当前位置:首页 > VUE

vue实现ssr

2026-02-10 07:56:31VUE

Vue 实现 SSR(服务端渲染)的方法

Vue 的服务端渲染(SSR)可以通过官方提供的 vue-server-renderer 库实现,以下是具体实现步骤和注意事项。

基本配置

安装必要的依赖包:

npm install vue vue-server-renderer express

创建一个基本的服务端入口文件(server.js):

const Vue = require('vue');
const server = require('express')();
const renderer = require('vue-server-renderer').createRenderer();

server.get('*', (req, res) => {
  const app = new Vue({
    data: {
      url: req.url
    },
    template: `<div>访问的 URL 是: {{ url }}</div>`
  });

  renderer.renderToString(app, (err, html) => {
    if (err) {
      res.status(500).end('Internal Server Error');
      return;
    }
    res.end(`
      <!DOCTYPE html>
      <html lang="en">
        <head><title>Vue SSR</title></head>
        <body>${html}</body>
      </html>
    `);
  });
});

server.listen(8080);

结合 Vue 单文件组件

为了支持单文件组件(.vue),需要使用 webpack 打包客户端和服务端代码。

安装额外依赖:

vue实现ssr

npm install webpack webpack-cli vue-loader vue-template-compiler @babel/core @babel/preset-env babel-loader css-loader -D

配置 webpack.server.config.js

const path = require('path');
const { VueLoaderPlugin } = require('vue-loader');

module.exports = {
  target: 'node',
  entry: './src/entry-server.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'server-bundle.js',
    libraryTarget: 'commonjs2'
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      }
    ]
  },
  plugins: [new VueLoaderPlugin()]
};

客户端激活(Hydration)

客户端需要打包独立的入口文件以激活静态 HTML。创建 entry-client.js

import Vue from 'vue';
import App from './App.vue';

const app = new Vue({
  render: h => h(App)
});

app.$mount('#app');

服务端数据预取

在服务端渲染时预取数据,可以通过 asyncData 方法实现。修改 entry-server.js

vue实现ssr

import { createApp } from './app';

export default context => {
  return new Promise((resolve, reject) => {
    const { app, router } = createApp();

    router.push(context.url);
    router.onReady(() => {
      const matchedComponents = router.getMatchedComponents();
      if (!matchedComponents.length) {
        return reject({ code: 404 });
      }

      Promise.all(
        matchedComponents.map(Component => {
          if (Component.asyncData) {
            return Component.asyncData({
              store,
              route: router.currentRoute
            });
          }
        })
      ).then(() => {
        context.state = store.state;
        resolve(app);
      }).catch(reject);
    }, reject);
  });
};

使用 Nuxt.js 简化流程

对于更复杂的项目,可以直接使用 Nuxt.js 框架,它内置了 Vue SSR 的最佳实践配置。

安装 Nuxt.js:

npx create-nuxt-app my-project

Nuxt.js 自动处理路由、状态管理和构建配置,只需在 pages 目录下创建组件即可实现 SSR。

注意事项

  • 避免在服务端渲染时使用浏览器特有的 API(如 windowdocument),需通过 process.client 判断环境。
  • 组件生命周期钩子中,beforeCreatecreated 会在服务端和客户端各执行一次,避免重复操作。
  • 静态资源路径需使用绝对路径或在构建时正确处理。

以上方法涵盖了从手动配置到使用框架的 Vue SSR 实现方式,可根据项目需求选择适合的方案。

标签: vuessr
分享给朋友:

相关文章

vue实现微博发布动态

vue实现微博发布动态

使用Vue实现微博发布动态功能 创建Vue组件结构 新建一个WeiboPost.vue组件,包含文本框、图片上传和发布按钮: <template> <div class="w…

vue 实现toast

vue 实现toast

vue 实现 toast 的方法 在 Vue 中实现 Toast 提示功能可以通过多种方式,以下是几种常见的实现方法: 使用第三方库 Vue 生态中有许多成熟的 Toast 库,例如 vue-toa…

vue实现建模

vue实现建模

Vue 实现建模的方法 在 Vue 中实现建模通常涉及数据绑定、组件化和状态管理。以下是几种常见的方法: 数据驱动建模 Vue 的核心是数据驱动视图。通过定义数据模型,Vue 会自动更新 DOM。例…

vue实现拖动

vue实现拖动

Vue实现拖动的常用方法 在Vue中实现拖动功能通常需要结合HTML5的拖放API或第三方库。以下是几种常见实现方式: 使用HTML5原生拖放API HTML5提供了原生拖放API,可以通过dra…

vue 实现fadeout

vue 实现fadeout

Vue 实现淡出效果 在 Vue 中实现淡出(fade-out)效果可以通过 CSS 过渡或动画结合 Vue 的动态渲染功能完成。以下是几种常见方法: 使用 Vue 过渡(Transition)组…

vue实现addclass

vue实现addclass

Vue 实现动态添加 class 的方法 在 Vue 中动态添加 class 可以通过多种方式实现,以下是常见的几种方法: 使用对象语法 通过绑定一个对象到 :class,可以动态切换 cla…