ssr-plugin-react 6.2.12 → 6.2.15

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.
Files changed (54) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/cjs/config/base.d.ts +2 -1
  3. package/cjs/config/base.js +6 -5
  4. package/cjs/config/client.d.ts +1 -0
  5. package/cjs/config/client.js +11 -1
  6. package/cjs/config/index.d.ts +1 -0
  7. package/cjs/config/index.js +1 -0
  8. package/cjs/config/server.d.ts +1 -0
  9. package/cjs/config/server.js +1 -0
  10. package/cjs/entry/client-entry.d.ts +1 -0
  11. package/cjs/entry/client-entry.js +2 -4
  12. package/cjs/entry/context.d.ts +1 -0
  13. package/cjs/entry/context.js +1 -0
  14. package/cjs/entry/create-context.d.ts +1 -0
  15. package/cjs/entry/create-context.js +1 -0
  16. package/cjs/entry/create-router.d.ts +1 -0
  17. package/cjs/entry/create-router.js +1 -0
  18. package/cjs/entry/server-entry.d.ts +1 -0
  19. package/cjs/entry/server-entry.js +9 -20
  20. package/cjs/index.d.ts +1 -0
  21. package/cjs/index.js +1 -0
  22. package/cjs/tools/vite.d.ts +1 -0
  23. package/cjs/tools/vite.js +1 -0
  24. package/cjs/tools/webpack.d.ts +1 -0
  25. package/cjs/tools/webpack.js +1 -0
  26. package/esm/config/base.d.ts +2 -1
  27. package/esm/config/base.js +6 -5
  28. package/esm/config/client.d.ts +1 -0
  29. package/esm/config/client.js +11 -1
  30. package/esm/config/index.d.ts +1 -0
  31. package/esm/config/index.js +1 -0
  32. package/esm/config/server.d.ts +1 -0
  33. package/esm/config/server.js +1 -0
  34. package/esm/entry/client-entry.d.ts +1 -0
  35. package/esm/entry/client-entry.js +2 -4
  36. package/esm/entry/context.d.ts +1 -0
  37. package/esm/entry/context.js +1 -0
  38. package/esm/entry/create-context.d.ts +1 -0
  39. package/esm/entry/create-context.js +1 -0
  40. package/esm/entry/create-router.d.ts +1 -0
  41. package/esm/entry/create-router.js +1 -0
  42. package/esm/entry/server-entry.d.ts +1 -0
  43. package/esm/entry/server-entry.js +9 -20
  44. package/esm/index.d.ts +1 -0
  45. package/esm/index.js +1 -0
  46. package/esm/tools/vite.d.ts +1 -0
  47. package/esm/tools/vite.js +1 -0
  48. package/esm/tools/webpack.d.ts +1 -0
  49. package/esm/tools/webpack.js +1 -0
  50. package/package.json +7 -8
  51. package/src/config/base.ts +6 -6
  52. package/src/config/client.ts +11 -1
  53. package/src/entry/client-entry.tsx +0 -4
  54. package/src/entry/server-entry.tsx +8 -21
