vue实现ssr
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 打包客户端和服务端代码。
安装额外依赖:

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:

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(如
window或document),需通过process.client判断环境。 - 组件生命周期钩子中,
beforeCreate和created会在服务端和客户端各执行一次,避免重复操作。 - 静态资源路径需使用绝对路径或在构建时正确处理。
以上方法涵盖了从手动配置到使用框架的 Vue SSR 实现方式,可根据项目需求选择适合的方案。






