vue-ssr-boilerplate
5 |A boilerplate for developing Server Side Render Vue.js Application
6 |1. 服务端渲染介绍
7 |参考文章:Vue SSR 渲染指南
8 |2. 如何使用
9 |使用的前提是安装依赖,即: npm i.
2.1 开发模式
11 |执行 npm run dev 即可.
2.2 生产模式
13 |生产模式,首先进行打包,然后再运行相关服务,即:
14 |npm run build && npm start # 如果线上使用 pm2,也可以用 npm run pm2生产模式如果要启用 service-worker(pwa),首先确保部署时采用了 https 协议,然后修改 build/webpack.client.conf.js 中 SWPlugin 相关配置,例如:
new SWPrecachePlugin({
17 | cacheId: 'vue-ssr-justemit',
18 | filename: 'service-worker.js',
19 | minify: true,
20 | // 设置为 false, sw生成的缓存是 filename?hash 形式,以便于浏览器更新缓存
21 | dontCacheBustUrlsMatching: false,
22 | // 忽略文件
23 | staticFileGlobsIgnorePatterns: [/\.map$/, /\.css$/],
24 | // For unknown URLs, fallback to the index page
25 | navigateFallback: 'https://example/', // 这里修改为 线上部署的地址
26 | // 运行时缓存
27 | runtimeCaching: [ // 这里修改为您实际开发时所需要的相关路由
28 | {
29 | urlPattern: '/',
30 | handler: 'networkFirst'
31 | },
32 | {
33 | urlPattern: /\/(page1|page2|page3)/,
34 | handler: 'networkFirst'
35 | }
36 | ]
37 | }存在的问题:
39 | 当浏览器访问 https://example.com/ 时,注册的 service-worker 的域是 https://example.com/ ,是不能直接浏览器输入 https://example.com/page1 来访问 /page1 这个路由的的.
解决办法: 浏览器新标签直接访问 https://example.com/page1 (直接访问走的是 服务端的路由匹配,即 entry-server), 将该域的 service-worker 注册,其他路由同理.
希望有懂这一块的小伙伴可以帮忙解决.(:
42 |3 源码结构
43 |服务端渲染应当为每个请求创建一个新的根 Vue 实例。如果在多个请求之间共享一个实例,显然是错误的。所以所有的根实例、根路由、根状态都应当是一个工厂函数,每次请求都应当得到一个新的根实例。
44 |src
45 | ├── components # 组件
46 | ├── router # vue-router
47 | ├── store # vuex store
48 | ├── App.vue
49 | ├── app.js # 通用 entry(universal entry)
50 | ├── entry-client.js # 仅运行于浏览器
51 | └── entry-server.js # 仅运行于服务器-
53 |
-
54 |
55 |app.js
56 |app.js是程序的“通用入口”。在客户端程序中,直接用此文件创建根 Vue 实例,并直接挂载到 DOM(激活)。在服务端渲染中,则将责任转到客户端入口文件。app.js只是简单到处createApp函数。
57 | -
58 |
59 |entry-client.js客户端入口只需要创建应用程序,并将其挂载到 DOM 中:
60 |64 |import { createApp } from './app' 61 | 62 | const { app } = createApp() 63 | app.$mount('#app')
65 | -
66 |
67 |entry-server.js服务器入口使用
68 |export default导出函数,并在每次渲染时重复调用此函数,用于创建和返回应用程序实例。也可以用于服务器端路由匹配和数据预取逻辑。
69 |
再次强调,如果使用了 vue-router、vuex 等,需要导出的均是一个工厂函数,而不是一个单例。
4 坑点提示
72 |4.1 window 及其他浏览器环境下属性
73 |由于采用了服务端渲染,所有关于浏览器上属性的使用,需要首先判断 window 对象是否存在。
4.2 单元测试
75 |默认采用 jest 和 vue-test-utils 进行测试,如果测试的组件需要用到 vuex,需要在测试的代码中新创建一个 store 传入,例如:
import { createStore } from '@/store'
77 |
78 | const store = createStore()
79 |
80 | test('test', () => {
81 | const wrapper = shallow(Component, { store })
82 | })5 其他
84 |-
85 |
- 如果未来需要使用到“页面缓存或组件缓存”,可参考:缓存 86 |
LICENSE
88 |MIT
89 |
30 |
4 |