@modern-js/runtime 2.13.4 → 2.15.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 +49 -0
- package/dist/cjs/document/Comment.js +37 -0
- package/dist/cjs/document/cli/index.js +10 -1
- package/dist/cjs/document/constants.js +10 -0
- package/dist/cjs/document/index.js +1 -0
- package/dist/cjs/router/runtime/hooks.js +28 -0
- package/dist/cjs/router/runtime/index.js +2 -0
- package/dist/cjs/router/runtime/plugin.js +13 -2
- package/dist/cjs/router/runtime/plugin.node.js +7 -1
- package/dist/cjs/ssr/cli/index.js +3 -15
- package/dist/cjs/ssr/index.js +6 -0
- package/dist/cjs/ssr/serverRender/renderToStream/bulidTemplate.before.js +1 -1
- package/dist/cjs/ssr/serverRender/renderToString/entry.js +8 -7
- package/dist/cjs/ssr/serverRender/utils.js +6 -0
- package/dist/esm/document/Comment.js +14 -0
- package/dist/esm/document/cli/index.js +7 -2
- package/dist/esm/document/constants.js +3 -1
- package/dist/esm/document/index.js +1 -0
- package/dist/esm/router/runtime/hooks.js +3 -0
- package/dist/esm/router/runtime/index.js +2 -2
- package/dist/esm/router/runtime/plugin.js +12 -1
- package/dist/esm/router/runtime/plugin.node.js +8 -2
- package/dist/esm/ssr/cli/index.js +4 -69
- package/dist/esm/ssr/index.js +6 -0
- package/dist/esm/ssr/serverRender/renderToStream/bulidTemplate.before.js +1 -1
- package/dist/esm/ssr/serverRender/renderToString/entry.js +6 -2
- package/dist/esm/ssr/serverRender/utils.js +3 -1
- package/dist/esm-node/document/Comment.js +17 -0
- package/dist/esm-node/document/cli/index.js +13 -2
- package/dist/esm-node/document/constants.js +8 -0
- package/dist/esm-node/document/index.js +1 -0
- package/dist/esm-node/router/runtime/hooks.js +5 -0
- package/dist/esm-node/router/runtime/index.js +3 -1
- package/dist/esm-node/router/runtime/plugin.js +13 -2
- package/dist/esm-node/router/runtime/plugin.node.js +7 -1
- package/dist/esm-node/ssr/cli/index.js +3 -15
- package/dist/esm-node/ssr/index.js +6 -0
- package/dist/esm-node/ssr/serverRender/renderToStream/bulidTemplate.before.js +1 -1
- package/dist/esm-node/ssr/serverRender/renderToString/entry.js +8 -7
- package/dist/esm-node/ssr/serverRender/utils.js +4 -0
- package/dist/types/document/Comment.d.ts +5 -0
- package/dist/types/document/constants.d.ts +2 -0
- package/dist/types/document/index.d.ts +1 -0
- package/dist/types/router/runtime/hooks.d.ts +3 -0
- package/dist/types/router/runtime/index.d.ts +1 -1
- package/dist/types/ssr/serverRender/utils.d.ts +2 -0
- package/package.json +9 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,54 @@
|
|
|
1
1
|
# @modern-js/runtime
|
|
2
2
|
|
|
3
|
+
## 2.15.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 09a3e57: chore(runtime): remove unused @testing-library/react-hooks
|
|
8
|
+
|
|
9
|
+
chore(runtime): 移除多余的 @testing-library/react-hooks
|
|
10
|
+
|
|
11
|
+
- @modern-js/plugin@2.15.0
|
|
12
|
+
- @modern-js/types@2.15.0
|
|
13
|
+
- @modern-js/utils@2.15.0
|
|
14
|
+
|
|
15
|
+
## 2.14.0
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- c921f30: fix: the streaming ssr may add repeated css assets, because the route-manifets would product all css link
|
|
20
|
+
fix: 因为 route-manifets 会生成所有 css link 信息,导致 streaming ssr 可能添加重复的 css 资源,
|
|
21
|
+
- ead58c8: feat: support Comment component in Document.tsx
|
|
22
|
+
feat: 支持 Comment 组件,可以保留用户的注释到最终的 html 上
|
|
23
|
+
- afe5d35: feat: add hook `modifyRoutes`
|
|
24
|
+
feat: 增加 hook `modifyRoutes`
|
|
25
|
+
- 4c74ea7: fix: ssr and document integration test error
|
|
26
|
+
fix: 修复 ssr 和 document 的集测错误
|
|
27
|
+
- 76ad173: feat: re-export `createPath` from react-router
|
|
28
|
+
feat: 从 react-router 导出 `createPath`
|
|
29
|
+
- 394470c: fix: router missing App static property
|
|
30
|
+
fix: router 确实 App 的静态属性
|
|
31
|
+
- 8b634f9: fix: 更新集测 snapshot,修复 document 功能在 node 14 下的错误
|
|
32
|
+
fix: update test snapshot, fix document error in node 14
|
|
33
|
+
- 1b3afa0: fix: ssr stream test case
|
|
34
|
+
fix: 修复 ssr stream 测试用例
|
|
35
|
+
- 28721cb: fix(runtime): MODERN_TARGET is not injected when using Rspack
|
|
36
|
+
|
|
37
|
+
fix(runtime): 修复 Rspack 模式未注入 MODERN_TARGET 的问题
|
|
38
|
+
|
|
39
|
+
- 60a81d0: feat: add ssr.inlineScript for use inline json instead inline script when ssr
|
|
40
|
+
feat: 添加 ssr.inlineScript 用于在 ssr 模式下使用内联 json 而不是内联脚本
|
|
41
|
+
- Updated dependencies [4779152]
|
|
42
|
+
- Updated dependencies [9321bef]
|
|
43
|
+
- Updated dependencies [9b45c58]
|
|
44
|
+
- Updated dependencies [52d0cb1]
|
|
45
|
+
- Updated dependencies [60a81d0]
|
|
46
|
+
- Updated dependencies [dacef96]
|
|
47
|
+
- Updated dependencies [16399fd]
|
|
48
|
+
- @modern-js/utils@2.14.0
|
|
49
|
+
- @modern-js/types@2.14.0
|
|
50
|
+
- @modern-js/plugin@2.14.0
|
|
51
|
+
|
|
3
52
|
## 2.13.4
|
|
4
53
|
|
|
5
54
|
### Patch Changes
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var Comment_exports = {};
|
|
19
|
+
__export(Comment_exports, {
|
|
20
|
+
Comment: () => Comment
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(Comment_exports);
|
|
23
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
24
|
+
var import_constants = require("./constants");
|
|
25
|
+
function Comment(props) {
|
|
26
|
+
const { comment, children } = props;
|
|
27
|
+
const commentStr = encodeURIComponent(children || comment || "");
|
|
28
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
29
|
+
`${import_constants.DOCUMENT_COMMENT_PLACEHOLDER_START}`,
|
|
30
|
+
`${commentStr}`,
|
|
31
|
+
`${import_constants.DOCUMENT_COMMENT_PLACEHOLDER_END}`
|
|
32
|
+
] });
|
|
33
|
+
}
|
|
34
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
35
|
+
0 && (module.exports = {
|
|
36
|
+
Comment
|
|
37
|
+
});
|
|
@@ -163,7 +163,7 @@ var cli_default = () => ({
|
|
|
163
163
|
).join("")
|
|
164
164
|
].join("");
|
|
165
165
|
if (html.includes(import_constants.DOCUMENT_SCRIPT_PLACEHOLDER_START) && html.includes(import_constants.DOCUMENT_SCRIPT_PLACEHOLDER_END)) {
|
|
166
|
-
html = html.
|
|
166
|
+
html = html.replace(
|
|
167
167
|
new RegExp(
|
|
168
168
|
`${import_constants.DOCUMENT_SCRIPT_PLACEHOLDER_START}(.*?)${import_constants.DOCUMENT_SCRIPT_PLACEHOLDER_END}`,
|
|
169
169
|
"g"
|
|
@@ -171,6 +171,15 @@ var cli_default = () => ({
|
|
|
171
171
|
(_scriptStr, $1) => `<script>${decodeURIComponent($1)}</script>`
|
|
172
172
|
);
|
|
173
173
|
}
|
|
174
|
+
if (html.includes(import_constants.DOCUMENT_COMMENT_PLACEHOLDER_START) && html.includes(import_constants.DOCUMENT_COMMENT_PLACEHOLDER_END)) {
|
|
175
|
+
html = html.replace(
|
|
176
|
+
new RegExp(
|
|
177
|
+
`${import_constants.DOCUMENT_COMMENT_PLACEHOLDER_START}(.*?)${import_constants.DOCUMENT_COMMENT_PLACEHOLDER_END}`,
|
|
178
|
+
"g"
|
|
179
|
+
),
|
|
180
|
+
(_scriptStr, $1) => `${decodeURIComponent($1)}`
|
|
181
|
+
);
|
|
182
|
+
}
|
|
174
183
|
const finalHtml = `<!DOCTYPE html>${html}`.replace(import_constants.DOCUMENT_META_PLACEHOLDER, metas).replace(import_constants.DOCUMENT_SSR_PLACEHOLDER, import_constants.HTML_SEPARATOR).replace(import_constants.DOCUMENT_SCRIPTS_PLACEHOLDER, scripts).replace(import_constants.DOCUMENT_LINKS_PLACEHOLDER, links).replace(
|
|
175
184
|
import_constants.DOCUMENT_CHUNKSMAP_PLACEHOLDER,
|
|
176
185
|
import_constants.PLACEHOLDER_REPLACER_MAP[import_constants.DOCUMENT_CHUNKSMAP_PLACEHOLDER]
|
|
@@ -18,6 +18,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
18
18
|
var constants_exports = {};
|
|
19
19
|
__export(constants_exports, {
|
|
20
20
|
DOCUMENT_CHUNKSMAP_PLACEHOLDER: () => DOCUMENT_CHUNKSMAP_PLACEHOLDER,
|
|
21
|
+
DOCUMENT_COMMENT_PLACEHOLDER_END: () => DOCUMENT_COMMENT_PLACEHOLDER_END,
|
|
22
|
+
DOCUMENT_COMMENT_PLACEHOLDER_START: () => DOCUMENT_COMMENT_PLACEHOLDER_START,
|
|
21
23
|
DOCUMENT_FILE_NAME: () => DOCUMENT_FILE_NAME,
|
|
22
24
|
DOCUMENT_LINKS_PLACEHOLDER: () => DOCUMENT_LINKS_PLACEHOLDER,
|
|
23
25
|
DOCUMENT_META_PLACEHOLDER: () => DOCUMENT_META_PLACEHOLDER,
|
|
@@ -60,6 +62,12 @@ const DOCUMENT_SCRIPT_PLACEHOLDER_START = encodeURIComponent(
|
|
|
60
62
|
const DOCUMENT_SCRIPT_PLACEHOLDER_END = encodeURIComponent(
|
|
61
63
|
"<!-- script-end -->"
|
|
62
64
|
);
|
|
65
|
+
const DOCUMENT_COMMENT_PLACEHOLDER_START = encodeURIComponent(
|
|
66
|
+
"<!-- comment-start -->"
|
|
67
|
+
);
|
|
68
|
+
const DOCUMENT_COMMENT_PLACEHOLDER_END = encodeURIComponent(
|
|
69
|
+
"<!-- comment-end -->"
|
|
70
|
+
);
|
|
63
71
|
const PLACEHOLDER_REPLACER_MAP = {
|
|
64
72
|
[DOCUMENT_NO_SCRIPTE_PLACEHOLDER]: `We're sorry but react app doesn't work properly without JavaScript enabled. Please enable it to continue.`,
|
|
65
73
|
[DOCUMENT_SSR_PLACEHOLDER]: HTML_SEPARATOR,
|
|
@@ -69,6 +77,8 @@ const PLACEHOLDER_REPLACER_MAP = {
|
|
|
69
77
|
// Annotate the CommonJS export names for ESM import in node:
|
|
70
78
|
0 && (module.exports = {
|
|
71
79
|
DOCUMENT_CHUNKSMAP_PLACEHOLDER,
|
|
80
|
+
DOCUMENT_COMMENT_PLACEHOLDER_END,
|
|
81
|
+
DOCUMENT_COMMENT_PLACEHOLDER_START,
|
|
72
82
|
DOCUMENT_FILE_NAME,
|
|
73
83
|
DOCUMENT_LINKS_PLACEHOLDER,
|
|
74
84
|
DOCUMENT_META_PLACEHOLDER,
|
|
@@ -21,6 +21,7 @@ __reExport(document_exports, require("./Head"), module.exports);
|
|
|
21
21
|
__reExport(document_exports, require("./Body"), module.exports);
|
|
22
22
|
__reExport(document_exports, require("./Root"), module.exports);
|
|
23
23
|
__reExport(document_exports, require("./Links"), module.exports);
|
|
24
|
+
__reExport(document_exports, require("./Comment"), module.exports);
|
|
24
25
|
__reExport(document_exports, require("./Scripts"), module.exports);
|
|
25
26
|
__reExport(document_exports, require("./Script"), module.exports);
|
|
26
27
|
__reExport(document_exports, require("./constants"), module.exports);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var hooks_exports = {};
|
|
19
|
+
__export(hooks_exports, {
|
|
20
|
+
modifyRoutes: () => modifyRoutes
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(hooks_exports);
|
|
23
|
+
var import_plugin = require("@modern-js/plugin");
|
|
24
|
+
const modifyRoutes = (0, import_plugin.createWaterfall)();
|
|
25
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
26
|
+
0 && (module.exports = {
|
|
27
|
+
modifyRoutes
|
|
28
|
+
});
|
|
@@ -35,6 +35,7 @@ __export(runtime_exports, {
|
|
|
35
35
|
createBrowserRouter: () => import_react_router_dom.createBrowserRouter,
|
|
36
36
|
createHashRouter: () => import_react_router_dom.createHashRouter,
|
|
37
37
|
createMemoryRouter: () => import_react_router_dom.createMemoryRouter,
|
|
38
|
+
createPath: () => import_react_router_dom.createPath,
|
|
38
39
|
createRoutesFromChildren: () => import_react_router_dom.createRoutesFromChildren,
|
|
39
40
|
createRoutesFromElements: () => import_react_router_dom.createRoutesFromElements,
|
|
40
41
|
createSearchParams: () => import_react_router_dom.createSearchParams,
|
|
@@ -104,6 +105,7 @@ var runtime_default = import_plugin.routerPlugin;
|
|
|
104
105
|
createBrowserRouter,
|
|
105
106
|
createHashRouter,
|
|
106
107
|
createMemoryRouter,
|
|
108
|
+
createPath,
|
|
107
109
|
createRoutesFromChildren,
|
|
108
110
|
createRoutesFromElements,
|
|
109
111
|
createSearchParams,
|
|
@@ -36,6 +36,8 @@ module.exports = __toCommonJS(plugin_exports);
|
|
|
36
36
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
37
37
|
var import_react_router_dom = require("react-router-dom");
|
|
38
38
|
var import_hoist_non_react_statics = __toESM(require("hoist-non-react-statics"));
|
|
39
|
+
var import_runtime = require("@modern-js/utils/runtime");
|
|
40
|
+
var import_hooks = require("./hooks");
|
|
39
41
|
var import_utils = require("./utils");
|
|
40
42
|
let finalRouteConfig = {
|
|
41
43
|
routes: []
|
|
@@ -62,9 +64,13 @@ const routerPlugin = ({
|
|
|
62
64
|
const select = (pathname) => serverBase.find((baseUrl) => pathname.search(baseUrl) === 0) || "/";
|
|
63
65
|
let routes = [];
|
|
64
66
|
finalRouteConfig = routesConfig;
|
|
67
|
+
window._SERVER_DATA = (0, import_runtime.parsedJSONFromElement)("__MODERN_SERVER_DATA__");
|
|
65
68
|
return {
|
|
66
69
|
name: "@modern-js/plugin-router",
|
|
67
|
-
|
|
70
|
+
registerHook: {
|
|
71
|
+
modifyRoutes: import_hooks.modifyRoutes
|
|
72
|
+
},
|
|
73
|
+
setup: (api) => {
|
|
68
74
|
return {
|
|
69
75
|
init({ context }, next) {
|
|
70
76
|
context.router = {
|
|
@@ -92,6 +98,8 @@ const routerPlugin = ({
|
|
|
92
98
|
props
|
|
93
99
|
})
|
|
94
100
|
);
|
|
101
|
+
const runner = api.useHookRunners();
|
|
102
|
+
routes = runner.modifyRoutes(routes);
|
|
95
103
|
const baseUrl = ((_a = window._SERVER_DATA) == null ? void 0 : _a.router.baseUrl) || select(location.pathname);
|
|
96
104
|
const _basename = baseUrl === "/" ? (0, import_utils.urlJoin)(baseUrl, basename) : baseUrl;
|
|
97
105
|
let hydrationData = window._ROUTER_DATA;
|
|
@@ -111,7 +119,10 @@ const routerPlugin = ({
|
|
|
111
119
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(App, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_router_dom.RouterProvider, { router }) });
|
|
112
120
|
};
|
|
113
121
|
};
|
|
114
|
-
|
|
122
|
+
let RouteApp = getRouteApp();
|
|
123
|
+
if (App) {
|
|
124
|
+
RouteApp = (0, import_hoist_non_react_statics.default)(RouteApp, App);
|
|
125
|
+
}
|
|
115
126
|
if (routesConfig == null ? void 0 : routesConfig.globalApp) {
|
|
116
127
|
return next({
|
|
117
128
|
App: (0, import_hoist_non_react_statics.default)(RouteApp, routesConfig.globalApp)
|
|
@@ -41,6 +41,7 @@ var import_react_router_dom = require("react-router-dom");
|
|
|
41
41
|
var import_core = require("../../core");
|
|
42
42
|
var import_utils = require("./utils");
|
|
43
43
|
var import_fetch = require("./fetch");
|
|
44
|
+
var import_hooks = require("./hooks");
|
|
44
45
|
(0, import_fetch.installGlobals)();
|
|
45
46
|
function createFetchRequest(req) {
|
|
46
47
|
const origin = `${req.protocol}://${req.host}`;
|
|
@@ -75,7 +76,10 @@ const routerPlugin = ({
|
|
|
75
76
|
}) => {
|
|
76
77
|
return {
|
|
77
78
|
name: "@modern-js/plugin-router",
|
|
78
|
-
|
|
79
|
+
registerHook: {
|
|
80
|
+
modifyRoutes: import_hooks.modifyRoutes
|
|
81
|
+
},
|
|
82
|
+
setup: (api) => {
|
|
79
83
|
return {
|
|
80
84
|
async init({ context }, next) {
|
|
81
85
|
if (!routesConfig && !createRoutes) {
|
|
@@ -103,6 +107,8 @@ const routerPlugin = ({
|
|
|
103
107
|
context.routerContext = routerContext;
|
|
104
108
|
context.routes = routes;
|
|
105
109
|
context.routeManifest = context.ssrContext.routeManifest;
|
|
110
|
+
const runner = api.useHookRunners();
|
|
111
|
+
runner.modifyRoutes(routes);
|
|
106
112
|
return next({ context });
|
|
107
113
|
},
|
|
108
114
|
hoc: ({ App }, next) => {
|
|
@@ -80,6 +80,9 @@ var cli_default = () => ({
|
|
|
80
80
|
// ensure that all packages use the same storage in @modern-js/utils/ssr
|
|
81
81
|
"@modern-js/utils/ssr": require.resolve("@modern-js/utils/ssr"),
|
|
82
82
|
"@modern-js/runtime/plugins": pluginsExportsUtils.getPath()
|
|
83
|
+
},
|
|
84
|
+
globalVars: (values, { target }) => {
|
|
85
|
+
values["process.env.MODERN_TARGET"] = target === "node" || target === "service-worker" ? "node" : "browser";
|
|
83
86
|
}
|
|
84
87
|
},
|
|
85
88
|
tools: {
|
|
@@ -91,21 +94,6 @@ var cli_default = () => ({
|
|
|
91
94
|
{ filename: import_utils.LOADABLE_STATS_FILE }
|
|
92
95
|
]);
|
|
93
96
|
}
|
|
94
|
-
const modernVars = {
|
|
95
|
-
[`process.env.MODERN_TARGET`]: JSON.stringify(
|
|
96
|
-
isServer || isServiceWorker ? "node" : "browser"
|
|
97
|
-
)
|
|
98
|
-
};
|
|
99
|
-
chain.plugin(CHAIN_ID.PLUGIN.DEFINE).tap((args) => {
|
|
100
|
-
const [vars, ...rest] = args;
|
|
101
|
-
return [
|
|
102
|
-
{
|
|
103
|
-
...vars,
|
|
104
|
-
...modernVars
|
|
105
|
-
},
|
|
106
|
-
...rest
|
|
107
|
-
];
|
|
108
|
-
});
|
|
109
97
|
},
|
|
110
98
|
babel: babelConfig
|
|
111
99
|
}
|
package/dist/cjs/ssr/index.js
CHANGED
|
@@ -35,14 +35,20 @@ module.exports = __toCommonJS(ssr_exports);
|
|
|
35
35
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
36
|
var import_component = require("@loadable/component");
|
|
37
37
|
var import_hoist_non_react_statics = __toESM(require("hoist-non-react-statics"));
|
|
38
|
+
var import_runtime = require("@modern-js/utils/runtime");
|
|
38
39
|
var import_types = require("./serverRender/types");
|
|
39
40
|
var import_withCallback = require("./react/withCallback");
|
|
40
41
|
var import_utils = require("./utils");
|
|
42
|
+
var import_utils2 = require("./serverRender/utils");
|
|
41
43
|
__reExport(ssr_exports, require("./react"), module.exports);
|
|
42
44
|
const ssr = (config) => ({
|
|
43
45
|
name: "@modern-js/plugin-ssr",
|
|
44
46
|
setup: () => {
|
|
45
47
|
const mockResp = (0, import_utils.mockResponse)();
|
|
48
|
+
if (config.inlineScript === false) {
|
|
49
|
+
window._SSR_DATA = (0, import_runtime.parsedJSONFromElement)(import_utils2.SSR_DATA_JSON_ID);
|
|
50
|
+
window._ROUTER_DATA = (0, import_runtime.parsedJSONFromElement)(import_utils2.ROUTER_DATA_JSON_ID);
|
|
51
|
+
}
|
|
46
52
|
return {
|
|
47
53
|
client: async ({ App, context, ModernRender, ModernHydrate }) => {
|
|
48
54
|
var _a;
|
|
@@ -73,7 +73,7 @@ function getHeadTemplate(beforeEntryTemplate, context) {
|
|
|
73
73
|
if (routeManifest2) {
|
|
74
74
|
const { referenceCssAssets = [] } = routeManifest2;
|
|
75
75
|
const _cssChunks = referenceCssAssets.filter(
|
|
76
|
-
(asset) => asset == null ? void 0 : asset.endsWith(".css")
|
|
76
|
+
(asset) => (asset == null ? void 0 : asset.endsWith(".css")) && !headTemplate2.includes(asset)
|
|
77
77
|
);
|
|
78
78
|
cssChunks.push(..._cssChunks);
|
|
79
79
|
}
|
|
@@ -39,6 +39,7 @@ var import_helmet = __toESM(require("../helmet"));
|
|
|
39
39
|
var import_types = require("../types");
|
|
40
40
|
var import_time = require("../time");
|
|
41
41
|
var import_prefetch = __toESM(require("../../prefetch"));
|
|
42
|
+
var import_utils2 = require("../utils");
|
|
42
43
|
var import_template = require("./template");
|
|
43
44
|
var import_reduce = require("./reduce");
|
|
44
45
|
var loadableRenderer = __toESM(require("./loadable"));
|
|
@@ -172,14 +173,14 @@ class Entry {
|
|
|
172
173
|
return html;
|
|
173
174
|
}
|
|
174
175
|
getSSRDataScript(templateData, routerData) {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
const useInlineScript = this.pluginConfig.inlineScript !== false;
|
|
177
|
+
const ssrData = (0, import_serialize.serializeJson)(templateData);
|
|
178
|
+
let ssrDataScripts = useInlineScript ? `<script>window._SSR_DATA = ${ssrData}</script>` : `<script type="application/json" id="${import_utils2.SSR_DATA_JSON_ID}">${ssrData}</script>`;
|
|
178
179
|
if (routerData) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
180
|
+
const serializedRouterData = (0, import_serialize.serializeJson)(routerData);
|
|
181
|
+
ssrDataScripts += useInlineScript ? `
|
|
182
|
+
<script>window._ROUTER_DATA = ${serializedRouterData}</script>` : `
|
|
183
|
+
<script type="application/json" id="${import_utils2.ROUTER_DATA_JSON_ID}">${serializedRouterData}</script>`;
|
|
183
184
|
}
|
|
184
185
|
return {
|
|
185
186
|
SSRDataScript: ssrDataScripts
|
|
@@ -18,10 +18,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
18
18
|
var utils_exports = {};
|
|
19
19
|
__export(utils_exports, {
|
|
20
20
|
CSS_CHUNKS_PLACEHOLDER: () => CSS_CHUNKS_PLACEHOLDER,
|
|
21
|
+
ROUTER_DATA_JSON_ID: () => ROUTER_DATA_JSON_ID,
|
|
22
|
+
SSR_DATA_JSON_ID: () => SSR_DATA_JSON_ID,
|
|
21
23
|
getLoadableScripts: () => getLoadableScripts
|
|
22
24
|
});
|
|
23
25
|
module.exports = __toCommonJS(utils_exports);
|
|
24
26
|
const CSS_CHUNKS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
|
|
27
|
+
const SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
|
|
28
|
+
const ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
|
|
25
29
|
function getLoadableScripts(extractor) {
|
|
26
30
|
const check = (scripts2) => (scripts2 || "").includes("__LOADABLE_REQUIRED_CHUNKS___ext");
|
|
27
31
|
const scripts = extractor.getScriptTags();
|
|
@@ -33,5 +37,7 @@ function getLoadableScripts(extractor) {
|
|
|
33
37
|
// Annotate the CommonJS export names for ESM import in node:
|
|
34
38
|
0 && (module.exports = {
|
|
35
39
|
CSS_CHUNKS_PLACEHOLDER,
|
|
40
|
+
ROUTER_DATA_JSON_ID,
|
|
41
|
+
SSR_DATA_JSON_ID,
|
|
36
42
|
getLoadableScripts
|
|
37
43
|
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Fragment, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { DOCUMENT_COMMENT_PLACEHOLDER_START, DOCUMENT_COMMENT_PLACEHOLDER_END } from "./constants";
|
|
3
|
+
function Comment(props) {
|
|
4
|
+
var comment = props.comment, children = props.children;
|
|
5
|
+
var commentStr = encodeURIComponent(children || comment || "");
|
|
6
|
+
return /* @__PURE__ */ jsxs(Fragment, {
|
|
7
|
+
children: [
|
|
8
|
+
"".concat(DOCUMENT_COMMENT_PLACEHOLDER_START),
|
|
9
|
+
"".concat(commentStr),
|
|
10
|
+
"".concat(DOCUMENT_COMMENT_PLACEHOLDER_END)
|
|
11
|
+
]
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export { Comment };
|
|
@@ -181,7 +181,7 @@ import ReactDomServer from "react-dom/server";
|
|
|
181
181
|
import { build } from "esbuild";
|
|
182
182
|
import { createDebugger, findExists, fs } from "@modern-js/utils";
|
|
183
183
|
import { DocumentContext } from "../DocumentContext";
|
|
184
|
-
import { DOCUMENT_SCRIPTS_PLACEHOLDER, DOCUMENT_LINKS_PLACEHOLDER, DOCUMENT_FILE_NAME, DOCUMENT_META_PLACEHOLDER, PLACEHOLDER_REPLACER_MAP, DOC_EXT, DOCUMENT_SSR_PLACEHOLDER, DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, DOCUMENT_SCRIPT_PLACEHOLDER_START, DOCUMENT_SCRIPT_PLACEHOLDER_END, HTML_SEPARATOR } from "../constants";
|
|
184
|
+
import { DOCUMENT_SCRIPTS_PLACEHOLDER, DOCUMENT_LINKS_PLACEHOLDER, DOCUMENT_FILE_NAME, DOCUMENT_META_PLACEHOLDER, PLACEHOLDER_REPLACER_MAP, DOC_EXT, DOCUMENT_SSR_PLACEHOLDER, DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, DOCUMENT_SCRIPT_PLACEHOLDER_START, DOCUMENT_SCRIPT_PLACEHOLDER_END, HTML_SEPARATOR, DOCUMENT_COMMENT_PLACEHOLDER_START, DOCUMENT_COMMENT_PLACEHOLDER_END } from "../constants";
|
|
185
185
|
var debug = createDebugger("html_genarate");
|
|
186
186
|
var getDocumenByEntryName = function getDocumenByEntryName(entrypoints, entryName, fallbackDir) {
|
|
187
187
|
var _entrypoints_find;
|
|
@@ -346,10 +346,15 @@ var cli_default = function() {
|
|
|
346
346
|
}).join("")
|
|
347
347
|
].join("");
|
|
348
348
|
if (html.includes(DOCUMENT_SCRIPT_PLACEHOLDER_START) && html.includes(DOCUMENT_SCRIPT_PLACEHOLDER_END)) {
|
|
349
|
-
html = html.
|
|
349
|
+
html = html.replace(new RegExp("".concat(DOCUMENT_SCRIPT_PLACEHOLDER_START, "(.*?)").concat(DOCUMENT_SCRIPT_PLACEHOLDER_END), "g"), function(_scriptStr, $1) {
|
|
350
350
|
return "<script>".concat(decodeURIComponent($1), "</script>");
|
|
351
351
|
});
|
|
352
352
|
}
|
|
353
|
+
if (html.includes(DOCUMENT_COMMENT_PLACEHOLDER_START) && html.includes(DOCUMENT_COMMENT_PLACEHOLDER_END)) {
|
|
354
|
+
html = html.replace(new RegExp("".concat(DOCUMENT_COMMENT_PLACEHOLDER_START, "(.*?)").concat(DOCUMENT_COMMENT_PLACEHOLDER_END), "g"), function(_scriptStr, $1) {
|
|
355
|
+
return "".concat(decodeURIComponent($1));
|
|
356
|
+
});
|
|
357
|
+
}
|
|
353
358
|
finalHtml = "<!DOCTYPE html>".concat(html).replace(DOCUMENT_META_PLACEHOLDER, metas).replace(DOCUMENT_SSR_PLACEHOLDER, HTML_SEPARATOR).replace(DOCUMENT_SCRIPTS_PLACEHOLDER, scripts).replace(DOCUMENT_LINKS_PLACEHOLDER, links).replace(DOCUMENT_CHUNKSMAP_PLACEHOLDER, PLACEHOLDER_REPLACER_MAP[DOCUMENT_CHUNKSMAP_PLACEHOLDER]).replace(DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, PLACEHOLDER_REPLACER_MAP[DOCUMENT_SSRDATASCRIPT_PLACEHOLDER]);
|
|
354
359
|
return [
|
|
355
360
|
2,
|
|
@@ -30,6 +30,8 @@ var DOCUMENT_LINKS_PLACEHOLDER = encodeURIComponent("<!-- chunk links placeholde
|
|
|
30
30
|
var DOCUMENT_NO_SCRIPTE_PLACEHOLDER = encodeURIComponent("<!-- no-script -->");
|
|
31
31
|
var DOCUMENT_SCRIPT_PLACEHOLDER_START = encodeURIComponent("<!-- script-start -->");
|
|
32
32
|
var DOCUMENT_SCRIPT_PLACEHOLDER_END = encodeURIComponent("<!-- script-end -->");
|
|
33
|
+
var DOCUMENT_COMMENT_PLACEHOLDER_START = encodeURIComponent("<!-- comment-start -->");
|
|
34
|
+
var DOCUMENT_COMMENT_PLACEHOLDER_END = encodeURIComponent("<!-- comment-end -->");
|
|
33
35
|
var _obj;
|
|
34
36
|
var PLACEHOLDER_REPLACER_MAP = (_obj = {}, _defineProperty(_obj, DOCUMENT_NO_SCRIPTE_PLACEHOLDER, "We're sorry but react app doesn't work properly without JavaScript enabled. Please enable it to continue."), _defineProperty(_obj, DOCUMENT_SSR_PLACEHOLDER, HTML_SEPARATOR), _defineProperty(_obj, DOCUMENT_CHUNKSMAP_PLACEHOLDER, HTML_CHUNKSMAP_SEPARATOR), _defineProperty(_obj, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, HTML_SSRDATASCRIPT_SEPARATOR), _obj);
|
|
35
|
-
export { DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_FILE_NAME, DOCUMENT_LINKS_PLACEHOLDER, DOCUMENT_META_PLACEHOLDER, DOCUMENT_NO_SCRIPTE_PLACEHOLDER, DOCUMENT_SCRIPTS_PLACEHOLDER, DOCUMENT_SCRIPT_PLACEHOLDER_END, DOCUMENT_SCRIPT_PLACEHOLDER_START, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, DOCUMENT_SSR_PLACEHOLDER, DOC_EXT, HTML_CHUNKSMAP_SEPARATOR, HTML_SEPARATOR, HTML_SSRDATASCRIPT_SEPARATOR, PLACEHOLDER_REPLACER_MAP };
|
|
37
|
+
export { DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_COMMENT_PLACEHOLDER_END, DOCUMENT_COMMENT_PLACEHOLDER_START, DOCUMENT_FILE_NAME, DOCUMENT_LINKS_PLACEHOLDER, DOCUMENT_META_PLACEHOLDER, DOCUMENT_NO_SCRIPTE_PLACEHOLDER, DOCUMENT_SCRIPTS_PLACEHOLDER, DOCUMENT_SCRIPT_PLACEHOLDER_END, DOCUMENT_SCRIPT_PLACEHOLDER_START, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, DOCUMENT_SSR_PLACEHOLDER, DOC_EXT, HTML_CHUNKSMAP_SEPARATOR, HTML_SEPARATOR, HTML_SSRDATASCRIPT_SEPARATOR, PLACEHOLDER_REPLACER_MAP };
|
|
@@ -3,6 +3,6 @@ var runtime_default = routerPlugin;
|
|
|
3
3
|
import { modifyRoutes } from "./plugin";
|
|
4
4
|
export * from "./withRouter";
|
|
5
5
|
import { Link, NavLink } from "./PrefetchLink";
|
|
6
|
-
import { createBrowserRouter, createHashRouter, createMemoryRouter, RouterProvider, BrowserRouter, HashRouter, MemoryRouter, Router, Await, Form, Navigate, Outlet, Route, Routes, ScrollRestoration, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit, createRoutesFromChildren, createRoutesFromElements, createSearchParams, generatePath, isRouteErrorResponse, matchPath, matchRoutes, renderMatches, resolvePath } from "react-router-dom";
|
|
6
|
+
import { createBrowserRouter, createHashRouter, createMemoryRouter, RouterProvider, BrowserRouter, HashRouter, MemoryRouter, Router, Await, Form, Navigate, Outlet, Route, Routes, ScrollRestoration, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit, createRoutesFromChildren, createRoutesFromElements, createSearchParams, generatePath, isRouteErrorResponse, matchPath, matchRoutes, renderMatches, resolvePath, createPath } from "react-router-dom";
|
|
7
7
|
import { defer, json, redirect } from "@modern-js/utils/universal/remix-router";
|
|
8
|
-
export { Await, BrowserRouter, Form, HashRouter, Link, MemoryRouter, NavLink, Navigate, Outlet, Route, Router, RouterProvider, Routes, ScrollRestoration, createBrowserRouter, createHashRouter, createMemoryRouter, createRoutesFromChildren, createRoutesFromElements, createSearchParams, runtime_default as default, defer, generatePath, isRouteErrorResponse, json, matchPath, matchRoutes, modifyRoutes, redirect, renderMatches, resolvePath, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit };
|
|
8
|
+
export { Await, BrowserRouter, Form, HashRouter, Link, MemoryRouter, NavLink, Navigate, Outlet, Route, Router, RouterProvider, Routes, ScrollRestoration, createBrowserRouter, createHashRouter, createMemoryRouter, createPath, createRoutesFromChildren, createRoutesFromElements, createSearchParams, runtime_default as default, defer, generatePath, isRouteErrorResponse, json, matchPath, matchRoutes, modifyRoutes, redirect, renderMatches, resolvePath, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit };
|
|
@@ -53,6 +53,8 @@ function _objectSpreadProps(target, source) {
|
|
|
53
53
|
import { jsx } from "react/jsx-runtime";
|
|
54
54
|
import { createBrowserRouter, createHashRouter, RouterProvider, createRoutesFromElements, useMatches, useLocation } from "react-router-dom";
|
|
55
55
|
import hoistNonReactStatics from "hoist-non-react-statics";
|
|
56
|
+
import { parsedJSONFromElement } from "@modern-js/utils/runtime";
|
|
57
|
+
import { modifyRoutes as modifyRoutesHook } from "./hooks";
|
|
56
58
|
import { deserializeErrors, renderRoutes, urlJoin } from "./utils";
|
|
57
59
|
var finalRouteConfig = {
|
|
58
60
|
routes: []
|
|
@@ -76,9 +78,13 @@ var routerPlugin = function(param) {
|
|
|
76
78
|
};
|
|
77
79
|
var routes = [];
|
|
78
80
|
finalRouteConfig = routesConfig;
|
|
81
|
+
window._SERVER_DATA = parsedJSONFromElement("__MODERN_SERVER_DATA__");
|
|
79
82
|
return {
|
|
80
83
|
name: "@modern-js/plugin-router",
|
|
81
|
-
|
|
84
|
+
registerHook: {
|
|
85
|
+
modifyRoutes: modifyRoutesHook
|
|
86
|
+
},
|
|
87
|
+
setup: function(api) {
|
|
82
88
|
return {
|
|
83
89
|
init: function init(param, next) {
|
|
84
90
|
var context = param.context;
|
|
@@ -110,6 +116,8 @@ var routerPlugin = function(param) {
|
|
|
110
116
|
routesConfig: finalRouteConfig,
|
|
111
117
|
props: props
|
|
112
118
|
}));
|
|
119
|
+
var runner = api.useHookRunners();
|
|
120
|
+
routes = runner.modifyRoutes(routes);
|
|
113
121
|
var baseUrl = ((_window__SERVER_DATA = window._SERVER_DATA) === null || _window__SERVER_DATA === void 0 ? void 0 : _window__SERVER_DATA.router.baseUrl) || select(location.pathname);
|
|
114
122
|
var _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
|
|
115
123
|
var hydrationData = window._ROUTER_DATA;
|
|
@@ -133,6 +141,9 @@ var routerPlugin = function(param) {
|
|
|
133
141
|
};
|
|
134
142
|
};
|
|
135
143
|
var RouteApp = getRouteApp();
|
|
144
|
+
if (App) {
|
|
145
|
+
RouteApp = hoistNonReactStatics(RouteApp, App);
|
|
146
|
+
}
|
|
136
147
|
if (routesConfig === null || routesConfig === void 0 ? void 0 : routesConfig.globalApp) {
|
|
137
148
|
return next({
|
|
138
149
|
App: hoistNonReactStatics(RouteApp, routesConfig.globalApp)
|
|
@@ -236,6 +236,7 @@ import { createRoutesFromElements } from "react-router-dom";
|
|
|
236
236
|
import { RuntimeReactContext } from "../../core";
|
|
237
237
|
import { renderRoutes, urlJoin } from "./utils";
|
|
238
238
|
import { installGlobals } from "./fetch";
|
|
239
|
+
import { modifyRoutes as modifyRoutesHook } from "./hooks";
|
|
239
240
|
installGlobals();
|
|
240
241
|
function createFetchRequest(req) {
|
|
241
242
|
var origin = "".concat(req.protocol, "://").concat(req.host);
|
|
@@ -301,12 +302,15 @@ var routerPlugin = function(param) {
|
|
|
301
302
|
var _param_basename = param.basename, basename = _param_basename === void 0 ? "" : _param_basename, routesConfig = param.routesConfig, createRoutes = param.createRoutes;
|
|
302
303
|
return {
|
|
303
304
|
name: "@modern-js/plugin-router",
|
|
304
|
-
|
|
305
|
+
registerHook: {
|
|
306
|
+
modifyRoutes: modifyRoutesHook
|
|
307
|
+
},
|
|
308
|
+
setup: function(api) {
|
|
305
309
|
return {
|
|
306
310
|
init: function init(param, next) {
|
|
307
311
|
var context = param.context;
|
|
308
312
|
return _asyncToGenerator(function() {
|
|
309
|
-
var _context_ssrContext, request, ssrMode, baseUrl, _basename, routes, query, remixRequest, routerContext, router;
|
|
313
|
+
var _context_ssrContext, request, ssrMode, baseUrl, _basename, routes, query, remixRequest, routerContext, router, runner;
|
|
310
314
|
return __generator(this, function(_state) {
|
|
311
315
|
switch(_state.label){
|
|
312
316
|
case 0:
|
|
@@ -346,6 +350,8 @@ var routerPlugin = function(param) {
|
|
|
346
350
|
context.routerContext = routerContext;
|
|
347
351
|
context.routes = routes;
|
|
348
352
|
context.routeManifest = context.ssrContext.routeManifest;
|
|
353
|
+
runner = api.useHookRunners();
|
|
354
|
+
runner.modifyRoutes(routes);
|
|
349
355
|
return [
|
|
350
356
|
2,
|
|
351
357
|
next({
|
|
@@ -1,65 +1,3 @@
|
|
|
1
|
-
function _arrayLikeToArray(arr, len) {
|
|
2
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
3
|
-
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
4
|
-
return arr2;
|
|
5
|
-
}
|
|
6
|
-
function _arrayWithHoles(arr) {
|
|
7
|
-
if (Array.isArray(arr)) return arr;
|
|
8
|
-
}
|
|
9
|
-
function _arrayWithoutHoles(arr) {
|
|
10
|
-
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
|
|
11
|
-
}
|
|
12
|
-
function _defineProperty(obj, key, value) {
|
|
13
|
-
if (key in obj) {
|
|
14
|
-
Object.defineProperty(obj, key, {
|
|
15
|
-
value: value,
|
|
16
|
-
enumerable: true,
|
|
17
|
-
configurable: true,
|
|
18
|
-
writable: true
|
|
19
|
-
});
|
|
20
|
-
} else {
|
|
21
|
-
obj[key] = value;
|
|
22
|
-
}
|
|
23
|
-
return obj;
|
|
24
|
-
}
|
|
25
|
-
function _iterableToArray(iter) {
|
|
26
|
-
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
27
|
-
}
|
|
28
|
-
function _nonIterableRest() {
|
|
29
|
-
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
30
|
-
}
|
|
31
|
-
function _nonIterableSpread() {
|
|
32
|
-
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
33
|
-
}
|
|
34
|
-
function _objectSpread(target) {
|
|
35
|
-
for(var i = 1; i < arguments.length; i++){
|
|
36
|
-
var source = arguments[i] != null ? arguments[i] : {};
|
|
37
|
-
var ownKeys = Object.keys(source);
|
|
38
|
-
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
39
|
-
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
40
|
-
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
41
|
-
}));
|
|
42
|
-
}
|
|
43
|
-
ownKeys.forEach(function(key) {
|
|
44
|
-
_defineProperty(target, key, source[key]);
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
return target;
|
|
48
|
-
}
|
|
49
|
-
function _toArray(arr) {
|
|
50
|
-
return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();
|
|
51
|
-
}
|
|
52
|
-
function _toConsumableArray(arr) {
|
|
53
|
-
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
|
|
54
|
-
}
|
|
55
|
-
function _unsupportedIterableToArray(o, minLen) {
|
|
56
|
-
if (!o) return;
|
|
57
|
-
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
|
58
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
59
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
60
|
-
if (n === "Map" || n === "Set") return Array.from(n);
|
|
61
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
62
|
-
}
|
|
63
1
|
import path from "path";
|
|
64
2
|
import { getEntryOptions, SERVER_RENDER_FUNCTION_NAME, LOADABLE_STATS_FILE, isUseSSRBundle, createRuntimeExportsUtils, isSSGEntry } from "@modern-js/utils";
|
|
65
3
|
var PLUGIN_IDENTIFIER = "ssr";
|
|
@@ -126,6 +64,10 @@ var cli_default = function() {
|
|
|
126
64
|
// ensure that all packages use the same storage in @modern-js/utils/ssr
|
|
127
65
|
"@modern-js/utils/ssr": require.resolve("@modern-js/utils/ssr"),
|
|
128
66
|
"@modern-js/runtime/plugins": pluginsExportsUtils.getPath()
|
|
67
|
+
},
|
|
68
|
+
globalVars: function(values, param) {
|
|
69
|
+
var target = param.target;
|
|
70
|
+
values["process.env.MODERN_TARGET"] = target === "node" || target === "service-worker" ? "node" : "browser";
|
|
129
71
|
}
|
|
130
72
|
},
|
|
131
73
|
tools: {
|
|
@@ -140,13 +82,6 @@ var cli_default = function() {
|
|
|
140
82
|
}
|
|
141
83
|
]);
|
|
142
84
|
}
|
|
143
|
-
var modernVars = _defineProperty({}, "process.env.MODERN_TARGET", JSON.stringify(isServer || isServiceWorker ? "node" : "browser"));
|
|
144
|
-
chain.plugin(CHAIN_ID.PLUGIN.DEFINE).tap(function(args) {
|
|
145
|
-
var _args = _toArray(args), vars = _args[0], rest = _args.slice(1);
|
|
146
|
-
return [
|
|
147
|
-
_objectSpread({}, vars, modernVars)
|
|
148
|
-
].concat(_toConsumableArray(rest));
|
|
149
|
-
});
|
|
150
85
|
},
|
|
151
86
|
babel: babelConfig
|
|
152
87
|
}
|
package/dist/esm/ssr/index.js
CHANGED
|
@@ -177,14 +177,20 @@ var __generator = this && this.__generator || function(thisArg, body) {
|
|
|
177
177
|
import { jsx } from "react/jsx-runtime";
|
|
178
178
|
import { loadableReady } from "@loadable/component";
|
|
179
179
|
import hoistNonReactStatics from "hoist-non-react-statics";
|
|
180
|
+
import { parsedJSONFromElement } from "@modern-js/utils/runtime";
|
|
180
181
|
import { RenderLevel } from "./serverRender/types";
|
|
181
182
|
import { WithCallback } from "./react/withCallback";
|
|
182
183
|
import { formatClient, mockResponse, isReact18 } from "./utils";
|
|
184
|
+
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "./serverRender/utils";
|
|
183
185
|
var ssr = function(config) {
|
|
184
186
|
return {
|
|
185
187
|
name: "@modern-js/plugin-ssr",
|
|
186
188
|
setup: function() {
|
|
187
189
|
var mockResp = mockResponse();
|
|
190
|
+
if (config.inlineScript === false) {
|
|
191
|
+
window._SSR_DATA = parsedJSONFromElement(SSR_DATA_JSON_ID);
|
|
192
|
+
window._ROUTER_DATA = parsedJSONFromElement(ROUTER_DATA_JSON_ID);
|
|
193
|
+
}
|
|
188
194
|
return {
|
|
189
195
|
client: function() {
|
|
190
196
|
var _ref = _asyncToGenerator(function(param) {
|
|
@@ -83,7 +83,7 @@ function getHeadTemplate(beforeEntryTemplate, context) {
|
|
|
83
83
|
var _cssChunks;
|
|
84
84
|
var _routeManifest2_referenceCssAssets = routeManifest2.referenceCssAssets, referenceCssAssets = _routeManifest2_referenceCssAssets === void 0 ? [] : _routeManifest2_referenceCssAssets;
|
|
85
85
|
var _cssChunks1 = referenceCssAssets.filter(function(asset) {
|
|
86
|
-
return asset === null || asset === void 0 ? void 0 : asset.endsWith(".css");
|
|
86
|
+
return (asset === null || asset === void 0 ? void 0 : asset.endsWith(".css")) && !headTemplate2.includes(asset);
|
|
87
87
|
});
|
|
88
88
|
(_cssChunks = cssChunks).push.apply(_cssChunks, _toConsumableArray(_cssChunks1));
|
|
89
89
|
}
|
|
@@ -178,6 +178,7 @@ import helmetReplace from "../helmet";
|
|
|
178
178
|
import { RenderLevel } from "../types";
|
|
179
179
|
import { time } from "../time";
|
|
180
180
|
import prefetch from "../../prefetch";
|
|
181
|
+
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../utils";
|
|
181
182
|
import { toFragments } from "./template";
|
|
182
183
|
import { reduce } from "./reduce";
|
|
183
184
|
import * as loadableRenderer from "./loadable";
|
|
@@ -402,9 +403,12 @@ var Entry = /*#__PURE__*/ function() {
|
|
|
402
403
|
{
|
|
403
404
|
key: "getSSRDataScript",
|
|
404
405
|
value: function getSSRDataScript(templateData, routerData) {
|
|
405
|
-
var
|
|
406
|
+
var useInlineScript = this.pluginConfig.inlineScript !== false;
|
|
407
|
+
var ssrData = serializeJson(templateData);
|
|
408
|
+
var ssrDataScripts = useInlineScript ? "<script>window._SSR_DATA = ".concat(ssrData, "</script>") : '<script type="application/json" id="'.concat(SSR_DATA_JSON_ID, '">').concat(ssrData, "</script>");
|
|
406
409
|
if (routerData) {
|
|
407
|
-
|
|
410
|
+
var serializedRouterData = serializeJson(routerData);
|
|
411
|
+
ssrDataScripts += useInlineScript ? "\n<script>window._ROUTER_DATA = ".concat(serializedRouterData, "</script>") : '\n<script type="application/json" id="'.concat(ROUTER_DATA_JSON_ID, '">').concat(serializedRouterData, "</script>");
|
|
408
412
|
}
|
|
409
413
|
return {
|
|
410
414
|
SSRDataScript: ssrDataScripts
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
var CSS_CHUNKS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
|
|
2
|
+
var SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
|
|
3
|
+
var ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
|
|
2
4
|
function getLoadableScripts(extractor) {
|
|
3
5
|
var check = function(scripts2) {
|
|
4
6
|
return (scripts2 || "").includes("__LOADABLE_REQUIRED_CHUNKS___ext");
|
|
@@ -11,4 +13,4 @@ function getLoadableScripts(extractor) {
|
|
|
11
13
|
return "".concat(i, "</script>");
|
|
12
14
|
}).join("");
|
|
13
15
|
}
|
|
14
|
-
export { CSS_CHUNKS_PLACEHOLDER, getLoadableScripts };
|
|
16
|
+
export { CSS_CHUNKS_PLACEHOLDER, ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID, getLoadableScripts };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Fragment, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import {
|
|
3
|
+
DOCUMENT_COMMENT_PLACEHOLDER_START,
|
|
4
|
+
DOCUMENT_COMMENT_PLACEHOLDER_END
|
|
5
|
+
} from "./constants";
|
|
6
|
+
function Comment(props) {
|
|
7
|
+
const { comment, children } = props;
|
|
8
|
+
const commentStr = encodeURIComponent(children || comment || "");
|
|
9
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
10
|
+
`${DOCUMENT_COMMENT_PLACEHOLDER_START}`,
|
|
11
|
+
`${commentStr}`,
|
|
12
|
+
`${DOCUMENT_COMMENT_PLACEHOLDER_END}`
|
|
13
|
+
] });
|
|
14
|
+
}
|
|
15
|
+
export {
|
|
16
|
+
Comment
|
|
17
|
+
};
|
|
@@ -16,7 +16,9 @@ import {
|
|
|
16
16
|
DOCUMENT_SSRDATASCRIPT_PLACEHOLDER,
|
|
17
17
|
DOCUMENT_SCRIPT_PLACEHOLDER_START,
|
|
18
18
|
DOCUMENT_SCRIPT_PLACEHOLDER_END,
|
|
19
|
-
HTML_SEPARATOR
|
|
19
|
+
HTML_SEPARATOR,
|
|
20
|
+
DOCUMENT_COMMENT_PLACEHOLDER_START,
|
|
21
|
+
DOCUMENT_COMMENT_PLACEHOLDER_END
|
|
20
22
|
} from "../constants";
|
|
21
23
|
const debug = createDebugger("html_genarate");
|
|
22
24
|
const getDocumenByEntryName = function(entrypoints, entryName, fallbackDir) {
|
|
@@ -143,7 +145,7 @@ var cli_default = () => ({
|
|
|
143
145
|
).join("")
|
|
144
146
|
].join("");
|
|
145
147
|
if (html.includes(DOCUMENT_SCRIPT_PLACEHOLDER_START) && html.includes(DOCUMENT_SCRIPT_PLACEHOLDER_END)) {
|
|
146
|
-
html = html.
|
|
148
|
+
html = html.replace(
|
|
147
149
|
new RegExp(
|
|
148
150
|
`${DOCUMENT_SCRIPT_PLACEHOLDER_START}(.*?)${DOCUMENT_SCRIPT_PLACEHOLDER_END}`,
|
|
149
151
|
"g"
|
|
@@ -151,6 +153,15 @@ var cli_default = () => ({
|
|
|
151
153
|
(_scriptStr, $1) => `<script>${decodeURIComponent($1)}</script>`
|
|
152
154
|
);
|
|
153
155
|
}
|
|
156
|
+
if (html.includes(DOCUMENT_COMMENT_PLACEHOLDER_START) && html.includes(DOCUMENT_COMMENT_PLACEHOLDER_END)) {
|
|
157
|
+
html = html.replace(
|
|
158
|
+
new RegExp(
|
|
159
|
+
`${DOCUMENT_COMMENT_PLACEHOLDER_START}(.*?)${DOCUMENT_COMMENT_PLACEHOLDER_END}`,
|
|
160
|
+
"g"
|
|
161
|
+
),
|
|
162
|
+
(_scriptStr, $1) => `${decodeURIComponent($1)}`
|
|
163
|
+
);
|
|
164
|
+
}
|
|
154
165
|
const finalHtml = `<!DOCTYPE html>${html}`.replace(DOCUMENT_META_PLACEHOLDER, metas).replace(DOCUMENT_SSR_PLACEHOLDER, HTML_SEPARATOR).replace(DOCUMENT_SCRIPTS_PLACEHOLDER, scripts).replace(DOCUMENT_LINKS_PLACEHOLDER, links).replace(
|
|
155
166
|
DOCUMENT_CHUNKSMAP_PLACEHOLDER,
|
|
156
167
|
PLACEHOLDER_REPLACER_MAP[DOCUMENT_CHUNKSMAP_PLACEHOLDER]
|
|
@@ -24,6 +24,12 @@ const DOCUMENT_SCRIPT_PLACEHOLDER_START = encodeURIComponent(
|
|
|
24
24
|
const DOCUMENT_SCRIPT_PLACEHOLDER_END = encodeURIComponent(
|
|
25
25
|
"<!-- script-end -->"
|
|
26
26
|
);
|
|
27
|
+
const DOCUMENT_COMMENT_PLACEHOLDER_START = encodeURIComponent(
|
|
28
|
+
"<!-- comment-start -->"
|
|
29
|
+
);
|
|
30
|
+
const DOCUMENT_COMMENT_PLACEHOLDER_END = encodeURIComponent(
|
|
31
|
+
"<!-- comment-end -->"
|
|
32
|
+
);
|
|
27
33
|
const PLACEHOLDER_REPLACER_MAP = {
|
|
28
34
|
[DOCUMENT_NO_SCRIPTE_PLACEHOLDER]: `We're sorry but react app doesn't work properly without JavaScript enabled. Please enable it to continue.`,
|
|
29
35
|
[DOCUMENT_SSR_PLACEHOLDER]: HTML_SEPARATOR,
|
|
@@ -32,6 +38,8 @@ const PLACEHOLDER_REPLACER_MAP = {
|
|
|
32
38
|
};
|
|
33
39
|
export {
|
|
34
40
|
DOCUMENT_CHUNKSMAP_PLACEHOLDER,
|
|
41
|
+
DOCUMENT_COMMENT_PLACEHOLDER_END,
|
|
42
|
+
DOCUMENT_COMMENT_PLACEHOLDER_START,
|
|
35
43
|
DOCUMENT_FILE_NAME,
|
|
36
44
|
DOCUMENT_LINKS_PLACEHOLDER,
|
|
37
45
|
DOCUMENT_META_PLACEHOLDER,
|
|
@@ -54,7 +54,8 @@ import {
|
|
|
54
54
|
matchPath,
|
|
55
55
|
matchRoutes,
|
|
56
56
|
renderMatches,
|
|
57
|
-
resolvePath
|
|
57
|
+
resolvePath,
|
|
58
|
+
createPath
|
|
58
59
|
} from "react-router-dom";
|
|
59
60
|
import { defer, json, redirect } from "@modern-js/utils/universal/remix-router";
|
|
60
61
|
export {
|
|
@@ -75,6 +76,7 @@ export {
|
|
|
75
76
|
createBrowserRouter,
|
|
76
77
|
createHashRouter,
|
|
77
78
|
createMemoryRouter,
|
|
79
|
+
createPath,
|
|
78
80
|
createRoutesFromChildren,
|
|
79
81
|
createRoutesFromElements,
|
|
80
82
|
createSearchParams,
|
|
@@ -8,6 +8,8 @@ import {
|
|
|
8
8
|
useLocation
|
|
9
9
|
} from "react-router-dom";
|
|
10
10
|
import hoistNonReactStatics from "hoist-non-react-statics";
|
|
11
|
+
import { parsedJSONFromElement } from "@modern-js/utils/runtime";
|
|
12
|
+
import { modifyRoutes as modifyRoutesHook } from "./hooks";
|
|
11
13
|
import { deserializeErrors, renderRoutes, urlJoin } from "./utils";
|
|
12
14
|
let finalRouteConfig = {
|
|
13
15
|
routes: []
|
|
@@ -34,9 +36,13 @@ const routerPlugin = ({
|
|
|
34
36
|
const select = (pathname) => serverBase.find((baseUrl) => pathname.search(baseUrl) === 0) || "/";
|
|
35
37
|
let routes = [];
|
|
36
38
|
finalRouteConfig = routesConfig;
|
|
39
|
+
window._SERVER_DATA = parsedJSONFromElement("__MODERN_SERVER_DATA__");
|
|
37
40
|
return {
|
|
38
41
|
name: "@modern-js/plugin-router",
|
|
39
|
-
|
|
42
|
+
registerHook: {
|
|
43
|
+
modifyRoutes: modifyRoutesHook
|
|
44
|
+
},
|
|
45
|
+
setup: (api) => {
|
|
40
46
|
return {
|
|
41
47
|
init({ context }, next) {
|
|
42
48
|
context.router = {
|
|
@@ -64,6 +70,8 @@ const routerPlugin = ({
|
|
|
64
70
|
props
|
|
65
71
|
})
|
|
66
72
|
);
|
|
73
|
+
const runner = api.useHookRunners();
|
|
74
|
+
routes = runner.modifyRoutes(routes);
|
|
67
75
|
const baseUrl = ((_a = window._SERVER_DATA) == null ? void 0 : _a.router.baseUrl) || select(location.pathname);
|
|
68
76
|
const _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
|
|
69
77
|
let hydrationData = window._ROUTER_DATA;
|
|
@@ -83,7 +91,10 @@ const routerPlugin = ({
|
|
|
83
91
|
return /* @__PURE__ */ jsx(App, { ...props, children: /* @__PURE__ */ jsx(RouterProvider, { router }) });
|
|
84
92
|
};
|
|
85
93
|
};
|
|
86
|
-
|
|
94
|
+
let RouteApp = getRouteApp();
|
|
95
|
+
if (App) {
|
|
96
|
+
RouteApp = hoistNonReactStatics(RouteApp, App);
|
|
97
|
+
}
|
|
87
98
|
if (routesConfig == null ? void 0 : routesConfig.globalApp) {
|
|
88
99
|
return next({
|
|
89
100
|
App: hoistNonReactStatics(RouteApp, routesConfig.globalApp)
|
|
@@ -10,6 +10,7 @@ import { createRoutesFromElements } from "react-router-dom";
|
|
|
10
10
|
import { RuntimeReactContext } from "../../core";
|
|
11
11
|
import { renderRoutes, urlJoin } from "./utils";
|
|
12
12
|
import { installGlobals } from "./fetch";
|
|
13
|
+
import { modifyRoutes as modifyRoutesHook } from "./hooks";
|
|
13
14
|
installGlobals();
|
|
14
15
|
function createFetchRequest(req) {
|
|
15
16
|
const origin = `${req.protocol}://${req.host}`;
|
|
@@ -44,7 +45,10 @@ const routerPlugin = ({
|
|
|
44
45
|
}) => {
|
|
45
46
|
return {
|
|
46
47
|
name: "@modern-js/plugin-router",
|
|
47
|
-
|
|
48
|
+
registerHook: {
|
|
49
|
+
modifyRoutes: modifyRoutesHook
|
|
50
|
+
},
|
|
51
|
+
setup: (api) => {
|
|
48
52
|
return {
|
|
49
53
|
async init({ context }, next) {
|
|
50
54
|
if (!routesConfig && !createRoutes) {
|
|
@@ -72,6 +76,8 @@ const routerPlugin = ({
|
|
|
72
76
|
context.routerContext = routerContext;
|
|
73
77
|
context.routes = routes;
|
|
74
78
|
context.routeManifest = context.ssrContext.routeManifest;
|
|
79
|
+
const runner = api.useHookRunners();
|
|
80
|
+
runner.modifyRoutes(routes);
|
|
75
81
|
return next({ context });
|
|
76
82
|
},
|
|
77
83
|
hoc: ({ App }, next) => {
|
|
@@ -55,6 +55,9 @@ var cli_default = () => ({
|
|
|
55
55
|
// ensure that all packages use the same storage in @modern-js/utils/ssr
|
|
56
56
|
"@modern-js/utils/ssr": require.resolve("@modern-js/utils/ssr"),
|
|
57
57
|
"@modern-js/runtime/plugins": pluginsExportsUtils.getPath()
|
|
58
|
+
},
|
|
59
|
+
globalVars: (values, { target }) => {
|
|
60
|
+
values["process.env.MODERN_TARGET"] = target === "node" || target === "service-worker" ? "node" : "browser";
|
|
58
61
|
}
|
|
59
62
|
},
|
|
60
63
|
tools: {
|
|
@@ -66,21 +69,6 @@ var cli_default = () => ({
|
|
|
66
69
|
{ filename: LOADABLE_STATS_FILE }
|
|
67
70
|
]);
|
|
68
71
|
}
|
|
69
|
-
const modernVars = {
|
|
70
|
-
[`process.env.MODERN_TARGET`]: JSON.stringify(
|
|
71
|
-
isServer || isServiceWorker ? "node" : "browser"
|
|
72
|
-
)
|
|
73
|
-
};
|
|
74
|
-
chain.plugin(CHAIN_ID.PLUGIN.DEFINE).tap((args) => {
|
|
75
|
-
const [vars, ...rest] = args;
|
|
76
|
-
return [
|
|
77
|
-
{
|
|
78
|
-
...vars,
|
|
79
|
-
...modernVars
|
|
80
|
-
},
|
|
81
|
-
...rest
|
|
82
|
-
];
|
|
83
|
-
});
|
|
84
72
|
},
|
|
85
73
|
babel: babelConfig
|
|
86
74
|
}
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import { loadableReady } from "@loadable/component";
|
|
3
3
|
import hoistNonReactStatics from "hoist-non-react-statics";
|
|
4
|
+
import { parsedJSONFromElement } from "@modern-js/utils/runtime";
|
|
4
5
|
import {
|
|
5
6
|
RenderLevel
|
|
6
7
|
} from "./serverRender/types";
|
|
7
8
|
import { WithCallback } from "./react/withCallback";
|
|
8
9
|
import { formatClient, mockResponse, isReact18 } from "./utils";
|
|
10
|
+
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "./serverRender/utils";
|
|
9
11
|
const ssr = (config) => ({
|
|
10
12
|
name: "@modern-js/plugin-ssr",
|
|
11
13
|
setup: () => {
|
|
12
14
|
const mockResp = mockResponse();
|
|
15
|
+
if (config.inlineScript === false) {
|
|
16
|
+
window._SSR_DATA = parsedJSONFromElement(SSR_DATA_JSON_ID);
|
|
17
|
+
window._ROUTER_DATA = parsedJSONFromElement(ROUTER_DATA_JSON_ID);
|
|
18
|
+
}
|
|
13
19
|
return {
|
|
14
20
|
client: async ({ App, context, ModernRender, ModernHydrate }) => {
|
|
15
21
|
var _a;
|
|
@@ -44,7 +44,7 @@ function getHeadTemplate(beforeEntryTemplate, context) {
|
|
|
44
44
|
if (routeManifest2) {
|
|
45
45
|
const { referenceCssAssets = [] } = routeManifest2;
|
|
46
46
|
const _cssChunks = referenceCssAssets.filter(
|
|
47
|
-
(asset) => asset == null ? void 0 : asset.endsWith(".css")
|
|
47
|
+
(asset) => (asset == null ? void 0 : asset.endsWith(".css")) && !headTemplate2.includes(asset)
|
|
48
48
|
);
|
|
49
49
|
cssChunks.push(..._cssChunks);
|
|
50
50
|
}
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
} from "../types";
|
|
10
10
|
import { time } from "../time";
|
|
11
11
|
import prefetch from "../../prefetch";
|
|
12
|
+
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../utils";
|
|
12
13
|
import { toFragments } from "./template";
|
|
13
14
|
import { reduce } from "./reduce";
|
|
14
15
|
import * as loadableRenderer from "./loadable";
|
|
@@ -142,14 +143,14 @@ class Entry {
|
|
|
142
143
|
return html;
|
|
143
144
|
}
|
|
144
145
|
getSSRDataScript(templateData, routerData) {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
146
|
+
const useInlineScript = this.pluginConfig.inlineScript !== false;
|
|
147
|
+
const ssrData = serializeJson(templateData);
|
|
148
|
+
let ssrDataScripts = useInlineScript ? `<script>window._SSR_DATA = ${ssrData}</script>` : `<script type="application/json" id="${SSR_DATA_JSON_ID}">${ssrData}</script>`;
|
|
148
149
|
if (routerData) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
150
|
+
const serializedRouterData = serializeJson(routerData);
|
|
151
|
+
ssrDataScripts += useInlineScript ? `
|
|
152
|
+
<script>window._ROUTER_DATA = ${serializedRouterData}</script>` : `
|
|
153
|
+
<script type="application/json" id="${ROUTER_DATA_JSON_ID}">${serializedRouterData}</script>`;
|
|
153
154
|
}
|
|
154
155
|
return {
|
|
155
156
|
SSRDataScript: ssrDataScripts
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
const CSS_CHUNKS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
|
|
2
|
+
const SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
|
|
3
|
+
const ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
|
|
2
4
|
function getLoadableScripts(extractor) {
|
|
3
5
|
const check = (scripts2) => (scripts2 || "").includes("__LOADABLE_REQUIRED_CHUNKS___ext");
|
|
4
6
|
const scripts = extractor.getScriptTags();
|
|
@@ -9,5 +11,7 @@ function getLoadableScripts(extractor) {
|
|
|
9
11
|
}
|
|
10
12
|
export {
|
|
11
13
|
CSS_CHUNKS_PLACEHOLDER,
|
|
14
|
+
ROUTER_DATA_JSON_ID,
|
|
15
|
+
SSR_DATA_JSON_ID,
|
|
12
16
|
getLoadableScripts
|
|
13
17
|
};
|
|
@@ -12,6 +12,8 @@ export declare const DOCUMENT_LINKS_PLACEHOLDER: string;
|
|
|
12
12
|
export declare const DOCUMENT_NO_SCRIPTE_PLACEHOLDER: string;
|
|
13
13
|
export declare const DOCUMENT_SCRIPT_PLACEHOLDER_START: string;
|
|
14
14
|
export declare const DOCUMENT_SCRIPT_PLACEHOLDER_END: string;
|
|
15
|
+
export declare const DOCUMENT_COMMENT_PLACEHOLDER_START: string;
|
|
16
|
+
export declare const DOCUMENT_COMMENT_PLACEHOLDER_END: string;
|
|
15
17
|
export declare const PLACEHOLDER_REPLACER_MAP: {
|
|
16
18
|
[x: string]: string;
|
|
17
19
|
};
|
|
@@ -7,5 +7,5 @@ export * from './withRouter';
|
|
|
7
7
|
export { Link, NavLink } from './PrefetchLink';
|
|
8
8
|
export type { LinkProps, NavLinkProps } from './PrefetchLink';
|
|
9
9
|
export type { FormEncType, FormMethod, GetScrollRestorationKeyFunction, ParamKeyValuePair, SubmitOptions, URLSearchParamsInit, FetcherWithComponents, BrowserRouterProps, HashRouterProps, HistoryRouterProps, FormProps, ScrollRestorationProps, SubmitFunction, ActionFunction, ActionFunctionArgs, AwaitProps, unstable_Blocker, unstable_BlockerFunction, DataRouteMatch, DataRouteObject, Fetcher, Hash, IndexRouteObject, IndexRouteProps, JsonFunction, LayoutRouteProps, LoaderFunction, LoaderFunctionArgs, Location, MemoryRouterProps, NavigateFunction, NavigateOptions, NavigateProps, Navigation, Navigator, NonIndexRouteObject, OutletProps, Params, ParamParseKey, Path, PathMatch, Pathname, PathPattern, PathRouteProps, RedirectFunction, RelativeRoutingType, RouteMatch, RouteObject, RouteProps, RouterProps, RouterProviderProps, RoutesProps, Search, ShouldRevalidateFunction, To } from 'react-router-dom';
|
|
10
|
-
export { createBrowserRouter, createHashRouter, createMemoryRouter, RouterProvider, BrowserRouter, HashRouter, MemoryRouter, Router, Await, Form, Navigate, Outlet, Route, Routes, ScrollRestoration, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit, createRoutesFromChildren, createRoutesFromElements, createSearchParams, generatePath, isRouteErrorResponse, matchPath, matchRoutes, renderMatches, resolvePath } from 'react-router-dom';
|
|
10
|
+
export { createBrowserRouter, createHashRouter, createMemoryRouter, RouterProvider, BrowserRouter, HashRouter, MemoryRouter, Router, Await, Form, Navigate, Outlet, Route, Routes, ScrollRestoration, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit, createRoutesFromChildren, createRoutesFromElements, createSearchParams, generatePath, isRouteErrorResponse, matchPath, matchRoutes, renderMatches, resolvePath, createPath } from 'react-router-dom';
|
|
11
11
|
export { defer, json, redirect } from '@modern-js/utils/universal/remix-router';
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import type { ChunkExtractor } from '@loadable/server';
|
|
2
2
|
export declare const CSS_CHUNKS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
|
|
3
|
+
export declare const SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
|
|
4
|
+
export declare const ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
|
|
3
5
|
export declare function getLoadableScripts(extractor: ChunkExtractor): string;
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"modern",
|
|
12
12
|
"modern.js"
|
|
13
13
|
],
|
|
14
|
-
"version": "2.
|
|
14
|
+
"version": "2.15.0",
|
|
15
15
|
"engines": {
|
|
16
16
|
"node": ">=14.17.6"
|
|
17
17
|
},
|
|
@@ -158,9 +158,9 @@
|
|
|
158
158
|
"react-side-effect": "^2.1.1",
|
|
159
159
|
"redux-logger": "^3.0.6",
|
|
160
160
|
"styled-components": "^5.3.1",
|
|
161
|
-
"@modern-js/plugin": "2.
|
|
162
|
-
"@modern-js/types": "2.
|
|
163
|
-
"@modern-js/utils": "2.
|
|
161
|
+
"@modern-js/plugin": "2.15.0",
|
|
162
|
+
"@modern-js/types": "2.15.0",
|
|
163
|
+
"@modern-js/utils": "2.15.0"
|
|
164
164
|
},
|
|
165
165
|
"peerDependencies": {
|
|
166
166
|
"react": ">=17",
|
|
@@ -170,7 +170,6 @@
|
|
|
170
170
|
"@types/cookie": "0.5.1",
|
|
171
171
|
"@remix-run/web-fetch": "^4.1.3",
|
|
172
172
|
"@testing-library/react": "^13.4.0",
|
|
173
|
-
"@testing-library/react-hooks": "^8.0.1",
|
|
174
173
|
"@types/invariant": "^2.2.30",
|
|
175
174
|
"@types/jest": "^29",
|
|
176
175
|
"@types/loadable__webpack-plugin": "^5.7.3",
|
|
@@ -181,11 +180,11 @@
|
|
|
181
180
|
"react-dom": "^18",
|
|
182
181
|
"ts-jest": "^29.0.5",
|
|
183
182
|
"typescript": "^4",
|
|
184
|
-
"@modern-js/app-tools": "2.
|
|
185
|
-
"@modern-js/core": "2.
|
|
186
|
-
"@modern-js/server-core": "2.
|
|
187
|
-
"@scripts/build": "2.
|
|
188
|
-
"@scripts/jest-config": "2.
|
|
183
|
+
"@modern-js/app-tools": "2.15.0",
|
|
184
|
+
"@modern-js/core": "2.15.0",
|
|
185
|
+
"@modern-js/server-core": "2.15.0",
|
|
186
|
+
"@scripts/build": "2.15.0",
|
|
187
|
+
"@scripts/jest-config": "2.15.0"
|
|
189
188
|
},
|
|
190
189
|
"sideEffects": false,
|
|
191
190
|
"modernConfig": {},
|