Vue.js SSR API 參考文檔

2021-01-07 16:15 更新

createRenderer

使用(可選的)選項創(chuàng)建一個 Renderer 實例。

const { createRenderer } = require('vue-server-renderer')
const renderer = createRenderer({ /* 選項 */ })

createBundleRenderer

使用 server bundle 和(可選的)選項創(chuàng)建一個 BundleRenderer 實例。

const { createBundleRenderer } = require('vue-server-renderer')
const renderer = createBundleRenderer(serverBundle, { /* 選項 */ })

serverBundle 參數(shù)可以是以下之一:

  • 絕對路徑,指向一個已經(jīng)構(gòu)建好的 bundle 文件(.js.json)。必須以 / 開頭才會被識別為文件路徑。

  • 由 webpack + vue-server-renderer/server-plugin 生成的 bundle 對象。

  • JavaScript 代碼字符串(不推薦)。

更多細節(jié)請查看 Server Bundle 指引構(gòu)建配置。

Class: Renderer

renderer.renderToString

函數(shù)簽名:

renderer.renderToString(vm, context?, callback?): ?Promise<string>

將 Vue 實例渲染為字符串。上下文對象 (context object) 可選。回調(diào)函數(shù)是典型的 Node.js 風(fēng)格回調(diào),其中第一個參數(shù)是可能拋出的錯誤,第二個參數(shù)是渲染完畢的字符串。

在 2.5.0+ 版本中,此 callback 回調(diào)函數(shù)是可選項。在不傳遞 callback 時,此方法返回一個 Promise 對象,在其 resolve 后返回最終渲染的 HTML。

renderer.renderToStream

函數(shù)簽名:

renderer.renderToStream(vm[, context]): stream.Readable

將 Vue 實例渲染為一個 Node.js 可讀流 。上下文對象 (context object) 可選。更多細節(jié)請查看流式渲染。

Class: BundleRenderer

bundleRenderer.renderToString

函數(shù)簽名:

bundleRenderer.renderToString([context, callback]): ?Promise<string>

將 bundle 渲染為字符串。上下文對象 (context object) 可選?;卣{(diào)是一個典型的 Node.js 風(fēng)格回調(diào),其中第一個參數(shù)是可能拋出的錯誤,第二個參數(shù)是渲染完畢的字符串。

在 2.5.0+ 版本中,此 callback 回調(diào)函數(shù)是可選項。在不傳遞 callback 時,此方法返回一個 Promise 對象,在其 resolve 后返回最終渲染的 HTML。

bundleRenderer.renderToStream

函數(shù)簽名:

bundleRenderer.renderToStream([context]): stream.Readable

將 bundle 渲染為一個 Node.js 可讀流 。上下文對象 (context object) 可選。更多細節(jié)請查看流式渲染。

Renderer 選項

template

為整個頁面的 HTML 提供一個模板。此模板應(yīng)包含注釋 <!--vue-ssr-outlet-->,作為渲染應(yīng)用程序內(nèi)容的占位符。

模板還支持使用渲染上下文 (render context) 進行基本插值:

  • 使用雙花括號 (double-mustache) 進行 HTML 轉(zhuǎn)義插值 (HTML-escaped interpolation);
  • 使用三花括號 (triple-mustache) 進行 HTML 不轉(zhuǎn)義插值 (non-HTML-escaped interpolation)。

當在渲染上下文 (render context) 上存在一些特定屬性時,模板會自動注入對應(yīng)的內(nèi)容:

  • context.head:(字符串)將會被作為 HTML 注入到頁面的頭部 (head) 里。

  • context.styles:(字符串)內(nèi)聯(lián) CSS,將以 style 標簽的形式注入到頁面頭部。注意,如果你使用了 vue-loader + vue-style-loader 來處理組件 CSS,此屬性會在構(gòu)建過程中被自動生成。

  • context.state:(對象)初始 Vuex store 狀態(tài),將以 window.__INITIAL_STATE__ 的形式內(nèi)聯(lián)到頁面。內(nèi)聯(lián)的 JSON 將使用 serialize-javascript 自動清理,以防止 XSS 攻擊。

在 2.5.0+ 版本中,嵌入式 script 也可以在生產(chǎn)模式 (production mode) 下自行移除。

此外,當提供 clientManifest 時,模板會自動注入以下內(nèi)容:

  • 渲染當前頁面所需的最優(yōu)客戶端 JavaScript 和 CSS 資源(支持自動推導(dǎo)異步代碼分割所需的文件);
  • 為要渲染頁面提供最佳的 <link rel="preload/prefetch"> 資源提示 (resource hints)。

你也可以通過將 inject: false 傳遞給 renderer,來禁用所有自動注入。

具體查看:

clientManifest

通過此選項提供一個由 vue-server-renderer/client-plugin 生成的客戶端構(gòu)建 manifest 對象(client build manifest object)。此對象包含了 webpack 整個構(gòu)建過程的信息,從而可以讓 bundle renderer 自動推導(dǎo)需要在 HTML 模板中注入的內(nèi)容。更多詳細信息,請查看生成 clientManifest

inject

控制使用 template 時是否執(zhí)行自動注入。默認是 true。

參考:手動資源注入(Manual Asset Injection)。

shouldPreload

一個函數(shù),用來控制什么文件應(yīng)該生成 <link rel="preload"> 資源預(yù)加載提示 (resource hints)。

默認情況下,只有 JavaScript 和 CSS 文件會被預(yù)加載,因為它們是啟動應(yīng)用時所必需的。

對于其他類型的資源(如圖像或字體),預(yù)加載過多可能會浪費帶寬,甚至損害性能,因此預(yù)加載什么資源具體依賴于場景。你可以使用 shouldPreload 選項精確控制預(yù)加載資源:

const renderer = createBundleRenderer(bundle, {
  template,
  clientManifest,
  shouldPreload: (file, type) => {
    // 基于文件擴展名的類型推斷。
    // https://fetch.spec.whatwg.org/#concept-request-destination
    if (type === 'script' || type === 'style') {
      return true
    }
    if (type === 'font') {
      // 只預(yù)加載 woff2 字體
      return /\.woff2$/.test(file)
    }
    if (type === 'image') {
      // 只預(yù)加載重要 images
      return file === 'hero.jpg'
    }
  }
})

shouldPrefetch

  • 2.5.0+

一個函數(shù),用來控制對于哪些文件,是需要生成 <link rel="prefetch"> 資源提示。

默認情況下,異步 chunk 中的所有資源都將被預(yù)取,因為這是低優(yōu)先級指令; 然而,為了更好地控制帶寬使用情況,你也可以自定義要預(yù)取的資源。此選項具有與 shouldPreload 相同的函數(shù)簽名。

runInNewContext

  • 只用于 createBundleRenderer
  • 期望值:boolean | 'once''once' 只在 2.3.1+ 支持)

