@modern-js/runtime 2.34.0 → 2.35.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/router/runtime/index.js +4 -0
- package/dist/cjs/ssr/index.node.js +2 -0
- package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +4 -1
- package/dist/cjs/ssr/serverRender/renderToStream/index.js +11 -2
- package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.js +0 -7
- package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.worker.js +3 -4
- package/dist/cjs/ssr/serverRender/renderToString/entry.js +1 -1
- package/dist/cjs/ssr/serverRender/tracker.js +14 -0
- package/dist/esm/router/runtime/index.js +1 -0
- package/dist/esm/ssr/index.node.js +2 -0
- package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.js +4 -1
- package/dist/esm/ssr/serverRender/renderToStream/index.js +12 -3
- package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.js +0 -7
- package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.worker.js +3 -4
- package/dist/esm/ssr/serverRender/renderToString/entry.js +2 -2
- package/dist/esm/ssr/serverRender/tracker.js +11 -0
- package/dist/esm-node/router/runtime/index.js +1 -0
- package/dist/esm-node/ssr/index.node.js +2 -0
- package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.js +4 -1
- package/dist/esm-node/ssr/serverRender/renderToStream/index.js +11 -2
- package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.js +0 -7
- package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.worker.js +3 -4
- package/dist/esm-node/ssr/serverRender/renderToString/entry.js +2 -2
- package/dist/esm-node/ssr/serverRender/tracker.js +14 -0
- package/dist/types/router/runtime/index.d.ts +1 -0
- package/dist/types/ssr/serverRender/renderToString/entry.d.ts +2 -2
- package/dist/types/ssr/serverRender/renderToString/type.d.ts +0 -10
- package/dist/types/ssr/serverRender/tracker.d.ts +5 -2
- package/dist/types/ssr/serverRender/types.d.ts +12 -1
- package/package.json +9 -9
|
@@ -10,6 +10,9 @@ function _export(target, all) {
|
|
|
10
10
|
});
|
|
11
11
|
}
|
|
12
12
|
_export(exports, {
|
|
13
|
+
renderRoutes: function() {
|
|
14
|
+
return _utils.renderRoutes;
|
|
15
|
+
},
|
|
13
16
|
default: function() {
|
|
14
17
|
return _default;
|
|
15
18
|
},
|
|
@@ -202,6 +205,7 @@ _export(exports, {
|
|
|
202
205
|
const _export_star = require("@swc/helpers/_/_export_star");
|
|
203
206
|
const _router = require("@modern-js/utils/runtime/router");
|
|
204
207
|
const _plugin = require("./plugin");
|
|
208
|
+
const _utils = require("./utils");
|
|
205
209
|
_export_star._(require("./withRouter"), exports);
|
|
206
210
|
const _PrefetchLink = require("./PrefetchLink");
|
|
207
211
|
const _default = _plugin.routerPlugin;
|
|
@@ -21,6 +21,7 @@ const _export_star = require("@swc/helpers/_/_export_star");
|
|
|
21
21
|
const _interop_require_default = require("@swc/helpers/_/_interop_require_default");
|
|
22
22
|
const _utils = require("./utils");
|
|
23
23
|
const _serverRender = /* @__PURE__ */ _interop_require_default._(require("./serverRender"));
|
|
24
|
+
const _tracker = require("./serverRender/tracker");
|
|
24
25
|
_export_star._(require("./react"), exports);
|
|
25
26
|
const ssr = (config = {}) => ({
|
|
26
27
|
name: "@modern-js/plugin-ssr",
|
|
@@ -38,6 +39,7 @@ const ssr = (config = {}) => ({
|
|
|
38
39
|
const { request } = context.ssrContext;
|
|
39
40
|
context.ssrContext.request = (0, _utils.formatServer)(request);
|
|
40
41
|
context.ssrContext.mode = config.mode;
|
|
42
|
+
context.ssrContext.tracker = (0, _tracker.createSSRTracker)(context.ssrContext);
|
|
41
43
|
if (!context.ssrContext.htmlModifiers) {
|
|
42
44
|
context.ssrContext.htmlModifiers = [];
|
|
43
45
|
}
|
|
@@ -21,7 +21,7 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
|
21
21
|
return template.replace("<!--<?- SSRDataScript ?>-->", ssrDataScript);
|
|
22
22
|
function buildSSRDataScript() {
|
|
23
23
|
const { context: { ssrContext, initialData, __i18nData__ }, renderLevel } = options;
|
|
24
|
-
const { request, enableUnsafeCtx, nonce } = ssrContext;
|
|
24
|
+
const { request, enableUnsafeCtx, nonce, tracker } = ssrContext;
|
|
25
25
|
const unsafeContext = {
|
|
26
26
|
headers: request.headers
|
|
27
27
|
};
|
|
@@ -31,6 +31,9 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
|
31
31
|
i18nData: __i18nData__
|
|
32
32
|
},
|
|
33
33
|
context: {
|
|
34
|
+
reporter: {
|
|
35
|
+
sessionId: tracker.sessionId
|
|
36
|
+
},
|
|
34
37
|
request: {
|
|
35
38
|
params: request.params,
|
|
36
39
|
query: request.query,
|
|
@@ -13,6 +13,7 @@ const _react = require("react");
|
|
|
13
13
|
const _runtimenode = require("@modern-js/utils/runtime-node");
|
|
14
14
|
const _time = require("@modern-js/utils/universal/time");
|
|
15
15
|
const _prerender = require("../../react/prerender");
|
|
16
|
+
const _tracker = require("../tracker");
|
|
16
17
|
const _renderToPipe = /* @__PURE__ */ _interop_require_default._(require("./renderToPipe"));
|
|
17
18
|
const render = ({ App, context }) => {
|
|
18
19
|
const { ssrContext } = context;
|
|
@@ -26,17 +27,25 @@ const render = ({ App, context }) => {
|
|
|
26
27
|
ssr: true
|
|
27
28
|
})
|
|
28
29
|
});
|
|
30
|
+
const { tracker } = ssrContext;
|
|
29
31
|
const pipe = (0, _renderToPipe.default)(rootElement, context, {
|
|
30
32
|
onShellReady() {
|
|
31
33
|
const cacheConfig = _prerender.PreRender.config();
|
|
32
34
|
if (cacheConfig) {
|
|
33
35
|
ssrContext.cacheConfig = cacheConfig;
|
|
34
36
|
}
|
|
37
|
+
const cost = end();
|
|
38
|
+
tracker.trackTiming(_tracker.SSRTimings.SSR_RENDER_SHELL, cost);
|
|
35
39
|
},
|
|
36
40
|
onAllReady() {
|
|
37
41
|
const cost = end();
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
tracker.trackTiming(_tracker.SSRTimings.SSR_RENDER_TOTAL, cost);
|
|
43
|
+
},
|
|
44
|
+
onShellError(e) {
|
|
45
|
+
tracker.trackError(_tracker.SSRErrors.RENDER_SHELL, e);
|
|
46
|
+
},
|
|
47
|
+
onError(error) {
|
|
48
|
+
tracker.trackError(_tracker.SSRErrors.RENDER_STREAM, error);
|
|
40
49
|
}
|
|
41
50
|
});
|
|
42
51
|
return pipe;
|
|
@@ -64,17 +64,10 @@ function renderToPipe(rootElement, context, options) {
|
|
|
64
64
|
},
|
|
65
65
|
onShellError(error) {
|
|
66
66
|
var _options_onShellError, _options;
|
|
67
|
-
ssrContext.metrics.emitCounter("app.render.streaming.shell.error", 1);
|
|
68
67
|
const { shellAfter, shellBefore } = (0, _template.getTemplates)(context, _types.RenderLevel.CLIENT_RENDER);
|
|
69
68
|
const fallbackHtml = `${shellBefore}${shellAfter}`;
|
|
70
69
|
resolve(fallbackHtml);
|
|
71
70
|
(_options = options) === null || _options === void 0 ? void 0 : (_options_onShellError = _options.onShellError) === null || _options_onShellError === void 0 ? void 0 : _options_onShellError.call(_options, error);
|
|
72
|
-
},
|
|
73
|
-
onError(error) {
|
|
74
|
-
var _options_onError, _options;
|
|
75
|
-
ssrContext.logger.error("An error occurs during streaming SSR", error);
|
|
76
|
-
ssrContext.metrics.emitCounter("app.render.streaming.error", 1);
|
|
77
|
-
(_options = options) === null || _options === void 0 ? void 0 : (_options_onError = _options.onError) === null || _options_onError === void 0 ? void 0 : _options_onError.call(_options, error);
|
|
78
71
|
}
|
|
79
72
|
});
|
|
80
73
|
});
|
|
@@ -10,6 +10,7 @@ Object.defineProperty(exports, "default", {
|
|
|
10
10
|
});
|
|
11
11
|
const _types = require("../types");
|
|
12
12
|
const _common = require("../../../common");
|
|
13
|
+
const _tracker = require("../tracker");
|
|
13
14
|
const _template = require("./template");
|
|
14
15
|
var ShellChunkStatus;
|
|
15
16
|
(function(ShellChunkStatus2) {
|
|
@@ -33,9 +34,7 @@ function renderToPipe(rootElement, context, options) {
|
|
|
33
34
|
...options,
|
|
34
35
|
nonce: (_ssrContext = ssrContext) === null || _ssrContext === void 0 ? void 0 : _ssrContext.nonce,
|
|
35
36
|
onError(error) {
|
|
36
|
-
var
|
|
37
|
-
(_ssrContext2 = ssrContext) === null || _ssrContext2 === void 0 ? void 0 : _ssrContext2.logger.error("An error occurs during streaming SSR", error);
|
|
38
|
-
(_ssrContext12 = ssrContext) === null || _ssrContext12 === void 0 ? void 0 : _ssrContext12.metrics.emitCounter("app.render.streaming.error", 1);
|
|
37
|
+
var _options_onError, _options;
|
|
39
38
|
(_options = options) === null || _options === void 0 ? void 0 : (_options_onError = _options.onError) === null || _options_onError === void 0 ? void 0 : _options_onError.call(_options, error);
|
|
40
39
|
}
|
|
41
40
|
});
|
|
@@ -68,7 +67,7 @@ function renderToPipe(rootElement, context, options) {
|
|
|
68
67
|
return injectableStream;
|
|
69
68
|
} catch (err) {
|
|
70
69
|
var _ssrContext1;
|
|
71
|
-
(_ssrContext1 = ssrContext) === null || _ssrContext1 === void 0 ? void 0 : _ssrContext1.
|
|
70
|
+
(_ssrContext1 = ssrContext) === null || _ssrContext1 === void 0 ? void 0 : _ssrContext1.tracker.trackError(_tracker.SSRErrors.RENDER_SHELL, err);
|
|
72
71
|
const { shellAfter: shellAfter2, shellBefore: shellBefore2 } = (0, _template.getTemplates)(context, _types.RenderLevel.CLIENT_RENDER);
|
|
73
72
|
const fallbackHtml = `${shellBefore2}${shellAfter2}`;
|
|
74
73
|
return fallbackHtml;
|
|
@@ -152,7 +152,7 @@ class Entry {
|
|
|
152
152
|
this.entryName = entryName;
|
|
153
153
|
this.App = options.App;
|
|
154
154
|
this.pluginConfig = config;
|
|
155
|
-
this.tracker =
|
|
155
|
+
this.tracker = ctx.tracker;
|
|
156
156
|
this.metrics = ctx.metrics;
|
|
157
157
|
this.htmlModifiers = ctx.htmlModifiers;
|
|
158
158
|
this.nonce = nonce;
|
|
@@ -25,11 +25,14 @@ var SSRTimings;
|
|
|
25
25
|
SSRTimings2[SSRTimings2["SSR_RENDER_TOTAL"] = 0] = "SSR_RENDER_TOTAL";
|
|
26
26
|
SSRTimings2[SSRTimings2["SSR_PREFETCH"] = 1] = "SSR_PREFETCH";
|
|
27
27
|
SSRTimings2[SSRTimings2["SSR_RENDER_HTML"] = 2] = "SSR_RENDER_HTML";
|
|
28
|
+
SSRTimings2[SSRTimings2["SSR_RENDER_SHELL"] = 3] = "SSR_RENDER_SHELL";
|
|
28
29
|
})(SSRTimings || (SSRTimings = {}));
|
|
29
30
|
var SSRErrors;
|
|
30
31
|
(function(SSRErrors2) {
|
|
31
32
|
SSRErrors2[SSRErrors2["PREFETCH"] = 0] = "PREFETCH";
|
|
32
33
|
SSRErrors2[SSRErrors2["RENDER_HTML"] = 1] = "RENDER_HTML";
|
|
34
|
+
SSRErrors2[SSRErrors2["RENDER_STREAM"] = 2] = "RENDER_STREAM";
|
|
35
|
+
SSRErrors2[SSRErrors2["RENDER_SHELL"] = 3] = "RENDER_SHELL";
|
|
33
36
|
})(SSRErrors || (SSRErrors = {}));
|
|
34
37
|
const errors = {
|
|
35
38
|
[SSRErrors.PREFETCH]: {
|
|
@@ -41,6 +44,14 @@ const errors = {
|
|
|
41
44
|
reporter: "SSR Error - App Render To HTML",
|
|
42
45
|
logger: "App Render To HTML",
|
|
43
46
|
metrics: "app.render.html.error"
|
|
47
|
+
},
|
|
48
|
+
[SSRErrors.RENDER_STREAM]: {
|
|
49
|
+
reporter: "SSR Error - App Render To Streaming",
|
|
50
|
+
logger: "An error occurs during streaming SSR",
|
|
51
|
+
metrics: "app.render.streaming.error"
|
|
52
|
+
},
|
|
53
|
+
[SSRErrors.RENDER_SHELL]: {
|
|
54
|
+
metrics: "app.render.streaming.shell.error"
|
|
44
55
|
}
|
|
45
56
|
};
|
|
46
57
|
const timings = {
|
|
@@ -61,6 +72,9 @@ const timings = {
|
|
|
61
72
|
serverTiming: "ssr-render-total",
|
|
62
73
|
metrics: "app.render.cost",
|
|
63
74
|
logger: "App Render Total cost = %d ms"
|
|
75
|
+
},
|
|
76
|
+
[SSRTimings.SSR_RENDER_SHELL]: {
|
|
77
|
+
reporter: "ssr-render-shell"
|
|
64
78
|
}
|
|
65
79
|
};
|
|
66
80
|
function createSSRTracker({ reporter, serverTiming, metrics, logger }) {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useRouteLoaderData as useRouteData } from "@modern-js/utils/runtime/router";
|
|
2
2
|
import { routerPlugin } from "./plugin";
|
|
3
|
+
export { renderRoutes } from "./utils";
|
|
3
4
|
export default routerPlugin;
|
|
4
5
|
export { modifyRoutes } from "./plugin";
|
|
5
6
|
export * from "./withRouter";
|
|
@@ -4,6 +4,7 @@ import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
|
|
|
4
4
|
import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
|
|
5
5
|
import { formatServer } from "./utils";
|
|
6
6
|
import render from "./serverRender";
|
|
7
|
+
import { createSSRTracker } from "./serverRender/tracker";
|
|
7
8
|
export var ssr = function() {
|
|
8
9
|
var config = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
9
10
|
return {
|
|
@@ -43,6 +44,7 @@ export var ssr = function() {
|
|
|
43
44
|
var request = context.ssrContext.request;
|
|
44
45
|
context.ssrContext.request = formatServer(request);
|
|
45
46
|
context.ssrContext.mode = config.mode;
|
|
47
|
+
context.ssrContext.tracker = createSSRTracker(context.ssrContext);
|
|
46
48
|
if (!context.ssrContext.htmlModifiers) {
|
|
47
49
|
context.ssrContext.htmlModifiers = [];
|
|
48
50
|
}
|
|
@@ -8,7 +8,7 @@ export function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
|
8
8
|
return template.replace("<!--<?- SSRDataScript ?>-->", ssrDataScript);
|
|
9
9
|
function buildSSRDataScript() {
|
|
10
10
|
var _options_context = options.context, ssrContext = _options_context.ssrContext, initialData = _options_context.initialData, __i18nData__ = _options_context.__i18nData__, renderLevel = options.renderLevel;
|
|
11
|
-
var request = ssrContext.request, enableUnsafeCtx = ssrContext.enableUnsafeCtx, nonce = ssrContext.nonce;
|
|
11
|
+
var request = ssrContext.request, enableUnsafeCtx = ssrContext.enableUnsafeCtx, nonce = ssrContext.nonce, tracker = ssrContext.tracker;
|
|
12
12
|
var unsafeContext = {
|
|
13
13
|
headers: request.headers
|
|
14
14
|
};
|
|
@@ -18,6 +18,9 @@ export function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
|
18
18
|
i18nData: __i18nData__
|
|
19
19
|
},
|
|
20
20
|
context: {
|
|
21
|
+
reporter: {
|
|
22
|
+
sessionId: tracker.sessionId
|
|
23
|
+
},
|
|
21
24
|
request: _object_spread({
|
|
22
25
|
params: request.params,
|
|
23
26
|
query: request.query,
|
|
@@ -4,6 +4,7 @@ import { createElement } from "react";
|
|
|
4
4
|
import { run } from "@modern-js/utils/runtime-node";
|
|
5
5
|
import { time } from "@modern-js/utils/universal/time";
|
|
6
6
|
import { PreRender } from "../../react/prerender";
|
|
7
|
+
import { SSRErrors, SSRTimings } from "../tracker";
|
|
7
8
|
import renderToPipe from "./renderToPipe";
|
|
8
9
|
export var render = function(param) {
|
|
9
10
|
var App = param.App, context = param.context;
|
|
@@ -12,7 +13,7 @@ export var render = function(param) {
|
|
|
12
13
|
throw new Error('The "ssrContext" must not be undefined, but received undefined');
|
|
13
14
|
}
|
|
14
15
|
return run(ssrContext.request.headers, /* @__PURE__ */ _async_to_generator(function() {
|
|
15
|
-
var end, rootElement, pipe;
|
|
16
|
+
var end, rootElement, tracker, pipe;
|
|
16
17
|
return _ts_generator(this, function(_state) {
|
|
17
18
|
end = time();
|
|
18
19
|
rootElement = createElement(App, {
|
|
@@ -20,17 +21,25 @@ export var render = function(param) {
|
|
|
20
21
|
ssr: true
|
|
21
22
|
})
|
|
22
23
|
});
|
|
24
|
+
tracker = ssrContext.tracker;
|
|
23
25
|
pipe = renderToPipe(rootElement, context, {
|
|
24
26
|
onShellReady: function onShellReady() {
|
|
25
27
|
var cacheConfig = PreRender.config();
|
|
26
28
|
if (cacheConfig) {
|
|
27
29
|
ssrContext.cacheConfig = cacheConfig;
|
|
28
30
|
}
|
|
31
|
+
var cost = end();
|
|
32
|
+
tracker.trackTiming(SSRTimings.SSR_RENDER_SHELL, cost);
|
|
29
33
|
},
|
|
30
34
|
onAllReady: function onAllReady() {
|
|
31
35
|
var cost = end();
|
|
32
|
-
|
|
33
|
-
|
|
36
|
+
tracker.trackTiming(SSRTimings.SSR_RENDER_TOTAL, cost);
|
|
37
|
+
},
|
|
38
|
+
onShellError: function onShellError(e) {
|
|
39
|
+
tracker.trackError(SSRErrors.RENDER_SHELL, e);
|
|
40
|
+
},
|
|
41
|
+
onError: function onError(error) {
|
|
42
|
+
tracker.trackError(SSRErrors.RENDER_STREAM, error);
|
|
34
43
|
}
|
|
35
44
|
});
|
|
36
45
|
return [
|
|
@@ -56,17 +56,10 @@ function renderToPipe(rootElement, context, options) {
|
|
|
56
56
|
},
|
|
57
57
|
onShellError: function onShellError(error) {
|
|
58
58
|
var _options_onShellError, _options;
|
|
59
|
-
ssrContext.metrics.emitCounter("app.render.streaming.shell.error", 1);
|
|
60
59
|
var _getTemplates = getTemplates(context, RenderLevel.CLIENT_RENDER), shellAfter = _getTemplates.shellAfter, shellBefore = _getTemplates.shellBefore;
|
|
61
60
|
var fallbackHtml = "".concat(shellBefore).concat(shellAfter);
|
|
62
61
|
resolve(fallbackHtml);
|
|
63
62
|
(_options = options) === null || _options === void 0 ? void 0 : (_options_onShellError = _options.onShellError) === null || _options_onShellError === void 0 ? void 0 : _options_onShellError.call(_options, error);
|
|
64
|
-
},
|
|
65
|
-
onError: function onError(error) {
|
|
66
|
-
var _options_onError, _options;
|
|
67
|
-
ssrContext.logger.error("An error occurs during streaming SSR", error);
|
|
68
|
-
ssrContext.metrics.emitCounter("app.render.streaming.error", 1);
|
|
69
|
-
(_options = options) === null || _options === void 0 ? void 0 : (_options_onError = _options.onError) === null || _options_onError === void 0 ? void 0 : _options_onError.call(_options, error);
|
|
70
63
|
}
|
|
71
64
|
})).pipe;
|
|
72
65
|
});
|
|
@@ -4,6 +4,7 @@ import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
|
|
|
4
4
|
import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
|
|
5
5
|
import { RenderLevel } from "../types";
|
|
6
6
|
import { ESCAPED_SHELL_STREAM_END_MARK } from "../../../common";
|
|
7
|
+
import { SSRErrors } from "../tracker";
|
|
7
8
|
import { getTemplates } from "./template";
|
|
8
9
|
var ShellChunkStatus;
|
|
9
10
|
(function(ShellChunkStatus2) {
|
|
@@ -38,9 +39,7 @@ function renderToPipe(rootElement, context, options) {
|
|
|
38
39
|
renderToReadableStream(rootElement, _object_spread_props(_object_spread({}, options), {
|
|
39
40
|
nonce: (_ssrContext = ssrContext) === null || _ssrContext === void 0 ? void 0 : _ssrContext.nonce,
|
|
40
41
|
onError: function onError(error) {
|
|
41
|
-
var
|
|
42
|
-
(_ssrContext2 = ssrContext) === null || _ssrContext2 === void 0 ? void 0 : _ssrContext2.logger.error("An error occurs during streaming SSR", error);
|
|
43
|
-
(_ssrContext12 = ssrContext) === null || _ssrContext12 === void 0 ? void 0 : _ssrContext12.metrics.emitCounter("app.render.streaming.error", 1);
|
|
42
|
+
var _options_onError, _options;
|
|
44
43
|
(_options = options) === null || _options === void 0 ? void 0 : (_options_onError = _options.onError) === null || _options_onError === void 0 ? void 0 : _options_onError.call(_options, error);
|
|
45
44
|
}
|
|
46
45
|
}))
|
|
@@ -101,7 +100,7 @@ function renderToPipe(rootElement, context, options) {
|
|
|
101
100
|
];
|
|
102
101
|
case 3:
|
|
103
102
|
err = _state.sent();
|
|
104
|
-
(_ssrContext1 = ssrContext) === null || _ssrContext1 === void 0 ? void 0 : _ssrContext1.
|
|
103
|
+
(_ssrContext1 = ssrContext) === null || _ssrContext1 === void 0 ? void 0 : _ssrContext1.tracker.trackError(SSRErrors.RENDER_SHELL, err);
|
|
105
104
|
_getTemplates1 = getTemplates(context, RenderLevel.CLIENT_RENDER), shellAfter1 = _getTemplates1.shellAfter, shellBefore1 = _getTemplates1.shellBefore;
|
|
106
105
|
fallbackHtml = "".concat(shellBefore1).concat(shellAfter1);
|
|
107
106
|
return [
|
|
@@ -14,7 +14,7 @@ import helmetReplace from "../helmet";
|
|
|
14
14
|
import { RenderLevel } from "../types";
|
|
15
15
|
import prefetch from "../../prefetch";
|
|
16
16
|
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID, attributesToString } from "../utils";
|
|
17
|
-
import { SSRErrors, SSRTimings
|
|
17
|
+
import { SSRErrors, SSRTimings } from "../tracker";
|
|
18
18
|
import { createLoadableCollector } from "./loadable";
|
|
19
19
|
import { createRender } from "./render";
|
|
20
20
|
import { createStyledCollector } from "./styledComponent";
|
|
@@ -60,7 +60,7 @@ var Entry = /* @__PURE__ */ function() {
|
|
|
60
60
|
this.entryName = entryName;
|
|
61
61
|
this.App = options.App;
|
|
62
62
|
this.pluginConfig = config;
|
|
63
|
-
this.tracker =
|
|
63
|
+
this.tracker = ctx.tracker;
|
|
64
64
|
this.metrics = ctx.metrics;
|
|
65
65
|
this.htmlModifiers = ctx.htmlModifiers;
|
|
66
66
|
this.nonce = nonce;
|
|
@@ -4,11 +4,14 @@ export var SSRTimings;
|
|
|
4
4
|
SSRTimings2[SSRTimings2["SSR_RENDER_TOTAL"] = 0] = "SSR_RENDER_TOTAL";
|
|
5
5
|
SSRTimings2[SSRTimings2["SSR_PREFETCH"] = 1] = "SSR_PREFETCH";
|
|
6
6
|
SSRTimings2[SSRTimings2["SSR_RENDER_HTML"] = 2] = "SSR_RENDER_HTML";
|
|
7
|
+
SSRTimings2[SSRTimings2["SSR_RENDER_SHELL"] = 3] = "SSR_RENDER_SHELL";
|
|
7
8
|
})(SSRTimings || (SSRTimings = {}));
|
|
8
9
|
export var SSRErrors;
|
|
9
10
|
(function(SSRErrors2) {
|
|
10
11
|
SSRErrors2[SSRErrors2["PREFETCH"] = 0] = "PREFETCH";
|
|
11
12
|
SSRErrors2[SSRErrors2["RENDER_HTML"] = 1] = "RENDER_HTML";
|
|
13
|
+
SSRErrors2[SSRErrors2["RENDER_STREAM"] = 2] = "RENDER_STREAM";
|
|
14
|
+
SSRErrors2[SSRErrors2["RENDER_SHELL"] = 3] = "RENDER_SHELL";
|
|
12
15
|
})(SSRErrors || (SSRErrors = {}));
|
|
13
16
|
var _obj;
|
|
14
17
|
var errors = (_obj = {}, _define_property(_obj, SSRErrors.PREFETCH, {
|
|
@@ -19,6 +22,12 @@ var errors = (_obj = {}, _define_property(_obj, SSRErrors.PREFETCH, {
|
|
|
19
22
|
reporter: "SSR Error - App Render To HTML",
|
|
20
23
|
logger: "App Render To HTML",
|
|
21
24
|
metrics: "app.render.html.error"
|
|
25
|
+
}), _define_property(_obj, SSRErrors.RENDER_STREAM, {
|
|
26
|
+
reporter: "SSR Error - App Render To Streaming",
|
|
27
|
+
logger: "An error occurs during streaming SSR",
|
|
28
|
+
metrics: "app.render.streaming.error"
|
|
29
|
+
}), _define_property(_obj, SSRErrors.RENDER_SHELL, {
|
|
30
|
+
metrics: "app.render.streaming.shell.error"
|
|
22
31
|
}), _obj);
|
|
23
32
|
var _obj1;
|
|
24
33
|
var timings = (_obj1 = {}, _define_property(_obj1, SSRTimings.SSR_PREFETCH, {
|
|
@@ -36,6 +45,8 @@ var timings = (_obj1 = {}, _define_property(_obj1, SSRTimings.SSR_PREFETCH, {
|
|
|
36
45
|
serverTiming: "ssr-render-total",
|
|
37
46
|
metrics: "app.render.cost",
|
|
38
47
|
logger: "App Render Total cost = %d ms"
|
|
48
|
+
}), _define_property(_obj1, SSRTimings.SSR_RENDER_SHELL, {
|
|
49
|
+
reporter: "ssr-render-shell"
|
|
39
50
|
}), _obj1);
|
|
40
51
|
export function createSSRTracker(param) {
|
|
41
52
|
var reporter = param.reporter, serverTiming = param.serverTiming, metrics = param.metrics, logger = param.logger;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useRouteLoaderData as useRouteData } from "@modern-js/utils/runtime/router";
|
|
2
2
|
import { routerPlugin } from "./plugin";
|
|
3
|
+
export { renderRoutes } from "./utils";
|
|
3
4
|
export default routerPlugin;
|
|
4
5
|
export { modifyRoutes } from "./plugin";
|
|
5
6
|
export * from "./withRouter";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { formatServer } from "./utils";
|
|
2
2
|
import render from "./serverRender";
|
|
3
|
+
import { createSSRTracker } from "./serverRender/tracker";
|
|
3
4
|
export const ssr = (config = {}) => ({
|
|
4
5
|
name: "@modern-js/plugin-ssr",
|
|
5
6
|
setup: () => {
|
|
@@ -16,6 +17,7 @@ export const ssr = (config = {}) => ({
|
|
|
16
17
|
const { request } = context.ssrContext;
|
|
17
18
|
context.ssrContext.request = formatServer(request);
|
|
18
19
|
context.ssrContext.mode = config.mode;
|
|
20
|
+
context.ssrContext.tracker = createSSRTracker(context.ssrContext);
|
|
19
21
|
if (!context.ssrContext.htmlModifiers) {
|
|
20
22
|
context.ssrContext.htmlModifiers = [];
|
|
21
23
|
}
|
|
@@ -11,7 +11,7 @@ export function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
|
11
11
|
return template.replace("<!--<?- SSRDataScript ?>-->", ssrDataScript);
|
|
12
12
|
function buildSSRDataScript() {
|
|
13
13
|
const { context: { ssrContext, initialData, __i18nData__ }, renderLevel } = options;
|
|
14
|
-
const { request, enableUnsafeCtx, nonce } = ssrContext;
|
|
14
|
+
const { request, enableUnsafeCtx, nonce, tracker } = ssrContext;
|
|
15
15
|
const unsafeContext = {
|
|
16
16
|
headers: request.headers
|
|
17
17
|
};
|
|
@@ -21,6 +21,9 @@ export function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
|
21
21
|
i18nData: __i18nData__
|
|
22
22
|
},
|
|
23
23
|
context: {
|
|
24
|
+
reporter: {
|
|
25
|
+
sessionId: tracker.sessionId
|
|
26
|
+
},
|
|
24
27
|
request: {
|
|
25
28
|
params: request.params,
|
|
26
29
|
query: request.query,
|
|
@@ -2,6 +2,7 @@ import { createElement } from "react";
|
|
|
2
2
|
import { run } from "@modern-js/utils/runtime-node";
|
|
3
3
|
import { time } from "@modern-js/utils/universal/time";
|
|
4
4
|
import { PreRender } from "../../react/prerender";
|
|
5
|
+
import { SSRErrors, SSRTimings } from "../tracker";
|
|
5
6
|
import renderToPipe from "./renderToPipe";
|
|
6
7
|
export const render = ({ App, context }) => {
|
|
7
8
|
const { ssrContext } = context;
|
|
@@ -15,17 +16,25 @@ export const render = ({ App, context }) => {
|
|
|
15
16
|
ssr: true
|
|
16
17
|
})
|
|
17
18
|
});
|
|
19
|
+
const { tracker } = ssrContext;
|
|
18
20
|
const pipe = renderToPipe(rootElement, context, {
|
|
19
21
|
onShellReady() {
|
|
20
22
|
const cacheConfig = PreRender.config();
|
|
21
23
|
if (cacheConfig) {
|
|
22
24
|
ssrContext.cacheConfig = cacheConfig;
|
|
23
25
|
}
|
|
26
|
+
const cost = end();
|
|
27
|
+
tracker.trackTiming(SSRTimings.SSR_RENDER_SHELL, cost);
|
|
24
28
|
},
|
|
25
29
|
onAllReady() {
|
|
26
30
|
const cost = end();
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
tracker.trackTiming(SSRTimings.SSR_RENDER_TOTAL, cost);
|
|
32
|
+
},
|
|
33
|
+
onShellError(e) {
|
|
34
|
+
tracker.trackError(SSRErrors.RENDER_SHELL, e);
|
|
35
|
+
},
|
|
36
|
+
onError(error) {
|
|
37
|
+
tracker.trackError(SSRErrors.RENDER_STREAM, error);
|
|
29
38
|
}
|
|
30
39
|
});
|
|
31
40
|
return pipe;
|
|
@@ -54,17 +54,10 @@ function renderToPipe(rootElement, context, options) {
|
|
|
54
54
|
},
|
|
55
55
|
onShellError(error) {
|
|
56
56
|
var _options_onShellError, _options;
|
|
57
|
-
ssrContext.metrics.emitCounter("app.render.streaming.shell.error", 1);
|
|
58
57
|
const { shellAfter, shellBefore } = getTemplates(context, RenderLevel.CLIENT_RENDER);
|
|
59
58
|
const fallbackHtml = `${shellBefore}${shellAfter}`;
|
|
60
59
|
resolve(fallbackHtml);
|
|
61
60
|
(_options = options) === null || _options === void 0 ? void 0 : (_options_onShellError = _options.onShellError) === null || _options_onShellError === void 0 ? void 0 : _options_onShellError.call(_options, error);
|
|
62
|
-
},
|
|
63
|
-
onError(error) {
|
|
64
|
-
var _options_onError, _options;
|
|
65
|
-
ssrContext.logger.error("An error occurs during streaming SSR", error);
|
|
66
|
-
ssrContext.metrics.emitCounter("app.render.streaming.error", 1);
|
|
67
|
-
(_options = options) === null || _options === void 0 ? void 0 : (_options_onError = _options.onError) === null || _options_onError === void 0 ? void 0 : _options_onError.call(_options, error);
|
|
68
61
|
}
|
|
69
62
|
});
|
|
70
63
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RenderLevel } from "../types";
|
|
2
2
|
import { ESCAPED_SHELL_STREAM_END_MARK } from "../../../common";
|
|
3
|
+
import { SSRErrors } from "../tracker";
|
|
3
4
|
import { getTemplates } from "./template";
|
|
4
5
|
var ShellChunkStatus;
|
|
5
6
|
(function(ShellChunkStatus2) {
|
|
@@ -23,9 +24,7 @@ function renderToPipe(rootElement, context, options) {
|
|
|
23
24
|
...options,
|
|
24
25
|
nonce: (_ssrContext = ssrContext) === null || _ssrContext === void 0 ? void 0 : _ssrContext.nonce,
|
|
25
26
|
onError(error) {
|
|
26
|
-
var
|
|
27
|
-
(_ssrContext2 = ssrContext) === null || _ssrContext2 === void 0 ? void 0 : _ssrContext2.logger.error("An error occurs during streaming SSR", error);
|
|
28
|
-
(_ssrContext12 = ssrContext) === null || _ssrContext12 === void 0 ? void 0 : _ssrContext12.metrics.emitCounter("app.render.streaming.error", 1);
|
|
27
|
+
var _options_onError, _options;
|
|
29
28
|
(_options = options) === null || _options === void 0 ? void 0 : (_options_onError = _options.onError) === null || _options_onError === void 0 ? void 0 : _options_onError.call(_options, error);
|
|
30
29
|
}
|
|
31
30
|
});
|
|
@@ -58,7 +57,7 @@ function renderToPipe(rootElement, context, options) {
|
|
|
58
57
|
return injectableStream;
|
|
59
58
|
} catch (err) {
|
|
60
59
|
var _ssrContext1;
|
|
61
|
-
(_ssrContext1 = ssrContext) === null || _ssrContext1 === void 0 ? void 0 : _ssrContext1.
|
|
60
|
+
(_ssrContext1 = ssrContext) === null || _ssrContext1 === void 0 ? void 0 : _ssrContext1.tracker.trackError(SSRErrors.RENDER_SHELL, err);
|
|
62
61
|
const { shellAfter: shellAfter2, shellBefore: shellBefore2 } = getTemplates(context, RenderLevel.CLIENT_RENDER);
|
|
63
62
|
const fallbackHtml = `${shellBefore2}${shellAfter2}`;
|
|
64
63
|
return fallbackHtml;
|
|
@@ -8,7 +8,7 @@ import helmetReplace from "../helmet";
|
|
|
8
8
|
import { RenderLevel } from "../types";
|
|
9
9
|
import prefetch from "../../prefetch";
|
|
10
10
|
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID, attributesToString } from "../utils";
|
|
11
|
-
import { SSRErrors, SSRTimings
|
|
11
|
+
import { SSRErrors, SSRTimings } from "../tracker";
|
|
12
12
|
import { createLoadableCollector } from "./loadable";
|
|
13
13
|
import { createRender } from "./render";
|
|
14
14
|
import { createStyledCollector } from "./styledComponent";
|
|
@@ -141,7 +141,7 @@ class Entry {
|
|
|
141
141
|
this.entryName = entryName;
|
|
142
142
|
this.App = options.App;
|
|
143
143
|
this.pluginConfig = config;
|
|
144
|
-
this.tracker =
|
|
144
|
+
this.tracker = ctx.tracker;
|
|
145
145
|
this.metrics = ctx.metrics;
|
|
146
146
|
this.htmlModifiers = ctx.htmlModifiers;
|
|
147
147
|
this.nonce = nonce;
|
|
@@ -3,11 +3,14 @@ export var SSRTimings;
|
|
|
3
3
|
SSRTimings2[SSRTimings2["SSR_RENDER_TOTAL"] = 0] = "SSR_RENDER_TOTAL";
|
|
4
4
|
SSRTimings2[SSRTimings2["SSR_PREFETCH"] = 1] = "SSR_PREFETCH";
|
|
5
5
|
SSRTimings2[SSRTimings2["SSR_RENDER_HTML"] = 2] = "SSR_RENDER_HTML";
|
|
6
|
+
SSRTimings2[SSRTimings2["SSR_RENDER_SHELL"] = 3] = "SSR_RENDER_SHELL";
|
|
6
7
|
})(SSRTimings || (SSRTimings = {}));
|
|
7
8
|
export var SSRErrors;
|
|
8
9
|
(function(SSRErrors2) {
|
|
9
10
|
SSRErrors2[SSRErrors2["PREFETCH"] = 0] = "PREFETCH";
|
|
10
11
|
SSRErrors2[SSRErrors2["RENDER_HTML"] = 1] = "RENDER_HTML";
|
|
12
|
+
SSRErrors2[SSRErrors2["RENDER_STREAM"] = 2] = "RENDER_STREAM";
|
|
13
|
+
SSRErrors2[SSRErrors2["RENDER_SHELL"] = 3] = "RENDER_SHELL";
|
|
11
14
|
})(SSRErrors || (SSRErrors = {}));
|
|
12
15
|
const errors = {
|
|
13
16
|
[SSRErrors.PREFETCH]: {
|
|
@@ -19,6 +22,14 @@ const errors = {
|
|
|
19
22
|
reporter: "SSR Error - App Render To HTML",
|
|
20
23
|
logger: "App Render To HTML",
|
|
21
24
|
metrics: "app.render.html.error"
|
|
25
|
+
},
|
|
26
|
+
[SSRErrors.RENDER_STREAM]: {
|
|
27
|
+
reporter: "SSR Error - App Render To Streaming",
|
|
28
|
+
logger: "An error occurs during streaming SSR",
|
|
29
|
+
metrics: "app.render.streaming.error"
|
|
30
|
+
},
|
|
31
|
+
[SSRErrors.RENDER_SHELL]: {
|
|
32
|
+
metrics: "app.render.streaming.shell.error"
|
|
22
33
|
}
|
|
23
34
|
};
|
|
24
35
|
const timings = {
|
|
@@ -39,6 +50,9 @@ const timings = {
|
|
|
39
50
|
serverTiming: "ssr-render-total",
|
|
40
51
|
metrics: "app.render.cost",
|
|
41
52
|
logger: "App Render Total cost = %d ms"
|
|
53
|
+
},
|
|
54
|
+
[SSRTimings.SSR_RENDER_SHELL]: {
|
|
55
|
+
reporter: "ssr-render-shell"
|
|
42
56
|
}
|
|
43
57
|
};
|
|
44
58
|
export function createSSRTracker({ reporter, serverTiming, metrics, logger }) {
|
|
@@ -2,6 +2,7 @@ import { useRouteLoaderData as useRouteData } from '@modern-js/utils/runtime/rou
|
|
|
2
2
|
import { routerPlugin } from './plugin';
|
|
3
3
|
import type { SingleRouteConfig, RouterConfig } from './types';
|
|
4
4
|
export type { SingleRouteConfig, RouterConfig };
|
|
5
|
+
export { renderRoutes } from './utils';
|
|
5
6
|
export default routerPlugin;
|
|
6
7
|
export { modifyRoutes } from './plugin';
|
|
7
8
|
export * from './withRouter';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { RuntimeContext, ModernSSRReactComponent, SSRPluginConfig } from '../types';
|
|
1
|
+
import { RuntimeContext, ModernSSRReactComponent, SSRPluginConfig, SSRServerContext } from '../types';
|
|
2
2
|
import { SSRTracker } from '../tracker';
|
|
3
|
-
import {
|
|
3
|
+
import { RenderResult } from './type';
|
|
4
4
|
type EntryOptions = {
|
|
5
5
|
ctx: SSRServerContext;
|
|
6
6
|
App: ModernSSRReactComponent;
|
|
@@ -1,18 +1,8 @@
|
|
|
1
|
-
import type { BaseSSRServerContext } from '@modern-js/types';
|
|
2
|
-
import type { BuildHtmlCb } from './buildHtml';
|
|
3
1
|
export declare enum RenderLevel {
|
|
4
2
|
CLIENT_RENDER = 0,
|
|
5
3
|
SERVER_PREFETCH = 1,
|
|
6
4
|
SERVER_RENDER = 2,
|
|
7
5
|
}
|
|
8
|
-
export type SSRServerContext = BaseSSRServerContext & {
|
|
9
|
-
request: BaseSSRServerContext['request'] & {
|
|
10
|
-
userAgent: string;
|
|
11
|
-
cookie: string;
|
|
12
|
-
cookieMap: Record<string, string>;
|
|
13
|
-
};
|
|
14
|
-
htmlModifiers: BuildHtmlCb[];
|
|
15
|
-
};
|
|
16
6
|
export type RenderResult = {
|
|
17
7
|
renderLevel: RenderLevel;
|
|
18
8
|
html?: string;
|
|
@@ -1,20 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { BaseSSRServerContext } from '@modern-js/types';
|
|
2
2
|
export type SSRTracker = ReturnType<typeof createSSRTracker>;
|
|
3
3
|
export declare enum SSRTimings {
|
|
4
4
|
SSR_RENDER_TOTAL = 0,
|
|
5
5
|
SSR_PREFETCH = 1,
|
|
6
6
|
SSR_RENDER_HTML = 2,
|
|
7
|
+
SSR_RENDER_SHELL = 3,
|
|
7
8
|
}
|
|
8
9
|
export declare enum SSRErrors {
|
|
9
10
|
PREFETCH = 0,
|
|
10
11
|
RENDER_HTML = 1,
|
|
12
|
+
RENDER_STREAM = 2,
|
|
13
|
+
RENDER_SHELL = 3,
|
|
11
14
|
}
|
|
12
15
|
export declare function createSSRTracker({
|
|
13
16
|
reporter,
|
|
14
17
|
serverTiming,
|
|
15
18
|
metrics,
|
|
16
19
|
logger
|
|
17
|
-
}:
|
|
20
|
+
}: BaseSSRServerContext): {
|
|
18
21
|
readonly sessionId: string | undefined;
|
|
19
22
|
trackError(key: SSRErrors, e: Error): void;
|
|
20
23
|
trackTiming(key: SSRTimings, cost: number): void;
|
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { ServerUserConfig } from '@modern-js/app-tools';
|
|
3
|
+
import type { BaseSSRServerContext } from '@modern-js/types';
|
|
3
4
|
import type { RuntimeContext } from '../../core';
|
|
4
5
|
import { RenderLevel } from './renderToString/type';
|
|
5
|
-
|
|
6
|
+
import type { BuildHtmlCb } from './renderToString/buildHtml';
|
|
7
|
+
import type { SSRTracker } from './tracker';
|
|
8
|
+
export type SSRServerContext = BaseSSRServerContext & {
|
|
9
|
+
request: BaseSSRServerContext['request'] & {
|
|
10
|
+
userAgent: string;
|
|
11
|
+
cookie: string;
|
|
12
|
+
cookieMap: Record<string, string>;
|
|
13
|
+
};
|
|
14
|
+
htmlModifiers: BuildHtmlCb[];
|
|
15
|
+
tracker: SSRTracker;
|
|
16
|
+
};
|
|
6
17
|
export type ModernSSRReactComponent = React.ComponentType<any>;
|
|
7
18
|
export { RuntimeContext, RenderLevel };
|
|
8
19
|
export type SSRPluginConfig = {
|
package/package.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"modern",
|
|
16
16
|
"modern.js"
|
|
17
17
|
],
|
|
18
|
-
"version": "2.
|
|
18
|
+
"version": "2.35.0",
|
|
19
19
|
"engines": {
|
|
20
20
|
"node": ">=14.17.6"
|
|
21
21
|
},
|
|
@@ -173,9 +173,9 @@
|
|
|
173
173
|
"redux-logger": "^3.0.6",
|
|
174
174
|
"styled-components": "^5.3.1",
|
|
175
175
|
"@swc/helpers": "0.5.1",
|
|
176
|
-
"@modern-js/plugin": "2.
|
|
177
|
-
"@modern-js/types": "2.
|
|
178
|
-
"@modern-js/utils": "2.
|
|
176
|
+
"@modern-js/plugin": "2.35.0",
|
|
177
|
+
"@modern-js/types": "2.35.0",
|
|
178
|
+
"@modern-js/utils": "2.35.0"
|
|
179
179
|
},
|
|
180
180
|
"peerDependencies": {
|
|
181
181
|
"react": ">=17",
|
|
@@ -196,11 +196,11 @@
|
|
|
196
196
|
"ts-jest": "^29.1.0",
|
|
197
197
|
"typescript": "^5",
|
|
198
198
|
"webpack": "^5.88.1",
|
|
199
|
-
"@modern-js/app-tools": "2.
|
|
200
|
-
"@modern-js/core": "2.
|
|
201
|
-
"@modern-js/server-core": "2.
|
|
202
|
-
"@scripts/build": "2.
|
|
203
|
-
"@scripts/jest-config": "2.
|
|
199
|
+
"@modern-js/app-tools": "2.35.0",
|
|
200
|
+
"@modern-js/core": "2.35.0",
|
|
201
|
+
"@modern-js/server-core": "2.35.0",
|
|
202
|
+
"@scripts/build": "2.35.0",
|
|
203
|
+
"@scripts/jest-config": "2.35.0"
|
|
204
204
|
},
|
|
205
205
|
"sideEffects": false,
|
|
206
206
|
"publishConfig": {
|