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 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="https://yulebao.alibaba.com/"><img src="https://gw.alicdn.com/tfs/TB1CmlIIFT7gK0jSZFpXXaTkpXa-190-46.png" width="120"/><br><sub><b>阿里影业娱乐宝
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" alt="国盛证券"/><br />
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://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>希沃帮助中心
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" alt="100教育"/><br />
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" alt="Happy"/><br />
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
- 984 text files.
286
- 668 unique files.
287
- 823 files ignored.
296
+ 993 text files.
297
+ 679 unique files.
298
+ 829 files ignored.
288
299
 
289
- github.com/AlDanial/cloc v 1.90 T=0.57 s (284.6 files/s, 10042.8 lines/s)
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 161 480 197 5004
304
+ TypeScript 164 471 195 4927
294
305
  -------------------------------------------------------------------------------
295
- SUM: 161 480 197 5004
306
+ SUM: 164 471 195 4927
296
307
  -------------------------------------------------------------------------------
297
308
  ```
298
309
 
@@ -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
@@ -1,4 +1,3 @@
1
- /// <reference types="webpack" />
2
1
  import * as WebpackChain from 'webpack-chain';
3
2
  declare const getClientWebpack: (chain: WebpackChain) => import("webpack").Configuration;
4
3
  export { getClientWebpack };
@@ -114,4 +114,3 @@ const getClientWebpack = (chain) => {
114
114
  return chain.toConfig();
115
115
  };
116
116
  exports.getClientWebpack = getClientWebpack;
117
- //# sourceMappingURL=client.js.map
@@ -16,4 +16,3 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./client"), exports);
18
18
  __exportStar(require("./server"), exports);
19
- //# sourceMappingURL=index.js.map
@@ -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 = window.microApp ? window.clientPrefix : window.prefix;
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
- if (!window.__disableClientRender__) {
35
- // 如果服务端直出的时候带上该记号,则默认不进行客户端渲染,将处理逻辑交给上层
36
- // 可用于微前端场景下自定义什么时候进行组件渲染的逻辑调用
37
- clientRender();
38
- }
39
- //# sourceMappingURL=client-entry.js.map
34
+ clientRender();
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { IProps } from 'ssr-types-react';
3
2
  export declare function AppContext(props: IProps): JSX.Element;
4
3
  //# sourceMappingURL=context.d.ts.map
@@ -29,4 +29,3 @@ function AppContext(props) {
29
29
  return (React.createElement(create_context_1.STORE_CONTEXT.Provider, { value: { state, dispatch } }, props.children));
30
30
  }
31
31
  exports.AppContext = AppContext;
32
- //# sourceMappingURL=context.js.map
@@ -17,4 +17,3 @@ else {
17
17
  state: {}
18
18
  });
19
19
  }
20
- //# sourceMappingURL=create-context.js.map
@@ -24,4 +24,3 @@ if (ManualRoutesWithType.FeRoutes) {
24
24
  });
25
25
  Routes.FeRoutes = combineRoutes;
26
26
  }
27
- //# sourceMappingURL=create-router.js.map
@@ -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, disableClientRender, prefix, isVite, isDev, clientPrefix } = config;
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
- if (isVite && isDev) {
29
- injectCss.push(React.createElement("script", { src: "/@vite/client", type: "module", key: "vite-client" }));
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(item => !!item).map(item => React.createElement("script", { key: item, src: item, type: isVite ? 'module' : '' }))
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 ? null : React.createElement("script", { dangerouslySetInnerHTML: {
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
@@ -44,4 +44,3 @@ function clientPlugin() {
44
44
  }
45
45
  exports.clientPlugin = clientPlugin;
46
46
  __exportStar(require("./tools/vite"), exports);
47
- //# sourceMappingURL=index.js.map
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
@@ -20,4 +20,3 @@ const webpackBuild = async () => {
20
20
  await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientBuild(getClientWebpack(clientConfigChain))]);
21
21
  };
22
22
  exports.webpackBuild = webpackBuild;
23
- //# sourceMappingURL=webpack.js.map
@@ -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
@@ -1,4 +1,3 @@
1
- /// <reference types="webpack" />
2
1
  import * as WebpackChain from 'webpack-chain';
3
2
  declare const getClientWebpack: (chain: WebpackChain) => import("webpack").Configuration;
4
3
  export { getClientWebpack };
@@ -111,4 +111,3 @@ const getClientWebpack = (chain) => {
111
111
  return chain.toConfig();
112
112
  };
113
113
  export { getClientWebpack };
114
- //# sourceMappingURL=client.js.map
@@ -1,3 +1,2 @@
1
1
  export * from './client';
2
2
  export * from './server';
3
- //# sourceMappingURL=index.js.map
@@ -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 = window.microApp ? window.clientPrefix : window.prefix;
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
- if (!window.__disableClientRender__) {
31
- // 如果服务端直出的时候带上该记号,则默认不进行客户端渲染,将处理逻辑交给上层
32
- // 可用于微前端场景下自定义什么时候进行组件渲染的逻辑调用
33
- clientRender();
34
- }
30
+ clientRender();
35
31
  export { clientRender };
36
- //# sourceMappingURL=client-entry.js.map
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { IProps } from 'ssr-types-react';
3
2
  export declare function AppContext(props: IProps): JSX.Element;
4
3
  //# sourceMappingURL=context.d.ts.map
@@ -25,4 +25,3 @@ export function AppContext(props) {
25
25
  const [state, dispatch] = useReducer(combineReducer, initialState);
26
26
  return (React.createElement(STORE_CONTEXT.Provider, { value: { state, dispatch } }, props.children));
27
27
  }
28
- //# sourceMappingURL=context.js.map
@@ -14,4 +14,3 @@ else {
14
14
  });
15
15
  }
16
16
  export { STORE_CONTEXT };
17
- //# sourceMappingURL=create-context.js.map
@@ -21,4 +21,3 @@ if (ManualRoutesWithType.FeRoutes) {
21
21
  Routes.FeRoutes = combineRoutes;
22
22
  }
23
23
  export { Routes };
24
- //# sourceMappingURL=create-router.js.map
@@ -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, disableClientRender, prefix, isVite, isDev, clientPrefix } = config;
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
- if (isVite && isDev) {
26
- injectCss.push(React.createElement("script", { src: "/@vite/client", type: "module", key: "vite-client" }));
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(item => !!item).map(item => React.createElement("script", { key: item, src: item, type: isVite ? 'module' : '' }))
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 ? null : React.createElement("script", { dangerouslySetInnerHTML: {
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
@@ -26,4 +26,3 @@ export function clientPlugin() {
26
26
  };
27
27
  }
28
28
  export * from './tools/vite';
29
- //# sourceMappingURL=index.js.map
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
@@ -15,4 +15,3 @@ export const webpackBuild = async () => {
15
15
  const clientConfigChain = new WebpackChain();
16
16
  await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientBuild(getClientWebpack(clientConfigChain))]);
17
17
  };
18
- //# sourceMappingURL=webpack.js.map
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "ssr-plugin-react",
3
- "version": "6.2.16",
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": {
@@ -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
 
@@ -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 { IWindow, LayoutProps, ReactRoutesType } from 'ssr-types-react'
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 = window.microApp ? window.clientPrefix : window.prefix
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
- if (!window.__disableClientRender__) {
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, ReactESMFeRouteItem } from 'ssr-types-react'
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, disableClientRender, prefix, isVite, isDev, clientPrefix } = config
13
+ const { mode, parallelFetch, prefix, isVite, isDev, clientPrefix } = config
14
14
  const path = normalizePath(ctx.request.path, prefix)
15
- const routeItem = findRoute<ReactESMFeRouteItem>(FeRoutes, path)
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: JSX.Element[] = []
30
-
31
- if (isVite && isDev) {
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
- } else {
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(item => !!item).map(item => <script key={item} src={item} type={isVite ? 'module' : ''}/>)
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 ? null : <script dangerouslySetInnerHTML={{
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
 
package/src/tools/vite.ts CHANGED
@@ -35,6 +35,9 @@ const serverConfig: UserConfig = {
35
35
  viteConfig?.()?.server?.extraPlugin,
36
36
  styleImport(styleImportConfig)
37
37
  ],
38
+ esbuild: {
39
+ keepNames: true
40
+ },
38
41
  build: {
39
42
  ssr: reactServerEntry,
40
43
  outDir: serverOutPut,