本来想前面写点什么的, 还是算了, 直接说思路吧.
从 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
Vue2,SSR,Cookies
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]