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.
- package/CHANGELOG.md +44 -0
- package/cjs/config/base.d.ts +2 -1
- package/cjs/config/base.js +6 -5
- package/cjs/config/client.d.ts +1 -0
- package/cjs/config/client.js +11 -1
- package/cjs/config/index.d.ts +1 -0
- package/cjs/config/index.js +1 -0
- package/cjs/config/server.d.ts +1 -0
- package/cjs/config/server.js +1 -0
- package/cjs/entry/client-entry.d.ts +1 -0
- package/cjs/entry/client-entry.js +2 -4
- package/cjs/entry/context.d.ts +1 -0
- package/cjs/entry/context.js +1 -0
- package/cjs/entry/create-context.d.ts +1 -0
- package/cjs/entry/create-context.js +1 -0
- package/cjs/entry/create-router.d.ts +1 -0
- package/cjs/entry/create-router.js +1 -0
- package/cjs/entry/server-entry.d.ts +1 -0
- package/cjs/entry/server-entry.js +9 -20
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +1 -0
- package/cjs/tools/vite.d.ts +1 -0
- package/cjs/tools/vite.js +1 -0
- package/cjs/tools/webpack.d.ts +1 -0
- package/cjs/tools/webpack.js +1 -0
- package/esm/config/base.d.ts +2 -1
- package/esm/config/base.js +6 -5
- package/esm/config/client.d.ts +1 -0
- package/esm/config/client.js +11 -1
- package/esm/config/index.d.ts +1 -0
- package/esm/config/index.js +1 -0
- package/esm/config/server.d.ts +1 -0
- package/esm/config/server.js +1 -0
- package/esm/entry/client-entry.d.ts +1 -0
- package/esm/entry/client-entry.js +2 -4
- package/esm/entry/context.d.ts +1 -0
- package/esm/entry/context.js +1 -0
- package/esm/entry/create-context.d.ts +1 -0
- package/esm/entry/create-context.js +1 -0
- package/esm/entry/create-router.d.ts +1 -0
- package/esm/entry/create-router.js +1 -0
- package/esm/entry/server-entry.d.ts +1 -0
- package/esm/entry/server-entry.js +9 -20
- package/esm/index.d.ts +1 -0
- package/esm/index.js +1 -0
- package/esm/tools/vite.d.ts +1 -0
- package/esm/tools/vite.js +1 -0
- package/esm/tools/webpack.d.ts +1 -0
- package/esm/tools/webpack.js +1 -0
- package/package.json +7 -8
- package/src/config/base.ts +6 -6
- package/src/config/client.ts +11 -1
- package/src/entry/client-entry.tsx +0 -4
- 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
|
|
package/cjs/config/base.d.ts
CHANGED
|
@@ -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
|
package/cjs/config/base.js
CHANGED
|
@@ -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
|
package/cjs/config/client.d.ts
CHANGED
package/cjs/config/client.js
CHANGED
|
@@ -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
|
package/cjs/config/index.d.ts
CHANGED
package/cjs/config/index.js
CHANGED
package/cjs/config/server.d.ts
CHANGED
package/cjs/config/server.js
CHANGED
|
@@ -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
|
|
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
|
package/cjs/entry/context.d.ts
CHANGED
package/cjs/entry/context.js
CHANGED
|
@@ -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
|
-
|
|
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 {
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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:
|
|
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
|
-
...
|
|
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
package/cjs/index.js
CHANGED
package/cjs/tools/vite.d.ts
CHANGED
package/cjs/tools/vite.js
CHANGED
package/cjs/tools/webpack.d.ts
CHANGED
package/cjs/tools/webpack.js
CHANGED
package/esm/config/base.d.ts
CHANGED
|
@@ -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
|
package/esm/config/base.js
CHANGED
|
@@ -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
|
package/esm/config/client.d.ts
CHANGED
package/esm/config/client.js
CHANGED
|
@@ -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
|
package/esm/config/index.d.ts
CHANGED
package/esm/config/index.js
CHANGED
package/esm/config/server.d.ts
CHANGED
package/esm/config/server.js
CHANGED
|
@@ -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
|
|
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
|
package/esm/entry/context.d.ts
CHANGED
package/esm/entry/context.js
CHANGED
|
@@ -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,
|
|
4
|
-
|
|
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 {
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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:
|
|
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
|
-
...
|
|
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
package/esm/index.js
CHANGED
package/esm/tools/vite.d.ts
CHANGED
package/esm/tools/vite.js
CHANGED
package/esm/tools/webpack.d.ts
CHANGED
package/esm/tools/webpack.js
CHANGED
package/package.json
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ssr-plugin-react",
|
|
3
|
-
"version": "6.2.
|
|
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
|
|
10
|
-
"
|
|
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
|
-
"
|
|
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
|
}
|
package/src/config/base.ts
CHANGED
|
@@ -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',
|
package/src/config/client.ts
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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:
|
|
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
|
-
...
|
|
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) {
|