默認情況下,對于每次渲染,bundle renderer 將創(chuàng)建一個新的 V8 上下文并重新執(zhí)行整個 bundle。這具有一些好處 - 例如,應(yīng)用程序代碼與服務(wù)器進程隔離,我們無需擔(dān)心文檔中提到的狀態(tài)單例問題。然而,這種模式有一些相當大的性能開銷,因為重新創(chuàng)建上下文并執(zhí)行整個 bundle 還是相當昂貴的,特別是當應(yīng)用很大的時候。

出于向后兼容的考慮,此選項默認為 true,但建議你盡可能使用 runInNewContext: falserunInNewContext: 'once'

在 2.3.0 中,此選項有一個 bug,其中 runInNewContext: false 仍然使用獨立的全局上下文 (separate global context) 執(zhí)行 bundle。以下信息假定版本為 2.3.1+。

使用 runInNewContext: false,bundle 代碼將與服務(wù)器進程在同一個 global 上下文中運行,所以請留意在應(yīng)用程序代碼中盡量避免修改 global。

使用 runInNewContext: 'once' (2.3.1+),bundle 將在獨立的全局上下文(separate global context)取值,然而只在啟動時取值一次。這提供了一定程度的應(yīng)用程序代碼隔離,因為它能夠防止 bundle 中的代碼意外污染服務(wù)器進程的 global 對象。注意事項如下:

  1. 在此模式下,修改 global(例如,polyfill)的依賴模塊必須被打包進 bundle,不能被外部化 (externalize);
  2. 從 bundle 執(zhí)行返回的值將使用不同的全局構(gòu)造函數(shù),例如,在服務(wù)器進程中捕獲到 bundle 內(nèi)部拋出的錯誤,使用的是 bundle 上下文中的 Error 構(gòu)造函數(shù),所以它不會是服務(wù)器進程中 Error 的一個實例。

參考:源碼結(jié)構(gòu)

basedir

  • 只用于 createBundleRenderer

顯式地聲明 server bundle 的運行目錄。運行時將會以此目錄為基準來解析 node_modules 中的依賴模塊。只有在所生成的 bundle 文件與外部的 NPM 依賴模塊放置在不同位置,或者 vue-server-renderer 是通過 NPM link 鏈接到當前項目中時,才需要配置此選項。

cache

提供組件緩存具體實現(xiàn)。緩存對象必須實現(xiàn)以下接口(使用 Flow 語法表示):

type RenderCache = {
  get: (key: string, cb?: Function) => string | void;
  set: (key: string, val: string) => void;
  has?: (key: string, cb?: Function) => boolean | void;
};

典型用法是傳入 lru-cache

const LRU = require('lru-cache')


const renderer = createRenderer({
  cache: LRU({
    max: 10000
  })
})

請注意,緩存對象應(yīng)至少要實現(xiàn) getset。此外,如果 gethas 接收第二個參數(shù)作為回調(diào),那 gethas 也可以是可選的異步函數(shù)。這允許緩存使用異步 API,例如,一個 Redis 客戶端:

const renderer = createRenderer({
  cache: {
    get: (key, cb) => {
      redisClient.get(key, (err, res) => {
        // 處理任何錯誤
        cb(res)
      })
    },
    set: (key, val) => {
      redisClient.set(key, val)
    }
  }
})

directives

對于自定義指令,允許提供服務(wù)器端實現(xiàn):

const renderer = createRenderer({
  directives: {
    example (vnode, directiveMeta) {
      // 基于指令綁定元數(shù)據(jù)(metadata)轉(zhuǎn)換 vnode
    }
  }
})

例如,請查看 v-show 的服務(wù)器端實現(xiàn)。

webpack 插件

webpack 插件作為獨立文件提供,并且應(yīng)當直接 require:

const VueSSRServerPlugin = require('vue-server-renderer/server-plugin')
const VueSSRClientPlugin = require('vue-server-renderer/client-plugin')

生成的默認文件是:

  • vue-ssr-server-bundle.json 用于服務(wù)器端插件;
  • vue-ssr-client-manifest.json 用于客戶端插件。

創(chuàng)建插件實例時可以自定義文件名:

const plugin = new VueSSRServerPlugin({
  filename: 'my-server-bundle.json'
})

更多信息請查看構(gòu)建配置。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號