ssr-plugin-react 6.1.8 → 6.1.14-alpha.0
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 +55 -0
- package/cjs/config/base.d.ts +1 -1
- package/cjs/config/base.js +1 -0
- package/cjs/config/client.js +1 -0
- package/cjs/config/index.js +1 -0
- package/cjs/config/server.js +1 -0
- package/cjs/entry/client-entry.js +1 -0
- package/cjs/entry/context.js +1 -0
- package/cjs/entry/create-context.js +3 -2
- package/cjs/entry/server-entry.js +19 -17
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +27 -16
- package/cjs/tools/vite.d.ts +6 -0
- package/cjs/tools/vite.js +56 -0
- package/cjs/tools/webpack.d.ts +2 -0
- package/cjs/tools/webpack.js +23 -0
- package/esm/config/base.d.ts +1 -1
- package/esm/config/base.js +1 -0
- package/esm/config/client.js +1 -0
- package/esm/config/index.js +1 -0
- package/esm/config/server.js +1 -0
- package/esm/entry/client-entry.js +1 -0
- package/esm/entry/context.js +1 -0
- package/esm/entry/create-context.js +4 -3
- package/esm/entry/server-entry.js +19 -17
- package/esm/index.d.ts +1 -0
- package/esm/index.js +17 -16
- package/esm/tools/vite.d.ts +6 -0
- package/esm/tools/vite.js +50 -0
- package/esm/tools/webpack.d.ts +2 -0
- package/esm/tools/webpack.js +18 -0
- package/package.json +9 -8
- package/src/config/server.ts +0 -1
- package/src/entry/create-context.ts +3 -3
- package/src/entry/server-entry.tsx +16 -18
- package/src/index.ts +17 -16
- package/src/tools/vite.ts +58 -0
- package/src/tools/webpack.ts +20 -0
- package/README.md +0 -274
- package/src/config/vite.config.tpl +0 -39
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { StaticRouter } from 'react-router-dom';
|
|
3
3
|
import { findRoute, getManifest, logGreen, normalizePath, addAsyncChunk } from 'ssr-server-utils';
|
|
4
|
-
|
|
4
|
+
//@ts-expect-error
|
|
5
|
+
import * as serializeWrap from 'serialize-javascript';
|
|
5
6
|
// @ts-expect-error
|
|
6
7
|
import * as Routes from '_build/ssr-temporary-routes';
|
|
7
8
|
// @ts-expect-error
|
|
@@ -9,17 +10,16 @@ import { STORE_CONTEXT as Context } from '_build/create-context';
|
|
|
9
10
|
// @ts-expect-error
|
|
10
11
|
import Layout from '@/components/layout/index.tsx';
|
|
11
12
|
const { FeRoutes, layoutFetch, PrefixRouterBase, state } = Routes;
|
|
13
|
+
const serialize = serializeWrap.default || serializeWrap;
|
|
12
14
|
const serverRender = async (ctx, config) => {
|
|
13
|
-
var _a
|
|
14
|
-
const { cssOrder, jsOrder, dynamic, mode,
|
|
15
|
-
global.window = (_a = global.window) !== null && _a !== void 0 ? _a : {}; // 防止覆盖上层应用自己定义的 window 对象
|
|
15
|
+
var _a;
|
|
16
|
+
const { cssOrder, jsOrder, dynamic, mode, parallelFetch, disableClientRender, prefix, isVite, isDev } = config;
|
|
16
17
|
let path = ctx.request.path; // 这里取 pathname 不能够包含 queryString
|
|
17
18
|
const base = prefix !== null && prefix !== void 0 ? prefix : PrefixRouterBase; // 以开发者实际传入的为最高优先级
|
|
18
19
|
if (base) {
|
|
19
20
|
path = normalizePath(path, base);
|
|
20
21
|
}
|
|
21
22
|
const routeItem = findRoute(FeRoutes, path);
|
|
22
|
-
const viteMode = process.env.BUILD_TOOL === 'vite';
|
|
23
23
|
if (!routeItem) {
|
|
24
24
|
throw new Error(`
|
|
25
25
|
查找组件失败,请确认当前 path: ${path} 对应前端组件是否存在
|
|
@@ -27,13 +27,15 @@ const serverRender = async (ctx, config) => {
|
|
|
27
27
|
`);
|
|
28
28
|
}
|
|
29
29
|
let dynamicCssOrder = cssOrder;
|
|
30
|
-
if (dynamic
|
|
30
|
+
if (dynamic) {
|
|
31
31
|
dynamicCssOrder = cssOrder.concat([`${routeItem.webpackChunkName}.css`]);
|
|
32
|
-
|
|
32
|
+
if (!isVite) {
|
|
33
|
+
dynamicCssOrder = await addAsyncChunk(dynamicCssOrder, routeItem.webpackChunkName);
|
|
34
|
+
}
|
|
33
35
|
}
|
|
34
|
-
const manifest =
|
|
36
|
+
const manifest = await getManifest(config);
|
|
35
37
|
const injectCss = [];
|
|
36
|
-
if (
|
|
38
|
+
if (isVite && isDev) {
|
|
37
39
|
injectCss.push(React.createElement("script", { src: "/@vite/client", type: "module", key: "vite-client" }));
|
|
38
40
|
injectCss.push(React.createElement("script", { key: "vite-react-refresh", type: "module", dangerouslySetInnerHTML: {
|
|
39
41
|
__html: ` import RefreshRuntime from "/@react-refresh"
|
|
@@ -42,7 +44,6 @@ const serverRender = async (ctx, config) => {
|
|
|
42
44
|
window.$RefreshSig$ = () => (type) => type
|
|
43
45
|
window.__vite_plugin_react_preamble_installed__ = true`
|
|
44
46
|
} }));
|
|
45
|
-
injectCss.push(React.createElement("link", { rel: 'stylesheet', href: `/server/static/css/${chunkName}.css`, key: "vite-head-css" }));
|
|
46
47
|
}
|
|
47
48
|
else {
|
|
48
49
|
dynamicCssOrder.forEach(css => {
|
|
@@ -57,18 +58,18 @@ const serverRender = async (ctx, config) => {
|
|
|
57
58
|
__html: 'window.__disableClientRender__ = true'
|
|
58
59
|
} }));
|
|
59
60
|
}
|
|
60
|
-
const injectScript =
|
|
61
|
-
React.createElement("script", { key: "viteWindowInit", dangerouslySetInnerHTML: {
|
|
61
|
+
const injectScript = [
|
|
62
|
+
isVite && React.createElement("script", { key: "viteWindowInit", dangerouslySetInnerHTML: {
|
|
62
63
|
__html: 'window.__USE_VITE__=true'
|
|
63
64
|
} }),
|
|
64
|
-
React.createElement("script", { type: "module", src: '/node_modules/ssr-plugin-react/esm/entry/client-entry.js', key: "vite-react-entry" })
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
(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' : '' }))
|
|
67
|
+
];
|
|
67
68
|
const staticList = {
|
|
68
69
|
injectCss,
|
|
69
70
|
injectScript
|
|
70
71
|
};
|
|
71
|
-
const isCsr = !!(mode === 'csr' || ((
|
|
72
|
+
const isCsr = !!(mode === 'csr' || ((_a = ctx.request.query) === null || _a === void 0 ? void 0 : _a.csr));
|
|
72
73
|
const { component, fetch } = routeItem;
|
|
73
74
|
const Component = (await component()).default;
|
|
74
75
|
if (isCsr) {
|
|
@@ -94,8 +95,9 @@ const serverRender = async (ctx, config) => {
|
|
|
94
95
|
const injectState = isCsr ? null : React.createElement("script", { dangerouslySetInnerHTML: {
|
|
95
96
|
__html: `window.__USE_SSR__=true; window.__INITIAL_DATA__ =${serialize(combineData)}`
|
|
96
97
|
} });
|
|
97
|
-
return (React.createElement(StaticRouter,
|
|
98
|
+
return (React.createElement(StaticRouter, { location: ctx.request.url },
|
|
98
99
|
React.createElement(Context.Provider, { value: { state: combineData } },
|
|
99
100
|
React.createElement(Layout, { ctx: ctx, config: config, staticList: staticList, injectState: injectState }, isCsr ? React.createElement(React.Fragment, null) : React.createElement(Component, null)))));
|
|
100
101
|
};
|
|
101
102
|
export { serverRender };
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWVudHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VudHJ5L3NlcnZlci1lbnRyeS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUE7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFFakcsa0JBQWtCO0FBQ2xCLE9BQU8sS0FBSyxhQUFhLE1BQU0sc0JBQXNCLENBQUE7QUFDckQsbUJBQW1CO0FBQ25CLE9BQU8sS0FBSyxNQUFNLE1BQU0sNkJBQTZCLENBQUE7QUFDckQsbUJBQW1CO0FBQ25CLE9BQU8sRUFBRSxhQUFhLElBQUksT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDaEUsbUJBQW1CO0FBQ25CLE9BQU8sTUFBTSxNQUFNLCtCQUErQixDQUFBO0FBRWxELE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxHQUFHLE1BQXlCLENBQUE7QUFDcEYsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLE9BQU8sSUFBSSxhQUFhLENBQUE7QUFFeEQsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLEdBQWdCLEVBQUUsTUFBZSxFQUErQixFQUFFOztJQUM1RixNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQTtJQUM5RyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQSxDQUFDLGlDQUFpQztJQUM3RCxNQUFNLElBQUksR0FBRyxNQUFNLGFBQU4s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
|
package/esm/index.d.ts
CHANGED
package/esm/index.js
CHANGED
|
@@ -1,28 +1,29 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { loadConfig } from 'ssr-server-utils';
|
|
2
|
+
const { isVite } = loadConfig();
|
|
2
3
|
export function reactPlugin() {
|
|
3
4
|
return {
|
|
4
5
|
name: 'plugin-react',
|
|
5
6
|
start: async () => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const serverConfigChain = new WebpackChain();
|
|
10
|
-
if (process.env.BUILD_TOOL === 'vite') {
|
|
11
|
-
await startServerBuild(getServerWebpack(serverConfigChain));
|
|
7
|
+
if (isVite) {
|
|
8
|
+
const { viteStart } = await import('./tools/vite');
|
|
9
|
+
await viteStart();
|
|
12
10
|
}
|
|
13
11
|
else {
|
|
14
|
-
const {
|
|
15
|
-
|
|
16
|
-
const clientConfigChain = new WebpackChain();
|
|
17
|
-
await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientServer(getClientWebpack(clientConfigChain))]);
|
|
12
|
+
const { webpackStart } = await import('./tools/webpack');
|
|
13
|
+
await webpackStart();
|
|
18
14
|
}
|
|
19
15
|
},
|
|
20
16
|
build: async () => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
17
|
+
if (isVite) {
|
|
18
|
+
const { viteBuild } = await import('./tools/vite');
|
|
19
|
+
await viteBuild();
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const { webpackBuild } = await import('./tools/webpack');
|
|
23
|
+
await webpackBuild();
|
|
24
|
+
}
|
|
26
25
|
}
|
|
27
26
|
};
|
|
28
27
|
}
|
|
28
|
+
export * from './tools/vite';
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRTdDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxVQUFVLEVBQUUsQ0FBQTtBQUUvQixNQUFNLFVBQVUsV0FBVztJQUN6QixPQUFPO1FBQ0wsSUFBSSxFQUFFLGNBQWM7UUFDcEIsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2hCLElBQUksTUFBTSxFQUFFO2dCQUNWLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQTtnQkFDbEQsTUFBTSxTQUFTLEVBQUUsQ0FBQTthQUNsQjtpQkFBTTtnQkFDTCxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtnQkFDeEQsTUFBTSxZQUFZLEVBQUUsQ0FBQTthQUNyQjtRQUNILENBQUM7UUFDRCxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEIsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFBO2dCQUNsRCxNQUFNLFNBQVMsRUFBRSxDQUFBO2FBQ2xCO2lCQUFNO2dCQUNMLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO2dCQUN4RCxNQUFNLFlBQVksRUFBRSxDQUFBO2FBQ3JCO1FBQ0gsQ0FBQztLQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsY0FBYyxjQUFjLENBQUEifQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { UserConfig } from 'vite';
|
|
2
|
+
declare const serverConfig: UserConfig;
|
|
3
|
+
declare const clientConfig: UserConfig;
|
|
4
|
+
declare const viteStart: () => Promise<void>;
|
|
5
|
+
declare const viteBuild: () => Promise<void>;
|
|
6
|
+
export { viteBuild, viteStart, serverConfig, clientConfig };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { loadConfig, chunkNamePlugin, output, manifestPlugin, commonConfig } from 'ssr-server-utils';
|
|
2
|
+
import react from '@vitejs/plugin-react';
|
|
3
|
+
const build = require('vite').build;
|
|
4
|
+
const { getOutput, reactServerEntry, reactClientEntry } = loadConfig();
|
|
5
|
+
const { clientOutPut, serverOutPut } = getOutput();
|
|
6
|
+
const serverConfig = {
|
|
7
|
+
...commonConfig(),
|
|
8
|
+
plugins: [
|
|
9
|
+
react()
|
|
10
|
+
],
|
|
11
|
+
build: {
|
|
12
|
+
ssr: reactServerEntry,
|
|
13
|
+
outDir: serverOutPut,
|
|
14
|
+
rollupOptions: {
|
|
15
|
+
output: {
|
|
16
|
+
entryFileNames: 'Page.server.js'
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
define: {
|
|
21
|
+
__isBrowser__: false
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const clientConfig = {
|
|
25
|
+
...commonConfig(),
|
|
26
|
+
plugins: [
|
|
27
|
+
react()
|
|
28
|
+
],
|
|
29
|
+
build: {
|
|
30
|
+
ssrManifest: true,
|
|
31
|
+
outDir: clientOutPut,
|
|
32
|
+
rollupOptions: {
|
|
33
|
+
input: reactClientEntry,
|
|
34
|
+
output: output,
|
|
35
|
+
plugins: [chunkNamePlugin(), manifestPlugin()]
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
define: {
|
|
39
|
+
__isBrowser__: true
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const viteStart = async () => {
|
|
43
|
+
//
|
|
44
|
+
};
|
|
45
|
+
const viteBuild = async () => {
|
|
46
|
+
await build({ ...clientConfig, mode: 'production' });
|
|
47
|
+
await build({ ...serverConfig, mode: 'production' });
|
|
48
|
+
};
|
|
49
|
+
export { viteBuild, viteStart, serverConfig, clientConfig };
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy92aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDcEcsT0FBTyxLQUFLLE1BQU0sc0JBQXNCLENBQUE7QUFDeEMsTUFBTSxLQUFLLEdBQXFCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUE7QUFDckQsTUFBTSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLFVBQVUsRUFBRSxDQUFBO0FBQ3RFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUE7QUFFbEQsTUFBTSxZQUFZLEdBQWU7SUFDL0IsR0FBRyxZQUFZLEVBQUU7SUFDakIsT0FBTyxFQUFFO1FBQ1AsS0FBSyxFQUFFO0tBQ1I7SUFDRCxLQUFLLEVBQUU7UUFDTCxHQUFHLEVBQUUsZ0JBQWdCO1FBQ3JCLE1BQU0sRUFBRSxZQUFZO1FBQ3BCLGFBQWEsRUFBRTtZQUNiLE1BQU0sRUFBRTtnQkFDTixjQUFjLEVBQUUsZ0JBQWdCO2FBQ2pDO1NBQ0Y7S0FDRjtJQUNELE1BQU0sRUFBRTtRQUNOLGFBQWEsRUFBRSxLQUFLO0tBQ3JCO0NBQ0YsQ0FBQTtBQUVELE1BQU0sWUFBWSxHQUFlO0lBQy9CLEdBQUcsWUFBWSxFQUFFO0lBQ2pCLE9BQU8sRUFBRTtRQUNQLEtBQUssRUFBRTtLQUNSO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsV0FBVyxFQUFFLElBQUk7UUFDakIsTUFBTSxFQUFFLFlBQVk7UUFDcEIsYUFBYSxFQUFFO1lBQ2IsS0FBSyxFQUFFLGdCQUFnQjtZQUN2QixNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRSxDQUFDLGVBQWUsRUFBRSxFQUFFLGNBQWMsRUFBRSxDQUFDO1NBQy9DO0tBQ0Y7SUFDRCxNQUFNLEVBQUU7UUFDTixhQUFhLEVBQUUsSUFBSTtLQUNwQjtDQUNGLENBQUE7QUFDRCxNQUFNLFNBQVMsR0FBRyxLQUFLLElBQUksRUFBRTtJQUMzQixFQUFFO0FBQ0osQ0FBQyxDQUFBO0FBQ0QsTUFBTSxTQUFTLEdBQUcsS0FBSyxJQUFJLEVBQUU7SUFDM0IsTUFBTSxLQUFLLENBQUMsRUFBRSxHQUFHLFlBQVksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQTtJQUNwRCxNQUFNLEtBQUssQ0FBQyxFQUFFLEdBQUcsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO0FBQ3RELENBQUMsQ0FBQTtBQUVELE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ2IsQ0FBQSJ9
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as WebpackChain from 'webpack-chain';
|
|
2
|
+
export const webpackStart = async () => {
|
|
3
|
+
const { startServerBuild } = await import('ssr-webpack/cjs/server');
|
|
4
|
+
const { getServerWebpack } = await import('../config/server');
|
|
5
|
+
const serverConfigChain = new WebpackChain();
|
|
6
|
+
const { startClientServer } = await import('ssr-webpack');
|
|
7
|
+
const { getClientWebpack } = await import('../config');
|
|
8
|
+
const clientConfigChain = new WebpackChain();
|
|
9
|
+
await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientServer(getClientWebpack(clientConfigChain))]);
|
|
10
|
+
};
|
|
11
|
+
export const webpackBuild = async () => {
|
|
12
|
+
const { startServerBuild, startClientBuild } = await import('ssr-webpack');
|
|
13
|
+
const { getClientWebpack, getServerWebpack } = await import('../config');
|
|
14
|
+
const serverConfigChain = new WebpackChain();
|
|
15
|
+
const clientConfigChain = new WebpackChain();
|
|
16
|
+
await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientBuild(getClientWebpack(clientConfigChain))]);
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VicGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy93ZWJwYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxZQUFZLE1BQU0sZUFBZSxDQUFBO0FBRTdDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxLQUFLLElBQUksRUFBRTtJQUNyQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO0lBQ25FLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFDN0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO0lBRTVDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3pELE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3RELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtJQUM1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNwSSxDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsS0FBSyxJQUFJLEVBQUU7SUFDckMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDMUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDeEUsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO0lBQzVDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtJQUM1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNuSSxDQUFDLENBQUEifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ssr-plugin-react",
|
|
3
|
-
"version": "6.1.
|
|
3
|
+
"version": "6.1.14-alpha.0",
|
|
4
4
|
"description": "plugin-react for ssr",
|
|
5
5
|
"main": "./cjs/index.js",
|
|
6
6
|
"module": "./esm/index.js",
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"@babel/core": "^7.0.0",
|
|
33
33
|
"@babel/plugin-transform-runtime": "^7.9.6",
|
|
34
34
|
"@babel/preset-env": "^7.5.5",
|
|
35
|
+
"@vitejs/plugin-react": "^1.0.0",
|
|
35
36
|
"babel-loader": "8.0.4",
|
|
36
37
|
"babel-plugin-import": "^1.13.0",
|
|
37
38
|
"babel-preset-react-app": "^9.0.2",
|
|
@@ -53,12 +54,13 @@
|
|
|
53
54
|
"postcss-safe-parser": "4.0.1",
|
|
54
55
|
"react-dev-utils": "^11.0.4",
|
|
55
56
|
"serialize-javascript": "^3.0.0",
|
|
56
|
-
"ssr-client-utils": "^
|
|
57
|
-
"ssr-hoc-react": "^6.0
|
|
58
|
-
"ssr-server-utils": "^
|
|
59
|
-
"ssr-webpack": "^
|
|
57
|
+
"ssr-client-utils": "^6.1.14-alpha.0",
|
|
58
|
+
"ssr-hoc-react": "^6.1.14-alpha.0",
|
|
59
|
+
"ssr-server-utils": "^6.1.14-alpha.0",
|
|
60
|
+
"ssr-webpack": "^6.1.14-alpha.0",
|
|
60
61
|
"terser-webpack-plugin": "^2.3.5",
|
|
61
62
|
"url-loader": "^4.1.1",
|
|
63
|
+
"vite": "^2.7.0-beta.10",
|
|
62
64
|
"webpack-bundle-analyzer": "^3.6.1",
|
|
63
65
|
"webpack-chain": "^6.4.0",
|
|
64
66
|
"webpack-manifest-plugin": "^2.2.0",
|
|
@@ -68,9 +70,8 @@
|
|
|
68
70
|
"@types/react": "^17.0.0",
|
|
69
71
|
"@types/react-dom": "^17.0.0",
|
|
70
72
|
"@types/react-router-dom": "^5.1.3",
|
|
71
|
-
"@types/serialize-javascript": "^1.5.0",
|
|
72
73
|
"@types/webpack": "^4.41.10",
|
|
73
|
-
"ssr-types-react": "^6.0
|
|
74
|
+
"ssr-types-react": "^6.1.14-alpha.0"
|
|
74
75
|
},
|
|
75
|
-
"gitHead": "
|
|
76
|
+
"gitHead": "aa2661c45ebd669fc11b84d90e2e8416e9373854"
|
|
76
77
|
}
|
package/src/config/server.ts
CHANGED
|
@@ -22,7 +22,6 @@ const getServerWebpack = (chain: WebpackChain) => {
|
|
|
22
22
|
|
|
23
23
|
const modulesDir = [join(cwd, './node_modules')]
|
|
24
24
|
modulesDir.push(getLocalNodeModules())
|
|
25
|
-
|
|
26
25
|
chain.externals(nodeExternals({
|
|
27
26
|
whitelist: [/\.(css|less|sass|scss)$/, /antd.*?(style)/].concat(whiteList || []),
|
|
28
27
|
// externals Dir contains example/xxx/node_modules ssr/node_modules
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
// The file is provisional,don't depend on it
|
|
3
3
|
|
|
4
|
-
import
|
|
4
|
+
import React from 'react'
|
|
5
5
|
import { IContext } from 'ssr-types-react'
|
|
6
6
|
|
|
7
7
|
let STORE_CONTEXT
|
|
8
8
|
if (__isBrowser__) {
|
|
9
|
-
STORE_CONTEXT = window.STORE_CONTEXT ?? createContext<IContext>({
|
|
9
|
+
STORE_CONTEXT = window.STORE_CONTEXT ?? React.createContext<IContext>({
|
|
10
10
|
state: {}
|
|
11
11
|
})
|
|
12
12
|
window.STORE_CONTEXT = STORE_CONTEXT
|
|
13
13
|
} else {
|
|
14
|
-
STORE_CONTEXT = createContext<IContext>({
|
|
14
|
+
STORE_CONTEXT = React.createContext<IContext>({
|
|
15
15
|
state: {}
|
|
16
16
|
})
|
|
17
17
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as React from 'react'
|
|
2
2
|
import { StaticRouter } from 'react-router-dom'
|
|
3
3
|
import { findRoute, getManifest, logGreen, normalizePath, addAsyncChunk } from 'ssr-server-utils'
|
|
4
|
-
import { ISSRContext,
|
|
5
|
-
|
|
4
|
+
import { ISSRContext, IConfig, ReactRoutesType, ReactESMFeRouteItem } from 'ssr-types-react'
|
|
5
|
+
//@ts-expect-error
|
|
6
|
+
import * as serializeWrap from 'serialize-javascript'
|
|
6
7
|
// @ts-expect-error
|
|
7
8
|
import * as Routes from '_build/ssr-temporary-routes'
|
|
8
9
|
// @ts-expect-error
|
|
@@ -11,19 +12,16 @@ import { STORE_CONTEXT as Context } from '_build/create-context'
|
|
|
11
12
|
import Layout from '@/components/layout/index.tsx'
|
|
12
13
|
|
|
13
14
|
const { FeRoutes, layoutFetch, PrefixRouterBase, state } = Routes as ReactRoutesType
|
|
14
|
-
|
|
15
|
-
declare const global: IGlobal
|
|
15
|
+
const serialize = serializeWrap.default || serializeWrap
|
|
16
16
|
|
|
17
17
|
const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.ReactElement> => {
|
|
18
|
-
const { cssOrder, jsOrder, dynamic, mode,
|
|
19
|
-
global.window = global.window ?? {} // 防止覆盖上层应用自己定义的 window 对象
|
|
18
|
+
const { cssOrder, jsOrder, dynamic, mode, parallelFetch, disableClientRender, prefix, isVite, isDev } = config
|
|
20
19
|
let path = ctx.request.path // 这里取 pathname 不能够包含 queryString
|
|
21
20
|
const base = prefix ?? PrefixRouterBase // 以开发者实际传入的为最高优先级
|
|
22
21
|
if (base) {
|
|
23
22
|
path = normalizePath(path, base)
|
|
24
23
|
}
|
|
25
24
|
const routeItem = findRoute<ReactESMFeRouteItem>(FeRoutes, path)
|
|
26
|
-
const viteMode = process.env.BUILD_TOOL === 'vite'
|
|
27
25
|
|
|
28
26
|
if (!routeItem) {
|
|
29
27
|
throw new Error(`
|
|
@@ -34,15 +32,17 @@ const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.Re
|
|
|
34
32
|
|
|
35
33
|
let dynamicCssOrder = cssOrder
|
|
36
34
|
|
|
37
|
-
if (dynamic
|
|
35
|
+
if (dynamic) {
|
|
38
36
|
dynamicCssOrder = cssOrder.concat([`${routeItem.webpackChunkName}.css`])
|
|
39
|
-
|
|
37
|
+
if (!isVite) {
|
|
38
|
+
dynamicCssOrder = await addAsyncChunk(dynamicCssOrder, routeItem.webpackChunkName)
|
|
39
|
+
}
|
|
40
40
|
}
|
|
41
|
-
const manifest =
|
|
41
|
+
const manifest = await getManifest(config)
|
|
42
42
|
|
|
43
43
|
const injectCss: JSX.Element[] = []
|
|
44
44
|
|
|
45
|
-
if (
|
|
45
|
+
if (isVite && isDev) {
|
|
46
46
|
injectCss.push(<script src="/@vite/client" type="module" key="vite-client"/>)
|
|
47
47
|
injectCss.push(<script key="vite-react-refresh" type="module" dangerouslySetInnerHTML={{
|
|
48
48
|
__html: ` import RefreshRuntime from "/@react-refresh"
|
|
@@ -51,7 +51,6 @@ const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.Re
|
|
|
51
51
|
window.$RefreshSig$ = () => (type) => type
|
|
52
52
|
window.__vite_plugin_react_preamble_installed__ = true`
|
|
53
53
|
}} />)
|
|
54
|
-
injectCss.push(<link rel='stylesheet' href={`/server/static/css/${chunkName}.css`} key="vite-head-css"/>)
|
|
55
54
|
} else {
|
|
56
55
|
dynamicCssOrder.forEach(css => {
|
|
57
56
|
if (manifest[css]) {
|
|
@@ -67,14 +66,13 @@ const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.Re
|
|
|
67
66
|
}}/>)
|
|
68
67
|
}
|
|
69
68
|
|
|
70
|
-
const injectScript =
|
|
71
|
-
<script key="viteWindowInit" dangerouslySetInnerHTML={{
|
|
69
|
+
const injectScript = [
|
|
70
|
+
isVite && <script key="viteWindowInit" dangerouslySetInnerHTML={{
|
|
72
71
|
__html: 'window.__USE_VITE__=true'
|
|
73
72
|
}} />,
|
|
74
|
-
<script type="module" src='/node_modules/ssr-plugin-react/esm/entry/client-entry.js' key="vite-react-entry"
|
|
73
|
+
(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' : ''}/>)
|
|
75
75
|
]
|
|
76
|
-
: jsOrder.map(js => manifest[js]).map(item => <script key={item} src={item} />)
|
|
77
|
-
|
|
78
76
|
const staticList = {
|
|
79
77
|
injectCss,
|
|
80
78
|
injectScript
|
|
@@ -110,7 +108,7 @@ const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.Re
|
|
|
110
108
|
}} />
|
|
111
109
|
|
|
112
110
|
return (
|
|
113
|
-
<StaticRouter>
|
|
111
|
+
<StaticRouter location={ctx.request.url}>
|
|
114
112
|
<Context.Provider value={{ state: combineData }}>
|
|
115
113
|
<Layout ctx={ctx} config={config} staticList={staticList} injectState={injectState}>
|
|
116
114
|
{isCsr ? <></> : <Component />}
|
package/src/index.ts
CHANGED
|
@@ -1,28 +1,29 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { loadConfig } from 'ssr-server-utils'
|
|
2
|
+
|
|
3
|
+
const { isVite } = loadConfig()
|
|
2
4
|
|
|
3
5
|
export function reactPlugin () {
|
|
4
6
|
return {
|
|
5
7
|
name: 'plugin-react',
|
|
6
8
|
start: async () => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const serverConfigChain = new WebpackChain()
|
|
11
|
-
if (process.env.BUILD_TOOL === 'vite') {
|
|
12
|
-
await startServerBuild(getServerWebpack(serverConfigChain))
|
|
9
|
+
if (isVite) {
|
|
10
|
+
const { viteStart } = await import('./tools/vite')
|
|
11
|
+
await viteStart()
|
|
13
12
|
} else {
|
|
14
|
-
const {
|
|
15
|
-
|
|
16
|
-
const clientConfigChain = new WebpackChain()
|
|
17
|
-
await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientServer(getClientWebpack(clientConfigChain))])
|
|
13
|
+
const { webpackStart } = await import('./tools/webpack')
|
|
14
|
+
await webpackStart()
|
|
18
15
|
}
|
|
19
16
|
},
|
|
20
17
|
build: async () => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
if (isVite) {
|
|
19
|
+
const { viteBuild } = await import('./tools/vite')
|
|
20
|
+
await viteBuild()
|
|
21
|
+
} else {
|
|
22
|
+
const { webpackBuild } = await import('./tools/webpack')
|
|
23
|
+
await webpackBuild()
|
|
24
|
+
}
|
|
26
25
|
}
|
|
27
26
|
}
|
|
28
27
|
}
|
|
28
|
+
|
|
29
|
+
export * from './tools/vite'
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { build as BuildType, UserConfig } from 'vite'
|
|
2
|
+
import { loadConfig, chunkNamePlugin, output, manifestPlugin, commonConfig } from 'ssr-server-utils'
|
|
3
|
+
import react from '@vitejs/plugin-react'
|
|
4
|
+
const build: typeof BuildType = require('vite').build
|
|
5
|
+
const { getOutput, reactServerEntry, reactClientEntry } = loadConfig()
|
|
6
|
+
const { clientOutPut, serverOutPut } = getOutput()
|
|
7
|
+
|
|
8
|
+
const serverConfig: UserConfig = {
|
|
9
|
+
...commonConfig(),
|
|
10
|
+
plugins: [
|
|
11
|
+
react()
|
|
12
|
+
],
|
|
13
|
+
build: {
|
|
14
|
+
ssr: reactServerEntry,
|
|
15
|
+
outDir: serverOutPut,
|
|
16
|
+
rollupOptions: {
|
|
17
|
+
output: {
|
|
18
|
+
entryFileNames: 'Page.server.js'
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
define: {
|
|
23
|
+
__isBrowser__: false
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const clientConfig: UserConfig = {
|
|
28
|
+
...commonConfig(),
|
|
29
|
+
plugins: [
|
|
30
|
+
react()
|
|
31
|
+
],
|
|
32
|
+
build: {
|
|
33
|
+
ssrManifest: true,
|
|
34
|
+
outDir: clientOutPut,
|
|
35
|
+
rollupOptions: {
|
|
36
|
+
input: reactClientEntry,
|
|
37
|
+
output: output,
|
|
38
|
+
plugins: [chunkNamePlugin(), manifestPlugin()]
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
define: {
|
|
42
|
+
__isBrowser__: true
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const viteStart = async () => {
|
|
46
|
+
//
|
|
47
|
+
}
|
|
48
|
+
const viteBuild = async () => {
|
|
49
|
+
await build({ ...clientConfig, mode: 'production' })
|
|
50
|
+
await build({ ...serverConfig, mode: 'production' })
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export {
|
|
54
|
+
viteBuild,
|
|
55
|
+
viteStart,
|
|
56
|
+
serverConfig,
|
|
57
|
+
clientConfig
|
|
58
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as WebpackChain from 'webpack-chain'
|
|
2
|
+
|
|
3
|
+
export const webpackStart = async () => {
|
|
4
|
+
const { startServerBuild } = await import('ssr-webpack/cjs/server')
|
|
5
|
+
const { getServerWebpack } = await import('../config/server')
|
|
6
|
+
const serverConfigChain = new WebpackChain()
|
|
7
|
+
|
|
8
|
+
const { startClientServer } = await import('ssr-webpack')
|
|
9
|
+
const { getClientWebpack } = await import('../config')
|
|
10
|
+
const clientConfigChain = new WebpackChain()
|
|
11
|
+
await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientServer(getClientWebpack(clientConfigChain))])
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const webpackBuild = async () => {
|
|
15
|
+
const { startServerBuild, startClientBuild } = await import('ssr-webpack')
|
|
16
|
+
const { getClientWebpack, getServerWebpack } = await import('../config')
|
|
17
|
+
const serverConfigChain = new WebpackChain()
|
|
18
|
+
const clientConfigChain = new WebpackChain()
|
|
19
|
+
await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientBuild(getClientWebpack(clientConfigChain))])
|
|
20
|
+
}
|