本来想前面写点什么的,还是算了,直接说思路吧.
从 Vue2.3 版本后,SSR 的 cookies,就变成一个无比麻烦的问题,具体请访问官网文档: https://ssr.vuejs.org/zh/api.html#runinnewcontext
之前也说不少的思路,可是都觉得不怎么好用,虽然都能解决问题,今天再说一种思路
因为 Vue2.3 以后,bundle 代码将与服务器进程在同一个 global 上下文中运行,所以不能再将 cookies 丢到 global 给 api 使用,否则就会出现 cookies 污染
Vue2.3 以后,我们需要为每个请求创建一个新的根 Vue 实例,同样的,router、store 也需要,所以,我们的思路也在此,将封装后的 api 注入到这 3 个实例当中去,保证每个请求的 api 都是独立,那么就剩一个问题,注入到哪个实例里面去!?
api 请求用到最多的两个地方就是: 组件和 vuex 的 actions 里,这两个地方都有 store 的影子,注入到 store 中,毫无疑问是最好的
那么下面就来操作下:
1. 修改 api,让 api 文件导出一个工厂函数
let cookie = ''
Object.keys(cookies).forEach(item => {
cookie += item + '=' + cookies[item] + '; '
})
return cookie
}
export const api = cookies => {
return {
api: axios.create({
baseURL: config.api,headers: {
'X-Requested-With': 'XMLHttpRequest',cookie: parseCookie(cookies)
},timeout: config.timeout
}),post(url,data) {
return this.api({
method: 'post',url,data: qs.stringify(data),headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
},async get(url,params) {
return this.api({
method: 'get',params
})
}
}
}
把 cookies 当参数传进工厂函数,给 axios 使用
示例文件1: src/api/index-server.js
示例文件2: src/api/index-client.js
2. 修改 server.js 文件,将 cookies 注入 renderer 的 上下文中
3. 修改服务端入口文件
4. 修改客户端入口文件
if (window.INITIAL_STATE) {
store.replaceState(window.INITIAL_STATE)
// 客户端就没必要用工厂函数了,用也可以,但是需注意,api里的属性必须和服务端的保持一致
store.$api = store.state.$api = api
}
// 前后代码略
5. 在 vuex 的 actions 中使用
示例文件: src/store/modules/frontend-article.js
6. 在组件中使用
示例文件: src/components/frontend-comment.vue
至此,全文结束,完整代码,请参考: https://github.com/lincenying/mmf-blog-vue2-pwa-ssr
原文链接:https://www.f2er.com/vue/32164.html