开始一个简单的server-render
tools/webpack.js
,很显然,既然vue在服务端渲染,那就须要有一个服务器的webpack文件,因此有tools
下面就多出一个webpack.server.js
的文件,里面的内容很简单,以下:const path = require('path'); // 获取项目根目录 const projectRoot = path.resolve(__dirname, '..'); module.exports = { target: 'node', // 这里必须是node,由于打包完成的运行环境是node entry: path.join(projectRoot, 'src/server-index.js'), output: { libraryTarget: 'commonjs2', // !different // 打包出的路径 path: path.join(projectRoot, 'build'), // 打包最终的文件名 filename: 'bundle.server.js', }, module: { // 由于使用webpack2,这里必须是rules,若是使用use, // 会报个错:vue this._init is not a function rules: [{ test: /\.vue$/, loader: 'vue-loader', }, { test: /\.js$/, loader: 'babel-loader', include: projectRoot, // 这里会把node_modules里面的东西排除在外,提升打包效率 exclude: /node_modules/, } ] }, }
注:具体里面的功能,请看注释html
server-index.js
,和前端打包同样,服务端打包可得有一个入口文件,里面最主要的内容就是你要打包哪一个.vue文件,里面的内容是// 这个文件里面除了定义入口的.vue,其余的都不用配置 import Vue from 'vue'; // 引入.vue入口文件 import App from './component/List.vue'; const app = new Vue(App); // 你问我这块代码是啥意思,其实我也不知道,想要打包server端代码,这个代码块是必须的 // 之后会在这段代码里面加入其余一些配置信息 export default function (context) { return new Promise((resolve, reject) => { resolve(app); }); };
webpack
来打包文件,在build
目录下面会生成一个bundle.server.js
文件,详见tools/dev.js
接下来就是比较关健的一步了,如何把bundle.server.js
里面的内容,转成HTML。这个项目里面,咱们使用的express前端
app.get('/', function (req, resp) {...})
,这样咱们就能够在访问localhost:5000时能看到效果npm install vue-server-renderer --save
,其实这个包咱们如今才开始用,*注:这个包必须和vue的版本必须一致,目前都是2.3.2,无论哪一个版本,版本号必须严格一致,不然会报warning*bundle.server.js
,const bundleRenderer = vueServerRenderer.createBundleRenderer(code);
这步的做用是解析bundle.server.js
,而后生成HTML,注:vueServerRenderer提供两个方法,分别为:createBundleRenderer
和createRenderer
,使用webpack打包的Component代码,必须做用createBundleRenderer
这个方法,具体参照:官方文档,参数就是上面读取的js文件bundleRenderer.renderToString((err, html) => {console.log(html)})
const filePath = path.join(__dirname, './build/bundle.server.js') const code = fs.readFileSync(filePath, 'utf8'); const bundleRenderer = vueServerRenderer.createBundleRenderer(code); bundleRenderer.renderToString((err, html) => { if (err) { console.log(err.message); console.log(err.stack); } console.log(html); resp.send(html) });
总结下生成HTML的步骤vue
src/server-index.js
build/bundle.server.js
文件vue-server-renderer
包解析这个文件,最终渲染成HTML码上GitHubnode
Vue-SSR系列目录
从零开始搭建vue-ssr系列之一:写在前面的话webpack
从零开始搭建vue-ssr系列之二:纯client端渲染以及webpack2+vue2注意事项git
从零开始搭建vue-ssr系列之三:服务器渲染的奥秘github