ssr-plugin-react 6.2.16 → 6.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +48 -0
- package/README.md +35 -24
- package/cjs/config/base.js +1 -4
- package/cjs/config/client.d.ts +0 -1
- package/cjs/config/client.js +0 -1
- package/cjs/config/index.js +0 -1
- package/cjs/config/server.js +13 -1
- package/cjs/entry/client-entry.js +2 -7
- package/cjs/entry/context.d.ts +0 -1
- package/cjs/entry/context.js +0 -1
- package/cjs/entry/create-context.js +0 -1
- package/cjs/entry/create-router.js +0 -1
- package/cjs/entry/server-entry.js +9 -24
- package/cjs/index.js +0 -1
- package/cjs/tools/vite.js +3 -1
- package/cjs/tools/webpack.js +0 -1
- package/esm/config/base.js +1 -4
- package/esm/config/client.d.ts +0 -1
- package/esm/config/client.js +0 -1
- package/esm/config/index.js +0 -1
- package/esm/config/server.js +14 -2
- package/esm/entry/client-entry.js +3 -8
- package/esm/entry/context.d.ts +0 -1
- package/esm/entry/context.js +0 -1
- package/esm/entry/create-context.js +0 -1
- package/esm/entry/create-router.js +0 -1
- package/esm/entry/server-entry.js +9 -24
- package/esm/index.js +0 -1
- package/esm/tools/vite.js +3 -1
- package/esm/tools/webpack.js +0 -1
- package/package.json +2 -1
- package/src/config/base.ts +1 -3
- package/src/config/server.ts +14 -2
- package/src/entry/client-entry.tsx +5 -10
- package/src/entry/server-entry.tsx +11 -26
- package/src/tools/vite.ts +3 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,51 @@
|
|
|
1
|
+
## [6.2.19](https://github.com/zhangyuang/ssr/compare/plugin-react@6.2.18...plugin-react@6.2.19) (2022-05-26)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* add ssr-common-utils ([c12a283](https://github.com/zhangyuang/ssr/commit/c12a283e0133285402f4af5cd0346b84f2aaf098))
|
|
7
|
+
* render add generic function overloading ([f03897f](https://github.com/zhangyuang/ssr/commit/f03897f07844d8fd5f9d2cf3eeef1a726da794bf))
|
|
8
|
+
* update chainBaseConfig ([51c1fbe](https://github.com/zhangyuang/ssr/commit/51c1fbe5a645d4701c7ebc035083096d50301891))
|
|
9
|
+
* update ssr-common-utils ([c7cadc1](https://github.com/zhangyuang/ssr/commit/c7cadc14922383f8fdaa6c76b4dbe9c220d0ac72))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## [6.2.18](https://github.com/zhangyuang/ssr/compare/plugin-react@6.2.17...plugin-react@6.2.18) (2022-05-13)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Bug Fixes
|
|
17
|
+
|
|
18
|
+
* add prefix output to window.prefix in csr mode ([#197](https://github.com/zhangyuang/ssr/issues/197)) ([479bb3d](https://github.com/zhangyuang/ssr/commit/479bb3df67d7da5635939a4219b5f5f9a40b5508))
|
|
19
|
+
* build html ([83be7be](https://github.com/zhangyuang/ssr/commit/83be7be185985a5dcbb9b8e846a5e2b14b94c1b0))
|
|
20
|
+
* build html ([59a8d7f](https://github.com/zhangyuang/ssr/commit/59a8d7f31bed703601e753d02db49ea5a0f93054))
|
|
21
|
+
* plugin-react without dynamic mode ([487cc84](https://github.com/zhangyuang/ssr/commit/487cc84188640aab13c27214df758da0d19e4368))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Features
|
|
25
|
+
|
|
26
|
+
* add .vue to defaultWhiteList ([dbabfa2](https://github.com/zhangyuang/ssr/commit/dbabfa2864ec0a5487aadc31286da5630a8603fc))
|
|
27
|
+
* add `turbo` ([#196](https://github.com/zhangyuang/ssr/issues/196)) ([2be17bb](https://github.com/zhangyuang/ssr/commit/2be17bba5d80610b97b3813b3d4fe9579f88e5c3))
|
|
28
|
+
* babelExtraModule support vue ([06251e7](https://github.com/zhangyuang/ssr/commit/06251e716678e1f882f06f68f72c518a341de0d7))
|
|
29
|
+
* babelExtraModule support vue ([513073d](https://github.com/zhangyuang/ssr/commit/513073ddcecbb728d34eae233686a93d63355e00))
|
|
30
|
+
* update turbo ([9ee14f5](https://github.com/zhangyuang/ssr/commit/9ee14f59359187e35f4ef990998846ac3847347b))
|
|
31
|
+
* use terser minify plugin-react server bundle ([0a3c7fe](https://github.com/zhangyuang/ssr/commit/0a3c7fe61908fe24bcb2d8c6394daf2afd18ba82))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
## [6.2.17](https://github.com/zhangyuang/ssr/compare/plugin-react@6.2.16...plugin-react@6.2.17) (2022-05-05)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
### Bug Fixes
|
|
39
|
+
|
|
40
|
+
* add build:publish disable sourcemap ([ef82b29](https://github.com/zhangyuang/ssr/commit/ef82b298ddf19b72b130d76c33bfbca67339b139))
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
### Features
|
|
44
|
+
|
|
45
|
+
* optimize code remove disableClientRender fix vite ([eeff477](https://github.com/zhangyuang/ssr/commit/eeff4770f8d9ff400289cf4d1ca4dd32883be108))
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
1
49
|
## [6.2.16](https://github.com/zhangyuang/ssr/compare/plugin-react@6.2.15...plugin-react@6.2.16) (2022-05-04)
|
|
2
50
|
|
|
3
51
|
|
package/README.md
CHANGED
|
@@ -51,31 +51,33 @@
|
|
|
51
51
|
<td align="center"><a target="_blank" href="http://youku.com/"><img src="https://img.alicdn.com/tfs/TB17DTuXkH0gK0jSZPiXXavapXa-680-133.svg" width="120"/><br />
|
|
52
52
|
<sub><b>优酷视频
|
|
53
53
|
</b></td>
|
|
54
|
-
<td align="center" style="width: 120px;"><a target="_blank" href="
|
|
54
|
+
<td align="center" style="width: 120px;"><a target="_blank" href="#"><img src="https://wxa-shop-1258344707.cos.ap-shanghai.myqcloud.com/test/cdn/c8e49fda-d8ef-4332-a2c0-8c9e571883f5.jpeg?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDtb4HEuJSLyJNCk11kCNHvIPGp8AvQfdK%26q-sign-time%3D1653378495%3B4294967040%26q-key-time%3D1653378495%3B4294967040%26q-header-list%3Dhost%26q-url-param-list%3D%26q-signature%3D2d09dc5ceec264a030da16b747477adf0ae5b647
|
|
55
|
+
" width="120"/><br><sub><b>微信公众平台
|
|
55
56
|
</b></sub></a></td>
|
|
57
|
+
<td align="center" style="height: 100px"><a href="#" target="_blank"><img src="https://res.wx.qq.com/op_res/wy4vvtyfqW8HjIfBKjba6TNEFBHuAApjJ1FjSQ37OVIdIYtylmiBm2ZeJ79SRtmT4IipU69bDNDw0Rrdnjd9yg
|
|
58
|
+
" width="200px;margin: 20px 0" /><br />
|
|
59
|
+
<a href="#" target="_bvlank"><b>腾讯体育
|
|
60
|
+
</b></a></td>
|
|
61
|
+
<td align="center" style="height: 100px"><a href="#" target="_blank"><img src="https://res.wx.qq.com/op_res/qc0sXfbvOvZFKVaDy9OLsqHfwHg6U4AemN2MP6YUxEo0EWpK6RyRcj70bIf3GEg5y_WA1wuv4HcfYi2FP7Awkw
|
|
62
|
+
" width="200px;margin: 20px 0" /><br />
|
|
63
|
+
<a href="#" target="_bvlank"><b>QQ会员
|
|
64
|
+
</b></a></td>
|
|
65
|
+
<td align="center" style="height: 100px"><a href="https://m.film.qq.com/x/tva-vip-center/" target="_blank"><img src="https://res.wx.qq.com/op_res/x7sWI9AfUK1QwH0EDhKp4e_bGWxYOQ_1RlZqBFy9JntJzaE4aRzNhVgmxLNloAFpSQ-mBr9X9pux3QlV9QHHvQ" width="200px;margin: 20px 0" /><br />
|
|
66
|
+
<a href="https://m.film.qq.com/x/tva-vip-center/" target="_bvlank"><b>腾讯视频
|
|
67
|
+
</b></a></td>
|
|
56
68
|
<td align="center"><a href="https://www.niuniuda.com/mall" target="_blank"><img src="https://img.alicdn.com/tfs/TB1df_8pBr0gK0jSZFnXXbRRXXa-160-60.png" width="120" alt="牛牛搭"/><br />
|
|
57
69
|
<a href="https://www.niuniuda.com/mall" target="_blank"><sub><b>牛牛搭
|
|
58
70
|
</b></a></td>
|
|
59
71
|
<td align="center"><a href="https://www.gszq.com/" target="_blank"><img src="https://www.gszq.com/static/media/icon-slogan.4d1c7974.png
|
|
60
|
-
" width="120"
|
|
72
|
+
" width="120"/><br />
|
|
61
73
|
<a href="https://www.gszq.com/" target="_bvlank"><sub><b>国盛证券
|
|
62
74
|
</b></a></td>
|
|
63
75
|
<td align="center"><a href="https://m.isle.org.cn" target="_blank"><img src="https://res.wx.qq.com/op_res/qzBjcpT1AZDopDDkEJfj5gKFADotYHTgD33lz9xvZUIj7VJaIR_8HE4lfOxwaiYBgi4V2xXm0xLmAcdQxF4IrQ" width="120" alt="三易科技"/><br />
|
|
64
76
|
<a href="https://m.isle.org.cn" target="_bvlank"><sub><b>三易科技
|
|
65
77
|
</b></a></td>
|
|
66
|
-
<td align="center"><a href="https://
|
|
67
|
-
</b></a></td>
|
|
68
|
-
<td align="center"><a href="https://wecard.qq.com/index/" target="_blank"><img src="https://img.alicdn.com/tfs/TB1pTZGrFT7gK0jSZFpXXaTkpXa-164-164.jpg" width="120" alt="腾讯微卡"/><br />
|
|
78
|
+
<td align="center"><a href="https://wecard.qq.com/index/" target="_blank"><img src="https://img.alicdn.com/tfs/TB1pTZGrFT7gK0jSZFpXXaTkpXa-164-164.jpg" width="120"/><br />
|
|
69
79
|
<a href="https://wecard.qq.com/index/" target="_blank"><sub><b>腾讯微卡
|
|
70
80
|
</b></a></td>
|
|
71
|
-
<td align="center" style="height: 100px"><a href="https://www.habisummercamp.com/" target="_blank"><img src="https://res.wx.qq.com/op_res/XXUpF56bDue53vZadoCSPSnqKF3bZqPOQnqsPa_ngEARa0OUIW22pX7eKsftPb6pc5ny62cR_wXM4g5xJ7G3DQ
|
|
72
|
-
" width="200px;margin: 20px 0" alt="Happy"/><br />
|
|
73
|
-
<a href="https://www.habisummercamp.com/" target="_bvlank"><b>HappyPC
|
|
74
|
-
</b></a></td>
|
|
75
|
-
<td align="center" style="height: 100px"><a href="https://m.habisummercamp.com/" target="_blank"><img src="https://res.wx.qq.com/op_res/XXUpF56bDue53vZadoCSPSnqKF3bZqPOQnqsPa_ngEARa0OUIW22pX7eKsftPb6pc5ny62cR_wXM4g5xJ7G3DQ
|
|
76
|
-
" width="200px;margin: 20px 0" alt="Happy"/><br />
|
|
77
|
-
<a href="https://m.habisummercamp.com/" target="_bvlank"><b>HappyMobile
|
|
78
|
-
</b></a></td>
|
|
79
81
|
</tr>
|
|
80
82
|
<tr>
|
|
81
83
|
<td align="center"><a href="https://syzs.qq.com/" target="_blank"><img src="images/syzs.png" width="120" alt="腾讯手游助手"/><br />
|
|
@@ -88,12 +90,9 @@
|
|
|
88
90
|
</b></sub></a></td>
|
|
89
91
|
<td align="center"><a target="_blank" href="http://tx.ssr-fc.com/"><img src="http://s0.60logo.com/uploads/items/images/soft/180126/tengxunyun.svg" width="120"/><br><sub><b>部署于腾讯云示例应用
|
|
90
92
|
</b></sub></a></td>
|
|
91
|
-
<td align="center"><a href="https://www.100.com/" target="_blank"><img src="https://oss.bs2dl.100.com/hippo/config/f13ee98cfca7ce13888752c1261081b44bd356fd.png" width="120"
|
|
93
|
+
<td align="center"><a href="https://www.100.com/" target="_blank"><img src="https://oss.bs2dl.100.com/hippo/config/f13ee98cfca7ce13888752c1261081b44bd356fd.png" width="120" /><br />
|
|
92
94
|
<a href="https://www.100.com/" target="_bvlank"><sub><b>100教育
|
|
93
95
|
</b></a></td>
|
|
94
|
-
<td align="center" style="height: 100px"><a href="https://m.film.qq.com/x/tva-vip-center/" target="_blank"><img src="https://res.wx.qq.com/op_res/x7sWI9AfUK1QwH0EDhKp4e_bGWxYOQ_1RlZqBFy9JntJzaE4aRzNhVgmxLNloAFpSQ-mBr9X9pux3QlV9QHHvQ" width="200px;margin: 20px 0" alt="腾讯视频"/><br />
|
|
95
|
-
<a href="https://m.film.qq.com/x/tva-vip-center/" target="_bvlank"><b>腾讯视频
|
|
96
|
-
</b></a></td>
|
|
97
96
|
<td align="center" style="height: 100px"><a href="https://blog.dreamer2q.wang/" target="_blank"><img src="https://res.wx.qq.com/op_res/MxxGgjPFRiTgjiReUefs2aMce-SgNvxxTB9U87YYhcOu6KPw9er7r2Lc0ne-b90nFstTUpc8REDwpxfUreKV1g" width="200px;margin: 20px 0" alt="Dream2qBlog"/><br />
|
|
98
97
|
<a href="https://blog.dreamer2q.wang/" target="_bvlank"><b>个人博客
|
|
99
98
|
</b></a></td>
|
|
@@ -105,18 +104,30 @@
|
|
|
105
104
|
</b></a></td>
|
|
106
105
|
</tr>
|
|
107
106
|
<tr>
|
|
107
|
+
<td align="center" style="height: 100px"><a href="https://www.habisummercamp.com/" target="_blank"><img src="https://res.wx.qq.com/op_res/XXUpF56bDue53vZadoCSPSnqKF3bZqPOQnqsPa_ngEARa0OUIW22pX7eKsftPb6pc5ny62cR_wXM4g5xJ7G3DQ
|
|
108
|
+
" width="200px;margin: 20px 0" alt="Happy"/><br />
|
|
109
|
+
<a href="https://www.habisummercamp.com/" target="_bvlank"><b>HappyPC
|
|
110
|
+
</b></a></td>
|
|
111
|
+
<td align="center" style="height: 100px"><a href="https://m.habisummercamp.com/" target="_blank"><img src="https://res.wx.qq.com/op_res/XXUpF56bDue53vZadoCSPSnqKF3bZqPOQnqsPa_ngEARa0OUIW22pX7eKsftPb6pc5ny62cR_wXM4g5xJ7G3DQ
|
|
112
|
+
" width="200px;margin: 20px 0" alt="Happy"/><br />
|
|
113
|
+
<a href="https://m.habisummercamp.com/" target="_bvlank"><b>HappyMobile
|
|
114
|
+
</b></a></td>
|
|
115
|
+
<td align="center" style="width: 120px;"><a target="_blank" href="https://yulebao.alibaba.com/"><img src="https://gw.alicdn.com/tfs/TB1CmlIIFT7gK0jSZFpXXaTkpXa-190-46.png" width="120"/><br><sub><b>阿里影业娱乐宝
|
|
116
|
+
</b></sub></a></td>
|
|
108
117
|
<td align="center"><a target="_blank" href="https://campaign.vmate.com/vrbollywood"><img src="https://img.alicdn.com/tfs/TB17p6Vhbj1gK0jSZFOXXc7GpXa-512-512.png" width="120" alt="vmate 积分商城"/><br />
|
|
109
118
|
<a target="_blank" href="https://job.alibaba.com/zhaopin/position_detail.htm?trace=qrcode_share&positionCode=GP524819"><sub><b>Vmate短视频
|
|
110
119
|
</b></a></td>
|
|
111
120
|
<td align="center"><a target="_blank" href="https://enjoysales.paat.com/"><img src="https://img.alicdn.com/tfs/TB1Ma0BiEY1gK0jSZFMXXaWcVXa-836-836.png" width="120" alt="火炽星原CRM"/><br />
|
|
112
121
|
<a target="_blank" href="https://enjoysales.paat.com/"><sub><b>火炽星原CRM
|
|
113
122
|
</b></a></td>
|
|
114
|
-
<td align="center" style="height: 100px"><a href="https://www.paixin.com/" target="_blank"><img src="https://www.paixin.com/favicon.ico" width="200px;margin: 20px 0"
|
|
123
|
+
<td align="center" style="height: 100px"><a href="https://www.paixin.com/" target="_blank"><img src="https://www.paixin.com/favicon.ico" width="200px;margin: 20px 0" /><br />
|
|
115
124
|
<a href="https://www.paixin.com/" target="_bvlank"><b>拍信创意
|
|
116
125
|
</b></a></td>
|
|
117
126
|
<td align="center"><a href="https://www.66tools.com/" target="_blank"><img src="https://cdn.66tools.com/extension/chrome_qrcode_avatar.png" width="120" alt="极速二维码"/><br />
|
|
118
127
|
<a href="https://www.66tools.com/" target="_bvlank"><sub><b>极速二维码
|
|
119
128
|
</b></a></td>
|
|
129
|
+
<td align="center"><a href="https://help.seewo.com/" target="_blank"><img src="https://img.alicdn.com/tfs/TB11Xo3q4v1gK0jSZFFXXb0sXXa-350-55.png" width="120" alt="cvte"/><br /><a href="https://help.seewo.com/" target="_blank"><sub><b>希沃帮助中心
|
|
130
|
+
</b></a></td>
|
|
120
131
|
</tr>
|
|
121
132
|
</table>
|
|
122
133
|
|
|
@@ -282,17 +293,17 @@ $ yarn start:vite # 以 vite 模式启动,等价于 npx ssr start --vite
|
|
|
282
293
|
|
|
283
294
|
```bash
|
|
284
295
|
$ cloc packages --include-ext=ts
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
296
|
+
993 text files.
|
|
297
|
+
679 unique files.
|
|
298
|
+
829 files ignored.
|
|
288
299
|
|
|
289
|
-
github.com/AlDanial/cloc v 1.90 T=0.
|
|
300
|
+
github.com/AlDanial/cloc v 1.90 T=0.62 s (264.7 files/s, 9026.5 lines/s)
|
|
290
301
|
-------------------------------------------------------------------------------
|
|
291
302
|
Language files blank comment code
|
|
292
303
|
-------------------------------------------------------------------------------
|
|
293
|
-
TypeScript
|
|
304
|
+
TypeScript 164 471 195 4927
|
|
294
305
|
-------------------------------------------------------------------------------
|
|
295
|
-
SUM:
|
|
306
|
+
SUM: 164 471 195 4927
|
|
296
307
|
-------------------------------------------------------------------------------
|
|
297
308
|
```
|
|
298
309
|
|
package/cjs/config/base.js
CHANGED
|
@@ -82,8 +82,6 @@ const getBaseConfig = (chain, isServer) => {
|
|
|
82
82
|
chain.module
|
|
83
83
|
.rule('mjs')
|
|
84
84
|
.test(/\.mjs/)
|
|
85
|
-
.include
|
|
86
|
-
.add(/node_modules/).end()
|
|
87
85
|
.type('javascript/auto')
|
|
88
86
|
.end();
|
|
89
87
|
const module = chain.module
|
|
@@ -134,8 +132,7 @@ const getBaseConfig = (chain, isServer) => {
|
|
|
134
132
|
...(isServer ? define === null || define === void 0 ? void 0 : define.server : define === null || define === void 0 ? void 0 : define.client),
|
|
135
133
|
...define === null || define === void 0 ? void 0 : define.base
|
|
136
134
|
}]);
|
|
137
|
-
chainBaseConfig(chain);
|
|
135
|
+
chainBaseConfig(chain, isServer);
|
|
138
136
|
return config;
|
|
139
137
|
};
|
|
140
138
|
exports.getBaseConfig = getBaseConfig;
|
|
141
|
-
//# sourceMappingURL=base.js.map
|
package/cjs/config/client.d.ts
CHANGED
package/cjs/config/client.js
CHANGED
package/cjs/config/index.js
CHANGED
package/cjs/config/server.js
CHANGED
|
@@ -8,6 +8,7 @@ const base_1 = require("./base");
|
|
|
8
8
|
const getServerWebpack = (chain) => {
|
|
9
9
|
const config = (0, ssr_server_utils_1.loadConfig)();
|
|
10
10
|
const { isDev, cwd, getOutput, chainServerConfig, whiteList, chunkName } = config;
|
|
11
|
+
const shouldUseSourceMap = isDev || Boolean(process.env.GENERATE_SOURCEMAP);
|
|
11
12
|
(0, base_1.getBaseConfig)(chain, true);
|
|
12
13
|
chain.devtool(isDev ? 'inline-source-map' : false);
|
|
13
14
|
chain.target('node');
|
|
@@ -25,6 +26,18 @@ const getServerWebpack = (chain) => {
|
|
|
25
26
|
// externals Dir contains example/xxx/node_modules ssr/node_modules
|
|
26
27
|
modulesDir
|
|
27
28
|
}));
|
|
29
|
+
if (!isDev) {
|
|
30
|
+
chain.optimization.minimizer('terser')
|
|
31
|
+
.use((0, ssr_server_utils_1.loadModuleFromFramework)('terser-webpack-plugin'), [{
|
|
32
|
+
terserOptions: {
|
|
33
|
+
keep_fnames: true
|
|
34
|
+
},
|
|
35
|
+
extractComments: false,
|
|
36
|
+
parallel: true,
|
|
37
|
+
cache: true,
|
|
38
|
+
sourceMap: shouldUseSourceMap
|
|
39
|
+
}]);
|
|
40
|
+
}
|
|
28
41
|
chain.when(isDev, () => {
|
|
29
42
|
chain.watch(true);
|
|
30
43
|
});
|
|
@@ -35,4 +48,3 @@ const getServerWebpack = (chain) => {
|
|
|
35
48
|
return chain.toConfig();
|
|
36
49
|
};
|
|
37
50
|
exports.getServerWebpack = getServerWebpack;
|
|
38
|
-
//# sourceMappingURL=server.js.map
|
|
@@ -14,7 +14,7 @@ const clientRender = async () => {
|
|
|
14
14
|
return props.children;
|
|
15
15
|
};
|
|
16
16
|
// 客户端渲染||hydrate
|
|
17
|
-
const baseName =
|
|
17
|
+
const baseName = (0, ssr_client_utils_1.isMicro)() ? window.clientPrefix : window.prefix;
|
|
18
18
|
const routes = await (0, ssr_client_utils_1.preloadComponent)(FeRoutes, baseName);
|
|
19
19
|
ReactDOM[window.__USE_SSR__ ? 'hydrate' : 'render'](React.createElement(react_router_dom_1.BrowserRouter, { basename: baseName },
|
|
20
20
|
React.createElement(context_1.AppContext, null,
|
|
@@ -31,9 +31,4 @@ const clientRender = async () => {
|
|
|
31
31
|
})))))), document.getElementById('app'));
|
|
32
32
|
};
|
|
33
33
|
exports.clientRender = clientRender;
|
|
34
|
-
|
|
35
|
-
// 如果服务端直出的时候带上该记号,则默认不进行客户端渲染,将处理逻辑交给上层
|
|
36
|
-
// 可用于微前端场景下自定义什么时候进行组件渲染的逻辑调用
|
|
37
|
-
clientRender();
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=client-entry.js.map
|
|
34
|
+
clientRender();
|
package/cjs/entry/context.d.ts
CHANGED
package/cjs/entry/context.js
CHANGED
|
@@ -11,7 +11,7 @@ const create_router_1 = require("./create-router");
|
|
|
11
11
|
const { FeRoutes, layoutFetch, state, Layout } = create_router_1.Routes;
|
|
12
12
|
const serverRender = async (ctx, config) => {
|
|
13
13
|
var _a;
|
|
14
|
-
const { mode, parallelFetch,
|
|
14
|
+
const { mode, parallelFetch, prefix, isVite, isDev, clientPrefix } = config;
|
|
15
15
|
const path = (0, ssr_server_utils_1.normalizePath)(ctx.request.path, prefix);
|
|
16
16
|
const routeItem = (0, ssr_server_utils_1.findRoute)(FeRoutes, path);
|
|
17
17
|
if (!routeItem) {
|
|
@@ -24,39 +24,25 @@ const serverRender = async (ctx, config) => {
|
|
|
24
24
|
const dynamicCssOrder = await (0, ssr_server_utils_1.getAsyncCssChunk)(ctx, webpackChunkName);
|
|
25
25
|
const dynamicJsOrder = await (0, ssr_server_utils_1.getAsyncJsChunk)(ctx);
|
|
26
26
|
const manifest = await (0, ssr_server_utils_1.getManifest)(config);
|
|
27
|
-
const injectCss = [
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
injectCss.push(React.createElement("script", { key: "vite-react-refresh", type: "module", dangerouslySetInnerHTML: {
|
|
27
|
+
const injectCss = (isVite && isDev) ? [
|
|
28
|
+
React.createElement("script", { src: "/@vite/client", type: "module", key: "vite-client" }),
|
|
29
|
+
React.createElement("script", { key: "vite-react-refresh", type: "module", dangerouslySetInnerHTML: {
|
|
31
30
|
__html: ssr_server_utils_1.reactRefreshFragment
|
|
32
|
-
} })
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
dynamicCssOrder.forEach(css => {
|
|
36
|
-
if (manifest[css]) {
|
|
37
|
-
const item = manifest[css];
|
|
38
|
-
injectCss.push(React.createElement("link", { rel: 'stylesheet', key: item, href: item }));
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
if (disableClientRender) {
|
|
43
|
-
injectCss.push(React.createElement("script", { key: "disableClientRender", dangerouslySetInnerHTML: {
|
|
44
|
-
__html: 'window.__disableClientRender__ = true'
|
|
45
|
-
} }));
|
|
46
|
-
}
|
|
31
|
+
} })
|
|
32
|
+
] : dynamicCssOrder.map(css => manifest[css]).filter(Boolean).map(css => React.createElement("link", { rel: 'stylesheet', key: css, href: css }));
|
|
47
33
|
const injectScript = [
|
|
48
34
|
...(isVite ? [React.createElement("script", { key: "viteWindowInit", dangerouslySetInnerHTML: {
|
|
49
35
|
__html: 'window.__USE_VITE__=true'
|
|
50
36
|
} })] : []),
|
|
51
37
|
...((isVite && isDev) ? [React.createElement("script", { type: "module", src: '/node_modules/ssr-plugin-react/esm/entry/client-entry.js', key: "vite-react-entry" })] : []),
|
|
52
|
-
...dynamicJsOrder.map(js => manifest[js]).filter(
|
|
38
|
+
...dynamicJsOrder.map(js => manifest[js]).filter(Boolean).map(item => React.createElement("script", { key: item, src: item, type: isVite ? 'module' : '' }))
|
|
53
39
|
];
|
|
54
40
|
const staticList = {
|
|
55
41
|
injectCss,
|
|
56
42
|
injectScript
|
|
57
43
|
};
|
|
58
44
|
const isCsr = !!(mode === 'csr' || ((_a = ctx.request.query) === null || _a === void 0 ? void 0 : _a.csr));
|
|
59
|
-
const Component = isCsr ? React.Fragment : (await component()).default;
|
|
45
|
+
const Component = isCsr ? React.Fragment : (component.name === 'dynamicComponent' ? (await component()).default : component);
|
|
60
46
|
if (isCsr) {
|
|
61
47
|
(0, ssr_server_utils_1.logGreen)(`Current path ${path} use csr render mode`);
|
|
62
48
|
}
|
|
@@ -77,7 +63,7 @@ const serverRender = async (ctx, config) => {
|
|
|
77
63
|
}
|
|
78
64
|
}
|
|
79
65
|
const combineData = isCsr ? null : Object.assign(state !== null && state !== void 0 ? state : {}, layoutFetchData !== null && layoutFetchData !== void 0 ? layoutFetchData : {}, fetchData !== null && fetchData !== void 0 ? fetchData : {});
|
|
80
|
-
const injectState = isCsr ?
|
|
66
|
+
const injectState = isCsr ? React.createElement("script", { dangerouslySetInnerHTML: { __html: `window.prefix="${prefix}"` } }) : React.createElement("script", { dangerouslySetInnerHTML: {
|
|
81
67
|
__html: `window.__USE_SSR__=true; window.__INITIAL_DATA__ =${(0, ssr_serialize_javascript_1.serialize)(combineData)}; window.prefix="${prefix}";${clientPrefix && `window.clientPrefix="${clientPrefix}"`}`
|
|
82
68
|
} });
|
|
83
69
|
return (React.createElement(react_router_dom_1.StaticRouter, { location: ctx.request.url },
|
|
@@ -86,4 +72,3 @@ const serverRender = async (ctx, config) => {
|
|
|
86
72
|
React.createElement(Component, null)))));
|
|
87
73
|
};
|
|
88
74
|
exports.serverRender = serverRender;
|
|
89
|
-
//# sourceMappingURL=server-entry.js.map
|
package/cjs/index.js
CHANGED
package/cjs/tools/vite.js
CHANGED
|
@@ -39,6 +39,9 @@ const serverConfig = {
|
|
|
39
39
|
(_g = (_f = viteConfig === null || viteConfig === void 0 ? void 0 : viteConfig()) === null || _f === void 0 ? void 0 : _f.server) === null || _g === void 0 ? void 0 : _g.extraPlugin,
|
|
40
40
|
(0, vite_plugin_style_import_1.default)(styleImportConfig)
|
|
41
41
|
],
|
|
42
|
+
esbuild: {
|
|
43
|
+
keepNames: true
|
|
44
|
+
},
|
|
42
45
|
build: {
|
|
43
46
|
ssr: reactServerEntry,
|
|
44
47
|
outDir: serverOutPut,
|
|
@@ -97,4 +100,3 @@ const viteBuild = async () => {
|
|
|
97
100
|
await (0, vite_1.build)({ ...serverConfig, mode: 'production' });
|
|
98
101
|
};
|
|
99
102
|
exports.viteBuild = viteBuild;
|
|
100
|
-
//# sourceMappingURL=vite.js.map
|
package/cjs/tools/webpack.js
CHANGED
package/esm/config/base.js
CHANGED
|
@@ -79,8 +79,6 @@ const getBaseConfig = (chain, isServer) => {
|
|
|
79
79
|
chain.module
|
|
80
80
|
.rule('mjs')
|
|
81
81
|
.test(/\.mjs/)
|
|
82
|
-
.include
|
|
83
|
-
.add(/node_modules/).end()
|
|
84
82
|
.type('javascript/auto')
|
|
85
83
|
.end();
|
|
86
84
|
const module = chain.module
|
|
@@ -131,8 +129,7 @@ const getBaseConfig = (chain, isServer) => {
|
|
|
131
129
|
...(isServer ? define === null || define === void 0 ? void 0 : define.server : define === null || define === void 0 ? void 0 : define.client),
|
|
132
130
|
...define === null || define === void 0 ? void 0 : define.base
|
|
133
131
|
}]);
|
|
134
|
-
chainBaseConfig(chain);
|
|
132
|
+
chainBaseConfig(chain, isServer);
|
|
135
133
|
return config;
|
|
136
134
|
};
|
|
137
135
|
export { getBaseConfig };
|
|
138
|
-
//# sourceMappingURL=base.js.map
|
package/esm/config/client.d.ts
CHANGED
package/esm/config/client.js
CHANGED
package/esm/config/index.js
CHANGED
package/esm/config/server.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { join } from 'path';
|
|
2
|
-
import { loadConfig, getLocalNodeModules, nodeExternals } from 'ssr-server-utils';
|
|
2
|
+
import { loadConfig, getLocalNodeModules, nodeExternals, loadModuleFromFramework } from 'ssr-server-utils';
|
|
3
3
|
import * as webpack from 'webpack';
|
|
4
4
|
import { getBaseConfig } from './base';
|
|
5
5
|
const getServerWebpack = (chain) => {
|
|
6
6
|
const config = loadConfig();
|
|
7
7
|
const { isDev, cwd, getOutput, chainServerConfig, whiteList, chunkName } = config;
|
|
8
|
+
const shouldUseSourceMap = isDev || Boolean(process.env.GENERATE_SOURCEMAP);
|
|
8
9
|
getBaseConfig(chain, true);
|
|
9
10
|
chain.devtool(isDev ? 'inline-source-map' : false);
|
|
10
11
|
chain.target('node');
|
|
@@ -22,6 +23,18 @@ const getServerWebpack = (chain) => {
|
|
|
22
23
|
// externals Dir contains example/xxx/node_modules ssr/node_modules
|
|
23
24
|
modulesDir
|
|
24
25
|
}));
|
|
26
|
+
if (!isDev) {
|
|
27
|
+
chain.optimization.minimizer('terser')
|
|
28
|
+
.use(loadModuleFromFramework('terser-webpack-plugin'), [{
|
|
29
|
+
terserOptions: {
|
|
30
|
+
keep_fnames: true
|
|
31
|
+
},
|
|
32
|
+
extractComments: false,
|
|
33
|
+
parallel: true,
|
|
34
|
+
cache: true,
|
|
35
|
+
sourceMap: shouldUseSourceMap
|
|
36
|
+
}]);
|
|
37
|
+
}
|
|
25
38
|
chain.when(isDev, () => {
|
|
26
39
|
chain.watch(true);
|
|
27
40
|
});
|
|
@@ -32,4 +45,3 @@ const getServerWebpack = (chain) => {
|
|
|
32
45
|
return chain.toConfig();
|
|
33
46
|
};
|
|
34
47
|
export { getServerWebpack };
|
|
35
|
-
//# sourceMappingURL=server.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import * as ReactDOM from 'react-dom';
|
|
3
3
|
import { BrowserRouter, Route, Switch } from 'react-router-dom';
|
|
4
|
-
import { preloadComponent } from 'ssr-client-utils';
|
|
4
|
+
import { preloadComponent, isMicro } from 'ssr-client-utils';
|
|
5
5
|
import { wrapComponent } from 'ssr-hoc-react';
|
|
6
6
|
import { Routes } from './create-router';
|
|
7
7
|
import { AppContext } from './context';
|
|
@@ -11,7 +11,7 @@ const clientRender = async () => {
|
|
|
11
11
|
return props.children;
|
|
12
12
|
};
|
|
13
13
|
// 客户端渲染||hydrate
|
|
14
|
-
const baseName =
|
|
14
|
+
const baseName = isMicro() ? window.clientPrefix : window.prefix;
|
|
15
15
|
const routes = await preloadComponent(FeRoutes, baseName);
|
|
16
16
|
ReactDOM[window.__USE_SSR__ ? 'hydrate' : 'render'](React.createElement(BrowserRouter, { basename: baseName },
|
|
17
17
|
React.createElement(AppContext, null,
|
|
@@ -27,10 +27,5 @@ const clientRender = async () => {
|
|
|
27
27
|
return (React.createElement(Route, { exact: true, key: path, path: path, render: () => React.createElement(WrappedComponent, { key: location.pathname }) }));
|
|
28
28
|
})))))), document.getElementById('app'));
|
|
29
29
|
};
|
|
30
|
-
|
|
31
|
-
// 如果服务端直出的时候带上该记号,则默认不进行客户端渲染,将处理逻辑交给上层
|
|
32
|
-
// 可用于微前端场景下自定义什么时候进行组件渲染的逻辑调用
|
|
33
|
-
clientRender();
|
|
34
|
-
}
|
|
30
|
+
clientRender();
|
|
35
31
|
export { clientRender };
|
|
36
|
-
//# sourceMappingURL=client-entry.js.map
|
package/esm/entry/context.d.ts
CHANGED
package/esm/entry/context.js
CHANGED
|
@@ -8,7 +8,7 @@ import { Routes } from './create-router';
|
|
|
8
8
|
const { FeRoutes, layoutFetch, state, Layout } = Routes;
|
|
9
9
|
const serverRender = async (ctx, config) => {
|
|
10
10
|
var _a;
|
|
11
|
-
const { mode, parallelFetch,
|
|
11
|
+
const { mode, parallelFetch, prefix, isVite, isDev, clientPrefix } = config;
|
|
12
12
|
const path = normalizePath(ctx.request.path, prefix);
|
|
13
13
|
const routeItem = findRoute(FeRoutes, path);
|
|
14
14
|
if (!routeItem) {
|
|
@@ -21,39 +21,25 @@ const serverRender = async (ctx, config) => {
|
|
|
21
21
|
const dynamicCssOrder = await getAsyncCssChunk(ctx, webpackChunkName);
|
|
22
22
|
const dynamicJsOrder = await getAsyncJsChunk(ctx);
|
|
23
23
|
const manifest = await getManifest(config);
|
|
24
|
-
const injectCss = [
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
injectCss.push(React.createElement("script", { key: "vite-react-refresh", type: "module", dangerouslySetInnerHTML: {
|
|
24
|
+
const injectCss = (isVite && isDev) ? [
|
|
25
|
+
React.createElement("script", { src: "/@vite/client", type: "module", key: "vite-client" }),
|
|
26
|
+
React.createElement("script", { key: "vite-react-refresh", type: "module", dangerouslySetInnerHTML: {
|
|
28
27
|
__html: reactRefreshFragment
|
|
29
|
-
} })
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
dynamicCssOrder.forEach(css => {
|
|
33
|
-
if (manifest[css]) {
|
|
34
|
-
const item = manifest[css];
|
|
35
|
-
injectCss.push(React.createElement("link", { rel: 'stylesheet', key: item, href: item }));
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
if (disableClientRender) {
|
|
40
|
-
injectCss.push(React.createElement("script", { key: "disableClientRender", dangerouslySetInnerHTML: {
|
|
41
|
-
__html: 'window.__disableClientRender__ = true'
|
|
42
|
-
} }));
|
|
43
|
-
}
|
|
28
|
+
} })
|
|
29
|
+
] : dynamicCssOrder.map(css => manifest[css]).filter(Boolean).map(css => React.createElement("link", { rel: 'stylesheet', key: css, href: css }));
|
|
44
30
|
const injectScript = [
|
|
45
31
|
...(isVite ? [React.createElement("script", { key: "viteWindowInit", dangerouslySetInnerHTML: {
|
|
46
32
|
__html: 'window.__USE_VITE__=true'
|
|
47
33
|
} })] : []),
|
|
48
34
|
...((isVite && isDev) ? [React.createElement("script", { type: "module", src: '/node_modules/ssr-plugin-react/esm/entry/client-entry.js', key: "vite-react-entry" })] : []),
|
|
49
|
-
...dynamicJsOrder.map(js => manifest[js]).filter(
|
|
35
|
+
...dynamicJsOrder.map(js => manifest[js]).filter(Boolean).map(item => React.createElement("script", { key: item, src: item, type: isVite ? 'module' : '' }))
|
|
50
36
|
];
|
|
51
37
|
const staticList = {
|
|
52
38
|
injectCss,
|
|
53
39
|
injectScript
|
|
54
40
|
};
|
|
55
41
|
const isCsr = !!(mode === 'csr' || ((_a = ctx.request.query) === null || _a === void 0 ? void 0 : _a.csr));
|
|
56
|
-
const Component = isCsr ? React.Fragment : (await component()).default;
|
|
42
|
+
const Component = isCsr ? React.Fragment : (component.name === 'dynamicComponent' ? (await component()).default : component);
|
|
57
43
|
if (isCsr) {
|
|
58
44
|
logGreen(`Current path ${path} use csr render mode`);
|
|
59
45
|
}
|
|
@@ -74,7 +60,7 @@ const serverRender = async (ctx, config) => {
|
|
|
74
60
|
}
|
|
75
61
|
}
|
|
76
62
|
const combineData = isCsr ? null : Object.assign(state !== null && state !== void 0 ? state : {}, layoutFetchData !== null && layoutFetchData !== void 0 ? layoutFetchData : {}, fetchData !== null && fetchData !== void 0 ? fetchData : {});
|
|
77
|
-
const injectState = isCsr ?
|
|
63
|
+
const injectState = isCsr ? React.createElement("script", { dangerouslySetInnerHTML: { __html: `window.prefix="${prefix}"` } }) : React.createElement("script", { dangerouslySetInnerHTML: {
|
|
78
64
|
__html: `window.__USE_SSR__=true; window.__INITIAL_DATA__ =${serialize(combineData)}; window.prefix="${prefix}";${clientPrefix && `window.clientPrefix="${clientPrefix}"`}`
|
|
79
65
|
} });
|
|
80
66
|
return (React.createElement(StaticRouter, { location: ctx.request.url },
|
|
@@ -83,4 +69,3 @@ const serverRender = async (ctx, config) => {
|
|
|
83
69
|
React.createElement(Component, null)))));
|
|
84
70
|
};
|
|
85
71
|
export { serverRender };
|
|
86
|
-
//# sourceMappingURL=server-entry.js.map
|
package/esm/index.js
CHANGED
package/esm/tools/vite.js
CHANGED
|
@@ -36,6 +36,9 @@ const serverConfig = {
|
|
|
36
36
|
(_g = (_f = viteConfig === null || viteConfig === void 0 ? void 0 : viteConfig()) === null || _f === void 0 ? void 0 : _f.server) === null || _g === void 0 ? void 0 : _g.extraPlugin,
|
|
37
37
|
styleImport(styleImportConfig)
|
|
38
38
|
],
|
|
39
|
+
esbuild: {
|
|
40
|
+
keepNames: true
|
|
41
|
+
},
|
|
39
42
|
build: {
|
|
40
43
|
ssr: reactServerEntry,
|
|
41
44
|
outDir: serverOutPut,
|
|
@@ -91,4 +94,3 @@ const viteBuild = async () => {
|
|
|
91
94
|
await build({ ...serverConfig, mode: 'production' });
|
|
92
95
|
};
|
|
93
96
|
export { viteBuild, viteStart, serverConfig, clientConfig };
|
|
94
|
-
//# sourceMappingURL=vite.js.map
|
package/esm/tools/webpack.js
CHANGED
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ssr-plugin-react",
|
|
3
|
-
"version": "6.2.
|
|
3
|
+
"version": "6.2.19",
|
|
4
4
|
"description": "plugin-react for ssr",
|
|
5
5
|
"main": "./cjs/index.js",
|
|
6
6
|
"module": "./esm/index.js",
|
|
7
7
|
"sideEffects": false,
|
|
8
8
|
"scripts": {
|
|
9
9
|
"build": "concurrently \"tsc -p ./tsconfig.cjs.json \" \" tsc -p ./tsconfig.esm.json\"",
|
|
10
|
+
"build:publish": "concurrently \"tsc -p ./tsconfig.cjs.json --sourcemap false\" \" tsc -p ./tsconfig.esm.json --sourcemap false\"",
|
|
10
11
|
"watch": "concurrently \"tsc -w -p ./tsconfig.cjs.json \" \"tsc -w -p ./tsconfig.esm.json \""
|
|
11
12
|
},
|
|
12
13
|
"repository": {
|
package/src/config/base.ts
CHANGED
|
@@ -88,8 +88,6 @@ const getBaseConfig = (chain: WebpackChain, isServer: boolean) => {
|
|
|
88
88
|
chain.module
|
|
89
89
|
.rule('mjs')
|
|
90
90
|
.test(/\.mjs/)
|
|
91
|
-
.include
|
|
92
|
-
.add(/node_modules/).end()
|
|
93
91
|
.type('javascript/auto')
|
|
94
92
|
.end()
|
|
95
93
|
|
|
@@ -147,7 +145,7 @@ const getBaseConfig = (chain: WebpackChain, isServer: boolean) => {
|
|
|
147
145
|
...(isServer ? define?.server : define?.client),
|
|
148
146
|
...define?.base
|
|
149
147
|
}])
|
|
150
|
-
chainBaseConfig(chain)
|
|
148
|
+
chainBaseConfig(chain, isServer)
|
|
151
149
|
return config
|
|
152
150
|
}
|
|
153
151
|
|
package/src/config/server.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { join } from 'path'
|
|
2
|
-
import { loadConfig, getLocalNodeModules, nodeExternals } from 'ssr-server-utils'
|
|
2
|
+
import { loadConfig, getLocalNodeModules, nodeExternals, loadModuleFromFramework } from 'ssr-server-utils'
|
|
3
3
|
import * as WebpackChain from 'webpack-chain'
|
|
4
4
|
import * as webpack from 'webpack'
|
|
5
5
|
import { getBaseConfig } from './base'
|
|
@@ -7,6 +7,7 @@ import { getBaseConfig } from './base'
|
|
|
7
7
|
const getServerWebpack = (chain: WebpackChain) => {
|
|
8
8
|
const config = loadConfig()
|
|
9
9
|
const { isDev, cwd, getOutput, chainServerConfig, whiteList, chunkName } = config
|
|
10
|
+
const shouldUseSourceMap = isDev || Boolean(process.env.GENERATE_SOURCEMAP)
|
|
10
11
|
getBaseConfig(chain, true)
|
|
11
12
|
chain.devtool(isDev ? 'inline-source-map' : false)
|
|
12
13
|
chain.target('node')
|
|
@@ -25,7 +26,18 @@ const getServerWebpack = (chain: WebpackChain) => {
|
|
|
25
26
|
// externals Dir contains example/xxx/node_modules ssr/node_modules
|
|
26
27
|
modulesDir
|
|
27
28
|
}))
|
|
28
|
-
|
|
29
|
+
if (!isDev) {
|
|
30
|
+
chain.optimization.minimizer('terser')
|
|
31
|
+
.use(loadModuleFromFramework('terser-webpack-plugin'), [{
|
|
32
|
+
terserOptions: {
|
|
33
|
+
keep_fnames: true
|
|
34
|
+
},
|
|
35
|
+
extractComments: false,
|
|
36
|
+
parallel: true,
|
|
37
|
+
cache: true,
|
|
38
|
+
sourceMap: shouldUseSourceMap
|
|
39
|
+
}])
|
|
40
|
+
}
|
|
29
41
|
chain.when(isDev, () => {
|
|
30
42
|
chain.watch(true)
|
|
31
43
|
})
|
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
import * as React from 'react'
|
|
2
2
|
import * as ReactDOM from 'react-dom'
|
|
3
3
|
import { BrowserRouter, Route, Switch } from 'react-router-dom'
|
|
4
|
-
import { preloadComponent } from 'ssr-client-utils'
|
|
4
|
+
import { preloadComponent, isMicro } from 'ssr-client-utils'
|
|
5
5
|
import { wrapComponent } from 'ssr-hoc-react'
|
|
6
|
-
import {
|
|
6
|
+
import { LayoutProps, ReactRoutesType } from 'ssr-types-react'
|
|
7
7
|
import { Routes } from './create-router'
|
|
8
8
|
import { AppContext } from './context'
|
|
9
9
|
|
|
10
10
|
const { FeRoutes, layoutFetch, App } = Routes as ReactRoutesType
|
|
11
11
|
|
|
12
|
-
declare const window: IWindow
|
|
13
|
-
|
|
14
12
|
const clientRender = async (): Promise<void> => {
|
|
15
13
|
const IApp = App ?? function (props: LayoutProps) {
|
|
16
14
|
return props.children!
|
|
17
15
|
}
|
|
18
16
|
// 客户端渲染||hydrate
|
|
19
|
-
const baseName =
|
|
17
|
+
const baseName = isMicro() ? window.clientPrefix : window.prefix
|
|
20
18
|
const routes = await preloadComponent(FeRoutes, baseName)
|
|
21
19
|
ReactDOM[window.__USE_SSR__ ? 'hydrate' : 'render'](
|
|
22
20
|
<BrowserRouter basename={baseName}>
|
|
@@ -44,11 +42,8 @@ const clientRender = async (): Promise<void> => {
|
|
|
44
42
|
, document.getElementById('app'))
|
|
45
43
|
|
|
46
44
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
// 可用于微前端场景下自定义什么时候进行组件渲染的逻辑调用
|
|
50
|
-
clientRender()
|
|
51
|
-
}
|
|
45
|
+
|
|
46
|
+
clientRender()
|
|
52
47
|
|
|
53
48
|
export {
|
|
54
49
|
clientRender
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react'
|
|
2
2
|
import { StaticRouter } from 'react-router-dom'
|
|
3
3
|
import { findRoute, getManifest, logGreen, normalizePath, getAsyncCssChunk, getAsyncJsChunk, reactRefreshFragment } from 'ssr-server-utils'
|
|
4
|
-
import { ISSRContext, IConfig, ReactRoutesType,
|
|
4
|
+
import { ISSRContext, IConfig, ReactRoutesType, ReactESMPreloadFeRouteItem, DynamicFC, StaticFC } from 'ssr-types-react'
|
|
5
5
|
import { serialize } from 'ssr-serialize-javascript'
|
|
6
6
|
// @ts-expect-error
|
|
7
7
|
import { STORE_CONTEXT as Context } from '_build/create-context'
|
|
@@ -10,9 +10,9 @@ import { Routes } from './create-router'
|
|
|
10
10
|
const { FeRoutes, layoutFetch, state, Layout } = Routes as ReactRoutesType
|
|
11
11
|
|
|
12
12
|
const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.ReactElement> => {
|
|
13
|
-
const { mode, parallelFetch,
|
|
13
|
+
const { mode, parallelFetch, prefix, isVite, isDev, clientPrefix } = config
|
|
14
14
|
const path = normalizePath(ctx.request.path, prefix)
|
|
15
|
-
const routeItem = findRoute<
|
|
15
|
+
const routeItem = findRoute<ReactESMPreloadFeRouteItem>(FeRoutes, path)
|
|
16
16
|
|
|
17
17
|
if (!routeItem) {
|
|
18
18
|
throw new Error(`
|
|
@@ -26,34 +26,19 @@ const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.Re
|
|
|
26
26
|
const dynamicJsOrder = await getAsyncJsChunk(ctx)
|
|
27
27
|
const manifest = await getManifest(config)
|
|
28
28
|
|
|
29
|
-
const injectCss
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
injectCss.push(<script src="/@vite/client" type="module" key="vite-client"/>)
|
|
33
|
-
injectCss.push(<script key="vite-react-refresh" type="module" dangerouslySetInnerHTML={{
|
|
29
|
+
const injectCss = (isVite && isDev) ? [
|
|
30
|
+
<script src="/@vite/client" type="module" key="vite-client"/>,
|
|
31
|
+
<script key="vite-react-refresh" type="module" dangerouslySetInnerHTML={{
|
|
34
32
|
__html: reactRefreshFragment
|
|
35
|
-
}} />
|
|
36
|
-
}
|
|
37
|
-
dynamicCssOrder.forEach(css => {
|
|
38
|
-
if (manifest[css]) {
|
|
39
|
-
const item = manifest[css]
|
|
40
|
-
injectCss.push(<link rel='stylesheet' key={item} href={item} />)
|
|
41
|
-
}
|
|
42
|
-
})
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (disableClientRender) {
|
|
46
|
-
injectCss.push(<script key="disableClientRender" dangerouslySetInnerHTML={{
|
|
47
|
-
__html: 'window.__disableClientRender__ = true'
|
|
48
|
-
}}/>)
|
|
49
|
-
}
|
|
33
|
+
}} />
|
|
34
|
+
] : dynamicCssOrder.map(css => manifest[css]).filter(Boolean).map(css => <link rel='stylesheet' key={css} href={css} />)
|
|
50
35
|
|
|
51
36
|
const injectScript = [
|
|
52
37
|
...(isVite ? [<script key="viteWindowInit" dangerouslySetInnerHTML={{
|
|
53
38
|
__html: 'window.__USE_VITE__=true'
|
|
54
39
|
}} />] : []),
|
|
55
40
|
...((isVite && isDev) ? [<script type="module" src='/node_modules/ssr-plugin-react/esm/entry/client-entry.js' key="vite-react-entry" />] : []),
|
|
56
|
-
...dynamicJsOrder.map(js => manifest[js]).filter(
|
|
41
|
+
...dynamicJsOrder.map(js => manifest[js]).filter(Boolean).map(item => <script key={item} src={item} type={isVite ? 'module' : ''}/>)
|
|
57
42
|
]
|
|
58
43
|
const staticList = {
|
|
59
44
|
injectCss,
|
|
@@ -61,7 +46,7 @@ const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.Re
|
|
|
61
46
|
}
|
|
62
47
|
|
|
63
48
|
const isCsr = !!(mode === 'csr' || ctx.request.query?.csr)
|
|
64
|
-
const Component = isCsr ? React.Fragment : (await component()).default
|
|
49
|
+
const Component = isCsr ? React.Fragment : (component.name === 'dynamicComponent' ? (await (component as DynamicFC)()).default : component as StaticFC)
|
|
65
50
|
|
|
66
51
|
if (isCsr) {
|
|
67
52
|
logGreen(`Current path ${path} use csr render mode`)
|
|
@@ -83,7 +68,7 @@ const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.Re
|
|
|
83
68
|
}
|
|
84
69
|
}
|
|
85
70
|
const combineData = isCsr ? null : Object.assign(state ?? {}, layoutFetchData ?? {}, fetchData ?? {})
|
|
86
|
-
const injectState = isCsr ?
|
|
71
|
+
const injectState = isCsr ? <script dangerouslySetInnerHTML={{ __html: `window.prefix="${prefix}"` }} /> : <script dangerouslySetInnerHTML={{
|
|
87
72
|
__html: `window.__USE_SSR__=true; window.__INITIAL_DATA__ =${serialize(combineData)}; window.prefix="${prefix}";${clientPrefix && `window.clientPrefix="${clientPrefix}"`}`
|
|
88
73
|
}} />
|
|
89
74
|
|