美文网首页让前端飞Vue.js开发技巧
vue服务端渲染缓存应用详解

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

作者: 88b61f4ab233 | 来源:发表于2019-03-03 20:49 被阅读32次

    服务端渲染简介

    服务端渲染不是一个新的技术;在 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 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返回常量将导致组件始终被缓存,这对纯静态组件是有好处的。

    最后

    为了帮助大家让学习变得轻松、高效,给大家免费分享一大批资料,帮助大家在成为全栈工程师,乃至架构师的路上披荆斩棘。在这里给大家推荐一个前端全栈学习交流圈:866109386.欢迎大家进群交流讨论,学习交流,共同进步。

    当真正开始学习的时候难免不知道从哪入手,导致效率低下影响继续学习的信心。

    但最重要的是不知道哪些技术需要重点掌握,学习时频繁踩坑,最终浪费大量时间,所以有有效资源还是很有必要的。

    最后祝福所有遇到瓶疾且不知道怎么办的前端程序员们,祝福大家在往后的工作与面试中一切顺利。


    相关文章

      网友评论

        本文标题:vue服务端渲染缓存应用详解

        本文链接:https://www.haomeiwen.com/subject/gfwmuqtx.html