Vue.js SSR Bundle Renderer 指引

2021-01-07 15:39 更新

使用基本 SSR 的問題

到目前為止,我們假設打包的服務器端代碼,將由服務器通過 require 直接使用:

const createApp = require('/path/to/built-server-bundle.js')

這是理所應當?shù)?,然而在每次編輯過應用程序源代碼之后,都必須停止并重啟服務。這在開發(fā)過程中會影響開發(fā)效率。此外,Node.js 本身不支持 source map。

傳入 BundleRenderer

vue-server-renderer 提供一個名為 createBundleRenderer 的 API,用于處理此問題,通過使用 webpack 的自定義插件,server bundle 將生成為可傳遞到 bundle renderer 的特殊 JSON 文件。所創(chuàng)建的 bundle renderer,用法和普通 renderer 相同,但是 bundle renderer 提供以下優(yōu)點:

  • 內置的 source map 支持(在 webpack 配置中使用 devtool: 'source-map'

  • 在開發(fā)環(huán)境甚至部署過程中熱重載(通過讀取更新后的 bundle,然后重新創(chuàng)建 renderer 實例)

  • 關鍵 CSS(critical CSS) 注入(在使用 *.vue 文件時):自動內聯(lián)在渲染過程中用到的組件所需的CSS。更多細節(jié)請查看 CSS 章節(jié)。

  • 使用 clientManifest 進行資源注入:自動推斷出最佳的預加載(preload)和預取(prefetch)指令,以及初始渲染所需的代碼分割 chunk。

在下一章節(jié)中,我們將討論如何配置 webpack,以生成 bundle renderer 所需的構建工件 (build artifact),但現(xiàn)在假設我們已經(jīng)有了這些需要的構建工件,以下就是創(chuàng)建和使用 bundle renderer 的方法:

const { createBundleRenderer } = require('vue-server-renderer')


const renderer = createBundleRenderer(serverBundle, {
  runInNewContext: false, // 推薦
  template, // (可選)頁面模板
  clientManifest // (可選)客戶端構建 manifest
})


// 在服務器處理函數(shù)中……
server.get('*', (req, res) => {
  const context = { url: req.url }
  // 這里無需傳入一個應用程序,因為在執(zhí)行 bundle 時已經(jīng)自動創(chuàng)建過。
  // 現(xiàn)在我們的服務器與應用程序已經(jīng)解耦!
  renderer.renderToString(context, (err, html) => {
    // 處理異?!?    res.end(html)
  })
})

bundle renderer 在調用 renderToString 時,它將自動執(zhí)行「由 bundle 創(chuàng)建的應用程序實例」所導出的函數(shù)(傳入上下文作為參數(shù)),然后渲染它。

注意,推薦將 runInNewContext 選項設置為 false'once'。更多細節(jié)請查看 API 參考。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號