使用(可選的)選項創(chuàng)建一個 Renderer
實例。
const { createRenderer } = require('vue-server-renderer')
const renderer = createRenderer({ /* 選項 */ })
使用 server bundle 和(可選的)選項創(chuàng)建一個 BundleRenderer
實例。
const { createBundleRenderer } = require('vue-server-renderer')
const renderer = createBundleRenderer(serverBundle, { /* 選項 */ })
serverBundle
參數(shù)可以是以下之一:
.js
或 .json
)。必須以 /
開頭才會被識別為文件路徑。vue-server-renderer/server-plugin
生成的 bundle 對象。更多細節(jié)請查看 Server Bundle 指引 和 構(gòu)建配置。
函數(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。
函數(shù)簽名:
renderer.renderToStream(vm[, context]): stream.Readable
將 Vue 實例渲染為一個 Node.js 可讀流 。上下文對象 (context object) 可選。更多細節(jié)請查看流式渲染。
函數(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。
函數(shù)簽名:
bundleRenderer.renderToStream([context]): stream.Readable
將 bundle 渲染為一個 Node.js 可讀流 。上下文對象 (context object) 可選。更多細節(jié)請查看流式渲染。
為整個頁面的 HTML 提供一個模板。此模板應(yīng)包含注釋 <!--vue-ssr-outlet-->
,作為渲染應(yīng)用程序內(nèi)容的占位符。
模板還支持使用渲染上下文 (render context) 進行基本插值:
當在渲染上下文 (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)容:
<link rel="preload/prefetch">
資源提示 (resource hints)。
你也可以通過將 inject: false
傳遞給 renderer,來禁用所有自動注入。
具體查看:
通過此選項提供一個由 vue-server-renderer/client-plugin
生成的客戶端構(gòu)建 manifest 對象(client build manifest object)。此對象包含了 webpack 整個構(gòu)建過程的信息,從而可以讓 bundle renderer 自動推導(dǎo)需要在 HTML 模板中注入的內(nèi)容。更多詳細信息,請查看生成 clientManifest。
控制使用 template
時是否執(zhí)行自動注入。默認是 true
。
參考:手動資源注入(Manual Asset Injection)。
一個函數(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'
}
}
})
一個函數(shù),用來控制對于哪些文件,是需要生成 <link rel="prefetch">
資源提示。
默認情況下,異步 chunk 中的所有資源都將被預(yù)取,因為這是低優(yōu)先級指令; 然而,為了更好地控制帶寬使用情況,你也可以自定義要預(yù)取的資源。此選項具有與 shouldPreload
相同的函數(shù)簽名。
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: false
或 runInNewContext: '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
對象。注意事項如下:
global
(例如,polyfill)的依賴模塊必須被打包進 bundle,不能被外部化 (externalize);Error
的一個實例。createBundleRenderer
顯式地聲明 server bundle 的運行目錄。運行時將會以此目錄為基準來解析 node_modules
中的依賴模塊。只有在所生成的 bundle 文件與外部的 NPM 依賴模塊放置在不同位置,或者 vue-server-renderer
是通過 NPM link 鏈接到當前項目中時,才需要配置此選項。
提供組件緩存具體實現(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) get
和 set
。此外,如果 get
和 has
接收第二個參數(shù)作為回調(diào),那 get
和 has
也可以是可選的異步函數(shù)。這允許緩存使用異步 API,例如,一個 Redis 客戶端:
const renderer = createRenderer({
cache: {
get: (key, cb) => {
redisClient.get(key, (err, res) => {
// 處理任何錯誤
cb(res)
})
},
set: (key, val) => {
redisClient.set(key, val)
}
}
})
對于自定義指令,允許提供服務(wù)器端實現(xiàn):
const renderer = createRenderer({
directives: {
example (vnode, directiveMeta) {
// 基于指令綁定元數(shù)據(jù)(metadata)轉(zhuǎn)換 vnode
}
}
})
例如,請查看 v-show
的服務(wù)器端實現(xiàn)。
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)建配置。
更多建議: