本来想前面写点什么的,还是算了,直接说思路吧.
从 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 的 上下文中
示例文件: server.js
3. 修改服务端入口文件
示例文件: src/entry-server.js
4. 修改客户端入口文件
store.replaceState(window.INITIAL_STATE)
// 客户端就没必要用工厂函数了,用也可以,但是需注意,api里的属性必须和服务端的保持一致
store.$api = store.state.$api = api
}
// 前后代码略
示例文件: src/entry-client.js
5. 在 vuex 的 actions 中使用
示例文件: src/store/modules/frontend-article.js
6. 在组件中使用
示例文件: src/components/frontend-comment.vue
至此,全文结束,完整代码,请参考: https://github.com/lincenying/mmf-blog-vue2-pwa-ssr
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。