前言
最近接手一个老项目,典型的 Vue 组件化前端渲染,后续业务优化可能会朝 SSR 方向走,因此,就先做些技术储备。如果对 Vue SSR 完全不了解,请先阅读官方文档。
思路
Vue 提供了一个官方 Demo,该 Demo 优点是功能大而全,缺点是对新手不友好,容易让人看蒙。因此,今天我们来写一个更加容易上手的 Demo。总共分三步走,循序渐进。
- 写一个简单的前端渲染 Demo(不包含 Ajax 数据);
- 将前端渲染改成后端渲染(仍然不包含 Ajax 数据);
- 在后端渲染的基础上,加上 Ajax 数据的处理;
第一步:前端渲染 Demo
这部分比较简单,就是一个页面中包含两个组件:Foo 和 Bar。
<!-- index.html -->
<body>
<div id="app">
<app></app>
</div>
<script src="./dist/web.js"></script> <!--这是 app.js 打包出来的 JS 文件 -->
</body>
// app.js,也是 webpack 打包入口
import Vue from 'vue';
import App from './App.vue';
var app = new Vue({
el: '#app',
components: {
App
}
});
// App.vue
<template>
<div>
<foo></foo>
<bar></bar>
</div>
</template>
<script>
import Foo from './components/Foo.vue';
import Bar from './components/Bar.vue';
export default {
components:{
Foo,
Bar
}
}
</script>
// Foo.vue
<template>
<div class='foo'>
<h1>Foo</h1>
<p>Component </p>
</div>
</template>
<style>
.foo{
background: yellow;
}
</style>
// Bar.vue
<template>
<div class='bar'>
<h1>Bar</h1>
<p>Component </p>
</div>
</template>
<style>
.bar{
background: blue;
}
</style>
最终渲染结果如下图所示,源码请参考这里。

第二步:后端渲染(不包含 Ajax 数据)
第一步的 Demo 虽不包含任何 Ajax 数据,但即便如此,要把它改造成后端渲染,亦非易事。该从哪几个方面着手呢?
- 拆分 JS 入口;
- 拆分 Webpack 打包配置;
- 编写服务端渲染主体逻辑。
1. 拆分 JS 入口
在前端渲染的时候,只需要一个入口 app.js。现在要做后端渲染,就得有两个 JS 文件:entry-client.js 和 entry-server.js 分别作为浏览器和服务器的入口。
先看 entry-client.js,它跟第一步的 app.js 有什么区别吗? → 没有区别,只是换了个名字而已,内容都一样。
