@modern-js/runtime 2.42.1 → 2.43.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/dist/cjs/cli/index.js +2 -3
- package/dist/cjs/ssr/cli/index.js +6 -4
- package/dist/cjs/ssr/index.js +11 -3
- package/dist/cjs/ssr/react/prerender/index.js +1 -0
- package/dist/cjs/ssr/serverRender/{renderToString/type.js → constants.js} +21 -11
- package/dist/cjs/ssr/serverRender/helmet.js +5 -4
- package/dist/cjs/ssr/serverRender/index.js +2 -2
- package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +2 -1
- package/dist/cjs/ssr/serverRender/renderToStream/bulidTemplate.before.js +2 -1
- package/dist/cjs/ssr/serverRender/renderToStream/index.js +0 -5
- package/dist/cjs/ssr/serverRender/renderToString/buildHtml.js +6 -8
- package/dist/cjs/ssr/serverRender/renderToString/entry.js +15 -13
- package/dist/cjs/ssr/serverRender/renderToString/index.js +0 -5
- package/dist/cjs/ssr/serverRender/types.js +7 -2
- package/dist/cjs/ssr/serverRender/utils.js +7 -11
- package/dist/esm/cli/index.js +2 -3
- package/dist/esm/ssr/cli/index.js +6 -4
- package/dist/esm/ssr/index.js +10 -2
- package/dist/esm/ssr/react/prerender/index.js +1 -0
- package/dist/esm/ssr/serverRender/constants.js +14 -0
- package/dist/esm/ssr/serverRender/helmet.js +5 -4
- package/dist/esm/ssr/serverRender/index.js +2 -2
- package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.js +3 -2
- package/dist/esm/ssr/serverRender/renderToStream/bulidTemplate.before.js +3 -2
- package/dist/esm/ssr/serverRender/renderToStream/index.js +0 -5
- package/dist/esm/ssr/serverRender/renderToString/buildHtml.js +6 -8
- package/dist/esm/ssr/serverRender/renderToString/entry.js +21 -15
- package/dist/esm/ssr/serverRender/renderToString/index.js +1 -6
- package/dist/esm/ssr/serverRender/types.js +6 -1
- package/dist/esm/ssr/serverRender/utils.js +7 -7
- package/dist/esm-node/cli/index.js +2 -3
- package/dist/esm-node/ssr/cli/index.js +6 -4
- package/dist/esm-node/ssr/index.js +9 -1
- package/dist/esm-node/ssr/react/prerender/index.js +1 -0
- package/dist/esm-node/ssr/serverRender/constants.js +14 -0
- package/dist/esm-node/ssr/serverRender/helmet.js +5 -4
- package/dist/esm-node/ssr/serverRender/index.js +2 -2
- package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.js +3 -2
- package/dist/esm-node/ssr/serverRender/renderToStream/bulidTemplate.before.js +3 -2
- package/dist/esm-node/ssr/serverRender/renderToStream/index.js +0 -5
- package/dist/esm-node/ssr/serverRender/renderToString/buildHtml.js +6 -8
- package/dist/esm-node/ssr/serverRender/renderToString/entry.js +14 -12
- package/dist/esm-node/ssr/serverRender/renderToString/index.js +0 -5
- package/dist/esm-node/ssr/serverRender/types.js +6 -1
- package/dist/esm-node/ssr/serverRender/utils.js +5 -7
- package/dist/types/exports/server.d.ts +1 -0
- package/dist/types/ssr/react/prerender/index.d.ts +4 -0
- package/dist/types/ssr/serverRender/constants.d.ts +6 -0
- package/dist/types/ssr/serverRender/renderToString/entry.d.ts +1 -2
- package/dist/types/ssr/serverRender/renderToString/loadable.d.ts +1 -2
- package/dist/types/ssr/serverRender/renderToString/styledComponent.d.ts +1 -1
- package/dist/types/ssr/serverRender/types.d.ts +15 -2
- package/dist/types/ssr/serverRender/utils.d.ts +7 -3
- package/package.json +12 -12
- package/dist/esm/ssr/serverRender/renderToString/type.js +0 -9
- package/dist/esm-node/ssr/serverRender/renderToString/type.js +0 -9
- package/dist/types/ssr/serverRender/renderToString/type.d.ts +0 -13
|
@@ -3,7 +3,8 @@ import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
|
|
|
3
3
|
import ReactHelmet from "react-helmet";
|
|
4
4
|
import { matchRoutes } from "@modern-js/runtime-utils/router";
|
|
5
5
|
import helmetReplace from "../helmet";
|
|
6
|
-
import {
|
|
6
|
+
import { CHUNK_CSS_PLACEHOLDER } from "../constants";
|
|
7
|
+
import { safeReplace } from "../utils";
|
|
7
8
|
import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
|
|
8
9
|
function getHeadTemplate(beforeEntryTemplate, context) {
|
|
9
10
|
var callbacks = [
|
|
@@ -20,7 +21,7 @@ function getHeadTemplate(beforeEntryTemplate, context) {
|
|
|
20
21
|
}
|
|
21
22
|
return buildTemplate(headTemplate, callbacks);
|
|
22
23
|
function injectCss(headTemplate2) {
|
|
23
|
-
return headTemplate2
|
|
24
|
+
return safeReplace(headTemplate2, CHUNK_CSS_PLACEHOLDER, getCssChunks());
|
|
24
25
|
function getCssChunks() {
|
|
25
26
|
var routeManifest = context.routeManifest, routerContext = context.routerContext, routes = context.routes;
|
|
26
27
|
if (!routeManifest || !routerContext || !routes) {
|
|
@@ -3,7 +3,6 @@ import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
|
|
|
3
3
|
import { createElement } from "react";
|
|
4
4
|
import { run } from "@modern-js/runtime-utils/node";
|
|
5
5
|
import { time } from "@modern-js/runtime-utils/time";
|
|
6
|
-
import { PreRender } from "../../react/prerender";
|
|
7
6
|
import { SSRErrors, SSRTimings } from "../tracker";
|
|
8
7
|
import renderToPipe from "./renderToPipe";
|
|
9
8
|
var render = function(param) {
|
|
@@ -24,10 +23,6 @@ var render = function(param) {
|
|
|
24
23
|
tracker = ssrContext.tracker;
|
|
25
24
|
pipe = renderToPipe(rootElement, context, {
|
|
26
25
|
onShellReady: function onShellReady() {
|
|
27
|
-
var cacheConfig = PreRender.config();
|
|
28
|
-
if (cacheConfig) {
|
|
29
|
-
ssrContext.cacheConfig = cacheConfig;
|
|
30
|
-
}
|
|
31
26
|
var cost = end();
|
|
32
27
|
tracker.trackTiming(SSRTimings.RENDER_SHELL, cost);
|
|
33
28
|
},
|
|
@@ -1,30 +1,28 @@
|
|
|
1
|
+
import { safeReplace } from "../utils";
|
|
2
|
+
import { HTML_PLACEHOLDER, SSR_DATA_PLACEHOLDER, CHUNK_JS_PLACEHOLDER, CHUNK_CSS_PLACEHOLDER } from "../constants";
|
|
1
3
|
function buildHtml(template, callbacks) {
|
|
2
4
|
return callbacks.reduce(function(tmp, cb) {
|
|
3
5
|
return cb(tmp);
|
|
4
6
|
}, template);
|
|
5
7
|
}
|
|
6
8
|
function createReplaceHtml(html) {
|
|
7
|
-
var HTML_REG = /<!--<\?-\s*html\s*\?>-->/;
|
|
8
9
|
return function(template) {
|
|
9
|
-
return template
|
|
10
|
+
return safeReplace(template, HTML_PLACEHOLDER, html);
|
|
10
11
|
};
|
|
11
12
|
}
|
|
12
13
|
function createReplaceSSRDataScript(data) {
|
|
13
|
-
var SSR_DATA_REG = /<!--<\?-\s*SSRDataScript\s*\?>-->/;
|
|
14
14
|
return function(template) {
|
|
15
|
-
return template
|
|
15
|
+
return safeReplace(template, SSR_DATA_PLACEHOLDER, data);
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
18
|
function createReplaceChunkJs(js) {
|
|
19
|
-
var CHUNK_JS_REG = /<!--<\?-\s*chunksMap\.js\s*\?>-->/;
|
|
20
19
|
return function(template) {
|
|
21
|
-
return template
|
|
20
|
+
return safeReplace(template, CHUNK_JS_PLACEHOLDER, js);
|
|
22
21
|
};
|
|
23
22
|
}
|
|
24
23
|
function createReplaceChunkCss(css) {
|
|
25
|
-
var CHUNK_CSS_REG = /<!--<\?-\s*chunksMap\.css\s*\?>-->/;
|
|
26
24
|
return function(template) {
|
|
27
|
-
return template
|
|
25
|
+
return safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
|
|
28
26
|
};
|
|
29
27
|
}
|
|
30
28
|
export {
|
|
@@ -2,7 +2,7 @@ import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
|
|
|
2
2
|
import { _ as _class_call_check } from "@swc/helpers/_/_class_call_check";
|
|
3
3
|
import { _ as _create_class } from "@swc/helpers/_/_create_class";
|
|
4
4
|
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
5
|
-
import { _ as
|
|
5
|
+
import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
|
|
6
6
|
import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
|
|
7
7
|
import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
|
|
8
8
|
import React from "react";
|
|
@@ -13,27 +13,34 @@ import { serializeErrors } from "../../../router/runtime/utils";
|
|
|
13
13
|
import helmetReplace from "../helmet";
|
|
14
14
|
import { RenderLevel } from "../types";
|
|
15
15
|
import prefetch from "../../prefetch";
|
|
16
|
-
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID
|
|
16
|
+
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../constants";
|
|
17
|
+
import { attributesToString } from "../utils";
|
|
17
18
|
import { SSRErrors, SSRTimings } from "../tracker";
|
|
18
19
|
import { createLoadableCollector } from "./loadable";
|
|
19
20
|
import { createRender } from "./render";
|
|
20
21
|
import { createStyledCollector } from "./styledComponent";
|
|
21
22
|
import { buildHtml, createReplaceChunkCss, createReplaceChunkJs, createReplaceHtml, createReplaceSSRDataScript } from "./buildHtml";
|
|
22
|
-
var buildTemplateData = function(context, data, renderLevel, tracker) {
|
|
23
|
-
var request = context.request
|
|
24
|
-
var
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
var buildTemplateData = function(context, data, renderLevel, tracker, config) {
|
|
24
|
+
var request = context.request;
|
|
25
|
+
var unsafeHeaders = config.unsafeHeaders;
|
|
26
|
+
var headers = unsafeHeaders ? Object.fromEntries(Object.entries(request.headers).filter(function(param) {
|
|
27
|
+
var _param = _sliced_to_array(param, 2), key = _param[0], _ = _param[1];
|
|
28
|
+
var _unsafeHeaders_map;
|
|
29
|
+
return unsafeHeaders === null || unsafeHeaders === void 0 ? void 0 : (_unsafeHeaders_map = unsafeHeaders.map(function(header) {
|
|
30
|
+
return header.toLowerCase();
|
|
31
|
+
})) === null || _unsafeHeaders_map === void 0 ? void 0 : _unsafeHeaders_map.includes(key.toLowerCase());
|
|
32
|
+
})) : void 0;
|
|
27
33
|
return {
|
|
28
34
|
data,
|
|
29
35
|
context: {
|
|
30
|
-
request:
|
|
36
|
+
request: {
|
|
31
37
|
params: request.params,
|
|
32
38
|
query: request.query,
|
|
33
39
|
pathname: request.pathname,
|
|
34
40
|
host: request.host,
|
|
35
|
-
url: request.url
|
|
36
|
-
|
|
41
|
+
url: request.url,
|
|
42
|
+
headers
|
|
43
|
+
},
|
|
37
44
|
reporter: {
|
|
38
45
|
sessionId: tracker.sessionId
|
|
39
46
|
}
|
|
@@ -41,8 +48,7 @@ var buildTemplateData = function(context, data, renderLevel, tracker) {
|
|
|
41
48
|
renderLevel
|
|
42
49
|
};
|
|
43
50
|
};
|
|
44
|
-
var Entry
|
|
45
|
-
Entry = /* @__PURE__ */ function() {
|
|
51
|
+
var Entry = /* @__PURE__ */ function() {
|
|
46
52
|
"use strict";
|
|
47
53
|
function Entry2(options) {
|
|
48
54
|
_class_call_check(this, Entry2);
|
|
@@ -130,13 +136,13 @@ Entry = /* @__PURE__ */ function() {
|
|
|
130
136
|
loaderData: routerContext.loaderData,
|
|
131
137
|
errors: serializeErrors(routerContext.errors)
|
|
132
138
|
} : void 0;
|
|
133
|
-
templateData = buildTemplateData(ssrContext, prefetchData, _this.result.renderLevel, _this.tracker);
|
|
139
|
+
templateData = buildTemplateData(ssrContext, prefetchData, _this.result.renderLevel, _this.tracker, _this.pluginConfig);
|
|
134
140
|
ssrDataScripts = _this.getSSRDataScript(templateData, routerData);
|
|
135
141
|
html = buildHtml(_this.template, [
|
|
136
142
|
createReplaceChunkCss(_this.result.chunksMap.css),
|
|
137
143
|
createReplaceChunkJs(_this.result.chunksMap.js),
|
|
138
|
-
|
|
139
|
-
|
|
144
|
+
createReplaceSSRDataScript(ssrDataScripts),
|
|
145
|
+
createReplaceHtml(_this.result.html || "")
|
|
140
146
|
].concat(_to_consumable_array(_this.htmlModifiers)));
|
|
141
147
|
helmetData = ReactHelmet.renderStatic();
|
|
142
148
|
return [
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
|
|
2
2
|
import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
|
|
3
3
|
import { run } from "@modern-js/runtime-utils/node";
|
|
4
|
-
import { PreRender } from "../../react/prerender";
|
|
5
4
|
import SSREntry from "./entry";
|
|
6
5
|
var render = function(param) {
|
|
7
6
|
var App = param.App, context = param.context, config = param.config;
|
|
8
7
|
var ssrContext = context.ssrContext;
|
|
9
8
|
return run(ssrContext.request.headers, /* @__PURE__ */ _async_to_generator(function() {
|
|
10
|
-
var entry, html
|
|
9
|
+
var entry, html;
|
|
11
10
|
return _ts_generator(this, function(_state) {
|
|
12
11
|
switch (_state.label) {
|
|
13
12
|
case 0:
|
|
@@ -23,10 +22,6 @@ var render = function(param) {
|
|
|
23
22
|
];
|
|
24
23
|
case 1:
|
|
25
24
|
html = _state.sent();
|
|
26
|
-
cacheConfig = PreRender.config();
|
|
27
|
-
if (cacheConfig) {
|
|
28
|
-
context.ssrContext.cacheConfig = cacheConfig;
|
|
29
|
-
}
|
|
30
25
|
return [
|
|
31
26
|
2,
|
|
32
27
|
html
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
var RenderLevel;
|
|
2
|
+
(function(RenderLevel2) {
|
|
3
|
+
RenderLevel2[RenderLevel2["CLIENT_RENDER"] = 0] = "CLIENT_RENDER";
|
|
4
|
+
RenderLevel2[RenderLevel2["SERVER_PREFETCH"] = 1] = "SERVER_PREFETCH";
|
|
5
|
+
RenderLevel2[RenderLevel2["SERVER_RENDER"] = 2] = "SERVER_RENDER";
|
|
6
|
+
})(RenderLevel || (RenderLevel = {}));
|
|
2
7
|
export {
|
|
3
8
|
RenderLevel
|
|
4
9
|
};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
|
|
2
|
-
var CSS_CHUNKS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
|
|
3
|
-
var SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
|
|
4
|
-
var ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
|
|
5
2
|
function attributesToString(attributes) {
|
|
6
3
|
return Object.entries(attributes).reduce(function(str, param) {
|
|
7
4
|
var _param = _sliced_to_array(param, 2), key = _param[0], value = _param[1];
|
|
8
5
|
return value === void 0 ? str : "".concat(str, " ").concat(key, '="').concat(value, '"');
|
|
9
6
|
}, "");
|
|
10
7
|
}
|
|
8
|
+
function safeReplace(source, searchValue, replaceValue) {
|
|
9
|
+
return source.replace(searchValue, function() {
|
|
10
|
+
return replaceValue;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
11
13
|
export {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
SSR_DATA_JSON_ID,
|
|
15
|
-
attributesToString
|
|
14
|
+
attributesToString,
|
|
15
|
+
safeReplace
|
|
16
16
|
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import path from "path";
|
|
2
1
|
import { isReact18, cleanRequireCache } from "@modern-js/utils";
|
|
3
2
|
import { statePlugin } from "../state/cli";
|
|
4
3
|
import { ssrPlugin } from "../ssr/cli";
|
|
@@ -23,8 +22,8 @@ const runtimePlugin = () => ({
|
|
|
23
22
|
setup: (api) => {
|
|
24
23
|
return {
|
|
25
24
|
config() {
|
|
26
|
-
const
|
|
27
|
-
process.env.IS_REACT18 = isReact18(
|
|
25
|
+
const appDir = api.useAppContext().appDirectory;
|
|
26
|
+
process.env.IS_REACT18 = isReact18(appDir).toString();
|
|
28
27
|
return {
|
|
29
28
|
runtime: {},
|
|
30
29
|
runtimeByEntries: {},
|
|
@@ -70,11 +70,11 @@ const ssrPlugin = () => ({
|
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
72
|
tools: {
|
|
73
|
-
bundlerChain(chain, { isServer, isServiceWorker
|
|
73
|
+
bundlerChain(chain, { isServer, isServiceWorker }) {
|
|
74
74
|
const userConfig = api.useResolvedConfigContext();
|
|
75
75
|
if (isUseSSRBundle(userConfig) && !isServer && !isServiceWorker && checkUseStringSSR(userConfig)) {
|
|
76
76
|
const LoadableBundlerPlugin = require("./loadable-bundler-plugin.js");
|
|
77
|
-
chain.plugin(
|
|
77
|
+
chain.plugin("loadable").use(LoadableBundlerPlugin, [
|
|
78
78
|
{
|
|
79
79
|
filename: LOADABLE_STATS_FILE
|
|
80
80
|
}
|
|
@@ -120,12 +120,13 @@ const ssrPlugin = () => ({
|
|
|
120
120
|
},
|
|
121
121
|
modifyEntryRuntimePlugins({ entrypoint, plugins, bundlerConfigs }) {
|
|
122
122
|
if (ssrConfigMap.get(entrypoint.entryName)) {
|
|
123
|
-
var _bundlerConfigs_find_output, _bundlerConfigs_find, _config_server;
|
|
123
|
+
var _bundlerConfigs_find_output, _bundlerConfigs_find, _config_server, _config_server1;
|
|
124
124
|
const chunkLoadingGlobal = bundlerConfigs === null || bundlerConfigs === void 0 ? void 0 : (_bundlerConfigs_find = bundlerConfigs.find((config2) => config2.name === "client")) === null || _bundlerConfigs_find === void 0 ? void 0 : (_bundlerConfigs_find_output = _bundlerConfigs_find.output) === null || _bundlerConfigs_find_output === void 0 ? void 0 : _bundlerConfigs_find_output.chunkLoadingGlobal;
|
|
125
125
|
const config = api.useResolvedConfigContext();
|
|
126
126
|
const { enableInlineScripts, enableInlineStyles } = config.output;
|
|
127
127
|
const { crossorigin, scriptLoading } = config.html;
|
|
128
128
|
const disablePrerender = typeof ((_config_server = config.server) === null || _config_server === void 0 ? void 0 : _config_server.ssr) === "object" ? Boolean(config.server.ssr.disablePrerender) : false;
|
|
129
|
+
const unsafeHeaders = typeof ((_config_server1 = config.server) === null || _config_server1 === void 0 ? void 0 : _config_server1.ssr) === "object" ? config.server.ssr.unsafeHeaders : void 0;
|
|
129
130
|
plugins.push({
|
|
130
131
|
name: PLUGIN_IDENTIFIER,
|
|
131
132
|
options: JSON.stringify({
|
|
@@ -135,7 +136,8 @@ const ssrPlugin = () => ({
|
|
|
135
136
|
chunkLoadingGlobal,
|
|
136
137
|
disablePrerender,
|
|
137
138
|
enableInlineScripts: typeof enableInlineScripts === "function" ? void 0 : enableInlineScripts,
|
|
138
|
-
enableInlineStyles: typeof enableInlineStyles === "function" ? void 0 : enableInlineStyles
|
|
139
|
+
enableInlineStyles: typeof enableInlineStyles === "function" ? void 0 : enableInlineStyles,
|
|
140
|
+
unsafeHeaders
|
|
139
141
|
})
|
|
140
142
|
});
|
|
141
143
|
}
|
|
@@ -5,7 +5,7 @@ import { parsedJSONFromElement } from "@modern-js/runtime-utils/parsed";
|
|
|
5
5
|
import { RenderLevel } from "./serverRender/types";
|
|
6
6
|
import { WithCallback } from "./react/withCallback";
|
|
7
7
|
import { formatClient, mockResponse, isReact18 } from "./utils";
|
|
8
|
-
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "./serverRender/
|
|
8
|
+
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "./serverRender/constants";
|
|
9
9
|
const ssr = (config) => ({
|
|
10
10
|
name: "@modern-js/plugin-ssr",
|
|
11
11
|
setup: () => {
|
|
@@ -24,6 +24,14 @@ const ssr = (config) => ({
|
|
|
24
24
|
},
|
|
25
25
|
_hydration: true
|
|
26
26
|
};
|
|
27
|
+
const { ssrContext } = hydrateContext;
|
|
28
|
+
const { pathname: initialPathname } = ssrContext.request;
|
|
29
|
+
const currentPathname = window.location.pathname;
|
|
30
|
+
if (initialPathname !== currentPathname) {
|
|
31
|
+
const errorMsg = `The initial URL ${initialPathname} and the URL ${currentPathname} to be hydrated do not match, reload.`;
|
|
32
|
+
console.error(errorMsg);
|
|
33
|
+
window.location.reload();
|
|
34
|
+
}
|
|
27
35
|
const callback = () => {
|
|
28
36
|
delete hydrateContext._hydration;
|
|
29
37
|
};
|
|
@@ -68,6 +68,7 @@ function factory(Component) {
|
|
|
68
68
|
if (!validate) {
|
|
69
69
|
throw new Error("invalid props, check usage");
|
|
70
70
|
}
|
|
71
|
+
console.error("[Warn] PreRender has been deprecated, please use SSR Cache instead. reference to docs: https://modernjs.dev/guides/advanced-features/ssr.html");
|
|
71
72
|
return createElement(Component, {
|
|
72
73
|
...newProps
|
|
73
74
|
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const HTML_PLACEHOLDER = "<!--<?- html ?>-->";
|
|
2
|
+
const SSR_DATA_PLACEHOLDER = "<!--<?- SSRDataScript ?>-->";
|
|
3
|
+
const CHUNK_JS_PLACEHOLDER = "<!--<?- chunksMap.js ?>-->";
|
|
4
|
+
const CHUNK_CSS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
|
|
5
|
+
const SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
|
|
6
|
+
const ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
|
|
7
|
+
export {
|
|
8
|
+
CHUNK_CSS_PLACEHOLDER,
|
|
9
|
+
CHUNK_JS_PLACEHOLDER,
|
|
10
|
+
HTML_PLACEHOLDER,
|
|
11
|
+
ROUTER_DATA_JSON_ID,
|
|
12
|
+
SSR_DATA_JSON_ID,
|
|
13
|
+
SSR_DATA_PLACEHOLDER
|
|
14
|
+
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EOL } from "os";
|
|
2
|
+
import { safeReplace } from "./utils";
|
|
2
3
|
const RE_HTML_ATTR = /<html[^>]*>/;
|
|
3
4
|
const RE_BODY_ATTR = /<body[^>]*>/;
|
|
4
5
|
const RE_LAST_IN_HEAD = /<\/head>/;
|
|
@@ -8,11 +9,11 @@ function helmet(content, helmetData) {
|
|
|
8
9
|
let result = content;
|
|
9
10
|
const bodyAttributes = helmetData.bodyAttributes.toString();
|
|
10
11
|
if (bodyAttributes) {
|
|
11
|
-
result = result
|
|
12
|
+
result = safeReplace(result, RE_BODY_ATTR, `<body ${bodyAttributes}>`);
|
|
12
13
|
}
|
|
13
14
|
const htmlAttributes = helmetData.htmlAttributes.toString();
|
|
14
15
|
if (htmlAttributes) {
|
|
15
|
-
result = result
|
|
16
|
+
result = safeReplace(result, RE_HTML_ATTR, `<html ${htmlAttributes}>`);
|
|
16
17
|
}
|
|
17
18
|
const base = helmetData.base.toString();
|
|
18
19
|
const link = helmetData.link.toString();
|
|
@@ -24,7 +25,7 @@ function helmet(content, helmetData) {
|
|
|
24
25
|
const existTitleTag = RE_TITLE.test(content);
|
|
25
26
|
const shouldReplaceTitle = existTitleTag && TEST_TITLE_CONTENT.test(title.trim());
|
|
26
27
|
if (shouldReplaceTitle) {
|
|
27
|
-
result = result
|
|
28
|
+
result = safeReplace(result, RE_TITLE, title);
|
|
28
29
|
}
|
|
29
30
|
const helmetStr = [
|
|
30
31
|
base,
|
|
@@ -37,7 +38,7 @@ function helmet(content, helmetData) {
|
|
|
37
38
|
].reduce((pre, cur) => {
|
|
38
39
|
return pre + (cur.length > 0 ? ` ${cur}${EOL}` : "");
|
|
39
40
|
}, "");
|
|
40
|
-
return result
|
|
41
|
+
return safeReplace(result, RE_LAST_IN_HEAD, `${helmetStr}</head>`);
|
|
41
42
|
}
|
|
42
43
|
export {
|
|
43
44
|
helmet as default
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { isReact18 } from "../utils";
|
|
2
|
-
import {
|
|
2
|
+
import { CHUNK_CSS_PLACEHOLDER } from "./constants";
|
|
3
3
|
async function serverRender(options) {
|
|
4
4
|
var _options_context_ssrContext;
|
|
5
5
|
if ((_options_context_ssrContext = options.context.ssrContext) === null || _options_context_ssrContext === void 0 ? void 0 : _options_context_ssrContext.template) {
|
|
6
6
|
var _options_context_ssrContext1;
|
|
7
|
-
options.context.ssrContext.template = (_options_context_ssrContext1 = options.context.ssrContext) === null || _options_context_ssrContext1 === void 0 ? void 0 : _options_context_ssrContext1.template.replace("</head>", `${
|
|
7
|
+
options.context.ssrContext.template = (_options_context_ssrContext1 = options.context.ssrContext) === null || _options_context_ssrContext1 === void 0 ? void 0 : _options_context_ssrContext1.template.replace("</head>", `${CHUNK_CSS_PLACEHOLDER}</head>`);
|
|
8
8
|
}
|
|
9
9
|
if (isReact18() && options.config.mode === "stream") {
|
|
10
10
|
const pipe = await require("./renderToStream").render(options);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { serializeJson } from "@modern-js/runtime-utils/node";
|
|
2
|
-
import { attributesToString } from "../utils";
|
|
2
|
+
import { attributesToString, safeReplace } from "../utils";
|
|
3
|
+
import { SSR_DATA_PLACEHOLDER } from "../constants";
|
|
3
4
|
import { buildTemplate } from "./buildTemplate.share";
|
|
4
5
|
function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
5
6
|
const callbacks = [
|
|
@@ -8,7 +9,7 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
|
8
9
|
return buildTemplate(afterAppTemplate, callbacks);
|
|
9
10
|
function injectSSRDataScript(template) {
|
|
10
11
|
const ssrDataScript = buildSSRDataScript();
|
|
11
|
-
return template
|
|
12
|
+
return safeReplace(template, SSR_DATA_PLACEHOLDER, ssrDataScript);
|
|
12
13
|
function buildSSRDataScript() {
|
|
13
14
|
const { context: { ssrContext, initialData, __i18nData__ }, renderLevel } = options;
|
|
14
15
|
const { request, enableUnsafeCtx, nonce, tracker } = ssrContext;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import ReactHelmet from "react-helmet";
|
|
2
2
|
import { matchRoutes } from "@modern-js/runtime-utils/router";
|
|
3
3
|
import helmetReplace from "../helmet";
|
|
4
|
-
import {
|
|
4
|
+
import { CHUNK_CSS_PLACEHOLDER } from "../constants";
|
|
5
|
+
import { safeReplace } from "../utils";
|
|
5
6
|
import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
|
|
6
7
|
function getHeadTemplate(beforeEntryTemplate, context) {
|
|
7
8
|
const callbacks = [
|
|
@@ -18,7 +19,7 @@ function getHeadTemplate(beforeEntryTemplate, context) {
|
|
|
18
19
|
}
|
|
19
20
|
return buildTemplate(headTemplate, callbacks);
|
|
20
21
|
function injectCss(headTemplate2) {
|
|
21
|
-
return headTemplate2
|
|
22
|
+
return safeReplace(headTemplate2, CHUNK_CSS_PLACEHOLDER, getCssChunks());
|
|
22
23
|
function getCssChunks() {
|
|
23
24
|
const { routeManifest, routerContext, routes } = context;
|
|
24
25
|
if (!routeManifest || !routerContext || !routes) {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createElement } from "react";
|
|
2
2
|
import { run } from "@modern-js/runtime-utils/node";
|
|
3
3
|
import { time } from "@modern-js/runtime-utils/time";
|
|
4
|
-
import { PreRender } from "../../react/prerender";
|
|
5
4
|
import { SSRErrors, SSRTimings } from "../tracker";
|
|
6
5
|
import renderToPipe from "./renderToPipe";
|
|
7
6
|
const render = ({ App, context }) => {
|
|
@@ -19,10 +18,6 @@ const render = ({ App, context }) => {
|
|
|
19
18
|
const { tracker } = ssrContext;
|
|
20
19
|
const pipe = renderToPipe(rootElement, context, {
|
|
21
20
|
onShellReady() {
|
|
22
|
-
const cacheConfig = PreRender.config();
|
|
23
|
-
if (cacheConfig) {
|
|
24
|
-
ssrContext.cacheConfig = cacheConfig;
|
|
25
|
-
}
|
|
26
21
|
const cost = end();
|
|
27
22
|
tracker.trackTiming(SSRTimings.RENDER_SHELL, cost);
|
|
28
23
|
},
|
|
@@ -1,21 +1,19 @@
|
|
|
1
|
+
import { safeReplace } from "../utils";
|
|
2
|
+
import { HTML_PLACEHOLDER, SSR_DATA_PLACEHOLDER, CHUNK_JS_PLACEHOLDER, CHUNK_CSS_PLACEHOLDER } from "../constants";
|
|
1
3
|
function buildHtml(template, callbacks) {
|
|
2
4
|
return callbacks.reduce((tmp, cb) => cb(tmp), template);
|
|
3
5
|
}
|
|
4
6
|
function createReplaceHtml(html) {
|
|
5
|
-
|
|
6
|
-
return (template) => template.replace(HTML_REG, html);
|
|
7
|
+
return (template) => safeReplace(template, HTML_PLACEHOLDER, html);
|
|
7
8
|
}
|
|
8
9
|
function createReplaceSSRDataScript(data) {
|
|
9
|
-
|
|
10
|
-
return (template) => template.replace(SSR_DATA_REG, data);
|
|
10
|
+
return (template) => safeReplace(template, SSR_DATA_PLACEHOLDER, data);
|
|
11
11
|
}
|
|
12
12
|
function createReplaceChunkJs(js) {
|
|
13
|
-
|
|
14
|
-
return (template) => template.replace(CHUNK_JS_REG, js);
|
|
13
|
+
return (template) => safeReplace(template, CHUNK_JS_PLACEHOLDER, js);
|
|
15
14
|
}
|
|
16
15
|
function createReplaceChunkCss(css) {
|
|
17
|
-
|
|
18
|
-
return (template) => template.replace(CHUNK_CSS_REG, css);
|
|
16
|
+
return (template) => safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
|
|
19
17
|
}
|
|
20
18
|
export {
|
|
21
19
|
buildHtml,
|
|
@@ -7,17 +7,20 @@ import { serializeErrors } from "../../../router/runtime/utils";
|
|
|
7
7
|
import helmetReplace from "../helmet";
|
|
8
8
|
import { RenderLevel } from "../types";
|
|
9
9
|
import prefetch from "../../prefetch";
|
|
10
|
-
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID
|
|
10
|
+
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../constants";
|
|
11
|
+
import { attributesToString } from "../utils";
|
|
11
12
|
import { SSRErrors, SSRTimings } from "../tracker";
|
|
12
13
|
import { createLoadableCollector } from "./loadable";
|
|
13
14
|
import { createRender } from "./render";
|
|
14
15
|
import { createStyledCollector } from "./styledComponent";
|
|
15
16
|
import { buildHtml, createReplaceChunkCss, createReplaceChunkJs, createReplaceHtml, createReplaceSSRDataScript } from "./buildHtml";
|
|
16
|
-
const buildTemplateData = (context, data, renderLevel, tracker) => {
|
|
17
|
-
const { request
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
const buildTemplateData = (context, data, renderLevel, tracker, config) => {
|
|
18
|
+
const { request } = context;
|
|
19
|
+
const { unsafeHeaders } = config;
|
|
20
|
+
const headers = unsafeHeaders ? Object.fromEntries(Object.entries(request.headers).filter(([key, _]) => {
|
|
21
|
+
var _unsafeHeaders_map;
|
|
22
|
+
return unsafeHeaders === null || unsafeHeaders === void 0 ? void 0 : (_unsafeHeaders_map = unsafeHeaders.map((header) => header.toLowerCase())) === null || _unsafeHeaders_map === void 0 ? void 0 : _unsafeHeaders_map.includes(key.toLowerCase());
|
|
23
|
+
})) : void 0;
|
|
21
24
|
return {
|
|
22
25
|
data,
|
|
23
26
|
context: {
|
|
@@ -27,7 +30,7 @@ const buildTemplateData = (context, data, renderLevel, tracker) => {
|
|
|
27
30
|
pathname: request.pathname,
|
|
28
31
|
host: request.host,
|
|
29
32
|
url: request.url,
|
|
30
|
-
|
|
33
|
+
headers
|
|
31
34
|
},
|
|
32
35
|
reporter: {
|
|
33
36
|
sessionId: tracker.sessionId
|
|
@@ -36,8 +39,7 @@ const buildTemplateData = (context, data, renderLevel, tracker) => {
|
|
|
36
39
|
renderLevel
|
|
37
40
|
};
|
|
38
41
|
};
|
|
39
|
-
|
|
40
|
-
Entry = class Entry2 {
|
|
42
|
+
class Entry {
|
|
41
43
|
async renderToHtml(context) {
|
|
42
44
|
var _ssrContext_redirection, _ssrContext_redirection1, _ssrContext_redirection2;
|
|
43
45
|
const ssrContext = context.ssrContext;
|
|
@@ -59,13 +61,13 @@ Entry = class Entry2 {
|
|
|
59
61
|
loaderData: routerContext.loaderData,
|
|
60
62
|
errors: serializeErrors(routerContext.errors)
|
|
61
63
|
} : void 0;
|
|
62
|
-
const templateData = buildTemplateData(ssrContext, prefetchData, this.result.renderLevel, this.tracker);
|
|
64
|
+
const templateData = buildTemplateData(ssrContext, prefetchData, this.result.renderLevel, this.tracker, this.pluginConfig);
|
|
63
65
|
const ssrDataScripts = this.getSSRDataScript(templateData, routerData);
|
|
64
66
|
const html = buildHtml(this.template, [
|
|
65
67
|
createReplaceChunkCss(this.result.chunksMap.css),
|
|
66
68
|
createReplaceChunkJs(this.result.chunksMap.js),
|
|
67
|
-
createReplaceHtml(this.result.html || ""),
|
|
68
69
|
createReplaceSSRDataScript(ssrDataScripts),
|
|
70
|
+
createReplaceHtml(this.result.html || ""),
|
|
69
71
|
...this.htmlModifiers
|
|
70
72
|
]);
|
|
71
73
|
const helmetData = ReactHelmet.renderStatic();
|
|
@@ -154,7 +156,7 @@ Entry = class Entry2 {
|
|
|
154
156
|
}
|
|
155
157
|
};
|
|
156
158
|
}
|
|
157
|
-
}
|
|
159
|
+
}
|
|
158
160
|
export {
|
|
159
161
|
Entry as default
|
|
160
162
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { run } from "@modern-js/runtime-utils/node";
|
|
2
|
-
import { PreRender } from "../../react/prerender";
|
|
3
2
|
import SSREntry from "./entry";
|
|
4
3
|
const render = ({ App, context, config }) => {
|
|
5
4
|
const ssrContext = context.ssrContext;
|
|
@@ -11,10 +10,6 @@ const render = ({ App, context, config }) => {
|
|
|
11
10
|
});
|
|
12
11
|
entry.metrics.emitCounter("app.visit.count", 1);
|
|
13
12
|
const html = await entry.renderToHtml(context);
|
|
14
|
-
const cacheConfig = PreRender.config();
|
|
15
|
-
if (cacheConfig) {
|
|
16
|
-
context.ssrContext.cacheConfig = cacheConfig;
|
|
17
|
-
}
|
|
18
13
|
return html;
|
|
19
14
|
});
|
|
20
15
|
};
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
var RenderLevel;
|
|
2
|
+
(function(RenderLevel2) {
|
|
3
|
+
RenderLevel2[RenderLevel2["CLIENT_RENDER"] = 0] = "CLIENT_RENDER";
|
|
4
|
+
RenderLevel2[RenderLevel2["SERVER_PREFETCH"] = 1] = "SERVER_PREFETCH";
|
|
5
|
+
RenderLevel2[RenderLevel2["SERVER_RENDER"] = 2] = "SERVER_RENDER";
|
|
6
|
+
})(RenderLevel || (RenderLevel = {}));
|
|
2
7
|
export {
|
|
3
8
|
RenderLevel
|
|
4
9
|
};
|
|
@@ -1,14 +1,12 @@
|
|
|
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__";
|
|
4
1
|
function attributesToString(attributes) {
|
|
5
2
|
return Object.entries(attributes).reduce((str, [key, value]) => {
|
|
6
3
|
return value === void 0 ? str : `${str} ${key}="${value}"`;
|
|
7
4
|
}, "");
|
|
8
5
|
}
|
|
6
|
+
function safeReplace(source, searchValue, replaceValue) {
|
|
7
|
+
return source.replace(searchValue, () => replaceValue);
|
|
8
|
+
}
|
|
9
9
|
export {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
SSR_DATA_JSON_ID,
|
|
13
|
-
attributesToString
|
|
10
|
+
attributesToString,
|
|
11
|
+
safeReplace
|
|
14
12
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AfterMatchContext, AfterRenderContext, MiddlewareContext, NextFunction } from '@modern-js/types';
|
|
2
|
+
export type { Container, CacheControl, CacheOptionProvider, CacheOption, } from '@modern-js/types';
|
|
2
3
|
export declare const hook: (attacher: ({ addMiddleware, afterMatch, afterRender, }: {
|
|
3
4
|
addMiddleware: (mid: Middleware) => void;
|
|
4
5
|
afterRender: (hook: AfterRenderHook) => void;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const HTML_PLACEHOLDER = "<!--<?- html ?>-->";
|
|
2
|
+
export declare const SSR_DATA_PLACEHOLDER = "<!--<?- SSRDataScript ?>-->";
|
|
3
|
+
export declare const CHUNK_JS_PLACEHOLDER = "<!--<?- chunksMap.js ?>-->";
|
|
4
|
+
export declare const CHUNK_CSS_PLACEHOLDER = "<!--<?- chunksMap.css ?>-->";
|
|
5
|
+
export declare const SSR_DATA_JSON_ID = "__MODERN_SSR_DATA__";
|
|
6
|
+
export declare const ROUTER_DATA_JSON_ID = "__MODERN_ROUTER_DATA__";
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { RuntimeContext, ModernSSRReactComponent, SSRPluginConfig, SSRServerContext } from '../types';
|
|
1
|
+
import { RuntimeContext, ModernSSRReactComponent, SSRPluginConfig, SSRServerContext, RenderResult } from '../types';
|
|
2
2
|
import { SSRTracker } from '../tracker';
|
|
3
|
-
import { RenderResult } from './type';
|
|
4
3
|
type EntryOptions = {
|
|
5
4
|
ctx: SSRServerContext;
|
|
6
5
|
App: ModernSSRReactComponent;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ReactElement } from 'react';
|
|
2
|
-
import { SSRPluginConfig } from '../types';
|
|
3
|
-
import { RenderResult } from './type';
|
|
2
|
+
import { SSRPluginConfig, RenderResult } from '../types';
|
|
4
3
|
import type { Collector } from './render';
|
|
5
4
|
declare class LoadableCollector implements Collector {
|
|
6
5
|
private options;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ServerStyleSheet } from 'styled-components';
|
|
2
2
|
import { ReactElement } from 'react';
|
|
3
|
-
import type { RenderResult } from '
|
|
3
|
+
import type { RenderResult } from '../types';
|
|
4
4
|
import type { Collector } from './render';
|
|
5
5
|
declare class StyledCollector implements Collector {
|
|
6
6
|
sheet: ServerStyleSheet;
|