package/CHANGELOG.md CHANGED
@@ -1,3 +1,47 @@
1
+ ## [6.2.15](https://github.com/zhangyuang/ssr/compare/plugin-react@6.2.14...plugin-react@6.2.15) (2022-04-27)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * ci ([57e713f](https://github.com/zhangyuang/ssr/commit/57e713f1f96b4ceb893837c15c6032b23a0b1a4c))
7
+ * whitList concat userconfig ([fdd971a](https://github.com/zhangyuang/ssr/commit/fdd971ab11aebc0f348d789e758183b877e791af))
8
+ * whitList concat userconfig ([e2328f8](https://github.com/zhangyuang/ssr/commit/e2328f87f5cfc18c9a30867e4f6e18d0df5c1ba3))
9
+
10
+
11
+ ### Features
12
+
13
+ * add ssr-serialize-javascript code optimize ([41bb14d](https://github.com/zhangyuang/ssr/commit/41bb14d31efd89d4a85d5220544d2f7a3883e1a3))
14
+ * support props.ssrApp in vue3 ([8985037](https://github.com/zhangyuang/ssr/commit/898503753cbe69187d27f91c70dff3f4cd4a0b2a))
15
+
16
+
17
+
18
+ ## [6.2.14](https://github.com/zhangyuang/ssr/compare/plugin-react@6.2.13...plugin-react@6.2.14) (2022-04-20)
19
+
20
+
21
+ ### Bug Fixes
22
+
23
+ * update preinstall ([2b4b869](https://github.com/zhangyuang/ssr/commit/2b4b869c28b83b414bef10260e5561bc3773cea9))
24
+
25
+
26
+ ### Features
27
+
28
+ * optimize customescript ([f374760](https://github.com/zhangyuang/ssr/commit/f3747608d4684576875968394eca6315e2fa8dd1))
29
+ * plugin-react add react-refresh, remove module.hot ([7bee211](https://github.com/zhangyuang/ssr/commit/7bee211ddfefaef688713f505756e1155320b844))
30
+
31
+
32
+
33
+ ## [6.2.13](https://github.com/zhangyuang/ssr/compare/plugin-react@6.2.12...plugin-react@6.2.13) (2022-04-18)
34
+
35
+
36
+ ### Features
37
+
38
+ * update extraJsOrder extraCssOrder ([cd5ca99](https://github.com/zhangyuang/ssr/commit/cd5ca99a686ea565020500a6c4f77e310b422ce3))
39
+ * update midway deploy ([a473c59](https://github.com/zhangyuang/ssr/commit/a473c599657df42b4bf7a59f248b3c7c33907657))
40
+ * update plugin-vue3 support call pinia in fetch.ts ([958fdc7](https://github.com/zhangyuang/ssr/commit/958fdc787ab615593f3114a6bf2c6cea4823afc2))
41
+ * upgrade midway example to v3 ([572f7c5](https://github.com/zhangyuang/ssr/commit/572f7c5d171346cc17f5f6cdebe33aee76e0c146))
42
+
43
+
44
+
1
45
  ## 6.2.12 (2022-04-15)
2
46
 
3
47
 
@@ -1,3 +1,4 @@
1
1
  import * as WebpackChain from 'webpack-chain';
2
- declare const getBaseConfig: (chain: WebpackChain, isServer: boolean) => IConfig;
2
+ declare const getBaseConfig: (chain: WebpackChain, isServer: boolean) => import("ssr-types-react").IConfig;
3
3
  export { getBaseConfig };
4
+ //# sourceMappingURL=base.d.ts.map
@@ -7,9 +7,9 @@ const webpack = require("webpack");
7
7
  const MiniCssExtractPlugin = require((0, ssr_server_utils_1.loadModuleFromFramework)('mini-css-extract-plugin'));
8
8
  const WebpackBar = require('webpackbar');
9
9
  const loadModule = ssr_server_utils_1.loadModuleFromFramework;
10
- const addBabelLoader = (chain, envOptions) => {
10
+ const addBabelLoader = (chain, envOptions, isServer) => {
11
11
  var _a, _b;
12
- const { babelOptions } = (0, ssr_server_utils_1.loadConfig)();
12
+ const { babelOptions, isDev } = (0, ssr_server_utils_1.loadConfig)();
13
13
  chain.use('babel-loader')
14
14
  .loader(loadModule('babel-loader'))
15
15
  .options({
@@ -41,7 +41,7 @@ const addBabelLoader = (chain, envOptions) => {
41
41
  [loadModule('@babel/plugin-proposal-private-methods'), { loose: true }],
42
42
  [loadModule('@babel/plugin-proposal-private-property-in-object'), { loose: true }],
43
43
  ...(_b = babelOptions === null || babelOptions === void 0 ? void 0 : babelOptions.plugins) !== null && _b !== void 0 ? _b : []
44
- ]
44
+ ].concat((!isServer && isDev) ? loadModule('react-refresh/babel') : [])
45
45
  })
46
46
  .end();
47
47
  };
@@ -98,8 +98,8 @@ const getBaseConfig = (chain, isServer) => {
98
98
  else {
99
99
  babelForExtraModule = module.end().exclude.add(/core-js/).end();
100
100
  }
101
- addBabelLoader(babelModule, envOptions);
102
- addBabelLoader(babelForExtraModule, envOptions);
101
+ addBabelLoader(babelModule, envOptions, isServer);
102
+ addBabelLoader(babelForExtraModule, envOptions, isServer);
103
103
  (0, ssr_server_utils_1.setStyle)(chain, /\.css$/, {
104
104
  rule: 'css',
105
105
  isServer,
@@ -138,3 +138,4 @@ const getBaseConfig = (chain, isServer) => {
138
138
  return config;
139
139
  };
140
140
  exports.getBaseConfig = getBaseConfig;
141
+ //# sourceMappingURL=base.js.map
@@ -2,3 +2,4 @@
2
2
  import * as WebpackChain from 'webpack-chain';
3
3
  declare const getClientWebpack: (chain: WebpackChain) => import("webpack").Configuration;
4
4
  export { getClientWebpack };
5
+ //# sourceMappingURL=client.d.ts.map
@@ -8,11 +8,12 @@ const base_1 = require("./base");
8
8
  const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin');
9
9
  const safePostCssParser = require('postcss-safe-parser');
10
10
  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
11
+ const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
11
12
  const generateAnalysis = Boolean(process.env.GENERATE_ANALYSIS);
12
13
  const loadModule = ssr_server_utils_1.loadModuleFromFramework;
13
14
  let asyncChunkMap = {};
14
15
  const getClientWebpack = (chain) => {
15
- const { isDev, chunkName, getOutput, cwd, useHash, chainClientConfig } = (0, ssr_server_utils_1.loadConfig)();
16
+ const { isDev, chunkName, getOutput, cwd, useHash, chainClientConfig, host, fePort } = (0, ssr_server_utils_1.loadConfig)();
16
17
  const shouldUseSourceMap = isDev || Boolean(process.env.GENERATE_SOURCEMAP);
17
18
  const publicPath = (0, ssr_server_utils_1.getOutputPublicPath)();
18
19
  (0, base_1.getBaseConfig)(chain, false);
@@ -89,6 +90,14 @@ const getClientWebpack = (chain) => {
89
90
  chain.when(generateAnalysis, chain => {
90
91
  chain.plugin('analyze').use(BundleAnalyzerPlugin);
91
92
  });
93
+ chain.when(isDev, chain => {
94
+ chain.plugin('fast-refresh').use(new ReactRefreshWebpackPlugin({
95
+ overlay: {
96
+ sockHost: host,
97
+ sockPort: fePort
98
+ }
99
+ }));
100
+ });
92
101
  chain.plugin('WriteAsyncManifest').use(class WriteAsyncChunkManifest {
93
102
  apply(compiler) {
94
103
  compiler.hooks.watchRun.tap('thisCompilation', async () => {
@@ -105,3 +114,4 @@ const getClientWebpack = (chain) => {
105
114
  return chain.toConfig();
106
115
  };
107
116
  exports.getClientWebpack = getClientWebpack;
117
+ //# sourceMappingURL=client.js.map
@@ -1,2 +1,3 @@
1
1
  export * from './client';
2
2
  export * from './server';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -16,3 +16,4 @@ 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
@@ -2,3 +2,4 @@ import * as WebpackChain from 'webpack-chain';
2
2
  import * as webpack from 'webpack';
3
3
  declare const getServerWebpack: (chain: WebpackChain) => webpack.Configuration;
4
4
  export { getServerWebpack };
5
+ //# sourceMappingURL=server.d.ts.map
@@ -35,3 +35,4 @@ const getServerWebpack = (chain) => {
35
35
  return chain.toConfig();
36
36
  };
37
37
  exports.getServerWebpack = getServerWebpack;
38
+ //# sourceMappingURL=server.js.map
@@ -1,2 +1,3 @@
1
1
  declare const clientRender: () => Promise<void>;
2
2
  export { clientRender };
3
+ //# sourceMappingURL=client-entry.d.ts.map
@@ -10,7 +10,7 @@ const create_router_1 = require("./create-router");
10
10
  const context_1 = require("./context");
11
11
  const { FeRoutes, layoutFetch, App, PrefixRouterBase } = create_router_1.Routes;
12
12
  const clientRender = async () => {
13
- var _a, _b, _c, _d;
13
+ var _a, _b;
14
14
  const IApp = App !== null && App !== void 0 ? App : function (props) {
15
15
  return props.children;
16
16
  };
@@ -30,9 +30,6 @@ const clientRender = async () => {
30
30
  const WrappedComponent = (0, ssr_hoc_react_1.wrapComponent)(component);
31
31
  return (React.createElement(react_router_dom_1.Route, { exact: true, key: path, path: path, render: () => React.createElement(WrappedComponent, { key: location.pathname }) }));
32
32
  })))))), document.getElementById('app'));
33
- if (!window.__USE_VITE__) {
34
- (_d = (_c = module === null || module === void 0 ? void 0 : module.hot) === null || _c === void 0 ? void 0 : _c.accept) === null || _d === void 0 ? void 0 : _d.call(_c); // webpack 场景下的 hmr
35
- }
36
33
  };
37
34
  exports.clientRender = clientRender;
38
35
  if (!window.__disableClientRender__) {
@@ -40,3 +37,4 @@ if (!window.__disableClientRender__) {
40
37
  // 可用于微前端场景下自定义什么时候进行组件渲染的逻辑调用
41
38
  clientRender();
42
39
  }
40
+ //# sourceMappingURL=client-entry.js.map
@@ -1,3 +1,4 @@
1
1
  /// <reference types="react" />
2
2
  import { IProps } from 'ssr-types-react';
3
3
  export declare function AppContext(props: IProps): JSX.Element;
4
+ //# sourceMappingURL=context.d.ts.map
@@ -29,3 +29,4 @@ 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
@@ -2,3 +2,4 @@ import { Context } from 'react';
2
2
  import { IContext } from 'ssr-types-react';
3
3
  declare let STORE_CONTEXT: Context<IContext>;
4
4
  export { STORE_CONTEXT };
5
+ //# sourceMappingURL=create-context.d.ts.map
@@ -17,3 +17,4 @@ else {
17
17
  state: {}
18
18
  });
19
19
  }
20
+ //# sourceMappingURL=create-context.js.map
@@ -1,3 +1,4 @@
1
1
  import { ReactRoutesType } from 'ssr-types-react';
2
2
  declare const Routes: ReactRoutesType;
3
3
  export { Routes };
4
+ //# sourceMappingURL=create-router.d.ts.map
@@ -24,3 +24,4 @@ if (ManualRoutesWithType.FeRoutes) {
24
24
  });
25
25
  Routes.FeRoutes = combineRoutes;
26
26
  }
27
+ //# sourceMappingURL=create-router.js.map
@@ -2,3 +2,4 @@ import * as React from 'react';
2
2
  import { ISSRContext, IConfig } from 'ssr-types-react';
3
3
  declare const serverRender: (ctx: ISSRContext, config: IConfig) => Promise<React.ReactElement>;
4
4
  export { serverRender };
5
+ //# sourceMappingURL=server-entry.d.ts.map
@@ -4,18 +4,16 @@ exports.serverRender = void 0;
4
4
  const React = require("react");
5
5
  const react_router_dom_1 = require("react-router-dom");
6
6
  const ssr_server_utils_1 = require("ssr-server-utils");
7
- // @ts-expect-error
8
- const serializeWrap = require("serialize-javascript");
7
+ const ssr_serialize_javascript_1 = require("ssr-serialize-javascript");
9
8
  // @ts-expect-error
10
9
  const create_context_1 = require("_build/create-context");
11
10
  // @ts-expect-error
12
11
  const index_tsx_1 = require("@/components/layout/index.tsx");
13
12
  const create_router_1 = require("./create-router");
14
13
  const { FeRoutes, layoutFetch, PrefixRouterBase, state } = create_router_1.Routes;
15
- const serialize = serializeWrap.default || serializeWrap;
16
14
  const serverRender = async (ctx, config) => {
17
15
  var _a;
18
- const { cssOrder, jsOrder, dynamic, mode, parallelFetch, disableClientRender, prefix, isVite, isDev, clientPrefix } = config;
16
+ const { mode, parallelFetch, disableClientRender, prefix, isVite, isDev, clientPrefix } = config;
19
17
  let path = ctx.request.path; // 这里取 pathname 不能够包含 queryString
20
18
  const base = prefix !== null && prefix !== void 0 ? prefix : PrefixRouterBase; // 以开发者实际传入的为最高优先级
21
19
  if (base) {
@@ -28,24 +26,15 @@ const serverRender = async (ctx, config) => {
28
26
  If you create new folder or component file, please restart server by npm start
29
27
  `);
30
28
  }
31
- let dynamicCssOrder = cssOrder;
32
- if (dynamic) {
33
- dynamicCssOrder = cssOrder.concat([`${routeItem.webpackChunkName}.css`]);
34
- if (!isVite || (isVite && !isDev)) {
35
- // call it when webpack mode or vite prod mode
36
- dynamicCssOrder = await (0, ssr_server_utils_1.addAsyncChunk)(dynamicCssOrder, routeItem.webpackChunkName);
37
- }
38
- }
29
+ const { fetch, webpackChunkName, component } = routeItem;
30
+ const dynamicCssOrder = await (0, ssr_server_utils_1.getAsyncCssChunk)(ctx, webpackChunkName);
31
+ const dynamicJsOrder = await (0, ssr_server_utils_1.getAsyncJsChunk)(ctx);
39
32
  const manifest = await (0, ssr_server_utils_1.getManifest)(config);
40
33
  const injectCss = [];
41
34
  if (isVite && isDev) {
42
35
  injectCss.push(React.createElement("script", { src: "/@vite/client", type: "module", key: "vite-client" }));
43
36
  injectCss.push(React.createElement("script", { key: "vite-react-refresh", type: "module", dangerouslySetInnerHTML: {
44
- __html: ` import RefreshRuntime from "/@react-refresh"
45
- RefreshRuntime.injectIntoGlobalHook(window)
46
- window.$RefreshReg$ = () => {}
47
- window.$RefreshSig$ = () => (type) => type
48
- window.__vite_plugin_react_preamble_installed__ = true`
37
+ __html: ssr_server_utils_1.reactRefreshFragment
49
38
  } }));
50
39
  }
51
40
  else {
@@ -66,14 +55,13 @@ const serverRender = async (ctx, config) => {
66
55
  __html: 'window.__USE_VITE__=true'
67
56
  } }),
68
57
  (isVite && isDev) && React.createElement("script", { type: "module", src: '/node_modules/ssr-plugin-react/esm/entry/client-entry.js', key: "vite-react-entry" }),
69
- ...jsOrder.map(js => manifest[js]).map(item => item && React.createElement("script", { key: item, src: item, type: isVite ? 'module' : '' }))
58
+ ...dynamicJsOrder.map(js => manifest[js]).map(item => item && React.createElement("script", { key: item, src: item, type: isVite ? 'module' : '' }))
70
59
  ];
71
60
  const staticList = {
72
61
  injectCss,
73
62
  injectScript
74
63
  };
75
64
  const isCsr = !!(mode === 'csr' || ((_a = ctx.request.query) === null || _a === void 0 ? void 0 : _a.csr));
76
- const { component, fetch } = routeItem;
77
65
  const Component = isCsr ? React.Fragment : (await component()).default;
78
66
  if (isCsr) {
79
67
  (0, ssr_server_utils_1.logGreen)(`Current path ${path} use csr render mode`);
@@ -96,7 +84,7 @@ const serverRender = async (ctx, config) => {
96
84
  }
97
85
  const combineData = isCsr ? null : Object.assign(state !== null && state !== void 0 ? state : {}, layoutFetchData !== null && layoutFetchData !== void 0 ? layoutFetchData : {}, fetchData !== null && fetchData !== void 0 ? fetchData : {});
98
86
  const injectState = isCsr ? null : React.createElement("script", { dangerouslySetInnerHTML: {
99
- __html: `window.__USE_SSR__=true; window.__INITIAL_DATA__ =${serialize(combineData)}; ${base && `window.prefix="${base}"`};${clientPrefix && `window.clientPrefix="${clientPrefix}"`}`
87
+ __html: `window.__USE_SSR__=true; window.__INITIAL_DATA__ =${(0, ssr_serialize_javascript_1.serialize)(combineData)}; ${base && `window.prefix="${base}"`};${clientPrefix && `window.clientPrefix="${clientPrefix}"`}`
100
88
  } });
101
89
  return (React.createElement(react_router_dom_1.StaticRouter, { location: ctx.request.url },
102
90
  React.createElement(create_context_1.STORE_CONTEXT.Provider, { value: { state: combineData } },
@@ -104,3 +92,4 @@ const serverRender = async (ctx, config) => {
104
92
  React.createElement(Component, null)))));
105
93
  };
106
94
  exports.serverRender = serverRender;
95
+ //# sourceMappingURL=server-entry.js.map
package/cjs/index.d.ts CHANGED
@@ -4,3 +4,4 @@ export declare function clientPlugin(): {
4
4
  build: () => Promise<void>;
5
5
  };
6
6
  export * from './tools/vite';
7
+ //# sourceMappingURL=index.d.ts.map
package/cjs/index.js CHANGED
@@ -44,3 +44,4 @@ function clientPlugin() {
44
44
  }
45
45
  exports.clientPlugin = clientPlugin;
46
46
  __exportStar(require("./tools/vite"), exports);
47
+ //# sourceMappingURL=index.js.map
@@ -4,3 +4,4 @@ declare const clientConfig: UserConfig;
4
4
  declare const viteStart: () => Promise<void>;
5
5
  declare const viteBuild: () => Promise<void>;
6
6
  export { viteBuild, viteStart, serverConfig, clientConfig };
7
+ //# sourceMappingURL=vite.d.ts.map
package/cjs/tools/vite.js CHANGED
@@ -97,3 +97,4 @@ const viteBuild = async () => {
97
97
  await (0, vite_1.build)({ ...serverConfig, mode: 'production' });
98
98
  };
99
99
  exports.viteBuild = viteBuild;
100
+ //# sourceMappingURL=vite.js.map
@@ -1,2 +1,3 @@
1
1
  export declare const webpackStart: () => Promise<void>;
2
2
  export declare const webpackBuild: () => Promise<void>;
3
+ //# sourceMappingURL=webpack.d.ts.map
@@ -20,3 +20,4 @@ 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
@@ -1,3 +1,4 @@
1
1
  import * as WebpackChain from 'webpack-chain';
2
- declare const getBaseConfig: (chain: WebpackChain, isServer: boolean) => IConfig;
2
+ declare const getBaseConfig: (chain: WebpackChain, isServer: boolean) => import("ssr-types-react").IConfig;
3
3
  export { getBaseConfig };
4
+ //# sourceMappingURL=base.d.ts.map
@@ -4,9 +4,9 @@ import * as webpack from 'webpack';
4
4
  const MiniCssExtractPlugin = require(loadModuleFromFramework('mini-css-extract-plugin'));
5
5
  const WebpackBar = require('webpackbar');
6
6
  const loadModule = loadModuleFromFramework;
7
- const addBabelLoader = (chain, envOptions) => {
7
+ const addBabelLoader = (chain, envOptions, isServer) => {
8
8
  var _a, _b;
9
- const { babelOptions } = loadConfig();
9
+ const { babelOptions, isDev } = loadConfig();
10
10
  chain.use('babel-loader')
11
11
  .loader(loadModule('babel-loader'))
12
12
  .options({
@@ -38,7 +38,7 @@ const addBabelLoader = (chain, envOptions) => {
38
38
  [loadModule('@babel/plugin-proposal-private-methods'), { loose: true }],
39
39
  [loadModule('@babel/plugin-proposal-private-property-in-object'), { loose: true }],
40
40
  ...(_b = babelOptions === null || babelOptions === void 0 ? void 0 : babelOptions.plugins) !== null && _b !== void 0 ? _b : []
41
- ]
41
+ ].concat((!isServer && isDev) ? loadModule('react-refresh/babel') : [])
42
42
  })
43
43
  .end();
44
44
  };
@@ -95,8 +95,8 @@ const getBaseConfig = (chain, isServer) => {
95
95
  else {
96
96
  babelForExtraModule = module.end().exclude.add(/core-js/).end();
97
97
  }
98
- addBabelLoader(babelModule, envOptions);
99
- addBabelLoader(babelForExtraModule, envOptions);
98
+ addBabelLoader(babelModule, envOptions, isServer);
99
+ addBabelLoader(babelForExtraModule, envOptions, isServer);
100
100
  setStyle(chain, /\.css$/, {
101
101
  rule: 'css',
102
102
  isServer,
@@ -135,3 +135,4 @@ const getBaseConfig = (chain, isServer) => {
135
135
  return config;
136
136
  };
137
137
  export { getBaseConfig };
138
+ //# sourceMappingURL=base.js.map
@@ -2,3 +2,4 @@
2
2
  import * as WebpackChain from 'webpack-chain';
3
3
  declare const getClientWebpack: (chain: WebpackChain) => import("webpack").Configuration;
4
4
  export { getClientWebpack };
5
+ //# sourceMappingURL=client.d.ts.map
@@ -5,11 +5,12 @@ import { getBaseConfig } from './base';
5
5
  const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin');
6
6
  const safePostCssParser = require('postcss-safe-parser');
7
7
  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
8
+ const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
8
9
  const generateAnalysis = Boolean(process.env.GENERATE_ANALYSIS);
9
10
  const loadModule = loadModuleFromFramework;
10
11
  let asyncChunkMap = {};
11
12
  const getClientWebpack = (chain) => {
12
- const { isDev, chunkName, getOutput, cwd, useHash, chainClientConfig } = loadConfig();
13
+ const { isDev, chunkName, getOutput, cwd, useHash, chainClientConfig, host, fePort } = loadConfig();
13
14
  const shouldUseSourceMap = isDev || Boolean(process.env.GENERATE_SOURCEMAP);
14
15
  const publicPath = getOutputPublicPath();
15
16
  getBaseConfig(chain, false);
@@ -86,6 +87,14 @@ const getClientWebpack = (chain) => {
86
87
  chain.when(generateAnalysis, chain => {
87
88
  chain.plugin('analyze').use(BundleAnalyzerPlugin);
88
89
  });
90
+ chain.when(isDev, chain => {
91
+ chain.plugin('fast-refresh').use(new ReactRefreshWebpackPlugin({
92
+ overlay: {
93
+ sockHost: host,
94
+ sockPort: fePort
95
+ }
96
+ }));
97
+ });
89
98
  chain.plugin('WriteAsyncManifest').use(class WriteAsyncChunkManifest {
90
99
  apply(compiler) {
91
100
  compiler.hooks.watchRun.tap('thisCompilation', async () => {
@@ -102,3 +111,4 @@ const getClientWebpack = (chain) => {
102
111
  return chain.toConfig();
103
112
  };
104
113
  export { getClientWebpack };
114
+ //# sourceMappingURL=client.js.map
@@ -1,2 +1,3 @@
1
1
  export * from './client';
2
2
  export * from './server';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -1,2 +1,3 @@
1
1
  export * from './client';
2
2
  export * from './server';
3
+ //# sourceMappingURL=index.js.map
@@ -2,3 +2,4 @@ import * as WebpackChain from 'webpack-chain';
2
2
  import * as webpack from 'webpack';
3
3
  declare const getServerWebpack: (chain: WebpackChain) => webpack.Configuration;
4
4
  export { getServerWebpack };
5
+ //# sourceMappingURL=server.d.ts.map
@@ -32,3 +32,4 @@ const getServerWebpack = (chain) => {
32
32
  return chain.toConfig();
33
33
  };
34
34
  export { getServerWebpack };
35
+ //# sourceMappingURL=server.js.map
@@ -1,2 +1,3 @@
1
1
  declare const clientRender: () => Promise<void>;
2
2
  export { clientRender };
3
+ //# sourceMappingURL=client-entry.d.ts.map
@@ -7,7 +7,7 @@ import { Routes } from './create-router';
7
7
  import { AppContext } from './context';
8
8
  const { FeRoutes, layoutFetch, App, PrefixRouterBase } = Routes;
9
9
  const clientRender = async () => {
10
- var _a, _b, _c, _d;
10
+ var _a, _b;
11
11
  const IApp = App !== null && App !== void 0 ? App : function (props) {
12
12
  return props.children;
13
13
  };
@@ -27,9 +27,6 @@ const clientRender = async () => {
27
27
  const WrappedComponent = wrapComponent(component);
28
28
  return (React.createElement(Route, { exact: true, key: path, path: path, render: () => React.createElement(WrappedComponent, { key: location.pathname }) }));
29
29
  })))))), document.getElementById('app'));
30
- if (!window.__USE_VITE__) {
31
- (_d = (_c = module === null || module === void 0 ? void 0 : module.hot) === null || _c === void 0 ? void 0 : _c.accept) === null || _d === void 0 ? void 0 : _d.call(_c); // webpack 场景下的 hmr
32
- }
33
30
  };
34
31
  if (!window.__disableClientRender__) {
35
32
  // 如果服务端直出的时候带上该记号,则默认不进行客户端渲染,将处理逻辑交给上层
@@ -37,3 +34,4 @@ if (!window.__disableClientRender__) {
37
34
  clientRender();
38
35
  }
39
36
  export { clientRender };
37
+ //# sourceMappingURL=client-entry.js.map
@@ -1,3 +1,4 @@
1
1
  /// <reference types="react" />
2
2
  import { IProps } from 'ssr-types-react';
3
3
  export declare function AppContext(props: IProps): JSX.Element;
4
+ //# sourceMappingURL=context.d.ts.map
@@ -25,3 +25,4 @@ 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
@@ -2,3 +2,4 @@ import { Context } from 'react';
2
2
  import { IContext } from 'ssr-types-react';
3
3
  declare let STORE_CONTEXT: Context<IContext>;
4
4
  export { STORE_CONTEXT };
5
+ //# sourceMappingURL=create-context.d.ts.map
@@ -14,3 +14,4 @@ else {
14
14
  });
15
15
  }
16
16
  export { STORE_CONTEXT };
17
+ //# sourceMappingURL=create-context.js.map
@@ -1,3 +1,4 @@
1
1
  import { ReactRoutesType } from 'ssr-types-react';
2
2
  declare const Routes: ReactRoutesType;
3
3
  export { Routes };
4
+ //# sourceMappingURL=create-router.d.ts.map
@@ -21,3 +21,4 @@ if (ManualRoutesWithType.FeRoutes) {
21
21
  Routes.FeRoutes = combineRoutes;
22
22
  }
23
23
  export { Routes };
24
+ //# sourceMappingURL=create-router.js.map
@@ -2,3 +2,4 @@ import * as React from 'react';
2
2
  import { ISSRContext, IConfig } from 'ssr-types-react';
3
3
  declare const serverRender: (ctx: ISSRContext, config: IConfig) => Promise<React.ReactElement>;
4
4
  export { serverRender };
5
+ //# sourceMappingURL=server-entry.d.ts.map
@@ -1,18 +1,16 @@
1
1
  import * as React from 'react';
2
2
  import { StaticRouter } from 'react-router-dom';
3
- import { findRoute, getManifest, logGreen, normalizePath, addAsyncChunk } from 'ssr-server-utils';
4
- // @ts-expect-error
5
- import * as serializeWrap from 'serialize-javascript';
3
+ import { findRoute, getManifest, logGreen, normalizePath, getAsyncCssChunk, getAsyncJsChunk, reactRefreshFragment } from 'ssr-server-utils';
4
+ import { serialize } from 'ssr-serialize-javascript';
6
5
  // @ts-expect-error
7
6
  import { STORE_CONTEXT as Context } from '_build/create-context';
8
7
  // @ts-expect-error
9
8
  import Layout from '@/components/layout/index.tsx';
10
9
  import { Routes } from './create-router';
11
10
  const { FeRoutes, layoutFetch, PrefixRouterBase, state } = Routes;
12
- const serialize = serializeWrap.default || serializeWrap;
13
11
  const serverRender = async (ctx, config) => {
14
12
  var _a;
15
- const { cssOrder, jsOrder, dynamic, mode, parallelFetch, disableClientRender, prefix, isVite, isDev, clientPrefix } = config;
13
+ const { mode, parallelFetch, disableClientRender, prefix, isVite, isDev, clientPrefix } = config;
16
14
  let path = ctx.request.path; // 这里取 pathname 不能够包含 queryString
17
15
  const base = prefix !== null && prefix !== void 0 ? prefix : PrefixRouterBase; // 以开发者实际传入的为最高优先级
18
16
  if (base) {
@@ -25,24 +23,15 @@ const serverRender = async (ctx, config) => {
25
23
  If you create new folder or component file, please restart server by npm start
26
24
  `);
27
25
  }
28
- let dynamicCssOrder = cssOrder;
29
- if (dynamic) {
30
- dynamicCssOrder = cssOrder.concat([`${routeItem.webpackChunkName}.css`]);
31
- if (!isVite || (isVite && !isDev)) {
32
- // call it when webpack mode or vite prod mode
33
- dynamicCssOrder = await addAsyncChunk(dynamicCssOrder, routeItem.webpackChunkName);
34
- }
35
- }
26
+ const { fetch, webpackChunkName, component } = routeItem;
27
+ const dynamicCssOrder = await getAsyncCssChunk(ctx, webpackChunkName);
28
+ const dynamicJsOrder = await getAsyncJsChunk(ctx);
36
29
  const manifest = await getManifest(config);
37
30
  const injectCss = [];
38
31
  if (isVite && isDev) {
39
32
  injectCss.push(React.createElement("script", { src: "/@vite/client", type: "module", key: "vite-client" }));
40
33
  injectCss.push(React.createElement("script", { key: "vite-react-refresh", type: "module", dangerouslySetInnerHTML: {
41
- __html: ` import RefreshRuntime from "/@react-refresh"
42
- RefreshRuntime.injectIntoGlobalHook(window)
43
- window.$RefreshReg$ = () => {}
44
- window.$RefreshSig$ = () => (type) => type
45
- window.__vite_plugin_react_preamble_installed__ = true`
34
+ __html: reactRefreshFragment
46
35
  } }));
47
36
  }
48
37
  else {
@@ -63,14 +52,13 @@ const serverRender = async (ctx, config) => {
63
52
  __html: 'window.__USE_VITE__=true'
64
53
  } }),
65
54
  (isVite && isDev) && React.createElement("script", { type: "module", src: '/node_modules/ssr-plugin-react/esm/entry/client-entry.js', key: "vite-react-entry" }),
66
- ...jsOrder.map(js => manifest[js]).map(item => item && React.createElement("script", { key: item, src: item, type: isVite ? 'module' : '' }))
55
+ ...dynamicJsOrder.map(js => manifest[js]).map(item => item && React.createElement("script", { key: item, src: item, type: isVite ? 'module' : '' }))
67
56
  ];
68
57
  const staticList = {
69
58
  injectCss,
70
59
  injectScript
71
60
  };
72
61
  const isCsr = !!(mode === 'csr' || ((_a = ctx.request.query) === null || _a === void 0 ? void 0 : _a.csr));
73
- const { component, fetch } = routeItem;
74
62
  const Component = isCsr ? React.Fragment : (await component()).default;
75
63
  if (isCsr) {
76
64
  logGreen(`Current path ${path} use csr render mode`);
@@ -101,3 +89,4 @@ const serverRender = async (ctx, config) => {
101
89
  React.createElement(Component, null)))));
102
90
  };
103
91
  export { serverRender };
92
+ //# sourceMappingURL=server-entry.js.map
package/esm/index.d.ts CHANGED
@@ -4,3 +4,4 @@ export declare function clientPlugin(): {
4
4
  build: () => Promise<void>;
5
5
  };
6
6
  export * from './tools/vite';
7
+ //# sourceMappingURL=index.d.ts.map
package/esm/index.js CHANGED
@@ -26,3 +26,4 @@ export function clientPlugin() {
26
26
  };
27
27
  }
28
28
  export * from './tools/vite';
29
+ //# sourceMappingURL=index.js.map
@@ -4,3 +4,4 @@ declare const clientConfig: UserConfig;
4
4
  declare const viteStart: () => Promise<void>;
5
5
  declare const viteBuild: () => Promise<void>;
6
6
  export { viteBuild, viteStart, serverConfig, clientConfig };
7
+ //# sourceMappingURL=vite.d.ts.map
package/esm/tools/vite.js CHANGED
@@ -91,3 +91,4 @@ const viteBuild = async () => {
91
91
  await build({ ...serverConfig, mode: 'production' });
92
92
  };
93
93
  export { viteBuild, viteStart, serverConfig, clientConfig };
94
+ //# sourceMappingURL=vite.js.map
@@ -1,2 +1,3 @@
1
1
  export declare const webpackStart: () => Promise<void>;
2
2
  export declare const webpackBuild: () => Promise<void>;
3
+ //# sourceMappingURL=webpack.d.ts.map
@@ -15,3 +15,4 @@ 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,15 +1,13 @@
1
1
  {
2
2
  "name": "ssr-plugin-react",
3
- "version": "6.2.12",
3
+ "version": "6.2.15",
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
- "build": "concurrently \"tsc -p ./tsconfig.cjs.json --inlineSourceMap false\" \" tsc -p ./tsconfig.esm.json --inlineSourceMap false\"",
10
- "build:only": "concurrently \"tsc-transpile-only --skipLibCheck -p ./tsconfig.cjs.json --inlineSourceMap false\" \" tsc-transpile-only --skipLibCheck -p ./tsconfig.esm.json --inlineSourceMap false\"",
11
- "watch": "concurrently \"tsc -w -p ./tsconfig.cjs.json \" \"tsc -w -p ./tsconfig.esm.json \"",
12
- "watch:cjs": "tsc -w -p ./tsconfig.cjs.json"
9
+ "build": "concurrently \"tsc -p ./tsconfig.cjs.json \" \" tsc -p ./tsconfig.esm.json\"",
10
+ "watch": "concurrently \"tsc -w -p ./tsconfig.cjs.json \" \"tsc -w -p ./tsconfig.esm.json \""
13
11
  },
14
12
  "repository": {
15
13
  "type": "git",
@@ -34,6 +32,7 @@
34
32
  "@babel/plugin-proposal-optional-chaining": "^7.16.5",
35
33
  "@babel/plugin-transform-runtime": "^7.9.6",
36
34
  "@babel/preset-env": "^7.5.5",
35
+ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.5",
37
36
  "@vitejs/plugin-react": "^1.0.0",
38
37
  "babel-loader": "^8.0.4",
39
38
  "babel-plugin-import": "1.13.3",
@@ -54,11 +53,12 @@
54
53
  "postcss-preset-env": "^7.0.0",
55
54
  "postcss-safe-parser": "^6.0.0",
56
55
  "react": "^17.0.1",
56
+ "react-dev-utils": "^11.0.4",
57
57
  "react-dom": "^17.0.0",
58
+ "react-refresh": "^0.12.0",
58
59
  "react-router": "^5.2.1",
59
60
  "react-router-dom": "^5.1.2",
60
- "react-dev-utils": "^11.0.4",
61
- "serialize-javascript": "^6.0.0",
61
+ "ssr-serialize-javascript": "^6.0.0",
62
62
  "ssr-client-utils": "^6.2.7",
63
63
  "ssr-hoc-react": "^6.2.7",
64
64
  "ssr-server-utils": "^6.2.10",
@@ -79,7 +79,6 @@
79
79
  "@types/react-router-dom": "^5.1.3",
80
80
  "@types/webpack": "^4.41.10",
81
81
  "concurrently": "^5.1.0",
82
- "ssr-types": "^6.2.3",
83
82
  "ssr-types-react": "^6.2.7"
84
83
  }
85
84
  }
@@ -1,6 +1,6 @@
1
1
 
2
2
  import { join } from 'path'
3
- import { Mode } from 'ssr-types'
3
+ import { Mode } from 'ssr-types-react'
4
4
  import { getCwd, loadConfig, getLocalNodeModules, setStyle, addImageChain, loadModuleFromFramework } from 'ssr-server-utils'
5
5
  import * as WebpackChain from 'webpack-chain'
6
6
  import * as webpack from 'webpack'
@@ -9,8 +9,8 @@ const MiniCssExtractPlugin = require(loadModuleFromFramework('mini-css-extract-p
9
9
  const WebpackBar = require('webpackbar')
10
10
  const loadModule = loadModuleFromFramework
11
11
 
12
- const addBabelLoader = (chain: WebpackChain.Rule<WebpackChain.Module>, envOptions: any) => {
13
- const { babelOptions } = loadConfig()
12
+ const addBabelLoader = (chain: WebpackChain.Rule<WebpackChain.Module>, envOptions: any, isServer: boolean) => {
13
+ const { babelOptions, isDev } = loadConfig()
14
14
  chain.use('babel-loader')
15
15
  .loader(loadModule('babel-loader'))
16
16
  .options({
@@ -42,7 +42,7 @@ const addBabelLoader = (chain: WebpackChain.Rule<WebpackChain.Module>, envOption
42
42
  [loadModule('@babel/plugin-proposal-private-methods'), { loose: true }],
43
43
  [loadModule('@babel/plugin-proposal-private-property-in-object'), { loose: true }],
44
44
  ...babelOptions?.plugins ?? []
45
- ]
45
+ ].concat((!isServer && isDev) ? loadModule('react-refresh/babel') : [])
46
46
  })
47
47
  .end()
48
48
  }
@@ -106,8 +106,8 @@ const getBaseConfig = (chain: WebpackChain, isServer: boolean) => {
106
106
  babelForExtraModule = module.end().exclude.add(/core-js/).end()
107
107
  }
108
108
 
109
- addBabelLoader(babelModule, envOptions)
110
- addBabelLoader(babelForExtraModule, envOptions)
109
+ addBabelLoader(babelModule, envOptions, isServer)
110
+ addBabelLoader(babelForExtraModule, envOptions, isServer)
111
111
 
112
112
  setStyle(chain, /\.css$/, {
113
113
  rule: 'css',
@@ -7,12 +7,13 @@ import { getBaseConfig } from './base'
7
7
  const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin')
8
8
  const safePostCssParser = require('postcss-safe-parser')
9
9
  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
10
+ const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin')
10
11
  const generateAnalysis = Boolean(process.env.GENERATE_ANALYSIS)
11
12
  const loadModule = loadModuleFromFramework
12
13
  let asyncChunkMap: Record<string, string[]> = {}
13
14
 
14
15
  const getClientWebpack = (chain: WebpackChain) => {
15
- const { isDev, chunkName, getOutput, cwd, useHash, chainClientConfig } = loadConfig()
16
+ const { isDev, chunkName, getOutput, cwd, useHash, chainClientConfig, host, fePort } = loadConfig()
16
17
  const shouldUseSourceMap = isDev || Boolean(process.env.GENERATE_SOURCEMAP)
17
18
  const publicPath = getOutputPublicPath()
18
19
  getBaseConfig(chain, false)
@@ -92,6 +93,15 @@ const getClientWebpack = (chain: WebpackChain) => {
92
93
  chain.when(generateAnalysis, chain => {
93
94
  chain.plugin('analyze').use(BundleAnalyzerPlugin)
94
95
  })
96
+ chain.when(isDev, chain => {
97
+ chain.plugin('fast-refresh').use(new ReactRefreshWebpackPlugin({
98
+ overlay: {
99
+ sockHost: host,
100
+ sockPort: fePort
101
+ }
102
+ }))
103
+ })
104
+
95
105
  chain.plugin('WriteAsyncManifest').use(
96
106
  class WriteAsyncChunkManifest {
97
107
  apply (compiler: any) {
@@ -9,7 +9,6 @@ import { AppContext } from './context'
9
9
 
10
10
  const { FeRoutes, layoutFetch, App, PrefixRouterBase } = Routes as ReactRoutesType
11
11
 
12
- declare const module: any
13
12
  declare const window: IWindow
14
13
 
15
14
  const clientRender = async (): Promise<void> => {
@@ -44,9 +43,6 @@ const clientRender = async (): Promise<void> => {
44
43
  </BrowserRouter>
45
44
  , document.getElementById('app'))
46
45
 
47
- if (!window.__USE_VITE__) {
48
- module?.hot?.accept?.() // webpack 场景下的 hmr
49
- }
50
46
  }
51
47
  if (!window.__disableClientRender__) {
52
48
  // 如果服务端直出的时候带上该记号,则默认不进行客户端渲染,将处理逻辑交给上层
@@ -1,9 +1,8 @@
1
1
  import * as React from 'react'
2
2
  import { StaticRouter } from 'react-router-dom'
3
- import { findRoute, getManifest, logGreen, normalizePath, addAsyncChunk } from 'ssr-server-utils'
3
+ import { findRoute, getManifest, logGreen, normalizePath, getAsyncCssChunk, getAsyncJsChunk, reactRefreshFragment } from 'ssr-server-utils'
4
4
  import { ISSRContext, IConfig, ReactRoutesType, ReactESMFeRouteItem } from 'ssr-types-react'
5
- // @ts-expect-error
6
- import * as serializeWrap from 'serialize-javascript'
5
+ import { serialize } from 'ssr-serialize-javascript'
7
6
  // @ts-expect-error
8
7
  import { STORE_CONTEXT as Context } from '_build/create-context'
9
8
  // @ts-expect-error
@@ -11,10 +10,9 @@ import Layout from '@/components/layout/index.tsx'
11
10
  import { Routes } from './create-router'
12
11
 
13
12
  const { FeRoutes, layoutFetch, PrefixRouterBase, state } = Routes as ReactRoutesType
14
- const serialize = serializeWrap.default || serializeWrap
15
13
 
16
14
  const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.ReactElement> => {
17
- const { cssOrder, jsOrder, dynamic, mode, parallelFetch, disableClientRender, prefix, isVite, isDev, clientPrefix } = config
15
+ const { mode, parallelFetch, disableClientRender, prefix, isVite, isDev, clientPrefix } = config
18
16
  let path = ctx.request.path // 这里取 pathname 不能够包含 queryString
19
17
  const base = prefix ?? PrefixRouterBase // 以开发者实际传入的为最高优先级
20
18
  if (base) {
@@ -29,15 +27,9 @@ const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.Re
29
27
  `)
30
28
  }
31
29
 
32
- let dynamicCssOrder = cssOrder
33
-
34
- if (dynamic) {
35
- dynamicCssOrder = cssOrder.concat([`${routeItem.webpackChunkName}.css`])
36
- if (!isVite || (isVite && !isDev)) {
37
- // call it when webpack mode or vite prod mode
38
- dynamicCssOrder = await addAsyncChunk(dynamicCssOrder, routeItem.webpackChunkName)
39
- }
40
- }
30
+ const { fetch, webpackChunkName, component } = routeItem
31
+ const dynamicCssOrder = await getAsyncCssChunk(ctx, webpackChunkName)
32
+ const dynamicJsOrder = await getAsyncJsChunk(ctx)
41
33
  const manifest = await getManifest(config)
42
34
 
43
35
  const injectCss: JSX.Element[] = []
@@ -45,11 +37,7 @@ const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.Re
45
37
  if (isVite && isDev) {
46
38
  injectCss.push(<script src="/@vite/client" type="module" key="vite-client"/>)
47
39
  injectCss.push(<script key="vite-react-refresh" type="module" dangerouslySetInnerHTML={{
48
- __html: ` import RefreshRuntime from "/@react-refresh"
49
- RefreshRuntime.injectIntoGlobalHook(window)
50
- window.$RefreshReg$ = () => {}
51
- window.$RefreshSig$ = () => (type) => type
52
- window.__vite_plugin_react_preamble_installed__ = true`
40
+ __html: reactRefreshFragment
53
41
  }} />)
54
42
  } else {
55
43
  dynamicCssOrder.forEach(css => {
@@ -71,7 +59,7 @@ const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.Re
71
59
  __html: 'window.__USE_VITE__=true'
72
60
  }} />,
73
61
  (isVite && isDev) && <script type="module" src='/node_modules/ssr-plugin-react/esm/entry/client-entry.js' key="vite-react-entry" />,
74
- ...jsOrder.map(js => manifest[js]).map(item => item && <script key={item} src={item} type={isVite ? 'module' : ''}/>)
62
+ ...dynamicJsOrder.map(js => manifest[js]).map(item => item && <script key={item} src={item} type={isVite ? 'module' : ''}/>)
75
63
  ]
76
64
  const staticList = {
77
65
  injectCss,
@@ -79,7 +67,6 @@ const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.Re
79
67
  }
80
68
 
81
69
  const isCsr = !!(mode === 'csr' || ctx.request.query?.csr)
82
- const { component, fetch } = routeItem
83
70
  const Component = isCsr ? React.Fragment : (await component()).default
84
71
 
85
72
  if (isCsr) {