到目前為止,我們假設打包的服務器端代碼,將由服務器通過 require
直接使用:
const createApp = require('/path/to/built-server-bundle.js')
這是理所應當?shù)?,然而在每次編輯過應用程序源代碼之后,都必須停止并重啟服務。這在開發(fā)過程中會影響開發(fā)效率。此外,Node.js 本身不支持 source map。
vue-server-renderer
提供一個名為 createBundleRenderer
的 API,用于處理此問題,通過使用 webpack 的自定義插件,server bundle 將生成為可傳遞到 bundle renderer 的特殊 JSON 文件。所創(chuàng)建的 bundle renderer,用法和普通 renderer 相同,但是 bundle renderer 提供以下優(yōu)點:
devtool: 'source-map'
)*.vue
文件時):自動內聯(lián)在渲染過程中用到的組件所需的CSS。更多細節(jié)請查看 CSS 章節(jié)。在下一章節(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 參考。
更多建議: