返回

预渲染更多的理解以及源码分析

前端

如今的一些主流框架打包的项目都是单页web应用,在页面加载时会出现首屏加载速度慢的问题。

本文将列举常见的三个解决方案,并对预渲染模块的prerender-spa-plugin源码进行注释分析。

解决方案

1. 服务器端渲染(SSR)

服务器端渲染(SSR)是指在服务器端将应用程序渲染成HTML,然后将渲染后的HTML发送给客户端。SSR的优点是首屏加载速度快,但缺点是服务器端渲染需要消耗更多的资源,并且不利于SEO。

2. 静态站点生成(SSG)

静态站点生成(SSG)是指在构建时将应用程序渲染成HTML,然后将渲染后的HTML存储在服务器上。SSG的优点是首屏加载速度快,并且有利于SEO,但缺点是构建过程可能需要很长时间,并且不适合于频繁更新的网站。

3. 预渲染

预渲染是指在应用程序加载之前,在服务器端或客户端将应用程序渲染成HTML。预渲染的优点是首屏加载速度快,并且有利于SEO,但缺点是预渲染过程可能需要一些时间,并且需要额外的配置。

prerender-spa-plugin源码分析

prerender-spa-plugin是一个用于预渲染单页web应用的插件。该插件的工作原理是在构建时将应用程序渲染成HTML,然后将渲染后的HTML存储在服务器上。当用户访问网站时,服务器将预渲染的HTML发送给客户端,客户端收到预渲染的HTML后,将其插入到DOM中,从而实现快速加载。

下面是对prerender-spa-plugin源码的注释分析:

// 入口文件
const PrerenderSPAPlugin = require('./lib/plugin')

// 插件主函数
module.exports = PrerenderSPAPlugin
// 插件构造函数
class PrerenderSPAPlugin {
  // 插件配置
  constructor(options) {
    this.options = options
  }

  // 应用插件
  apply(compiler) {
    // 注册webpack钩子
    compiler.hooks.emit.tapAsync('PrerenderSPAPlugin', (compilation, callback) => {
      // 获取输出路径
      const outputPath = compilation.options.output.path

      // 获取输出文件名
      const outputFilename = compilation.options.output.filename

      // 读取HTML文件
      const html = readFileSync(path.join(outputPath, outputFilename))

      // 预渲染HTML
      const prerenderedHtml = prerender(html, this.options)

      // 写入预渲染后的HTML文件
      writeFileSync(path.join(outputPath, 'prerendered.html'), prerenderedHtml)

      // 调用回调函数
      callback()
    })
  }
}

从上面的代码可以看出,prerender-spa-plugin插件的工作原理是在构建时将应用程序渲染成HTML,然后将渲染后的HTML存储在服务器上。当用户访问网站时,服务器将预渲染的HTML发送给客户端,客户端收到预渲染的HTML后,将其插入到DOM中,从而实现快速加载。