File tree Expand file tree Collapse file tree 1 file changed +47
-0
lines changed Expand file tree Collapse file tree 1 file changed +47
-0
lines changed Original file line number Diff line number Diff line change
1
+ # Bundle Renderer 指引
2
+
3
+ ## 使用基本 SSR 的问题
4
+
5
+ 到目前为止,我们假设打包的服务器端代码,将由服务器通过 ` require ` 直接使用:
6
+
7
+ ``` js
8
+ const createApp = require (' /path/to/built-server-bundle.js' )
9
+ ```
10
+
11
+ 这是理所应当的,然而在每次编辑过应用程序源代码之后,都必须停止并重启服务。这在开发过程中会影响开发效率。此外,Node.js 本身不支持 source map。
12
+
13
+ ## 传入 BundleRenderer
14
+
15
+ ` vue-server-renderer ` 提供一个名为 ` createBundleRenderer ` 的 API,用于处理此问题,通过使用 webpack 的自定义插件,server bundle 将生成为可传递到 bundle renderer 的特殊 JSON 文件。所创建的 bundle renderer,用法和普通 renderer 相同,但是 bundle renderer 提供以下优点:
16
+
17
+ - 内置的 source map 支持(在 webpack 配置中使用 ` devtool: 'source-map' ` )
18
+ - 在开发环境甚至部署过程中热重载(通过读取更新后的 bundle,然后重新创建 renderer 实例)
19
+ - 关键 CSS(critical CSS) 注入(在使用 ` *.vue ` 文件时):自动内联在渲染过程中用到的组件所需的CSS。更多细节请查看 [ CSS] ( ./css.md ) 章节。
20
+ - 使用 [ clientManifest] ( ./api.md#clientmanifest ) 进行资源注入:自动推断出最佳的预加载(preload)和预取(prefetch)指令,以及初始渲染所需的代码分割 chunk。
21
+
22
+ ---
23
+
24
+ 在下一章节中,我们将讨论如何配置 webpack,以生成 bundle renderer 所需的构建工件(build artifact),但现在假设我们已经有了这些需要的构建工件,以下就是创建和使用 bundle renderer 的方法:
25
+
26
+ ``` js
27
+ const { createBundleRenderer } = require (' vue-server-renderer' )
28
+ const renderer = createBundleRenderer (serverBundle, {
29
+ runInNewContext: false , // 推荐
30
+ template, // (可选)页面模板
31
+ clientManifest // (可选)客户端构建 manifest
32
+ })
33
+ // 在服务器处理函数中……
34
+ server .get (' *' , (req , res ) => {
35
+ const context = { url: req .url }
36
+ // 这里无需传入一个应用程序,因为在执行 bundle 时已经自动创建过。
37
+ // 现在我们的服务器与应用程序已经解耦!
38
+ renderer .renderToString (context, (err , html ) => {
39
+ // 处理异常……
40
+ res .end (html)
41
+ })
42
+ })
43
+ ```
44
+
45
+ bundle renderer 在调用 ` renderToString ` 时,它将自动执行「由 bundle 创建的应用程序实例」所导出的函数(传入` 上下文 ` 作为参数),然后渲染它。
46
+
47
+ 注意,推荐将 ` runInNewContext ` 选项设置为 ` false ` 或 ` 'once' ` 。更多细节请查看 [ API 参考] ( ./api.md#runinnewcontext ) 。
You can’t perform that action at this time.
0 commit comments