总结vue 预渲染

Posted 看见了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了总结vue 预渲染相关的知识,希望对你有一定的参考价值。

环境

  • vue-cli@3创建的空白项目(vue,vue-router)
  • prerender-spa-plugin@3.4.0

基础

const PrerenderSPAPlugin = require("prerender-spa-plugin");
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer;
const path = require("path");

module.exports = {
  configureWebpack: (config) => {
    if (process.env.NODE_ENV !== "production") return;

    return {
      plugins: [
        new PrerenderSPAPlugin({
          // 必填 - app预渲染的webpack打包输出目录
          staticDir: path.join(__dirname, "dist"),
          // 必填 - 预渲染的路由路径
          routes: ["/", "/about"],
        }),
      ],
    };
  },
};

进阶

const path = require(\'path\')
const PrerenderSPAPlugin = require(\'prerender-spa-plugin\')
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer

module.exports = {
  plugins: [
    ...
    new PrerenderSPAPlugin({
      // 必填 - app预渲染的webpack打包输出目录
      staticDir: path.join(__dirname, \'dist\'),

      // 可选 - app应该渲输出的路径
      // (默认是staticDir.)
      outputDir: path.join(__dirname, \'prerendered\'),

      // 可选 - index.html 位置
      indexPath: path.join(__dirname, \'dist\', \'index.html\'),

      // 必填 - 预渲染的路由路径
      routes: [ \'/\', \'/about\', \'/some/deep/nested/route\' ],

      // Optional - Allows you to customize the HTML and output path before
      // writing the rendered contents to a file.
      // renderedRoute can be modified and it or an equivelant should be returned.
      // renderedRoute format:
      // {
      //   route: String, // Where the output file will end up (relative to outputDir)
      //   originalRoute: String, // The route that was passed into the renderer, before redirects.
      //   html: String, // The rendered HTML for this route.
      //   outputPath: String // The path the rendered HTML will be written to.
      // }
      postProcess (renderedRoute) {
        // Ignore any redirects.
        renderedRoute.route = renderedRoute.originalRoute
        // Basic whitespace removal. (Don\'t use this in production.)
        renderedRoute.html = renderedRoute.html.split(/>[\\s]+</gmi).join(\'><\')
        // Remove /index.html from the output path if the dir name ends with a .html file extension.
        // For example: /dist/dir/special.html/index.html -> /dist/dir/special.html
        if (renderedRoute.route.endsWith(\'.html\')) {
          renderedRoute.outputPath = path.join(__dirname, \'dist\', renderedRoute.route)
        }

        return renderedRoute
      },

      // 可选 - 使用 html-minifier (https://github.com/kangax/html-minifier)
      // 压缩生成的HTML文件.
      // Option reference: https://github.com/kangax/html-minifier#options-quick-reference
      minify: {
        collapseBooleanAttributes: true, // 从布尔属性中忽略属性值
        collapseWhitespace: true, // 折叠节点之间的空白
        decodeEntities: true, // 尽可能使用Unicode字符
        keepClosingSlash: true, // 在单例元素上保留末尾斜杠
        sortAttributes: true // 按频率排列属性
      },

      // Server configuration options.
      server: {
        // 通常会自动检测到空闲端口,但如果需要可以自定义设置。
        port: 8001
      },

      // 实际要使用的预渲染器. (你可以自己编写,估计很难)
      // Available renderers: https://github.com/Tribex/prerenderer/tree/master/renderers
      renderer: new Renderer({
        // 可选 - 要添加到window对象的属性的名称,内容为`inject`.
        injectProperty: \'__PRERENDER_INJECTED\',
        // 可选 - 任何你想让你的应用程序通过\'window.injectProperty\'访问的值。
        inject: {
          foo: \'bar\'
        },

        // 可选 - 默认是0,没有限制
        // 路由是异步渲染的。
        // 使用它来限制并行渲染的路由数量。
        maxConcurrentRoutes: 4,

        // 可选 - 等待渲染,直到在文档上分派指定的事件。
        // eg, with `document.dispatchEvent(new Event(\'custom-render-trigger\'))`
        renderAfterDocumentEvent: \'custom-render-trigger\',

        // 可选 - Wait to render until the specified element is detected using `document.querySelector`
        renderAfterElementExists: \'my-app-element\',

        // 可选-等待渲染,直到一定的时间已经过去.
        // 不推荐
        renderAfterTime: 5000, // 等待5s

        // Other puppeteer options.
        // (See here: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions)
        headless: false // Display the browser window when rendering. Useful for debugging.
      })
    })
  ]
}

参考文章

  • 预渲染 prerender-spa-plugin 避坑指南

以上是关于总结vue 预渲染的主要内容,如果未能解决你的问题,请参考以下文章

如何预渲染多个 Vue 应用页面?

vue 项目预渲染(prerender-spa-plugin)

vue-cil 服务端预渲染 prerender-spa-plugin

Vue CLI 3 预渲染水疗插件

vue项目使用 prerender-spa-plugin 预渲染

如何使用 spa-prerender 插件在 VUE 中预渲染“*”(未找到)页面