ssr-plugin-react 6.1.12 → 6.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,56 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [6.1.16](https://github.com/zhangyuang/ssr/compare/v6.1.15...v6.1.16) (2021-12-06)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * add keepNames when esbuild compile plugin-react jsxRuntime use classic ([8502e6c](https://github.com/zhangyuang/ssr/commit/8502e6ca898fd99e936e60af2093fb6b174f6aab))
12
+ * component evaluating in csr mode ([#138](https://github.com/zhangyuang/ssr/issues/138)) ([66f5f09](https://github.com/zhangyuang/ssr/commit/66f5f09963502588bd59a09ff839d1dae8947817))
13
+ * plugin-react csr ([572c6c0](https://github.com/zhangyuang/ssr/commit/572c6c092c63c915da15883e1d34ad26a5a6cadd))
14
+ * plugin-react csr ([ab51062](https://github.com/zhangyuang/ssr/commit/ab510626946234de436a55184937d018c8c0e514))
15
+
16
+
17
+
18
+
19
+
20
+ ## [6.1.15](https://github.com/zhangyuang/ssr/compare/v6.1.14...v6.1.15) (2021-12-05)
21
+
22
+ **Note:** Version bump only for package ssr-plugin-react
23
+
24
+
25
+
26
+
27
+
28
+ ## [6.1.14](https://github.com/zhangyuang/ssr/compare/v6.1.14-alpha.0...v6.1.14) (2021-12-05)
29
+
30
+ **Note:** Version bump only for package ssr-plugin-react
31
+
32
+
33
+
34
+
35
+
36
+ ## [6.1.14-alpha.0](https://github.com/zhangyuang/ssr/compare/v5.7.3...v6.1.14-alpha.0) (2021-12-04)
37
+
38
+
39
+ ### Bug Fixes
40
+
41
+ *  boolean GENERATE_SOURCEMAP ([#133](https://github.com/zhangyuang/ssr/issues/133)) ([dbaeed8](https://github.com/zhangyuang/ssr/commit/dbaeed8efcf3d232c5754b2cfd6f3a664596610c))
42
+ * create-context in vite ([109fc6c](https://github.com/zhangyuang/ssr/commit/109fc6ce2ebd73c67b003d5b74c732ad46bee64c))
43
+ * restore staicRouter ([1150a6c](https://github.com/zhangyuang/ssr/commit/1150a6c4e4fe17d4416e35d619f8aac10837a7b8))
44
+
45
+
46
+ ### Features
47
+
48
+ * add location prop to StaticRouter ([#137](https://github.com/zhangyuang/ssr/issues/137)) ([301f997](https://github.com/zhangyuang/ssr/commit/301f9975ff08a94b8e792e36587c32796cf477ac))
49
+ * update plugin-react fetch params ([243c847](https://github.com/zhangyuang/ssr/commit/243c847c994032a3dc203bdee6c284b34b39dbfb))
50
+ * vite ([#127](https://github.com/zhangyuang/ssr/issues/127)) ([917e24f](https://github.com/zhangyuang/ssr/commit/917e24f1e9add29ceb7ed540029238f1d40defc3))
51
+
52
+
53
+
54
+
55
+
6
56
  ## [6.1.12](https://github.com/zhangyuang/ssr/compare/ssr-plugin-react@6.1.11...ssr-plugin-react@6.1.12) (2021-12-02)
7
57
 
8
58
  **Note:** Version bump only for package ssr-plugin-react
@@ -1,20 +1,19 @@
1
1
  "use strict";
2
2
  // @ts-nocheck
3
3
  // The file is provisional,don't depend on it
4
- var _a;
5
4
  Object.defineProperty(exports, "__esModule", { value: true });
6
5
  exports.STORE_CONTEXT = void 0;
7
6
  const react_1 = require("react");
8
7
  let STORE_CONTEXT;
9
8
  exports.STORE_CONTEXT = STORE_CONTEXT;
10
9
  if (__isBrowser__) {
11
- exports.STORE_CONTEXT = STORE_CONTEXT = (_a = window.STORE_CONTEXT) !== null && _a !== void 0 ? _a : (0, react_1.createContext)({
10
+ exports.STORE_CONTEXT = STORE_CONTEXT = window.STORE_CONTEXT || react_1.default.createContext({
12
11
  state: {}
13
12
  });
14
13
  window.STORE_CONTEXT = STORE_CONTEXT;
15
14
  }
16
15
  else {
17
- exports.STORE_CONTEXT = STORE_CONTEXT = (0, react_1.createContext)({
16
+ exports.STORE_CONTEXT = STORE_CONTEXT = react_1.default.createContext({
18
17
  state: {}
19
18
  });
20
19
  }
@@ -4,7 +4,8 @@ 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
- const serialize = require("serialize-javascript");
7
+ //@ts-expect-error
8
+ const serializeWrap = require("serialize-javascript");
8
9
  // @ts-expect-error
9
10
  const Routes = require("_build/ssr-temporary-routes");
10
11
  // @ts-expect-error
@@ -12,17 +13,16 @@ const create_context_1 = require("_build/create-context");
12
13
  // @ts-expect-error
13
14
  const index_tsx_1 = require("@/components/layout/index.tsx");
14
15
  const { FeRoutes, layoutFetch, PrefixRouterBase, state } = Routes;
16
+ const serialize = serializeWrap.default || serializeWrap;
15
17
  const serverRender = async (ctx, config) => {
16
- var _a, _b;
17
- const { cssOrder, jsOrder, dynamic, mode, chunkName, parallelFetch, disableClientRender, prefix } = config;
18
- global.window = (_a = global.window) !== null && _a !== void 0 ? _a : {}; // 防止覆盖上层应用自己定义的 window 对象
18
+ var _a;
19
+ const { cssOrder, jsOrder, dynamic, mode, parallelFetch, disableClientRender, prefix, isVite, isDev } = config;
19
20
  let path = ctx.request.path; // 这里取 pathname 不能够包含 queryString
20
21
  const base = prefix !== null && prefix !== void 0 ? prefix : PrefixRouterBase; // 以开发者实际传入的为最高优先级
21
22
  if (base) {
22
23
  path = (0, ssr_server_utils_1.normalizePath)(path, base);
23
24
  }
24
25
  const routeItem = (0, ssr_server_utils_1.findRoute)(FeRoutes, path);
25
- const viteMode = process.env.BUILD_TOOL === 'vite';
26
26
  if (!routeItem) {
27
27
  throw new Error(`
28
28
  查找组件失败,请确认当前 path: ${path} 对应前端组件是否存在
@@ -30,13 +30,15 @@ const serverRender = async (ctx, config) => {
30
30
  `);
31
31
  }
32
32
  let dynamicCssOrder = cssOrder;
33
- if (dynamic && !viteMode) {
33
+ if (dynamic) {
34
34
  dynamicCssOrder = cssOrder.concat([`${routeItem.webpackChunkName}.css`]);
35
- dynamicCssOrder = await (0, ssr_server_utils_1.addAsyncChunk)(dynamicCssOrder, routeItem.webpackChunkName);
35
+ if (!isVite) {
36
+ dynamicCssOrder = await (0, ssr_server_utils_1.addAsyncChunk)(dynamicCssOrder, routeItem.webpackChunkName);
37
+ }
36
38
  }
37
- const manifest = viteMode ? {} : await (0, ssr_server_utils_1.getManifest)();
39
+ const manifest = await (0, ssr_server_utils_1.getManifest)(config);
38
40
  const injectCss = [];
39
- if (viteMode) {
41
+ if (isVite && isDev) {
40
42
  injectCss.push(React.createElement("script", { src: "/@vite/client", type: "module", key: "vite-client" }));
41
43
  injectCss.push(React.createElement("script", { key: "vite-react-refresh", type: "module", dangerouslySetInnerHTML: {
42
44
  __html: ` import RefreshRuntime from "/@react-refresh"
@@ -45,7 +47,6 @@ const serverRender = async (ctx, config) => {
45
47
  window.$RefreshSig$ = () => (type) => type
46
48
  window.__vite_plugin_react_preamble_installed__ = true`
47
49
  } }));
48
- injectCss.push(React.createElement("link", { rel: 'stylesheet', href: `/server/static/css/${chunkName}.css`, key: "vite-head-css" }));
49
50
  }
50
51
  else {
51
52
  dynamicCssOrder.forEach(css => {
@@ -60,20 +61,20 @@ const serverRender = async (ctx, config) => {
60
61
  __html: 'window.__disableClientRender__ = true'
61
62
  } }));
62
63
  }
63
- const injectScript = viteMode ? [
64
- React.createElement("script", { key: "viteWindowInit", dangerouslySetInnerHTML: {
64
+ const injectScript = [
65
+ isVite && React.createElement("script", { key: "viteWindowInit", dangerouslySetInnerHTML: {
65
66
  __html: 'window.__USE_VITE__=true'
66
67
  } }),
67
- React.createElement("script", { type: "module", src: '/node_modules/ssr-plugin-react/esm/entry/client-entry.js', key: "vite-react-entry" })
68
- ]
69
- : jsOrder.map(js => manifest[js]).map(item => React.createElement("script", { key: item, src: item }));
68
+ (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' : '' }))
70
+ ];
70
71
  const staticList = {
71
72
  injectCss,
72
73
  injectScript
73
74
  };
74
- const isCsr = !!(mode === 'csr' || ((_b = ctx.request.query) === null || _b === void 0 ? void 0 : _b.csr));
75
+ const isCsr = !!(mode === 'csr' || ((_a = ctx.request.query) === null || _a === void 0 ? void 0 : _a.csr));
75
76
  const { component, fetch } = routeItem;
76
- const Component = (await component()).default;
77
+ const Component = isCsr ? React.Fragment : (await component()).default;
77
78
  if (isCsr) {
78
79
  (0, ssr_server_utils_1.logGreen)(`Current path ${path} use csr render mode`);
79
80
  }
@@ -99,6 +100,7 @@ const serverRender = async (ctx, config) => {
99
100
  } });
100
101
  return (React.createElement(react_router_dom_1.StaticRouter, { location: ctx.request.url },
101
102
  React.createElement(create_context_1.STORE_CONTEXT.Provider, { value: { state: combineData } },
102
- React.createElement(index_tsx_1.default, { ctx: ctx, config: config, staticList: staticList, injectState: injectState }, isCsr ? React.createElement(React.Fragment, null) : React.createElement(Component, null)))));
103
+ React.createElement(index_tsx_1.default, { ctx: ctx, config: config, staticList: staticList, injectState: injectState },
104
+ React.createElement(Component, null)))));
103
105
  };
104
106
  exports.serverRender = serverRender;
package/cjs/index.d.ts CHANGED
@@ -3,3 +3,4 @@ export declare function reactPlugin(): {
3
3
  start: () => Promise<void>;
4
4
  build: () => Promise<void>;
5
5
  };
6
+ export * from './tools/vite';
package/cjs/index.js CHANGED
@@ -1,32 +1,42 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
2
12
  Object.defineProperty(exports, "__esModule", { value: true });
3
13
  exports.reactPlugin = void 0;
4
- const WebpackChain = require("webpack-chain");
14
+ const ssr_server_utils_1 = require("ssr-server-utils");
15
+ const { isVite } = (0, ssr_server_utils_1.loadConfig)();
5
16
  function reactPlugin() {
6
17
  return {
7
18
  name: 'plugin-react',
8
19
  start: async () => {
9
- // 本地开发的时候要做细致的依赖分离, Vite 场景不需要去加载 Webpack 构建客户端应用所需的模块
10
- const { startServerBuild } = await Promise.resolve().then(() => require('ssr-webpack/cjs/server'));
11
- const { getServerWebpack } = await Promise.resolve().then(() => require('./config/server'));
12
- const serverConfigChain = new WebpackChain();
13
- if (process.env.BUILD_TOOL === 'vite') {
14
- await startServerBuild(getServerWebpack(serverConfigChain));
20
+ if (isVite) {
21
+ const { viteStart } = await Promise.resolve().then(() => require('./tools/vite'));
22
+ await viteStart();
15
23
  }
16
24
  else {
17
- const { startClientServer } = await Promise.resolve().then(() => require('ssr-webpack'));
18
- const { getClientWebpack } = await Promise.resolve().then(() => require('./config'));
19
- const clientConfigChain = new WebpackChain();
20
- await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientServer(getClientWebpack(clientConfigChain))]);
25
+ const { webpackStart } = await Promise.resolve().then(() => require('./tools/webpack'));
26
+ await webpackStart();
21
27
  }
22
28
  },
23
29
  build: async () => {
24
- const { startServerBuild, startClientBuild } = await Promise.resolve().then(() => require('ssr-webpack'));
25
- const { getClientWebpack, getServerWebpack } = await Promise.resolve().then(() => require('./config'));
26
- const serverConfigChain = new WebpackChain();
27
- const clientConfigChain = new WebpackChain();
28
- await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientBuild(getClientWebpack(clientConfigChain))]);
30
+ if (isVite) {
31
+ const { viteBuild } = await Promise.resolve().then(() => require('./tools/vite'));
32
+ await viteBuild();
33
+ }
34
+ else {
35
+ const { webpackBuild } = await Promise.resolve().then(() => require('./tools/webpack'));
36
+ await webpackBuild();
37
+ }
29
38
  }
30
39
  };
31
40
  }
32
41
  exports.reactPlugin = reactPlugin;
42
+ __exportStar(require("./tools/vite"), exports);
@@ -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,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clientConfig = exports.serverConfig = exports.viteStart = exports.viteBuild = void 0;
4
+ const ssr_server_utils_1 = require("ssr-server-utils");
5
+ const plugin_react_1 = require("@vitejs/plugin-react");
6
+ const build = require('vite').build;
7
+ const { getOutput, reactServerEntry, reactClientEntry } = (0, ssr_server_utils_1.loadConfig)();
8
+ const { clientOutPut, serverOutPut } = getOutput();
9
+ const serverConfig = {
10
+ ...(0, ssr_server_utils_1.commonConfig)(),
11
+ plugins: [
12
+ (0, plugin_react_1.default)({
13
+ jsxRuntime: 'classic'
14
+ })
15
+ ],
16
+ build: {
17
+ ssr: reactServerEntry,
18
+ outDir: serverOutPut,
19
+ rollupOptions: {
20
+ output: {
21
+ entryFileNames: 'Page.server.js'
22
+ }
23
+ }
24
+ },
25
+ define: {
26
+ __isBrowser__: false
27
+ }
28
+ };
29
+ exports.serverConfig = serverConfig;
30
+ const clientConfig = {
31
+ ...(0, ssr_server_utils_1.commonConfig)(),
32
+ esbuild: {
33
+ keepNames: true
34
+ },
35
+ plugins: [
36
+ (0, plugin_react_1.default)({
37
+ jsxRuntime: 'classic'
38
+ })
39
+ ],
40
+ build: {
41
+ ssrManifest: true,
42
+ outDir: clientOutPut,
43
+ rollupOptions: {
44
+ input: reactClientEntry,
45
+ output: ssr_server_utils_1.output,
46
+ plugins: [(0, ssr_server_utils_1.chunkNamePlugin)(), (0, ssr_server_utils_1.manifestPlugin)()]
47
+ }
48
+ },
49
+ define: {
50
+ __isBrowser__: true
51
+ }
52
+ };
53
+ exports.clientConfig = clientConfig;
54
+ const viteStart = async () => {
55
+ //
56
+ };
57
+ exports.viteStart = viteStart;
58
+ const viteBuild = async () => {
59
+ await build({ ...clientConfig, mode: 'production' });
60
+ await build({ ...serverConfig, mode: 'production' });
61
+ };
62
+ exports.viteBuild = viteBuild;
@@ -0,0 +1,2 @@
1
+ export declare const webpackStart: () => Promise<void>;
2
+ export declare const webpackBuild: () => Promise<void>;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.webpackBuild = exports.webpackStart = void 0;
4
+ const WebpackChain = require("webpack-chain");
5
+ const webpackStart = async () => {
6
+ const { startServerBuild } = await Promise.resolve().then(() => require('ssr-webpack/cjs/server'));
7
+ const { getServerWebpack } = await Promise.resolve().then(() => require('../config/server'));
8
+ const serverConfigChain = new WebpackChain();
9
+ const { startClientServer } = await Promise.resolve().then(() => require('ssr-webpack'));
10
+ const { getClientWebpack } = await Promise.resolve().then(() => require('../config'));
11
+ const clientConfigChain = new WebpackChain();
12
+ await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientServer(getClientWebpack(clientConfigChain))]);
13
+ };
14
+ exports.webpackStart = webpackStart;
15
+ const webpackBuild = async () => {
16
+ const { startServerBuild, startClientBuild } = await Promise.resolve().then(() => require('ssr-webpack'));
17
+ const { getClientWebpack, getServerWebpack } = await Promise.resolve().then(() => require('../config'));
18
+ const serverConfigChain = new WebpackChain();
19
+ const clientConfigChain = new WebpackChain();
20
+ await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientBuild(getClientWebpack(clientConfigChain))]);
21
+ };
22
+ exports.webpackBuild = webpackBuild;
@@ -1,16 +1,15 @@
1
1
  // @ts-nocheck
2
2
  // The file is provisional,don't depend on it
3
- var _a;
4
- import { createContext } from 'react';
3
+ import React from 'react';
5
4
  let STORE_CONTEXT;
6
5
  if (__isBrowser__) {
7
- STORE_CONTEXT = (_a = window.STORE_CONTEXT) !== null && _a !== void 0 ? _a : createContext({
6
+ STORE_CONTEXT = window.STORE_CONTEXT || React.createContext({
8
7
  state: {}
9
8
  });
10
9
  window.STORE_CONTEXT = STORE_CONTEXT;
11
10
  }
12
11
  else {
13
- STORE_CONTEXT = createContext({
12
+ STORE_CONTEXT = React.createContext({
14
13
  state: {}
15
14
  });
16
15
  }
@@ -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
- import * as serialize from 'serialize-javascript';
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, _b;
14
- const { cssOrder, jsOrder, dynamic, mode, chunkName, parallelFetch, disableClientRender, prefix } = config;
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 && !viteMode) {
30
+ if (dynamic) {
31
31
  dynamicCssOrder = cssOrder.concat([`${routeItem.webpackChunkName}.css`]);
32
- dynamicCssOrder = await addAsyncChunk(dynamicCssOrder, routeItem.webpackChunkName);
32
+ if (!isVite) {
33
+ dynamicCssOrder = await addAsyncChunk(dynamicCssOrder, routeItem.webpackChunkName);
34
+ }
33
35
  }
34
- const manifest = viteMode ? {} : await getManifest();
36
+ const manifest = await getManifest(config);
35
37
  const injectCss = [];
36
- if (viteMode) {
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,20 +58,20 @@ const serverRender = async (ctx, config) => {
57
58
  __html: 'window.__disableClientRender__ = true'
58
59
  } }));
59
60
  }
60
- const injectScript = viteMode ? [
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
- : jsOrder.map(js => manifest[js]).map(item => React.createElement("script", { key: item, src: item }));
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' || ((_b = ctx.request.query) === null || _b === void 0 ? void 0 : _b.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
- const Component = (await component()).default;
74
+ const Component = isCsr ? React.Fragment : (await component()).default;
74
75
  if (isCsr) {
75
76
  logGreen(`Current path ${path} use csr render mode`);
76
77
  }
@@ -96,6 +97,7 @@ const serverRender = async (ctx, config) => {
96
97
  } });
97
98
  return (React.createElement(StaticRouter, { location: ctx.request.url },
98
99
  React.createElement(Context.Provider, { value: { state: combineData } },
99
- React.createElement(Layout, { ctx: ctx, config: config, staticList: staticList, injectState: injectState }, isCsr ? React.createElement(React.Fragment, null) : React.createElement(Component, null)))));
100
+ React.createElement(Layout, { ctx: ctx, config: config, staticList: staticList, injectState: injectState },
101
+ React.createElement(Component, null)))));
100
102
  };
101
103
  export { serverRender };
package/esm/index.d.ts CHANGED
@@ -3,3 +3,4 @@ export declare function reactPlugin(): {
3
3
  start: () => Promise<void>;
4
4
  build: () => Promise<void>;
5
5
  };
6
+ export * from './tools/vite';
package/esm/index.js CHANGED
@@ -1,28 +1,28 @@
1
- import * as WebpackChain from 'webpack-chain';
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
- // 本地开发的时候要做细致的依赖分离, Vite 场景不需要去加载 Webpack 构建客户端应用所需的模块
7
- const { startServerBuild } = await import('ssr-webpack/cjs/server');
8
- const { getServerWebpack } = await import('./config/server');
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 { startClientServer } = await import('ssr-webpack');
15
- const { getClientWebpack } = await import('./config');
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
- const { startServerBuild, startClientBuild } = await import('ssr-webpack');
22
- const { getClientWebpack, getServerWebpack } = await import('./config');
23
- const serverConfigChain = new WebpackChain();
24
- const clientConfigChain = new WebpackChain();
25
- await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientBuild(getClientWebpack(clientConfigChain))]);
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';
@@ -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,56 @@
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
+ jsxRuntime: 'classic'
11
+ })
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
+ const clientConfig = {
27
+ ...commonConfig(),
28
+ esbuild: {
29
+ keepNames: true
30
+ },
31
+ plugins: [
32
+ react({
33
+ jsxRuntime: 'classic'
34
+ })
35
+ ],
36
+ build: {
37
+ ssrManifest: true,
38
+ outDir: clientOutPut,
39
+ rollupOptions: {
40
+ input: reactClientEntry,
41
+ output: output,
42
+ plugins: [chunkNamePlugin(), manifestPlugin()]
43
+ }
44
+ },
45
+ define: {
46
+ __isBrowser__: true
47
+ }
48
+ };
49
+ const viteStart = async () => {
50
+ //
51
+ };
52
+ const viteBuild = async () => {
53
+ await build({ ...clientConfig, mode: 'production' });
54
+ await build({ ...serverConfig, mode: 'production' });
55
+ };
56
+ export { viteBuild, viteStart, serverConfig, clientConfig };
@@ -0,0 +1,2 @@
1
+ export declare const webpackStart: () => Promise<void>;
2
+ export declare const webpackBuild: () => Promise<void>;
@@ -0,0 +1,17 @@
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
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ssr-plugin-react",
3
- "version": "6.1.12",
3
+ "version": "6.1.16",
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",
@@ -52,13 +53,14 @@
52
53
  "postcss-preset-env": "^6.0.5",
53
54
  "postcss-safe-parser": "4.0.1",
54
55
  "react-dev-utils": "^11.0.4",
55
- "serialize-javascript": "^3.0.0",
56
- "ssr-client-utils": "^5.6.42",
57
- "ssr-hoc-react": "^6.0.9",
58
- "ssr-server-utils": "^5.7.13",
59
- "ssr-webpack": "^5.7.12",
56
+ "serialize-javascript": "^6.0.0",
57
+ "ssr-client-utils": "^6.1.15",
58
+ "ssr-hoc-react": "^6.1.15",
59
+ "ssr-server-utils": "^6.1.15",
60
+ "ssr-webpack": "^6.1.15",
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.8"
74
+ "ssr-types-react": "^6.1.15"
74
75
  },
75
- "gitHead": "0872b132285161bb838ef8597e3f91201d4b0ce5"
76
+ "gitHead": "e8e142e95ad7d0b11864bf7caf982de0c2af38d6"
76
77
  }
@@ -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 { createContext } from 'react'
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, IGlobal, IConfig, ReactRoutesType, ReactESMFeRouteItem } from 'ssr-types-react'
5
- import * as serialize from 'serialize-javascript'
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, chunkName, parallelFetch, disableClientRender, prefix } = config
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 && !viteMode) {
35
+ if (dynamic) {
38
36
  dynamicCssOrder = cssOrder.concat([`${routeItem.webpackChunkName}.css`])
39
- dynamicCssOrder = await addAsyncChunk(dynamicCssOrder, routeItem.webpackChunkName)
37
+ if (!isVite) {
38
+ dynamicCssOrder = await addAsyncChunk(dynamicCssOrder, routeItem.webpackChunkName)
39
+ }
40
40
  }
41
- const manifest = viteMode ? {} : await getManifest()
41
+ const manifest = await getManifest(config)
42
42
 
43
43
  const injectCss: JSX.Element[] = []
44
44
 
45
- if (viteMode) {
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 = viteMode ? [
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
@@ -82,7 +80,7 @@ const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.Re
82
80
 
83
81
  const isCsr = !!(mode === 'csr' || ctx.request.query?.csr)
84
82
  const { component, fetch } = routeItem
85
- const Component = (await component()).default
83
+ const Component = isCsr ? React.Fragment : (await component()).default
86
84
 
87
85
  if (isCsr) {
88
86
  logGreen(`Current path ${path} use csr render mode`)
@@ -113,7 +111,7 @@ const serverRender = async (ctx: ISSRContext, config: IConfig): Promise<React.Re
113
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
- {isCsr ? <></> : <Component />}
114
+ <Component />
117
115
  </Layout>
118
116
  </Context.Provider>
119
117
  </StaticRouter>
package/src/index.ts CHANGED
@@ -1,28 +1,29 @@
1
- import * as WebpackChain from 'webpack-chain'
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
- // 本地开发的时候要做细致的依赖分离, Vite 场景不需要去加载 Webpack 构建客户端应用所需的模块
8
- const { startServerBuild } = await import('ssr-webpack/cjs/server')
9
- const { getServerWebpack } = await import('./config/server')
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 { startClientServer } = await import('ssr-webpack')
15
- const { getClientWebpack } = await import('./config')
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
- const { startServerBuild, startClientBuild } = await import('ssr-webpack')
22
- const { getClientWebpack, getServerWebpack } = await import('./config')
23
- const serverConfigChain = new WebpackChain()
24
- const clientConfigChain = new WebpackChain()
25
- await Promise.all([startServerBuild(getServerWebpack(serverConfigChain)), startClientBuild(getClientWebpack(clientConfigChain))])
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,65 @@
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
+ jsxRuntime: 'classic'
13
+ })
14
+ ],
15
+ build: {
16
+ ssr: reactServerEntry,
17
+ outDir: serverOutPut,
18
+ rollupOptions: {
19
+ output: {
20
+ entryFileNames: 'Page.server.js'
21
+ }
22
+ }
23
+ },
24
+ define: {
25
+ __isBrowser__: false
26
+ }
27
+ }
28
+
29
+ const clientConfig: UserConfig = {
30
+ ...commonConfig(),
31
+ esbuild: {
32
+ keepNames: true
33
+ },
34
+ plugins: [
35
+ react({
36
+ jsxRuntime: 'classic'
37
+ })
38
+ ],
39
+ build: {
40
+ ssrManifest: true,
41
+ outDir: clientOutPut,
42
+ rollupOptions: {
43
+ input: reactClientEntry,
44
+ output: output,
45
+ plugins: [chunkNamePlugin(), manifestPlugin()]
46
+ }
47
+ },
48
+ define: {
49
+ __isBrowser__: true
50
+ }
51
+ }
52
+ const viteStart = async () => {
53
+ //
54
+ }
55
+ const viteBuild = async () => {
56
+ await build({ ...clientConfig, mode: 'production' })
57
+ await build({ ...serverConfig, mode: 'production' })
58
+ }
59
+
60
+ export {
61
+ viteBuild,
62
+ viteStart,
63
+ serverConfig,
64
+ clientConfig
65
+ }
@@ -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
+ }
@@ -1,39 +0,0 @@
1
- // 以下为默认生成的 Vite Config 配置,为了确保应用正确运行请不要删除默认配置中的任何代码
2
-
3
- const { join } = require('path')
4
- const reactRefresh = require('@vitejs/plugin-react-refresh')
5
- const genericNames = require('generic-names')
6
-
7
- /**
8
- * @type {import('vite').UserConfig}
9
- */
10
- module.exports = {
11
- plugins: [
12
- reactRefresh()
13
- ],
14
- define: {
15
- __isBrowser__: true
16
- },
17
- css: {
18
- modules: {
19
- generateScopedName: function (name, filename, css) {
20
- // 对齐 css-loader 与 postcss-modules 生成 hash 方式, 不要修改
21
- return genericNames('[name]__[local]___[hash:base64:5]', {
22
- context: process.cwd()
23
- })(name, filename)
24
- }
25
- }
26
- },
27
- resolve: {
28
- alias: {
29
- '@': join(process.cwd(), './web'),
30
- _build: join(process.cwd(), './build')
31
- },
32
- extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
33
- },
34
- build: {
35
- rollupOptions: {
36
- input: './node_modules/ssr-plugin-react/esm/entry/client-entry.js'
37
- }
38
- }
39
- }