本来想前面写点什么的, 还是算了, 直接说思路吧.
从 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 都是独立, 那么就剩一个问题, 注入到哪个实例里面去!"htmlcode">
import axios from 'axios' import qs from 'qs' import md5 from 'md5' import config from './config-server' const parseCookie = cookies => { 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', url, params }) } } }
把 cookies 当参数传进工厂函数, 给 axios 使用
示例文件1: src/api/index-server.js
示例文件2: src/api/index-client.js
2. 修改 server.js 文件, 将 cookies 注入 renderer 的 上下文中
// 前后代码略 const context = { title: 'M.M.F 小屋', url: req.url, cookies: req.cookies } renderer.renderToString(context, (err, html) => { if (err) { return handleError(err) } res.end(html) if (!isProd) { console.log(`whole request: ${Date.now() - s}ms`) } }) // 前后代码略
示例文件: server.js
3. 修改服务端入口文件
import { createApp } from './app' import { api } from '~api' export default function(context) { return new Promise((resolve, reject) => { const s = Date.now() const { app, router, store } = createApp() const url = context.url const fullPath = router.resolve(url).route.fullPath if (fullPath !== url) { reject({ url: fullPath }) } router.push(url) router.onReady(() => { const matchedComponents = router.getMatchedComponents() if (!matchedComponents.length) { reject({ code: 404 }) } // 注意这里, 在步骤2中, context里已经带有cookies了 // 创建一个新的api实例, 并把cookies传进去 // 同时注入store和根状态中 // 注入 store 中, 可以方便在组件中用 // 注入 根状态中, 可以方便在 vuex 的 actions 中用 store.$api = store.state.$api = api(context.cookies) Promise.all( matchedComponents.map( ({ asyncData }) => asyncData && asyncData({ store, route: router.currentRoute, cookies: context.cookies, isServer: true, isClient: false }) ) ) .then(() => { console.log(`data pre-fetch: ${Date.now() - s}ms`) context.state = store.state context.isProd = process.env.NODE_ENV === 'production' resolve(app) }) .catch(reject) }, reject) }) }
示例文件: src/entry-server.js
4. 修改客户端入口文件
import api from '~api' // 前后代码略 const { app, router, store } = createApp() if (window.__INITIAL_STATE__) { store.replaceState(window.__INITIAL_STATE__) // 客户端就没必要用工厂函数了, 用也可以, 但是需注意, api里的属性必须和服务端的保持一致 store.$api = store.state.$api = api } // 前后代码略
示例文件: src/entry-client.js
5. 在 vuex 的 actions 中使用
const actions = { async ['getArticleList']( { commit, state, rootState: { $api } // 这里就是前面注入的api }, config ) { const { data: { data, code } } = await $api.get('frontend/article/list', { ...config, cache: true }) if (data && code === 200) { commit('receiveArticleList', { ...config, ...data }) } } }
示例文件: src/store/modules/frontend-article.js
6. 在组件中使用
methods: { async recover(id) { const { data: { code, message } } = await this.$store.$api.get('frontend/comment/recover', { id }) if (code === 200) { this.$store.commit('global/comment/recoverComment', id) } } }
示例文件: src/components/frontend-comment.vue
至此, 全文结束, 完整代码, 请参考: https://github.com/lincenying/mmf-blog-vue2-pwa-ssr
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]