这片官方的ssr指南已经说的比较详细了,本次对其中的一些关键流程进行总结,以及对其中不太明确的地方,做一个说明。
从 路由和代码分割 这一章开始到构建配置过程中,都是没有办法运行测试的,所以看起来就会有一些困难。整体的流程重新梳理,大体如下:
- 和spa开发一样,编写页面布局。
- 将vue实例,router实例使用工厂函数创建,并export出来。
- 需要暴露出来,是因为,打包的时候,需要做两次打包,其中一次是打包出服务端渲染所需要的资源vue-ssr-server-bundle.json ,另一次是给客户端用的spa。
- 打包完成后,ssr服务器启动的时候,需要使用vue-ssr-server-bundle.json 来传递给renderer。当服务端渲染是会从其中取到需要渲染的vue文件和js,来处理成html。
- 返回给浏览器的时候,会返回当前的html,以及上述打包出来的spa代码。
- 客户端渲染完成后,vue会做一次hydration, 比对真实的vdom和当前html结构一致。如果一致就不用再渲染了,进行依赖收集。下次数据更新时,直接重新渲染。
- 要注意的是,需要打包两次,然后再开启服务器。
- 主要用到的类以及插件有:
// createBundleRenderer 来渲染服务端 vue 到 html
const { createBundleRenderer } = require('vue-server-renderer')
const renderer = createBundleRenderer(serverBundle, {
runInNewContext: false, // 推荐
template, // (可选)页面模板
clientManifest // (可选)客户端构建 manifest
})
// 将vue打包成服务端的 vue-ssr-server-bundle.json
const VueSSRServerPlugin = require('vue-server-renderer/server-plugin')
// 生成vue-ssr-client-manifest.json
const VueSSRClientPlugin = require('vue-server-renderer/client-plugin')
- asyncData是个同步的方法,在客户端也是同步的。