欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

nuxt.js 緩存實(shí)踐

 更新時(shí)間:2018年06月25日 14:16:21   作者:nw2018  
這篇文章主要介紹了nuxt.js 緩存實(shí)踐,nuxt 的緩存可以分為 組件級(jí)別緩存 , API級(jí)別緩存 以及 頁(yè)面級(jí)別緩存,本文就詳細(xì)的介紹了這三種緩存,感興趣的小伙伴們可以參考一下

nuxt 是基于 vue 的 ssr 解決方案,可以是使用vue語(yǔ)法完成前后端的同構(gòu)。

然而在與傳統(tǒng)純字符串拼接的 ssr 方案相比,性能就沒(méi)那么好了, nuxt 需要在服務(wù)端生成虛擬 dom ,然后再序列化出HTML字符串,我們常說(shuō) nodejs 的高性能指的是異步IO操作頻繁的場(chǎng)景而非CPU操作密集的場(chǎng)景,畢竟 nodejs 是運(yùn)行在單線程下的,在涉及到高并發(fā)的場(chǎng)景下,性能就會(huì)有所下降,可以考慮采用合理的緩存策略

nuxt 的緩存可以分為 組件級(jí)別緩存 , API級(jí)別緩存 以及 頁(yè)面級(jí)別緩存

組件級(jí)別的緩存

配置項(xiàng) nuxt.config.js 的配置大概長(zhǎng)這樣子:

const LRU = require('lru-cache')
module.exports = {
 render: {
  bundleRenderer: {
   cache: LRU({
    max: 1000,           // 最大的緩存?zhèn)€數(shù)
    maxAge: 1000 * 60 * 15    // 緩存15分鐘
   })
  }
 }
}

并不是說(shuō)配了該項(xiàng)就實(shí)現(xiàn)了組件級(jí)別的緩存,還需要在需做緩存的 vue 組件上增加 name 以及 serverCacheKey 字段,以確定緩存的唯一鍵值,比如:

export default {
 name: 'AppHeader',
 props: ['type'],
 serverCacheKey: props => props.type
}

上述組件會(huì)根據(jù)父組件傳下來(lái)的 type 值去做緩存,鍵值是: AppHeader::${props.type} ,由此,新的請(qǐng)求到來(lái)時(shí),只要父組件傳下來(lái)的 type 屬性之前處理過(guò),就可以復(fù)用之前的渲染緩存結(jié)果,以增進(jìn)性能

從該例子可以看出,如果該組件除了依賴父組件的 type 屬性,還依賴于別的屬性, serverCacheKey 這里也要做出相應(yīng)的改變,因此,如果組件依賴于很多的全局狀態(tài),或者,依賴的狀態(tài)取值非常多,意味需要緩存會(huì)被頻繁被設(shè)置而導(dǎo)致溢出,其實(shí)就沒(méi)有多大意義了,在 lru-cache 的配置中,設(shè)置的最大緩存?zhèn)€數(shù)是1000,超出部分就會(huì)被清掉

其次,不應(yīng)該緩存可能對(duì)渲染上下文產(chǎn)生副作用的子組件,比如,組件的 created beforeCreated 的鉤子在服務(wù)端也會(huì)走,組件被緩存后就不會(huì)執(zhí)行了,這些可能影響到渲染上下文的地方也要小心,更多內(nèi)容請(qǐng)參考:組件級(jí)別緩存

一般來(lái)說(shuō),比較適合的場(chǎng)景是 v-for 大量數(shù)據(jù)的渲染,因?yàn)檠h(huán)操作比較耗cpu

API級(jí)別的緩存

在服務(wù)端渲染的場(chǎng)景中,往往會(huì)將請(qǐng)求放在服務(wù)端去做,渲染完頁(yè)面再返回給瀏覽器,而有些接口是可以去做緩存的,比如,不依賴登錄態(tài)且不依賴過(guò)多參數(shù)的接口或者是單純獲取配置數(shù)據(jù)的接口等,接口的處理也是需要時(shí)間的,對(duì)接口的緩存可以加快每個(gè)請(qǐng)求的處理速度,更快地釋放掉請(qǐng)求,從而增進(jìn)性能

