server-side-render
项目当中页面开发使用的是服务端直出的页面,为了可读性以及后期维护使用了 vue 框架
直出页面相比于异步页面的优点
- 首屏渲染的体验较好
- 服务端统一进行页面的拼接和渲染,统一做测速和数据上报
- 多平台和设备上也能有较好的体验,降低浏览器的压力
核心代码
1 | // 第 1 步:创建一个 Vue 实例 |
注意这里重点是通过一个异步操作renderToString得到一个异步页面,这样子服务端就可以直接输出这个异步页面
vuex
在store.js文件夹当中设定该页面相关的state, commit, action
1 | import Vue from 'vue' |
state
统一进行状态管理,包含初始数据和各类判断页面是否渲染的 flag 值
在.vue 文件当中通过以下方式进行绑定,可以实现双向绑定,关联model和view层
1 | computed: Vuex.mapState([ |
mutation
对state的所有修改都放在一个mutation当中,使用store.commit('mutation', payload)进行状态的更新
1 | methods: { |
注意所有的
mutation都是同步操作
action
action当中封装了一组mutation,并且外层返回一个promise,可以进行异步操作
1 | methods: { |
可以在
action当中手动返回一个promise进行错误的传递处理,通过store.dispatch('name', payload).then().catch()进行异步操作和错误处理
代码结构
- app.js
1 | import Vue from 'vue'; |
这个地方是进行 vuex 的注册,可以将创建的 store 导出,这样子在其他 js 文件当中就能够引用这个单例的 store
- App.vue
在该文件当中导出一个函数
1 | asyncData(store) { |
1 |
在该函数当中请求后台接口预先加载数据并储存到vuex当中
- entry-client.js
客户端文件的入口,替换服务端 store 的 __INITIAL_STATE__,并生成页面并挂载
1 | import { |
- entry-server.js
服务端的入口文件,await App.asyncData(), 对 store储存了之后再载入到客户端当中
1 | import { |
- store.js