首页 > 语言 > JavaScript > 正文

vue服务端渲染缓存应用详解

2024-05-06 15:30:10
字体:
来源:转载
供稿:网友

服务端渲染简介

服务端渲染不是一个新的技术;在 Web 最初的时候,页面就是通过服务端渲染来返回的,用 PHP 来说,通常是使用 Smarty 等模板写模板文件,然后 PHP 服务端框架将数据和模板渲染为页面返回,这样的服务端渲染有个缺点就是一旦要查看新的页面,就需要请求服务端,刷新页面。

但如今的前端,为了追求一些体验上的优化,通常整个渲染在浏览器端使用 JS 来完成,配合 history.pushState 等方式来做单页应用(SPA: Single-Page Application),也收到不错的效果,但是这样还是有一些缺点:第一次加载过慢,用户需要等待较长时间来等待浏览器端渲染完成;对搜索引擎爬虫等不友好。这时候就出现了类似于 React,Vue 2.0 等前端框架来做服务端渲染。

本文重点给大家介绍vue服务端渲染缓存应用,先看下vue缓存分为哪几种吧。

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 rendererif (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) })}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选