@modern-js/runtime 2.39.2 → 2.40.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 +0 -23
- package/dist/cjs/router/cli/index.js +0 -13
- package/dist/cjs/ssr/prefetch.js +37 -16
- package/dist/cjs/ssr/serverRender/renderToStream/index.js +2 -2
- package/dist/cjs/ssr/serverRender/renderToString/entry.js +2 -6
- package/dist/cjs/ssr/serverRender/renderToString/index.js +0 -5
- package/dist/cjs/ssr/serverRender/renderToString/loadable.js +14 -9
- package/dist/cjs/ssr/serverRender/tracker.js +30 -25
- package/dist/cjs/state/cli/index.js +0 -13
- package/dist/esm/cli/index.js +1 -23
- package/dist/esm/router/cli/index.js +0 -13
- package/dist/esm/ssr/prefetch.js +51 -18
- package/dist/esm/ssr/serverRender/renderToStream/index.js +2 -2
- package/dist/esm/ssr/serverRender/renderToString/entry.js +11 -17
- package/dist/esm/ssr/serverRender/renderToString/index.js +1 -6
- package/dist/esm/ssr/serverRender/renderToString/loadable.js +68 -63
- package/dist/esm/ssr/serverRender/tracker.js +28 -24
- package/dist/esm/state/cli/index.js +0 -13
- package/dist/esm-node/cli/index.js +1 -24
- package/dist/esm-node/router/cli/index.js +0 -13
- package/dist/esm-node/ssr/prefetch.js +37 -16
- package/dist/esm-node/ssr/serverRender/renderToStream/index.js +2 -2
- package/dist/esm-node/ssr/serverRender/renderToString/entry.js +2 -6
- package/dist/esm-node/ssr/serverRender/renderToString/index.js +0 -5
- package/dist/esm-node/ssr/serverRender/renderToString/loadable.js +14 -9
- package/dist/esm-node/ssr/serverRender/tracker.js +30 -25
- package/dist/esm-node/state/cli/index.js +0 -13
- package/dist/types/ssr/prefetch.d.ts +4 -2
- package/dist/types/ssr/serverRender/tracker.d.ts +9 -8
- package/package.json +10 -10
|
@@ -31,6 +31,36 @@ var checkIsInline = function(chunk, enableInline) {
|
|
|
31
31
|
return false;
|
|
32
32
|
}
|
|
33
33
|
};
|
|
34
|
+
var readAsset = function() {
|
|
35
|
+
var _ref = _async_to_generator(function(chunk) {
|
|
36
|
+
var fs, path, filepath;
|
|
37
|
+
return _ts_generator(this, function(_state) {
|
|
38
|
+
switch (_state.label) {
|
|
39
|
+
case 0:
|
|
40
|
+
return [
|
|
41
|
+
4,
|
|
42
|
+
import("node:fs/promises")
|
|
43
|
+
];
|
|
44
|
+
case 1:
|
|
45
|
+
fs = _state.sent();
|
|
46
|
+
return [
|
|
47
|
+
4,
|
|
48
|
+
import("node:path")
|
|
49
|
+
];
|
|
50
|
+
case 2:
|
|
51
|
+
path = _state.sent();
|
|
52
|
+
filepath = path.resolve(__dirname, chunk.filename);
|
|
53
|
+
return [
|
|
54
|
+
2,
|
|
55
|
+
fs.readFile(filepath, "utf-8")
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
return function readAsset2(chunk) {
|
|
61
|
+
return _ref.apply(this, arguments);
|
|
62
|
+
};
|
|
63
|
+
}();
|
|
34
64
|
var checkIsNode = function() {
|
|
35
65
|
var _process_release;
|
|
36
66
|
return typeof process !== "undefined" && ((_process_release = process.release) === null || _process_release === void 0 ? void 0 : _process_release.name) === "node";
|
|
@@ -151,40 +181,27 @@ var LoadableCollector = /* @__PURE__ */ function() {
|
|
|
151
181
|
return !jsChunkReg.test(template) && !((_this_existsAssets = _this.existsAssets) === null || _this_existsAssets === void 0 ? void 0 : _this_existsAssets.includes(chunk.path));
|
|
152
182
|
}).map(function() {
|
|
153
183
|
var _ref = _async_to_generator(function(chunk) {
|
|
154
|
-
var
|
|
184
|
+
var script;
|
|
155
185
|
return _ts_generator(this, function(_state2) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
2,
|
|
172
|
-
fs.readFile(filepath, "utf-8").then(function(content) {
|
|
173
|
-
return "<script>".concat(content, "</script>");
|
|
174
|
-
}).catch(function(_) {
|
|
175
|
-
return "";
|
|
176
|
-
})
|
|
177
|
-
];
|
|
178
|
-
case 2:
|
|
179
|
-
return [
|
|
180
|
-
2,
|
|
181
|
-
"<script".concat(attributes, ' src="').concat(chunk.url, '"></script>')
|
|
182
|
-
];
|
|
183
|
-
case 3:
|
|
184
|
-
return [
|
|
185
|
-
2
|
|
186
|
-
];
|
|
186
|
+
script = "<script".concat(attributes, ' src="').concat(chunk.url, '"></script>');
|
|
187
|
+
if (checkIsInline(chunk, enableInlineScripts) && checkIsNode()) {
|
|
188
|
+
return [
|
|
189
|
+
2,
|
|
190
|
+
readAsset(chunk).then(function(content) {
|
|
191
|
+
return "<script>".concat(content, "</script>");
|
|
192
|
+
}).catch(function(_) {
|
|
193
|
+
return script;
|
|
194
|
+
})
|
|
195
|
+
];
|
|
196
|
+
} else {
|
|
197
|
+
return [
|
|
198
|
+
2,
|
|
199
|
+
script
|
|
200
|
+
];
|
|
187
201
|
}
|
|
202
|
+
return [
|
|
203
|
+
2
|
|
204
|
+
];
|
|
188
205
|
});
|
|
189
206
|
});
|
|
190
207
|
return function(chunk) {
|
|
@@ -224,39 +241,27 @@ var LoadableCollector = /* @__PURE__ */ function() {
|
|
|
224
241
|
return !cssChunkReg.test(template) && !((_this_existsAssets = _this.existsAssets) === null || _this_existsAssets === void 0 ? void 0 : _this_existsAssets.includes(chunk.path));
|
|
225
242
|
}).map(function() {
|
|
226
243
|
var _ref = _async_to_generator(function(chunk) {
|
|
227
|
-
var
|
|
244
|
+
var link;
|
|
228
245
|
return _ts_generator(this, function(_state2) {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
fs.readFile(chunk.path).then(function(content) {
|
|
245
|
-
return "<style>".concat(content, "</style>");
|
|
246
|
-
}).catch(function(_) {
|
|
247
|
-
return "";
|
|
248
|
-
})
|
|
249
|
-
];
|
|
250
|
-
case 2:
|
|
251
|
-
return [
|
|
252
|
-
2,
|
|
253
|
-
"<link".concat(atrributes, ' href="').concat(chunk.url, '" rel="stylesheet" />')
|
|
254
|
-
];
|
|
255
|
-
case 3:
|
|
256
|
-
return [
|
|
257
|
-
2
|
|
258
|
-
];
|
|
246
|
+
link = "<link".concat(atrributes, ' href="').concat(chunk.url, '" rel="stylesheet" />');
|
|
247
|
+
if (checkIsInline(chunk, enableInlineStyles) && checkIsNode()) {
|
|
248
|
+
return [
|
|
249
|
+
2,
|
|
250
|
+
readAsset(chunk).then(function(content) {
|
|
251
|
+
return "<style>".concat(content, "</style>");
|
|
252
|
+
}).catch(function(_) {
|
|
253
|
+
return link;
|
|
254
|
+
})
|
|
255
|
+
];
|
|
256
|
+
} else {
|
|
257
|
+
return [
|
|
258
|
+
2,
|
|
259
|
+
link
|
|
260
|
+
];
|
|
259
261
|
}
|
|
262
|
+
return [
|
|
263
|
+
2
|
|
264
|
+
];
|
|
260
265
|
});
|
|
261
266
|
});
|
|
262
267
|
return function(chunk) {
|
|
@@ -1,23 +1,28 @@
|
|
|
1
1
|
import { _ as _define_property } from "@swc/helpers/_/_define_property";
|
|
2
2
|
var SSRTimings;
|
|
3
3
|
(function(SSRTimings2) {
|
|
4
|
-
SSRTimings2[SSRTimings2["
|
|
5
|
-
SSRTimings2[SSRTimings2["
|
|
6
|
-
SSRTimings2[SSRTimings2["
|
|
7
|
-
SSRTimings2[SSRTimings2["
|
|
4
|
+
SSRTimings2[SSRTimings2["PRERENDER"] = 0] = "PRERENDER";
|
|
5
|
+
SSRTimings2[SSRTimings2["RENDER_HTML"] = 1] = "RENDER_HTML";
|
|
6
|
+
SSRTimings2[SSRTimings2["RENDER_SHELL"] = 2] = "RENDER_SHELL";
|
|
7
|
+
SSRTimings2[SSRTimings2["USE_LOADER"] = 3] = "USE_LOADER";
|
|
8
8
|
})(SSRTimings || (SSRTimings = {}));
|
|
9
9
|
var SSRErrors;
|
|
10
10
|
(function(SSRErrors2) {
|
|
11
|
-
SSRErrors2[SSRErrors2["
|
|
12
|
-
SSRErrors2[SSRErrors2["
|
|
13
|
-
SSRErrors2[SSRErrors2["
|
|
14
|
-
SSRErrors2[SSRErrors2["
|
|
11
|
+
SSRErrors2[SSRErrors2["PRERENDER"] = 0] = "PRERENDER";
|
|
12
|
+
SSRErrors2[SSRErrors2["USE_LOADER"] = 1] = "USE_LOADER";
|
|
13
|
+
SSRErrors2[SSRErrors2["RENDER_HTML"] = 2] = "RENDER_HTML";
|
|
14
|
+
SSRErrors2[SSRErrors2["RENDER_STREAM"] = 3] = "RENDER_STREAM";
|
|
15
|
+
SSRErrors2[SSRErrors2["RENDER_SHELL"] = 4] = "RENDER_SHELL";
|
|
15
16
|
})(SSRErrors || (SSRErrors = {}));
|
|
16
17
|
var _obj;
|
|
17
|
-
var errors = (_obj = {}, _define_property(_obj, SSRErrors.
|
|
18
|
-
reporter: "SSR Error - App
|
|
19
|
-
logger: "App
|
|
20
|
-
metrics: "app.
|
|
18
|
+
var errors = (_obj = {}, _define_property(_obj, SSRErrors.PRERENDER, {
|
|
19
|
+
reporter: "SSR Error - App Prerender",
|
|
20
|
+
logger: "App Prerender",
|
|
21
|
+
metrics: "app.prerender.error"
|
|
22
|
+
}), _define_property(_obj, SSRErrors.USE_LOADER, {
|
|
23
|
+
reporter: "SSR Error - App run useLoader",
|
|
24
|
+
logger: "App run useLoader",
|
|
25
|
+
metrics: "app.useloader.error"
|
|
21
26
|
}), _define_property(_obj, SSRErrors.RENDER_HTML, {
|
|
22
27
|
reporter: "SSR Error - App Render To HTML",
|
|
23
28
|
logger: "App Render To HTML",
|
|
@@ -30,23 +35,22 @@ var errors = (_obj = {}, _define_property(_obj, SSRErrors.PREFETCH, {
|
|
|
30
35
|
metrics: "app.render.streaming.shell.error"
|
|
31
36
|
}), _obj);
|
|
32
37
|
var _obj1;
|
|
33
|
-
var timings = (_obj1 = {}, _define_property(_obj1, SSRTimings.
|
|
34
|
-
reporter: "ssr-
|
|
35
|
-
serverTiming: "ssr-
|
|
36
|
-
metrics: "app.
|
|
37
|
-
logger: "App
|
|
38
|
-
}), _define_property(_obj1, SSRTimings.
|
|
38
|
+
var timings = (_obj1 = {}, _define_property(_obj1, SSRTimings.PRERENDER, {
|
|
39
|
+
reporter: "ssr-prerender",
|
|
40
|
+
serverTiming: "ssr-prerender",
|
|
41
|
+
metrics: "app.prerender.cost",
|
|
42
|
+
logger: "App Prerender cost = %d ms"
|
|
43
|
+
}), _define_property(_obj1, SSRTimings.RENDER_HTML, {
|
|
39
44
|
reporter: "ssr-render-html",
|
|
40
45
|
serverTiming: "ssr-render-html",
|
|
41
46
|
metrics: "app.render.html.cost",
|
|
42
47
|
logger: "App Render To HTML cost = %d ms"
|
|
43
|
-
}), _define_property(_obj1, SSRTimings.
|
|
44
|
-
reporter: "ssr-render-total",
|
|
45
|
-
serverTiming: "ssr-render-total",
|
|
46
|
-
metrics: "app.render.cost",
|
|
47
|
-
logger: "App Render Total cost = %d ms"
|
|
48
|
-
}), _define_property(_obj1, SSRTimings.SSR_RENDER_SHELL, {
|
|
48
|
+
}), _define_property(_obj1, SSRTimings.RENDER_SHELL, {
|
|
49
49
|
reporter: "ssr-render-shell"
|
|
50
|
+
}), _define_property(_obj1, SSRTimings.USE_LOADER, {
|
|
51
|
+
reporter: "use-loader",
|
|
52
|
+
serverTiming: "use-loader",
|
|
53
|
+
logger: "App run useLoader cost = %d ms"
|
|
50
54
|
}), _obj1);
|
|
51
55
|
function createSSRTracker(param) {
|
|
52
56
|
var reporter = param.reporter, serverTiming = param.serverTiming, metrics = param.metrics, logger = param.logger;
|
|
@@ -58,19 +58,6 @@ var statePlugin = function() {
|
|
|
58
58
|
plugins
|
|
59
59
|
};
|
|
60
60
|
},
|
|
61
|
-
validateSchema: function validateSchema() {
|
|
62
|
-
return [
|
|
63
|
-
{
|
|
64
|
-
target: "runtime.state",
|
|
65
|
-
schema: {
|
|
66
|
-
type: [
|
|
67
|
-
"boolean",
|
|
68
|
-
"object"
|
|
69
|
-
]
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
];
|
|
73
|
-
},
|
|
74
61
|
addRuntimeExports: function addRuntimeExports() {
|
|
75
62
|
pluginsExportsUtils.addExport("export { default as state } from '@modern-js/runtime/model'");
|
|
76
63
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from "path";
|
|
2
|
-
import { isReact18, cleanRequireCache
|
|
2
|
+
import { isReact18, cleanRequireCache } from "@modern-js/utils";
|
|
3
3
|
import { statePlugin } from "../state/cli";
|
|
4
4
|
import { ssrPlugin } from "../ssr/cli";
|
|
5
5
|
import { routerPlugin } from "../router/cli";
|
|
@@ -51,29 +51,6 @@ const runtimePlugin = () => ({
|
|
|
51
51
|
}
|
|
52
52
|
};
|
|
53
53
|
},
|
|
54
|
-
validateSchema() {
|
|
55
|
-
return [
|
|
56
|
-
{
|
|
57
|
-
target: "runtime",
|
|
58
|
-
schema: {
|
|
59
|
-
type: "object",
|
|
60
|
-
additionalProperties: false
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
target: "runtimeByEntries",
|
|
65
|
-
schema: {
|
|
66
|
-
type: "object",
|
|
67
|
-
patternProperties: {
|
|
68
|
-
[ENTRY_NAME_PATTERN]: {
|
|
69
|
-
type: "object"
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
additionalProperties: false
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
];
|
|
76
|
-
},
|
|
77
54
|
async beforeRestart() {
|
|
78
55
|
cleanRequireCache([
|
|
79
56
|
require.resolve("../state/cli"),
|
|
@@ -29,19 +29,6 @@ const routerPlugin = () => ({
|
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
31
|
},
|
|
32
|
-
validateSchema() {
|
|
33
|
-
return [
|
|
34
|
-
{
|
|
35
|
-
target: "runtime.router",
|
|
36
|
-
schema: {
|
|
37
|
-
type: [
|
|
38
|
-
"boolean",
|
|
39
|
-
"object"
|
|
40
|
-
]
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
];
|
|
44
|
-
},
|
|
45
32
|
modifyEntryImports({ entrypoint, imports }) {
|
|
46
33
|
const { entryName, isMainEntry, fileSystemRoutes } = entrypoint;
|
|
47
34
|
const userConfig = api.useResolvedConfigContext();
|
|
@@ -2,25 +2,36 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { renderToStaticMarkup } from "react-dom/server";
|
|
3
3
|
import { run } from "@modern-js/runtime-utils/node";
|
|
4
4
|
import { ChunkExtractor } from "@loadable/server";
|
|
5
|
-
|
|
5
|
+
import { time } from "@modern-js/runtime-utils/time";
|
|
6
|
+
import { SSRTimings, SSRErrors } from "./serverRender/tracker";
|
|
7
|
+
const prefetch = async (App, context, config, tracker) => run(context.ssrContext.request.headers, async () => {
|
|
6
8
|
var _context_store;
|
|
7
9
|
const { ssrContext } = context;
|
|
8
10
|
const { loadableStats } = ssrContext;
|
|
9
11
|
if (!config.disablePrerender) {
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
12
|
+
try {
|
|
13
|
+
const end = time();
|
|
14
|
+
if (loadableStats) {
|
|
15
|
+
const extractor = new ChunkExtractor({
|
|
16
|
+
stats: loadableStats,
|
|
17
|
+
entrypoints: [
|
|
18
|
+
ssrContext.entryName
|
|
19
|
+
].filter(Boolean)
|
|
20
|
+
});
|
|
21
|
+
renderToStaticMarkup(extractor.collectChunks(/* @__PURE__ */ _jsx(App, {
|
|
22
|
+
context
|
|
23
|
+
})));
|
|
24
|
+
} else {
|
|
25
|
+
renderToStaticMarkup(/* @__PURE__ */ _jsx(App, {
|
|
26
|
+
context
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
const cost = end();
|
|
30
|
+
tracker.trackTiming(SSRTimings.PRERENDER, cost);
|
|
31
|
+
} catch (e) {
|
|
32
|
+
const error = e;
|
|
33
|
+
tracker.trackError(SSRErrors.PRERENDER, error);
|
|
34
|
+
throw e;
|
|
24
35
|
}
|
|
25
36
|
}
|
|
26
37
|
if (!context.loaderManager.hasPendingLoaders()) {
|
|
@@ -29,7 +40,17 @@ const prefetch = async (App, context, config) => run(context.ssrContext.request.
|
|
|
29
40
|
i18nData: context.__i18nData__
|
|
30
41
|
};
|
|
31
42
|
}
|
|
32
|
-
|
|
43
|
+
let loadersData = {};
|
|
44
|
+
try {
|
|
45
|
+
const end = time();
|
|
46
|
+
loadersData = await context.loaderManager.awaitPendingLoaders();
|
|
47
|
+
const cost = end();
|
|
48
|
+
tracker.trackTiming(SSRTimings.USE_LOADER, cost);
|
|
49
|
+
} catch (e) {
|
|
50
|
+
const error = e;
|
|
51
|
+
tracker.trackError(SSRErrors.USE_LOADER, error);
|
|
52
|
+
throw e;
|
|
53
|
+
}
|
|
33
54
|
Object.keys(loadersData).forEach((id) => {
|
|
34
55
|
const data = loadersData[id];
|
|
35
56
|
if (data._error) {
|
|
@@ -24,11 +24,11 @@ const render = ({ App, context }) => {
|
|
|
24
24
|
ssrContext.cacheConfig = cacheConfig;
|
|
25
25
|
}
|
|
26
26
|
const cost = end();
|
|
27
|
-
tracker.trackTiming(SSRTimings.
|
|
27
|
+
tracker.trackTiming(SSRTimings.RENDER_SHELL, cost);
|
|
28
28
|
},
|
|
29
29
|
onAllReady() {
|
|
30
30
|
const cost = end();
|
|
31
|
-
tracker.trackTiming(SSRTimings.
|
|
31
|
+
tracker.trackTiming(SSRTimings.RENDER_HTML, cost);
|
|
32
32
|
},
|
|
33
33
|
onShellError(e) {
|
|
34
34
|
tracker.trackError(SSRErrors.RENDER_SHELL, e);
|
|
@@ -72,15 +72,11 @@ class Entry {
|
|
|
72
72
|
}
|
|
73
73
|
async prefetch(context) {
|
|
74
74
|
let prefetchData;
|
|
75
|
-
const end = time();
|
|
76
75
|
try {
|
|
77
|
-
prefetchData = await prefetch(this.App, context, this.pluginConfig);
|
|
76
|
+
prefetchData = await prefetch(this.App, context, this.pluginConfig, this.tracker);
|
|
78
77
|
this.result.renderLevel = RenderLevel.SERVER_PREFETCH;
|
|
79
|
-
const prefetchCost = end();
|
|
80
|
-
this.tracker.trackTiming(SSRTimings.SSR_PREFETCH, prefetchCost);
|
|
81
78
|
} catch (e) {
|
|
82
79
|
this.result.renderLevel = RenderLevel.CLIENT_RENDER;
|
|
83
|
-
this.tracker.trackError(SSRErrors.PREFETCH, e);
|
|
84
80
|
}
|
|
85
81
|
return prefetchData || {};
|
|
86
82
|
}
|
|
@@ -104,7 +100,7 @@ class Entry {
|
|
|
104
100
|
routeManifest: this.routeManifest
|
|
105
101
|
})).finish();
|
|
106
102
|
const cost = end();
|
|
107
|
-
this.tracker.trackTiming(SSRTimings.
|
|
103
|
+
this.tracker.trackTiming(SSRTimings.RENDER_HTML, cost);
|
|
108
104
|
this.result.renderLevel = RenderLevel.SERVER_RENDER;
|
|
109
105
|
} catch (e) {
|
|
110
106
|
this.tracker.trackError(SSRErrors.RENDER_HTML, e);
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { run } from "@modern-js/runtime-utils/node";
|
|
2
|
-
import { time } from "@modern-js/runtime-utils/time";
|
|
3
2
|
import { PreRender } from "../../react/prerender";
|
|
4
|
-
import { SSRTimings } from "../tracker";
|
|
5
3
|
import SSREntry from "./entry";
|
|
6
4
|
const render = ({ App, context, config }) => {
|
|
7
5
|
const ssrContext = context.ssrContext;
|
|
@@ -12,10 +10,7 @@ const render = ({ App, context, config }) => {
|
|
|
12
10
|
config
|
|
13
11
|
});
|
|
14
12
|
entry.metrics.emitCounter("app.visit.count", 1);
|
|
15
|
-
const end = time();
|
|
16
13
|
const html = await entry.renderToHtml(context);
|
|
17
|
-
const cost = end();
|
|
18
|
-
entry.tracker.trackTiming(SSRTimings.SSR_RENDER_TOTAL, cost);
|
|
19
14
|
const cacheConfig = PreRender.config();
|
|
20
15
|
if (cacheConfig) {
|
|
21
16
|
context.ssrContext.cacheConfig = cacheConfig;
|
|
@@ -19,6 +19,12 @@ const checkIsInline = (chunk, enableInline) => {
|
|
|
19
19
|
return false;
|
|
20
20
|
}
|
|
21
21
|
};
|
|
22
|
+
const readAsset = async (chunk) => {
|
|
23
|
+
const fs = await import("node:fs/promises");
|
|
24
|
+
const path = await import("node:path");
|
|
25
|
+
const filepath = path.resolve(__dirname, chunk.filename);
|
|
26
|
+
return fs.readFile(filepath, "utf-8");
|
|
27
|
+
};
|
|
22
28
|
const checkIsNode = () => {
|
|
23
29
|
var _process_release;
|
|
24
30
|
return typeof process !== "undefined" && ((_process_release = process.release) === null || _process_release === void 0 ? void 0 : _process_release.name) === "node";
|
|
@@ -81,14 +87,13 @@ class LoadableCollector {
|
|
|
81
87
|
const jsChunkReg = new RegExp(`<script .*src="${chunk.url}".*>`);
|
|
82
88
|
return !jsChunkReg.test(template) && !((_this_existsAssets = this.existsAssets) === null || _this_existsAssets === void 0 ? void 0 : _this_existsAssets.includes(chunk.path));
|
|
83
89
|
}).map(async (chunk) => {
|
|
90
|
+
const script = `<script${attributes} src="${chunk.url}"></script>`;
|
|
84
91
|
if (checkIsInline(chunk, enableInlineScripts) && checkIsNode()) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
return fs.readFile(filepath, "utf-8").then((content) => `<script>${content}</script>`).catch((_) => {
|
|
88
|
-
return "";
|
|
92
|
+
return readAsset(chunk).then((content) => `<script>${content}</script>`).catch((_) => {
|
|
93
|
+
return script;
|
|
89
94
|
});
|
|
90
95
|
} else {
|
|
91
|
-
return
|
|
96
|
+
return script;
|
|
92
97
|
}
|
|
93
98
|
}));
|
|
94
99
|
chunksMap.js += scripts.filter((script) => Boolean(script)).join("");
|
|
@@ -101,13 +106,13 @@ class LoadableCollector {
|
|
|
101
106
|
const cssChunkReg = new RegExp(`<link .*href="${chunk.url}".*>`);
|
|
102
107
|
return !cssChunkReg.test(template) && !((_this_existsAssets = this.existsAssets) === null || _this_existsAssets === void 0 ? void 0 : _this_existsAssets.includes(chunk.path));
|
|
103
108
|
}).map(async (chunk) => {
|
|
109
|
+
const link = `<link${atrributes} href="${chunk.url}" rel="stylesheet" />`;
|
|
104
110
|
if (checkIsInline(chunk, enableInlineStyles) && checkIsNode()) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
return "";
|
|
111
|
+
return readAsset(chunk).then((content) => `<style>${content}</style>`).catch((_) => {
|
|
112
|
+
return link;
|
|
108
113
|
});
|
|
109
114
|
} else {
|
|
110
|
-
return
|
|
115
|
+
return link;
|
|
111
116
|
}
|
|
112
117
|
}));
|
|
113
118
|
chunksMap.css += css.filter((css2) => Boolean(css2)).join("");
|
|
@@ -1,22 +1,28 @@
|
|
|
1
1
|
var SSRTimings;
|
|
2
2
|
(function(SSRTimings2) {
|
|
3
|
-
SSRTimings2[SSRTimings2["
|
|
4
|
-
SSRTimings2[SSRTimings2["
|
|
5
|
-
SSRTimings2[SSRTimings2["
|
|
6
|
-
SSRTimings2[SSRTimings2["
|
|
3
|
+
SSRTimings2[SSRTimings2["PRERENDER"] = 0] = "PRERENDER";
|
|
4
|
+
SSRTimings2[SSRTimings2["RENDER_HTML"] = 1] = "RENDER_HTML";
|
|
5
|
+
SSRTimings2[SSRTimings2["RENDER_SHELL"] = 2] = "RENDER_SHELL";
|
|
6
|
+
SSRTimings2[SSRTimings2["USE_LOADER"] = 3] = "USE_LOADER";
|
|
7
7
|
})(SSRTimings || (SSRTimings = {}));
|
|
8
8
|
var SSRErrors;
|
|
9
9
|
(function(SSRErrors2) {
|
|
10
|
-
SSRErrors2[SSRErrors2["
|
|
11
|
-
SSRErrors2[SSRErrors2["
|
|
12
|
-
SSRErrors2[SSRErrors2["
|
|
13
|
-
SSRErrors2[SSRErrors2["
|
|
10
|
+
SSRErrors2[SSRErrors2["PRERENDER"] = 0] = "PRERENDER";
|
|
11
|
+
SSRErrors2[SSRErrors2["USE_LOADER"] = 1] = "USE_LOADER";
|
|
12
|
+
SSRErrors2[SSRErrors2["RENDER_HTML"] = 2] = "RENDER_HTML";
|
|
13
|
+
SSRErrors2[SSRErrors2["RENDER_STREAM"] = 3] = "RENDER_STREAM";
|
|
14
|
+
SSRErrors2[SSRErrors2["RENDER_SHELL"] = 4] = "RENDER_SHELL";
|
|
14
15
|
})(SSRErrors || (SSRErrors = {}));
|
|
15
16
|
const errors = {
|
|
16
|
-
[SSRErrors.
|
|
17
|
-
reporter: "SSR Error - App
|
|
18
|
-
logger: "App
|
|
19
|
-
metrics: "app.
|
|
17
|
+
[SSRErrors.PRERENDER]: {
|
|
18
|
+
reporter: "SSR Error - App Prerender",
|
|
19
|
+
logger: "App Prerender",
|
|
20
|
+
metrics: "app.prerender.error"
|
|
21
|
+
},
|
|
22
|
+
[SSRErrors.USE_LOADER]: {
|
|
23
|
+
reporter: "SSR Error - App run useLoader",
|
|
24
|
+
logger: "App run useLoader",
|
|
25
|
+
metrics: "app.useloader.error"
|
|
20
26
|
},
|
|
21
27
|
[SSRErrors.RENDER_HTML]: {
|
|
22
28
|
reporter: "SSR Error - App Render To HTML",
|
|
@@ -33,26 +39,25 @@ const errors = {
|
|
|
33
39
|
}
|
|
34
40
|
};
|
|
35
41
|
const timings = {
|
|
36
|
-
[SSRTimings.
|
|
37
|
-
reporter: "ssr-
|
|
38
|
-
serverTiming: "ssr-
|
|
39
|
-
metrics: "app.
|
|
40
|
-
logger: "App
|
|
42
|
+
[SSRTimings.PRERENDER]: {
|
|
43
|
+
reporter: "ssr-prerender",
|
|
44
|
+
serverTiming: "ssr-prerender",
|
|
45
|
+
metrics: "app.prerender.cost",
|
|
46
|
+
logger: "App Prerender cost = %d ms"
|
|
41
47
|
},
|
|
42
|
-
[SSRTimings.
|
|
48
|
+
[SSRTimings.RENDER_HTML]: {
|
|
43
49
|
reporter: "ssr-render-html",
|
|
44
50
|
serverTiming: "ssr-render-html",
|
|
45
51
|
metrics: "app.render.html.cost",
|
|
46
52
|
logger: "App Render To HTML cost = %d ms"
|
|
47
53
|
},
|
|
48
|
-
[SSRTimings.
|
|
49
|
-
reporter: "ssr-render-total",
|
|
50
|
-
serverTiming: "ssr-render-total",
|
|
51
|
-
metrics: "app.render.cost",
|
|
52
|
-
logger: "App Render Total cost = %d ms"
|
|
53
|
-
},
|
|
54
|
-
[SSRTimings.SSR_RENDER_SHELL]: {
|
|
54
|
+
[SSRTimings.RENDER_SHELL]: {
|
|
55
55
|
reporter: "ssr-render-shell"
|
|
56
|
+
},
|
|
57
|
+
[SSRTimings.USE_LOADER]: {
|
|
58
|
+
reporter: "use-loader",
|
|
59
|
+
serverTiming: "use-loader",
|
|
60
|
+
logger: "App run useLoader cost = %d ms"
|
|
56
61
|
}
|
|
57
62
|
};
|
|
58
63
|
function createSSRTracker({ reporter, serverTiming, metrics, logger }) {
|
|
@@ -55,19 +55,6 @@ const statePlugin = () => ({
|
|
|
55
55
|
plugins
|
|
56
56
|
};
|
|
57
57
|
},
|
|
58
|
-
validateSchema() {
|
|
59
|
-
return [
|
|
60
|
-
{
|
|
61
|
-
target: "runtime.state",
|
|
62
|
-
schema: {
|
|
63
|
-
type: [
|
|
64
|
-
"boolean",
|
|
65
|
-
"object"
|
|
66
|
-
]
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
];
|
|
70
|
-
},
|
|
71
58
|
addRuntimeExports() {
|
|
72
59
|
pluginsExportsUtils.addExport(`export { default as state } from '@modern-js/runtime/model'`);
|
|
73
60
|
}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { RuntimeContext } from '../core';
|
|
2
|
+
import { LoaderResult } from '../core/loader/loaderManager';
|
|
2
3
|
import { SSRPluginConfig } from './serverRender/types';
|
|
3
|
-
|
|
4
|
+
import { SSRTracker } from './serverRender/tracker';
|
|
5
|
+
declare const prefetch: (App: React.ComponentType<any>, context: RuntimeContext, config: SSRPluginConfig, tracker: SSRTracker) => Promise<{
|
|
4
6
|
initialData: Record<string, unknown> | undefined;
|
|
5
7
|
i18nData: any;
|
|
6
8
|
loadersData?: undefined;
|
|
7
9
|
storeState?: undefined;
|
|
8
10
|
} | {
|
|
9
|
-
loadersData: Record<string,
|
|
11
|
+
loadersData: Record<string, LoaderResult>;
|
|
10
12
|
initialData: Record<string, unknown> | undefined;
|
|
11
13
|
i18nData: any;
|
|
12
14
|
storeState: any;
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import type { BaseSSRServerContext } from '@modern-js/types';
|
|
2
2
|
export type SSRTracker = ReturnType<typeof createSSRTracker>;
|
|
3
3
|
export declare enum SSRTimings {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
PRERENDER = 0,
|
|
5
|
+
RENDER_HTML = 1,
|
|
6
|
+
RENDER_SHELL = 2,
|
|
7
|
+
USE_LOADER = 3,
|
|
8
8
|
}
|
|
9
9
|
export declare enum SSRErrors {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
PRERENDER = 0,
|
|
11
|
+
USE_LOADER = 1,
|
|
12
|
+
RENDER_HTML = 2,
|
|
13
|
+
RENDER_STREAM = 3,
|
|
14
|
+
RENDER_SHELL = 4,
|
|
14
15
|
}
|
|
15
16
|
export declare function createSSRTracker({
|
|
16
17
|
reporter,
|