api的請(qǐng)求使用 axios , axios 即可以在服務(wù)端使用也可是在瀏覽器使用,代碼大概長(zhǎng)這樣子

import axios from 'axios'
import md5 from 'md5'
import LRU from 'lru-cache'

// 給api加3秒緩存
const CACHED = LRU({
 max: 1000,
 maxAge: 1000 * 3
})

function request (config) {
 let key
 // 服務(wù)端才加緩存,瀏覽器端就不管了
 if (config.cache && !process.browser) {
  const { params = {}, data = {} } = config
  key = md5(config.url + JSON.stringify(params) + JSON.stringify(data))
  if (CACHED.has(key)) {
   // 緩存命中
   return Promise.resolve(CACHED.get(key))
  }
 }
 return axios(config)
  .then(rsp => {
   if (config.cache && !process.browser) {
    // 返回結(jié)果前先設(shè)置緩存
    CACHED.set(key, rsp.data)
   }
   return rsp.data
  })
}

使用上跟平時(shí)使用 axios 還是一樣的,就多加了個(gè) cache 的屬性標(biāo)識(shí)是否需要在服務(wù)端做緩存

const api = {
 getGames: params => request({
  url: '/gameInfo/gatGames',
  params,
  cache: true
 })
}

頁(yè)面級(jí)別的緩存

在不依賴于登錄態(tài)以及過(guò)多參數(shù)的情況下,如果并發(fā)量很大,可以考慮使用頁(yè)面級(jí)別的緩存, 在 nuxt.config.js 增加 serverMiddleware 屬性

const nuxtPageCache = require('nuxt-page-cache')

module.exports = {
 serverMiddleware: [
  nuxtPageCache.cacheSeconds(1, req => {
   if (req.query && req.query.pageType) {
    return req.query.pageType
   }
   return false
  })
 ]
}

上面的例子根據(jù)鏈接后面的參數(shù) pageType 去做緩存,如果鏈接后面有 pageType 參數(shù),就做緩存,緩存時(shí)間為1秒,也就是說(shuō)在1秒內(nèi)相同的 pageType 請(qǐng)求,服務(wù)端只會(huì)執(zhí)行一次完整的渲染

nuxt-page-cache 參考了route-cache ,寫得比較簡(jiǎn)陋,你也可以重新封裝下,nuxt最終返回?cái)?shù)據(jù)是使用 res.end(html, 'utf-8') ,頁(yè)面級(jí)別的緩存大概的思想如下:

const LRU = require('lru-cache')

let cacheStore = new LRU({
 max: 100,     // 設(shè)置最大的緩存?zhèn)€數(shù)
 maxAge: 200
})

module.exports.cacheSeconds = function (secondsTTL, cacheKey) {
 // 設(shè)置緩存的時(shí)間
 const ttl = secondsTTL * 1000
 return function (req, res, next) {
  // 獲取緩存的key值
  let key = req.originalUrl
  if (typeof cacheKey === 'function') {
   key = cacheKey(req, res)
   if (!key) { return next() }
  } else if (typeof cacheKey === 'string') {
   key = cacheKey
  }

  // 如果緩存命中,直接返回
  const value = cacheStore.get(key)
  if (value) {
   return res.end(value, 'utf-8')
  }

  // 緩存原先的end方案
  res.original_end = res.end

  // 重寫res.end方案,由此nuxt調(diào)用res.end實(shí)際上是調(diào)用該方法,
  res.end = function () {
   if (res.statusCode === 200) {
    // 設(shè)置緩存
    cacheStore.set(key, data, ttl)
   }
   // 最終返回結(jié)果
   res.original_end(data, 'utf-8')
  }
 }
}

如果緩存命中,直接將原先的計(jì)算結(jié)果返回,大大提供了性能

