最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

最后說說Vue2 SSR 的 Cookies 問題

 更新時(shí)間:2018年05月25日 09:55:01   作者:林岑影  
這篇文章主要介紹了最后說說Vue2 SSR 的 Cookies 問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

本來想前面寫點(diǎn)什么的, 還是算了, 直接說思路吧.

從 Vue2.3 版本后, SSR 的 cookies, 就變成一個(gè)無比麻煩的問題, 具體請?jiān)L問官網(wǎng)文檔: https://ssr.vuejs.org/zh/api.html#runinnewcontext

之前也說不少的思路, 可是都覺得不怎么好用, 雖然都能解決問題, 今天再說一種思路

因?yàn)?Vue2.3 以后, bundle 代碼將與服務(wù)器進(jìn)程在同一個(gè) global 上下文中運(yùn)行, 所以不能再將 cookies 丟到 global 給 api 使用, 否則就會出現(xiàn) cookies 污染

Vue2.3 以后, 我們需要為每個(gè)請求創(chuàng)建一個(gè)新的根 Vue 實(shí)例, 同樣的, router、store 也需要, 所以, 我們的思路也在此, 將封裝后的 api 注入到這 3 個(gè)實(shí)例當(dāng)中去, 保證每個(gè)請求的 api 都是獨(dú)立, 那么就剩一個(gè)問題, 注入到哪個(gè)實(shí)例里面去!?

api 請求用到最多的兩個(gè)地方就是: 組件和 vuex 的 actions 里, 這兩個(gè)地方都有 store 的影子, 所以, 注入到 store 中, 毫無疑問是最好的

那么下面就來操作下:

1. 修改 api, 讓 api 文件導(dǎo)出一個(gè)工廠函數(shù)

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 當(dāng)參數(shù)傳進(jìn)工廠函數(shù), 給 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. 修改服務(wù)端入口文件

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里已經(jīng)帶有cookies了
      // 創(chuàng)建一個(gè)新的api實(shí)例, 并把cookies傳進(jìn)去
      // 同時(shí)注入store和根狀態(tài)中
      // 注入 store 中, 可以方便在組件中用
      // 注入 根狀態(tài)中, 可以方便在 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__)
  // 客戶端就沒必要用工廠函數(shù)了, 用也可以, 但是需注意, api里的屬性必須和服務(wù)端的保持一致
  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

至此, 全文結(jié)束, 完整代碼, 請參考: https://github.com/lincenying/mmf-blog-vue2-pwa-ssr

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue.2.0.5實(shí)現(xiàn)Class 與 Style 綁定的實(shí)例

    Vue.2.0.5實(shí)現(xiàn)Class 與 Style 綁定的實(shí)例

    本篇文章主要介紹了Vue.2.0.5實(shí)現(xiàn)Class 與 Style 綁定的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • vue判斷input輸入內(nèi)容全是空格的方法

    vue判斷input輸入內(nèi)容全是空格的方法

    下面小編就為大家分享一篇vue判斷input輸入內(nèi)容全是空格的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • vue data有值,但是頁面{{}} 取不到值的解決

    vue data有值,但是頁面{{}} 取不到值的解決

    這篇文章主要介紹了vue data有值,但是頁面{{}} 取不到值的解決,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Vue 實(shí)現(xiàn)撥打電話操作

    Vue 實(shí)現(xiàn)撥打電話操作

    這篇文章主要介紹了Vue 實(shí)現(xiàn)撥打電話操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 一次vue項(xiàng)目優(yōu)化的實(shí)際操作記錄

    一次vue項(xiàng)目優(yōu)化的實(shí)際操作記錄

    用vue開發(fā)項(xiàng)目上線以后,發(fā)現(xiàn)首頁加載速度非常慢,如果項(xiàng)目比較大,甚至可能出現(xiàn)10s以上的等待,下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Vue v2.4中新增的$attrs及$listeners屬性使用教程

    Vue v2.4中新增的$attrs及$listeners屬性使用教程

    這篇文章主要給大家介紹了關(guān)于Vue v2.4中新增的$attrs及$listeners屬性的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • vue實(shí)現(xiàn)全選和反選功能

    vue實(shí)現(xiàn)全選和反選功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)全選和反選功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 前端vue中實(shí)現(xiàn)文件下載的幾種方法總結(jié)

    前端vue中實(shí)現(xiàn)文件下載的幾種方法總結(jié)

    這篇文章主要介紹了前端vue中實(shí)現(xiàn)文件下載的幾種方法總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • VUE對Storage的過期時(shí)間設(shè)置,及增刪改查方式

    VUE對Storage的過期時(shí)間設(shè)置,及增刪改查方式

    這篇文章主要介紹了VUE對Storage的過期時(shí)間設(shè)置,及增刪改查方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Ant Design Vue日期組件的時(shí)間限制方式

    Ant Design Vue日期組件的時(shí)間限制方式

    這篇文章主要介紹了Ant Design Vue日期組件的時(shí)間限制方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評論

乐山市| 霍山县| 大荔县| 张家界市| 遵义县| 扶余县| 吉隆县| 宁城县| 沾化县| 星子县| 两当县| 图木舒克市| 乌兰县| 循化| 寻乌县| 陆川县| 双峰县| 靖宇县| 阜平县| 平湖市| 隆德县| 二连浩特市| 岑巩县| 巴楚县| 洛宁县| 巴南区| 北碚区| 丹凤县| 共和县| 灵寿县| 无锡市| 拉萨市| 莒南县| 平乡县| 崇信县| 阜新| 景洪市| 祁东县| 正蓝旗| 夏河县| 威信县|