@modern-js/runtime 2.42.2 → 2.44.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/buildTemplate.share.js +1 -1
- package/dist/cjs/ssr/serverRender/renderToStream/bulidTemplate.before.js +37 -10
- package/dist/cjs/ssr/serverRender/renderToStream/index.js +2 -7
- package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.js +32 -30
- package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.worker.js +3 -3
- package/dist/cjs/ssr/serverRender/renderToStream/template.js +3 -3
- package/dist/cjs/ssr/serverRender/renderToString/buildHtml.js +6 -12
- package/dist/cjs/ssr/serverRender/renderToString/entry.js +14 -12
- package/dist/cjs/ssr/serverRender/renderToString/index.js +0 -5
- package/dist/cjs/ssr/serverRender/renderToString/loadable.js +2 -6
- package/dist/cjs/ssr/serverRender/types.js +7 -2
- package/dist/cjs/ssr/serverRender/utils.js +13 -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/buildTemplate.share.js +5 -3
- package/dist/esm/ssr/serverRender/renderToStream/bulidTemplate.before.js +169 -33
- package/dist/esm/ssr/serverRender/renderToStream/index.js +2 -7
- package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.js +34 -30
- package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.worker.js +23 -13
- package/dist/esm/ssr/serverRender/renderToStream/template.js +37 -11
- package/dist/esm/ssr/serverRender/renderToString/buildHtml.js +6 -13
- package/dist/esm/ssr/serverRender/renderToString/entry.js +19 -13
- package/dist/esm/ssr/serverRender/renderToString/index.js +1 -6
- package/dist/esm/ssr/serverRender/renderToString/loadable.js +3 -7
- package/dist/esm/ssr/serverRender/types.js +6 -1
- package/dist/esm/ssr/serverRender/utils.js +12 -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/buildTemplate.share.js +1 -1
- package/dist/esm-node/ssr/serverRender/renderToStream/bulidTemplate.before.js +38 -11
- package/dist/esm-node/ssr/serverRender/renderToStream/index.js +2 -7
- package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.js +32 -30
- package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.worker.js +3 -3
- package/dist/esm-node/ssr/serverRender/renderToStream/template.js +3 -3
- package/dist/esm-node/ssr/serverRender/renderToString/buildHtml.js +6 -12
- package/dist/esm-node/ssr/serverRender/renderToString/entry.js +13 -11
- package/dist/esm-node/ssr/serverRender/renderToString/index.js +0 -5
- package/dist/esm-node/ssr/serverRender/renderToString/loadable.js +3 -7
- package/dist/esm-node/ssr/serverRender/types.js +6 -1
- package/dist/esm-node/ssr/serverRender/utils.js +10 -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/renderToStream/buildTemplate.after.d.ts +1 -1
- package/dist/types/ssr/serverRender/renderToStream/buildTemplate.share.d.ts +2 -2
- package/dist/types/ssr/serverRender/renderToStream/bulidTemplate.before.d.ts +2 -2
- package/dist/types/ssr/serverRender/renderToStream/index.d.ts +1 -1
- package/dist/types/ssr/serverRender/renderToStream/renderToPipe.d.ts +2 -2
- package/dist/types/ssr/serverRender/renderToStream/renderToPipe.worker.d.ts +2 -2
- package/dist/types/ssr/serverRender/renderToStream/template.d.ts +2 -2
- 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 +8 -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
|
@@ -11,13 +11,13 @@ var ShellChunkStatus;
|
|
|
11
11
|
ShellChunkStatus2[ShellChunkStatus2["START"] = 0] = "START";
|
|
12
12
|
ShellChunkStatus2[ShellChunkStatus2["FINIESH"] = 1] = "FINIESH";
|
|
13
13
|
})(ShellChunkStatus || (ShellChunkStatus = {}));
|
|
14
|
-
function renderToPipe(rootElement, context, options) {
|
|
14
|
+
function renderToPipe(rootElement, context, pluginConfig, options) {
|
|
15
15
|
var shellChunkStatus = 0;
|
|
16
16
|
var chunkVec = [];
|
|
17
17
|
var ssrContext = context.ssrContext;
|
|
18
18
|
var forUserPipe = function() {
|
|
19
19
|
var _ref = _async_to_generator(function() {
|
|
20
|
-
var renderToReadableStream,
|
|
20
|
+
var renderToReadableStream, _ref2, shellAfter, shellBefore, readableOriginal, reader, injectableStream, err, _ref1, shellAfter1, shellBefore1, fallbackHtml;
|
|
21
21
|
return _ts_generator(this, function(_state) {
|
|
22
22
|
switch (_state.label) {
|
|
23
23
|
case 0:
|
|
@@ -25,14 +25,19 @@ function renderToPipe(rootElement, context, options) {
|
|
|
25
25
|
renderToReadableStream = require("react-dom/server").renderToReadableStream;
|
|
26
26
|
} catch (e) {
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
return [
|
|
29
|
+
4,
|
|
30
|
+
getTemplates(context, RenderLevel.SERVER_RENDER, pluginConfig)
|
|
31
|
+
];
|
|
30
32
|
case 1:
|
|
33
|
+
_ref2 = _state.sent(), shellAfter = _ref2.shellAfter, shellBefore = _ref2.shellBefore;
|
|
34
|
+
_state.label = 2;
|
|
35
|
+
case 2:
|
|
31
36
|
_state.trys.push([
|
|
32
|
-
|
|
33
|
-
|
|
37
|
+
2,
|
|
38
|
+
4,
|
|
34
39
|
,
|
|
35
|
-
|
|
40
|
+
6
|
|
36
41
|
]);
|
|
37
42
|
return [
|
|
38
43
|
4,
|
|
@@ -44,7 +49,7 @@ function renderToPipe(rootElement, context, options) {
|
|
|
44
49
|
}
|
|
45
50
|
}))
|
|
46
51
|
];
|
|
47
|
-
case
|
|
52
|
+
case 3:
|
|
48
53
|
readableOriginal = _state.sent();
|
|
49
54
|
reader = readableOriginal.getReader();
|
|
50
55
|
injectableStream = new ReadableStream({
|
|
@@ -54,7 +59,7 @@ function renderToPipe(rootElement, context, options) {
|
|
|
54
59
|
}
|
|
55
60
|
function _push() {
|
|
56
61
|
_push = _async_to_generator(function() {
|
|
57
|
-
var
|
|
62
|
+
var _ref3, done, value, chunk, concatedChunk;
|
|
58
63
|
return _ts_generator(this, function(_state2) {
|
|
59
64
|
switch (_state2.label) {
|
|
60
65
|
case 0:
|
|
@@ -63,7 +68,7 @@ function renderToPipe(rootElement, context, options) {
|
|
|
63
68
|
reader.read()
|
|
64
69
|
];
|
|
65
70
|
case 1:
|
|
66
|
-
|
|
71
|
+
_ref3 = _state2.sent(), done = _ref3.done, value = _ref3.value;
|
|
67
72
|
if (done) {
|
|
68
73
|
controller.close();
|
|
69
74
|
return [
|
|
@@ -98,16 +103,21 @@ function renderToPipe(rootElement, context, options) {
|
|
|
98
103
|
2,
|
|
99
104
|
injectableStream
|
|
100
105
|
];
|
|
101
|
-
case
|
|
106
|
+
case 4:
|
|
102
107
|
err = _state.sent();
|
|
103
108
|
ssrContext === null || ssrContext === void 0 ? void 0 : ssrContext.tracker.trackError(SSRErrors.RENDER_SHELL, err);
|
|
104
|
-
|
|
109
|
+
return [
|
|
110
|
+
4,
|
|
111
|
+
getTemplates(context, RenderLevel.CLIENT_RENDER, pluginConfig)
|
|
112
|
+
];
|
|
113
|
+
case 5:
|
|
114
|
+
_ref1 = _state.sent(), shellAfter1 = _ref1.shellAfter, shellBefore1 = _ref1.shellBefore;
|
|
105
115
|
fallbackHtml = "".concat(shellBefore1).concat(shellAfter1);
|
|
106
116
|
return [
|
|
107
117
|
2,
|
|
108
118
|
fallbackHtml
|
|
109
119
|
];
|
|
110
|
-
case
|
|
120
|
+
case 6:
|
|
111
121
|
return [
|
|
112
122
|
2
|
|
113
123
|
];
|
|
@@ -1,20 +1,46 @@
|
|
|
1
|
+
import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
|
|
1
2
|
import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
|
|
3
|
+
import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
|
|
2
4
|
import { buildShellAfterTemplate } from "./buildTemplate.after";
|
|
3
5
|
import { buildShellBeforeTemplate } from "./bulidTemplate.before";
|
|
4
6
|
var HTML_SEPARATOR = "<!--<?- html ?>-->";
|
|
5
|
-
var getTemplates = function(
|
|
6
|
-
var
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
var getTemplates = function() {
|
|
8
|
+
var _ref = _async_to_generator(function(context, renderLevel, pluginConfig) {
|
|
9
|
+
var ssrContext, _ref2, tmp, beforeAppTemplate, tmp1, afterAppHtmlTemplate, builtBeforeTemplate, builtAfterTemplate;
|
|
10
|
+
return _ts_generator(this, function(_state) {
|
|
11
|
+
switch (_state.label) {
|
|
12
|
+
case 0:
|
|
13
|
+
ssrContext = context.ssrContext;
|
|
14
|
+
_ref2 = _sliced_to_array(ssrContext.template.split(HTML_SEPARATOR) || [], 2), tmp = _ref2[0], beforeAppTemplate = tmp === void 0 ? "" : tmp, tmp1 = _ref2[1], afterAppHtmlTemplate = tmp1 === void 0 ? "" : tmp1;
|
|
15
|
+
return [
|
|
16
|
+
4,
|
|
17
|
+
buildShellBeforeTemplate(beforeAppTemplate, context, pluginConfig)
|
|
18
|
+
];
|
|
19
|
+
case 1:
|
|
20
|
+
builtBeforeTemplate = _state.sent();
|
|
21
|
+
return [
|
|
22
|
+
4,
|
|
23
|
+
buildShellAfterTemplate(afterAppHtmlTemplate, {
|
|
24
|
+
context,
|
|
25
|
+
renderLevel
|
|
26
|
+
})
|
|
27
|
+
];
|
|
28
|
+
case 2:
|
|
29
|
+
builtAfterTemplate = _state.sent();
|
|
30
|
+
return [
|
|
31
|
+
2,
|
|
32
|
+
{
|
|
33
|
+
shellBefore: builtBeforeTemplate,
|
|
34
|
+
shellAfter: builtAfterTemplate
|
|
35
|
+
}
|
|
36
|
+
];
|
|
37
|
+
}
|
|
38
|
+
});
|
|
12
39
|
});
|
|
13
|
-
return {
|
|
14
|
-
|
|
15
|
-
shellAfter: builtAfterTemplate
|
|
40
|
+
return function getTemplates2(context, renderLevel, pluginConfig) {
|
|
41
|
+
return _ref.apply(this, arguments);
|
|
16
42
|
};
|
|
17
|
-
};
|
|
43
|
+
}();
|
|
18
44
|
export {
|
|
19
45
|
getTemplates
|
|
20
46
|
};
|
|
@@ -1,35 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
var _source_split = _sliced_to_array(source.split(searchValue), 2), s1 = _source_split[0], s2 = _source_split[1];
|
|
4
|
-
return s1 + replaceValue + s2;
|
|
5
|
-
}
|
|
1
|
+
import { safeReplace } from "../utils";
|
|
2
|
+
import { HTML_PLACEHOLDER, SSR_DATA_PLACEHOLDER, CHUNK_JS_PLACEHOLDER, CHUNK_CSS_PLACEHOLDER } from "../constants";
|
|
6
3
|
function buildHtml(template, callbacks) {
|
|
7
4
|
return callbacks.reduce(function(tmp, cb) {
|
|
8
5
|
return cb(tmp);
|
|
9
6
|
}, template);
|
|
10
7
|
}
|
|
11
8
|
function createReplaceHtml(html) {
|
|
12
|
-
var HTML_REMARK = "<!--<?- html ?>-->";
|
|
13
9
|
return function(template) {
|
|
14
|
-
return
|
|
10
|
+
return safeReplace(template, HTML_PLACEHOLDER, html);
|
|
15
11
|
};
|
|
16
12
|
}
|
|
17
13
|
function createReplaceSSRDataScript(data) {
|
|
18
|
-
var SSR_DATA_REMARK = "<!--<?- SSRDataScript ?>-->";
|
|
19
14
|
return function(template) {
|
|
20
|
-
return
|
|
15
|
+
return safeReplace(template, SSR_DATA_PLACEHOLDER, data);
|
|
21
16
|
};
|
|
22
17
|
}
|
|
23
18
|
function createReplaceChunkJs(js) {
|
|
24
|
-
var CHUNK_JS_REMARK = "<!--<?- chunksMap.js ?>-->";
|
|
25
19
|
return function(template) {
|
|
26
|
-
return
|
|
20
|
+
return safeReplace(template, CHUNK_JS_PLACEHOLDER, js);
|
|
27
21
|
};
|
|
28
22
|
}
|
|
29
23
|
function createReplaceChunkCss(css) {
|
|
30
|
-
var CHUNK_CSS_REG = "<!--<?- chunksMap.css ?>-->";
|
|
31
24
|
return function(template) {
|
|
32
|
-
return
|
|
25
|
+
return safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
|
|
33
26
|
};
|
|
34
27
|
}
|
|
35
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,7 +136,7 @@ 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),
|
|
@@ -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
|
|
@@ -6,7 +6,7 @@ import { _ as _instanceof } from "@swc/helpers/_/_instanceof";
|
|
|
6
6
|
import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
|
|
7
7
|
import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
|
|
8
8
|
import { ChunkExtractor } from "@loadable/server";
|
|
9
|
-
import { attributesToString } from "../utils";
|
|
9
|
+
import { attributesToString, checkIsNode } from "../utils";
|
|
10
10
|
var extname = function(uri) {
|
|
11
11
|
if (typeof uri !== "string" || !uri.includes(".")) {
|
|
12
12
|
return "";
|
|
@@ -61,10 +61,6 @@ var readAsset = function() {
|
|
|
61
61
|
return _ref.apply(this, arguments);
|
|
62
62
|
};
|
|
63
63
|
}();
|
|
64
|
-
var checkIsNode = function() {
|
|
65
|
-
var _process_release;
|
|
66
|
-
return typeof process !== "undefined" && ((_process_release = process.release) === null || _process_release === void 0 ? void 0 : _process_release.name) === "node";
|
|
67
|
-
};
|
|
68
64
|
var LoadableCollector = /* @__PURE__ */ function() {
|
|
69
65
|
"use strict";
|
|
70
66
|
function LoadableCollector2(options) {
|
|
@@ -184,7 +180,7 @@ var LoadableCollector = /* @__PURE__ */ function() {
|
|
|
184
180
|
var script;
|
|
185
181
|
return _ts_generator(this, function(_state2) {
|
|
186
182
|
script = "<script".concat(attributes, ' src="').concat(chunk.url, '"></script>');
|
|
187
|
-
if (checkIsInline(chunk, enableInlineScripts)
|
|
183
|
+
if (checkIsNode() && checkIsInline(chunk, enableInlineScripts)) {
|
|
188
184
|
return [
|
|
189
185
|
2,
|
|
190
186
|
readAsset(chunk).then(function(content) {
|
|
@@ -244,7 +240,7 @@ var LoadableCollector = /* @__PURE__ */ function() {
|
|
|
244
240
|
var link;
|
|
245
241
|
return _ts_generator(this, function(_state2) {
|
|
246
242
|
link = "<link".concat(atrributes, ' href="').concat(chunk.url, '" rel="stylesheet" />');
|
|
247
|
-
if (checkIsInline(chunk, enableInlineStyles)
|
|
243
|
+
if (checkIsNode() && checkIsInline(chunk, enableInlineStyles)) {
|
|
248
244
|
return [
|
|
249
245
|
2,
|
|
250
246
|
readAsset(chunk).then(function(content) {
|
|
@@ -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,21 @@
|
|
|
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
|
+
}
|
|
13
|
+
function checkIsNode() {
|
|
14
|
+
var _process_release;
|
|
15
|
+
return typeof process !== "undefined" && ((_process_release = process.release) === null || _process_release === void 0 ? void 0 : _process_release.name) === "node";
|
|
16
|
+
}
|
|
11
17
|
export {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
attributesToString
|
|
18
|
+
attributesToString,
|
|
19
|
+
checkIsNode,
|
|
20
|
+
safeReplace
|
|
16
21
|
};
|
|
@@ -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,6 +1,6 @@
|
|
|
1
1
|
const HEAD_REG_EXP = /<head(.|\n)*>(.|\n)*<\/head>/;
|
|
2
2
|
function buildTemplate(template, callbacks) {
|
|
3
|
-
return callbacks.reduce((
|
|
3
|
+
return callbacks.reduce((promise, buildTemplateCb) => promise.then((template2) => buildTemplateCb(template2)), Promise.resolve(template));
|
|
4
4
|
}
|
|
5
5
|
export {
|
|
6
6
|
HEAD_REG_EXP,
|
|
@@ -1,9 +1,27 @@
|
|
|
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 { checkIsNode, safeReplace } from "../utils";
|
|
5
6
|
import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
|
|
6
|
-
|
|
7
|
+
const readAsset = async (chunk) => {
|
|
8
|
+
const fs = await import("fs/promises");
|
|
9
|
+
const path = await import("path");
|
|
10
|
+
const filepath = path.join(__dirname, chunk);
|
|
11
|
+
return fs.readFile(filepath, "utf-8");
|
|
12
|
+
};
|
|
13
|
+
const checkIsInline = (chunk, enableInline) => {
|
|
14
|
+
if (process.env.NODE_ENV === "production") {
|
|
15
|
+
if (enableInline instanceof RegExp) {
|
|
16
|
+
return enableInline.test(chunk);
|
|
17
|
+
} else {
|
|
18
|
+
return Boolean(enableInline);
|
|
19
|
+
}
|
|
20
|
+
} else {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
function getHeadTemplate(beforeEntryTemplate, context, pluginConfig) {
|
|
7
25
|
const callbacks = [
|
|
8
26
|
(headTemplate2) => {
|
|
9
27
|
const helmetData = ReactHelmet.renderStatic();
|
|
@@ -17,9 +35,10 @@ function getHeadTemplate(beforeEntryTemplate, context) {
|
|
|
17
35
|
return "";
|
|
18
36
|
}
|
|
19
37
|
return buildTemplate(headTemplate, callbacks);
|
|
20
|
-
function injectCss(headTemplate2) {
|
|
21
|
-
|
|
22
|
-
|
|
38
|
+
async function injectCss(headTemplate2) {
|
|
39
|
+
const css = await getCssChunks();
|
|
40
|
+
return safeReplace(headTemplate2, CHUNK_CSS_PLACEHOLDER, css);
|
|
41
|
+
async function getCssChunks() {
|
|
23
42
|
const { routeManifest, routerContext, routes } = context;
|
|
24
43
|
if (!routeManifest || !routerContext || !routes) {
|
|
25
44
|
return "";
|
|
@@ -41,15 +60,23 @@ function getHeadTemplate(beforeEntryTemplate, context) {
|
|
|
41
60
|
}
|
|
42
61
|
}
|
|
43
62
|
});
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
63
|
+
const { enableInlineStyles } = pluginConfig;
|
|
64
|
+
const styles = await Promise.all(cssChunks.map(async (chunk) => {
|
|
65
|
+
const link = `<link href="${chunk}" rel="stylesheet" />`;
|
|
66
|
+
if (checkIsNode() && checkIsInline(chunk, enableInlineStyles)) {
|
|
67
|
+
return readAsset(chunk).then((content) => `<style>${content}</style>`).catch((_) => {
|
|
68
|
+
return link;
|
|
69
|
+
});
|
|
70
|
+
} else {
|
|
71
|
+
return link;
|
|
72
|
+
}
|
|
73
|
+
}));
|
|
74
|
+
return `${styles.join("")}`;
|
|
48
75
|
}
|
|
49
76
|
}
|
|
50
77
|
}
|
|
51
|
-
function buildShellBeforeTemplate(beforeAppTemplate, context) {
|
|
52
|
-
const headTemplate = getHeadTemplate(beforeAppTemplate, context);
|
|
78
|
+
async function buildShellBeforeTemplate(beforeAppTemplate, context, pluginConfig) {
|
|
79
|
+
const headTemplate = await getHeadTemplate(beforeAppTemplate, context, pluginConfig);
|
|
53
80
|
return beforeAppTemplate.replace(HEAD_REG_EXP, headTemplate);
|
|
54
81
|
}
|
|
55
82
|
export {
|