UNPKG

2.48 kBMarkdownView Raw
1# HTML注入
2
3HTML注入主要是只在SSR阶段,根据HTTP请求,动态的向```HTML模板```里插入代码。
4
5### HTML模板
6
7默认情况,模板文件在 ```/src/html.js```。
8如下:
9```js
10export default `
11 <!DOCTYPE html>
12 <html>
13 <head>
14 <meta charset="UTF-8">
15 <title><script>//inject_title</script></title>
16 <script>//inject_metas</script>
17 <script>//inject_css</script>
18 <script>//inject_style</script>
19 </head>
20 <body>
21 <div id="boat-loader">LOADING...</div>
22 <div id="root"><script>//inject_react</script></div>
23 <script>//inject_redux</script>
24 <script>//inject_js</script>
25 </body>
26 </html>
27`
28
29```
30
31### 注入变量
32
33从上面的```HTML模板```里可以看见很多个```<script>//inject_[*]</script>```标签,这样的标签会在```SSR```阶段被动态替换成配置文件里的对应代码。
34配置文件: ```/super.js```中,```export const server = { inject }```的```inject```会指定对应关系所在的文件。
35
36默认配置是:
37```js
38// File: /super.js
39
40export const server = {
41 inject: require('./src/server/lifecycle/inject').default
42}
43```
44
45```js
46// File: /src/server/lifecycle/inject.js
47
48import getClientFilePath from 'super-project/utils/get-client-file-path'
49export default {
50 js: [getClientFilePath('client.js')], // 对应标签 <script>//inject_js</script>
51 // css: [...],
52 // ...
53 // 可自行扩展
54}
55```
56默认打包方式会把打包后的文件加上```[hash]```值,所以```Super.js```框架提供了找到被 hash 后新文件名的方法。
57
58如:```getClientFilePath('client.js')``` => ```client.8f0f500307dec12480a2.js```
59
60
61### 注入时机
62
63注入到HTML模板的代码可能是每个页面都需要的,也可能是在特定页面才需要的,所以为了减少字符串匹配的性能消耗,我们把每个页面都需要的注入标签在服务端程序启动时就替换好,有特定需求的会在页面被渲染时候才注入。
64
65注入变量 | 时机 | 必填 | 说明
66- | - | -
67js | 服务端启动 | 是 |一般是 client.js
68css | 服务端启动 | 否 | 可选,可自定义浏览器预加载的 CSS
69title | 页面渲染 | 否 | 页面标题
70metas | 页面渲染 | 否 | <meta> 标签
71redux | 页面渲染 | 是 | 服务端准备好的 redux store
72react | 页面渲染 | 是 | React 在服务端渲染好的 HTML 代码
73style | 页面渲染 | 是 | React 在服务端渲染好的 CSS 代码
74
\No newline at end of file