總結(jié)

在高并發(fā)的情況下可以考慮使用緩存,而緩存策略的使用需要視場(chǎng)景而定,這里不再贅述,還可以考慮使用pm2開(kāi)啟集群模式去管理我們的進(jìn)程,從而滿足更高的并發(fā)。

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

相關(guān)文章

  • vue中的ElementUI的使用詳解

    vue中的ElementUI的使用詳解

    本文通過(guò)實(shí)例代碼給大家介紹了vue中的ElementUI的使用,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • Vue mixins詳解與使用技巧

    Vue mixins詳解與使用技巧

    Vue mixins提供了一個(gè)非常靈活的方式來(lái)分發(fā)Vue組件中的可復(fù)用功能,通過(guò)全局混入和局部混入,可以將預(yù)定義的方法、數(shù)據(jù)等混合到Vue組件中,這種技術(shù)可以簡(jiǎn)化代碼,提高開(kāi)發(fā)效率,并允許在不同組件間共享功能
    2024-09-09
  • vue解決跨域問(wèn)題的幾種常用方法(CORS)

    vue解決跨域問(wèn)題的幾種常用方法(CORS)

    在Vue中解決跨域問(wèn)題有多種方法,今天通過(guò)本文給大家介紹幾種比較常見(jiàn)的方法,對(duì)vue解決跨域問(wèn)題感興趣的朋友跟隨小編一起看看吧
    2023-05-05
  • Vue數(shù)據(jù)監(jiān)聽(tīng)方法watch的使用

    Vue數(shù)據(jù)監(jiān)聽(tīng)方法watch的使用

    這篇文章主要介紹了Vue數(shù)據(jù)監(jiān)聽(tīng)方法watch的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • 詳解vue-cli項(xiàng)目開(kāi)發(fā)/生產(chǎn)環(huán)境代理實(shí)現(xiàn)跨域請(qǐng)求

    詳解vue-cli項(xiàng)目開(kāi)發(fā)/生產(chǎn)環(huán)境代理實(shí)現(xiàn)跨域請(qǐng)求

    這篇文章主要介紹了詳解vue-cli項(xiàng)目開(kāi)發(fā)/生產(chǎn)環(huán)境代理實(shí)現(xiàn)跨域請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • vue-cli配置全局sass、less變量的方法

    vue-cli配置全局sass、less變量的方法

    這篇文章主要介紹了vue-cli配置全局sass、less變量的方法,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • ant?design?vue?pro?支持多頁(yè)簽?zāi)J絾?wèn)題

    ant?design?vue?pro?支持多頁(yè)簽?zāi)J絾?wèn)題

    這篇文章主要介紹了ant?design?vue?pro?支持多頁(yè)簽?zāi)J絾?wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • VUE3基礎(chǔ)學(xué)習(xí)之click事件詳解

    VUE3基礎(chǔ)學(xué)習(xí)之click事件詳解

    由于vue是一個(gè)雙向數(shù)據(jù)綁定的框架,它的點(diǎn)擊事件與以前常用的還是有很大的差別的,下面這篇文章主要給大家介紹了關(guān)于VUE3基礎(chǔ)學(xué)習(xí)之click事件的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • vue原生方法自定義右鍵菜單

    vue原生方法自定義右鍵菜單

    這篇文章主要為大家詳細(xì)介紹了vue原生方法自定義右鍵菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue中js實(shí)現(xiàn)點(diǎn)擊復(fù)制文本到剪貼板的3種方案

    vue中js實(shí)現(xiàn)點(diǎn)擊復(fù)制文本到剪貼板的3種方案

    今天遇到一個(gè)復(fù)制粘貼的需求,研究之后發(fā)現(xiàn)太簡(jiǎn)單了,這篇文章主要給大家介紹了關(guān)于vue中js實(shí)現(xiàn)點(diǎn)擊復(fù)制文本到剪貼板的3種方案,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09

最新評(píng)論