vue服務端渲染添加緩存

雖然 Vue 的服務器端渲染(SSR)相當快速,但是由于創建組件實例和虛擬 DOM 節點的開銷,無法與純基于字符串拼接(pure string-based)的模板的性能相當。在 SSR 性能至關重要的情況下,明智地利用緩存策略,可以極大改善響應時間并減少服務器負載。

vue服務區緩存分為頁面緩存、組建緩存和接口緩存

頁面緩存:

在server.js中設置

const LRU = require('lru-cache')
const microCache = LRU({max: 100, // 最大緩存的數目maxAge: 1000 // 重要提示:條目在 1 秒后過期。
})const isCacheable = req => {//判斷是否需要頁面緩存if (req.url && req.url === '/') {return req.url} else {return false}
}
app.get('*', (req, res) => {
const cacheable = isCacheable(req)if (cacheable) {const hit = microCache.get(req.url)if (hit) {return res.end(hit)}}
const errorHandler = err => {if (err && err.code === 404) {// 未找到頁面res.status(404).sendfile('public/404.html');} else {// 頁面渲染錯誤res.status(500).end('500 - Internal Server Error')console.error(`error during render : ${req.url}`)console.error(err)}
}
const context = {title: 'vue',keywords: 'vue-ssr服務端腳手架',description: 'vue-ssr-template, vue-server-renderer',version: v,url: req.url,cookies: req.cookies
}
renderer.renderToString(context, (err, html) => {if (err) {return errorHandler(err)}res.end(html)microCache.set(req.url, html) // 設置當前緩存頁面的內容
})
})
復制代碼

組建緩存:

在server.js中設置如下:

function createRenderer(bundle, template) {return require('vue-server-renderer').createBundleRenderer(bundle, {template,cache: LRU({max: 1000,maxAge: 1000 * 60 * 5 // 組建緩存時間})})
}
let renderer
if (isProd) {// 生產環境使用本地打包文件來渲染const bundle = require('./output/vue-ssr-bundle.json')const template = fs.readFileSync(resolve('./output/index.html'), 'utf-8')renderer = createRenderer(bundle, template)
} else {// 開發環境使用webpack熱更新服務require('./build/dev-server')(app, (bundle, template) => {renderer = createRenderer(bundle, template)})
}
復制代碼

 要緩存的組建

export default {name: 'Home',title() {return {title: 'vue-ssr',keywords: 'vue-ssr服務端腳手架, home',description: 'vue-ssr-template, vue-server-renderer, home'}},created() {},computed: {},asyncData({ store }) {},methods: {},serverCacheKey: props => props.id
}
復制代碼

serverCacheKey 返回的 key 應該包含足夠的信息,來表示渲染結果的具體情況。如果渲染結果僅由 props.item.id 決定,則上述是一個很好的實現。但是,如果具有相同 id 的 item 可能會隨時間而變化,或者如果渲染結果依賴于其他 prop,則需要修改 serverCacheKey 的實現,以考慮其他變量。如果

serverCacheKey
返回常量將導致組件始終被緩存,這對純靜態組件是有好處的。

接口緩存:

在create-api-server.js中設置緩存

import qs from 'qs'
import axios from 'axios'
import md5 from 'md5'
import LRU from 'lru-cache'
復制代碼

const microCache = LRU({ <br> max: 100,<br> maxAge: 5000 // 設置數據多久過期<br>})

export function createAPI({baseUrl, timeout}) {
let api
復制代碼
if (process.__API__) { api = process.__API__ } else {<br>// 定義全局變量 process.__API__api = process.__API__ = {get(url, params = {}) {const key = md5(url + JSON.stringify(params))// 判斷是否有緩存,直接返回緩存結果if (params.cache && microCache.get(key)) {console.log('返回緩存')return Promise.resolve(microCache.get(key))}return new Promise((resolve, reject) => {axios({url,params,headers: {'X-Requested-With': 'XMLHttpRequest'// 'Cookie': parseCookie(SSR.cookies)},method: 'get'}).then(res => {// 判斷是否需要緩存 如果需要緩存緩存數據if (params.cache && microCache) {microCache.set(key, res.data)}console.log('返回新數據')resolve(res.data)}).catch(error => {reject(error)})})},post(url, params = {}) {const key = md5(url + JSON.stringify(params))// 判斷是否有緩存,直接返回緩存結果if (params.cache && microCache.get(key)) {return Promise.resolve(microCache.get(key))}return new Promise((resolve, reject) => {axios({url,data: qs.stringify(params),method: 'post',headers: {'X-Requested-With': 'XMLHttpRequest','Content-Type': 'application/x-www-form-urlencoded'// 'Cookie': parseCookie(SSR.cookies)}}).then(res => {// 判斷是否需要緩存 如果需要緩存緩存數據if (params.cache && microCache) {microCache.set(key, res.data)}resolve(res.data)}).catch(error => {reject(error)})})}}}<br>return api<br>}復制代碼


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537630.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537630.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537630.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Could not autowire. No beans of 'xxxx' type found的錯誤提示

spring 集成mybatis 找不到 beans 查了很多網頁&#xff0c;解決辦法是&#xff1a; 在PersonMapper 上加 Repositorypackage zengmiaogen.csdn.cn.mybatis;import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository;import java.ut…

怎么把頁面按比例縮小_做PPT多圖排版千萬別套模板了,按這28種版式來,絕對靠譜!...

編按&#xff1a;各種類型的PPT經常會用到圖片&#xff0c;這些圖片到底如何排版才更出色呢&#xff1f;今天給大家分享一篇PPT圖片排版手冊&#xff0c;主要介紹了多張圖常見的排版方式&#xff0c;希望能幫助到您&#xff01;嗨&#xff0c;大家好&#xff0c;我是P小白。一張…

spring boot 集成Mybatis時 Invalid bound statement (not found)

spring boot 集成Mybatis時&#xff0c;運行提示 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): zengmiaogen.csdn.cn.mybatis.PersonMapper.queryPersonList 按照下文的步驟&#xff0c;解決了問題 https://blog.csdn.net/qq_3598128…

Caffe CuDNN版本與環境不同導致make錯誤

1.將./include/caffe/util/cudnn.hpp 換成最新版的caffe里的cudnn的實現&#xff0c;即相應的cudnn.hpp. 2.將./include/caffe/layers里的&#xff0c;所有以cudnn開頭的文件&#xff0c;例如cudnn_conv_layer.hpp&#xff0c;都替換成最新版的caffe里的相應的同名文件。 3.將.…

nodejs 安裝 nrm

nodejs默認源在國外&#xff0c;訪問速度慢。可以手動修改源&#xff0c;但要每次都修改。 安裝 nrm&#xff0c;指定源路徑&#xff0c;不需要每次修改 npm install nrm -g nrm ls * npm -------- https://registry.npmjs.org/ yarn ------- https://registry.yarnpkg.co…

磁盤陣列怎么做_設計與后期制作該怎么選擇筆記本電腦?朋克老師來教你

最近有很多人問我設計與后期制作該怎么選擇筆記本電腦&#xff1f;既然選擇筆記本電腦就說明在相關工作中對電腦有移動需求&#xff0c;比如自媒體、記者、影視后期出組人員等等&#xff0c;那該如何選擇呢&#xff1f;視頻剪輯咱們按工作內容分類聊一聊。第一類&#xff0c;平…

EventBus源碼分析

簡介 前面我學習了如何使用EventBus&#xff0c;還有了解了EventBus的特性&#xff0c;那么接下來我們一起來學習EventBus的源碼&#xff0c;查看EventBus的源碼&#xff0c;看看EventBus給我們帶來什么驚喜以及編程思想。 這個圖我們從一開始就一直放置在上面了。我們在來回顧…

Vue.js 概述與 MVVM 模式

一、Vue.js 1. Vue.js 是什么 Vue.js 是一個輕巧、高性能、可組件化的 MVVM 庫&#xff0c;擁有非常容易上手的 API&#xff1b; Vue.js是一個構建數據驅動的 Web 界面的庫。 2. Vue.js 的特性 1. 輕量級的框架 2. 雙向數據綁定 3. 指令 4. 插件化&#xff08;組件化&#…

ipad錄屏軟件_如何在 Mac 上優雅的截圖和錄屏

在使用電腦的時候&#xff0c;很多時候我們都需要截屏或者錄屏分享。所以你可能已經聽過 snip&#xff0c;或者經常使用 QQ、微信 等軟件來實現截屏。但是今天我們一起來看一下&#xff0c;怎么使用系統提供的功能&#xff0c;來優雅的實現截圖和錄屏。最開始的這幾篇都比較基礎…

數據庫的輔助工具:My-SqlViewer

閱讀目錄開始My-SqlViewer 使用說明程序安裝及啟動說明程序主界面DataBase瀏覽器搜索數據庫存儲過程的復制比較數據庫今天發一個我自己寫的且經常使用的數據庫的輔助工具&#xff1a;My-SqlViewer由于我比較喜歡使用存儲過程&#xff0c;但發現不管是SQL Server Management Stu…

安卓平板微信和手機微信同時登陸_Mac電腦如何同時登陸多個微信或QQ

現如今&#xff0c;微信和QQ已經不單單是簡單的社交軟件了&#xff0c;也成了工作必備軟件&#xff0c;工作中用它傳個文件&#xff0c;發個通知&#xff0c;不知道有多方便。但是很多人希望將工作圈和生活圈分開&#xff0c;有人想出拿兩部手機的方法&#xff0c;倒是可以&…

VSCode 開發Vue必備插件

工欲善其事&#xff0c;必先利其器 以下就是開發Vue必備插件&#xff1a; Vetur —— 語法高亮、智能感知、Emmet等 包含格式化功能&#xff0c; AltShiftF &#xff08;格式化全文&#xff09;&#xff0c;CtrlK CtrlF&#xff08;格式化選中代碼&#xff0c;兩個Ctrl需要同時…

蘋果x人臉識別突然失靈_教你解決mac電腦鍵盤失靈的問題

無論是使用WIN系統還是蘋果電腦都有可能遇到鍵盤失靈&#xff0c;無法使用的問題&#xff0c;那么蘋果電腦鍵盤失靈該怎么解決呢&#xff1f;這里macw小編為大家帶來了蘋果電腦鍵盤失靈解決教程&#xff0c;趕緊收藏起來吧&#xff01;無線鍵盤失靈解決教程1、確保藍牙已啟用并…

產品文檔如何說清楚產品業務?關注這幾點就夠了

如果產品文檔沒把產品業務說清楚會有什么影響&#xff1f; 常見的&#xff1a;產品不符合業務&#xff08;實際使用場景&#xff09;&#xff0c;驗收不通過&#xff0c;需要加班修改&#xff0c;調整。產品經理被罵。 嚴重的&#xff1a;甲方爸爸受不了了&#xff0c;換供應…

前端錯誤日志收集方案

前言 公司的項目上線出現問題后難以定位錯誤&#xff0c;研究過現存的錯誤監控方案&#xff0c;受限于特殊條件只能定制自己的錯誤收集方案。 基于以上背景我擼出來一個錯誤日志收集方案 - Ohbug。 歡迎各位大佬 star ~ 監控錯誤 說起錯誤的捕獲&#xff0c;首先想到的是 try c…

spring入門到放棄——spring事務管理

Spring事務提供了兩種管理的的方式&#xff1a;編程式事務和聲明式事務 簡單回顧下事務&#xff1a; 事務&#xff1a;邏輯上的一組操作&#xff0c;組成操作的各個單元&#xff0c;要么全部成功&#xff0c;要么全部失敗。 事務特性&#xff1a; 原子性&#xff1a;一個事務包…

高德百度地圖如何獲取附近小區酒店銀行等?

概述 實現以下功能&#xff1a;根據當前定位&#xff0c;查找附近小區 實現步驟 高德&#xff0c;百度地圖實現方式相同&#xff0c;步驟都是如下&#xff1a; 1.獲取當前位置的經緯度 2.查詢poitype編碼。 &#xff08;小區&#xff0c;寫字樓&#xff0c;銀行&#xff0…

angular 字符串轉換成數字_Python基礎語法大全:字符串的處理與使用

本文來自牛鷺學院學員&#xff1a;鄧瑞杰字母處理string.capitalize()返回元字符串&#xff0c;且將字符串第一個字母轉為大寫&#xff0c;其它字母小寫string.title()返回元字符串&#xff0c;且將字符串第一個字母轉為大寫&#xff0c;其它字母小寫string.swapcase()用于對字…

Java實現MD5編碼32位

加入依賴包 <dependency><groupId>org.apache.directory.studio</groupId><artifactId>org.apache.commons.codec</artifactId><version>1.8</version></dependency> 實現代碼 DigestUtils.md5Hex(字符串)

計算機二級考試python_全國計算機等級考試考試大綱(2018年版)

級別 大綱名稱 一級 一級計算機基礎及WPS Office應用考試大綱&#xff08;2018年版&#xff09;點擊下載 一級計算機基礎及MS Office應用考試大綱&#xff08;2018年版&#xff09;點擊下載 一級計算機基礎及Photoshop應用考試大綱&#xff08;2018年版&#xff09;點擊下載 一…