@modern-js/runtime 2.28.0 → 2.30.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.
Files changed (43) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/cjs/document/cli/index.js +1 -0
  3. package/dist/cjs/document/constants.js +0 -5
  4. package/dist/cjs/router/runtime/plugin.js +6 -0
  5. package/dist/cjs/ssr/cli/index.js +19 -13
  6. package/dist/cjs/ssr/serverRender/constants.js +16 -0
  7. package/dist/cjs/ssr/serverRender/renderToStream/index.js +1 -1
  8. package/dist/cjs/ssr/serverRender/renderToString/entry.js +13 -13
  9. package/dist/cjs/ssr/serverRender/renderToString/index.js +3 -3
  10. package/dist/cjs/ssr/serverRender/tracker.js +86 -0
  11. package/dist/esm/document/cli/index.js +1 -0
  12. package/dist/esm/document/constants.js +1 -2
  13. package/dist/esm/router/runtime/plugin.js +6 -0
  14. package/dist/esm/ssr/cli/index.js +19 -13
  15. package/dist/esm/ssr/serverRender/constants.js +6 -0
  16. package/dist/esm/ssr/serverRender/renderToStream/index.js +1 -1
  17. package/dist/esm/ssr/serverRender/renderToString/entry.js +14 -14
  18. package/dist/esm/ssr/serverRender/renderToString/index.js +3 -3
  19. package/dist/esm/ssr/serverRender/tracker.js +61 -0
  20. package/dist/esm-node/document/cli/index.js +1 -0
  21. package/dist/esm-node/document/constants.js +0 -2
  22. package/dist/esm-node/router/runtime/plugin.js +6 -0
  23. package/dist/esm-node/ssr/cli/index.js +19 -13
  24. package/dist/esm-node/ssr/serverRender/constants.js +6 -0
  25. package/dist/esm-node/ssr/serverRender/renderToStream/index.js +1 -1
  26. package/dist/esm-node/ssr/serverRender/renderToString/entry.js +13 -13
  27. package/dist/esm-node/ssr/serverRender/renderToString/index.js +3 -3
  28. package/dist/esm-node/ssr/serverRender/tracker.js +64 -0
  29. package/dist/types/document/constants.d.ts +0 -1
  30. package/dist/types/router/runtime/types.d.ts +4 -0
  31. package/dist/types/ssr/index.node.d.ts +1 -1
  32. package/dist/types/ssr/serverRender/constants.d.ts +5 -0
  33. package/dist/types/ssr/serverRender/renderToString/entry.d.ts +2 -1
  34. package/dist/types/ssr/serverRender/tracker.d.ts +21 -0
  35. package/package.json +9 -9
  36. package/dist/cjs/ssr/serverRender/time.js +0 -20
  37. package/dist/cjs/ssr/serverRender/time.worker.js +0 -38
  38. package/dist/esm/ssr/serverRender/time.js +0 -11
  39. package/dist/esm/ssr/serverRender/time.worker.js +0 -29
  40. package/dist/esm-node/ssr/serverRender/time.js +0 -10
  41. package/dist/esm-node/ssr/serverRender/time.worker.js +0 -28
  42. package/dist/types/ssr/serverRender/time.d.ts +0 -1
  43. package/dist/types/ssr/serverRender/time.worker.d.ts +0 -1
@@ -1,8 +1,9 @@
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/utils/runtime-node";
4
+ import { time } from "@modern-js/utils/universal/time";
4
5
  import { PreRender } from "../../react/prerender";
5
- import { time } from "../time";
6
+ import { SSRTimings } from "../tracker";
6
7
  import SSREntry from "./entry";
7
8
  export var render = function(param) {
8
9
  var App = param.App, context = param.context, config = param.config;
@@ -26,8 +27,7 @@ export var render = function(param) {
26
27
  case 1:
27
28
  html = _state.sent();
28
29
  cost = end();
29
- entry.logger.info("App Render Total cost = %d ms", cost);
30
- entry.metrics.emitTimer("app.render.cost", cost);
30
+ entry.tracker.trackTiming(SSRTimings.SSR_RENDER_TOTAL, cost);
31
31
  cacheConfig = PreRender.config();
32
32
  if (cacheConfig) {
33
33
  context.ssrContext.cacheConfig = cacheConfig;
@@ -0,0 +1,61 @@
1
+ import { _ as _define_property } from "@swc/helpers/_/_define_property";
2
+ export var SSRTimings;
3
+ (function(SSRTimings2) {
4
+ SSRTimings2[SSRTimings2["SSR_RENDER_TOTAL"] = 0] = "SSR_RENDER_TOTAL";
5
+ SSRTimings2[SSRTimings2["SSR_PREFETCH"] = 1] = "SSR_PREFETCH";
6
+ SSRTimings2[SSRTimings2["SSR_RENDER_HTML"] = 2] = "SSR_RENDER_HTML";
7
+ })(SSRTimings || (SSRTimings = {}));
8
+ export var SSRErrors;
9
+ (function(SSRErrors2) {
10
+ SSRErrors2[SSRErrors2["PREFETCH"] = 0] = "PREFETCH";
11
+ SSRErrors2[SSRErrors2["RENDER_HTML"] = 1] = "RENDER_HTML";
12
+ })(SSRErrors || (SSRErrors = {}));
13
+ var _obj;
14
+ var errors = (_obj = {}, _define_property(_obj, SSRErrors.PREFETCH, {
15
+ reporter: "SSR Error - App Prefetch Render",
16
+ logger: "App Prefetch Render",
17
+ metrics: "app.prefetch.render.error"
18
+ }), _define_property(_obj, SSRErrors.RENDER_HTML, {
19
+ reporter: "SSR Error - App Render To HTML",
20
+ logger: "App Render To HTML",
21
+ metrics: "app.render.html.error"
22
+ }), _obj);
23
+ var _obj1;
24
+ var timings = (_obj1 = {}, _define_property(_obj1, SSRTimings.SSR_PREFETCH, {
25
+ reporter: "ssr-prefetch",
26
+ serverTiming: "ssr-prefetch",
27
+ metrics: "app.prefeth.cost",
28
+ logger: "App Prefetch cost = %d ms"
29
+ }), _define_property(_obj1, SSRTimings.SSR_RENDER_HTML, {
30
+ reporter: "ssr-render-html",
31
+ serverTiming: "ssr-render-html",
32
+ metrics: "app.render.html.cost",
33
+ logger: "App Render To HTML cost = %d ms"
34
+ }), _define_property(_obj1, SSRTimings.SSR_RENDER_TOTAL, {
35
+ reporter: "ssr-render-total",
36
+ serverTiming: "ssr-render-total",
37
+ metrics: "app.render.cost",
38
+ logger: "App Render Total cost = %d ms"
39
+ }), _obj1);
40
+ export function createSSRTracker(param) {
41
+ var reporter = param.reporter, serverTiming = param.serverTiming, metrics = param.metrics, logger = param.logger;
42
+ var tracker = {
43
+ get sessionId() {
44
+ return reporter.sessionId;
45
+ },
46
+ trackError: function trackError(key, e) {
47
+ var _errors_key = errors[key], reporterContent = _errors_key.reporter, metricsContent = _errors_key.metrics, loggerContent = _errors_key.logger;
48
+ reporterContent && reporter.reportError(reporterContent, e);
49
+ metricsContent && metrics.emitCounter(metricsContent, 1);
50
+ loggerContent && logger.error(loggerContent, e);
51
+ },
52
+ trackTiming: function trackTiming(key, cost) {
53
+ var _timings_key = timings[key], reporterName = _timings_key.reporter, serverTimingName = _timings_key.serverTiming, loggerName = _timings_key.logger, metricsName = _timings_key.metrics;
54
+ reporterName && reporter.reportTiming(reporterName, cost);
55
+ serverTimingName && serverTiming.addServeTiming(serverTimingName, cost);
56
+ metricsName && metrics.emitTimer(metricsName, cost);
57
+ loggerName && logger.debug(loggerName, cost);
58
+ }
59
+ };
60
+ return tracker;
61
+ }
@@ -152,6 +152,7 @@ export const documentPlugin = () => ({
152
152
  );
153
153
  const documentHtmlOptions = templateContent ? {
154
154
  templateContent,
155
+ // Note: the behavior of inject/modify tags in afterTemplateExecution hook will not take effect
155
156
  inject: false
156
157
  } : {};
157
158
  return {
@@ -14,7 +14,6 @@ export const DOCUMENT_SSRDATASCRIPT_PLACEHOLDER = encodeURIComponent(HTML_SSRDAT
14
14
  export const DOCUMENT_FILE_NAME = "Document";
15
15
  export const DOCUMENT_SCRIPTS_PLACEHOLDER = encodeURIComponent("<!-- chunk scripts placeholder -->");
16
16
  export const DOCUMENT_LINKS_PLACEHOLDER = encodeURIComponent("<!-- chunk links placeholder -->");
17
- export const DOCUMENT_NO_SCRIPTE_PLACEHOLDER = encodeURIComponent("<!-- no-script -->");
18
17
  export const DOCUMENT_SCRIPT_PLACEHOLDER_START = encodeURIComponent("<!-- script-start -->");
19
18
  export const DOCUMENT_SCRIPT_PLACEHOLDER_END = encodeURIComponent("<!-- script-end -->");
20
19
  export const DOCUMENT_STYLE_PLACEHOLDER_START = encodeURIComponent("<!-- style-start -->");
@@ -22,7 +21,6 @@ export const DOCUMENT_STYLE_PLACEHOLDER_END = encodeURIComponent("<!-- style-end
22
21
  export const DOCUMENT_COMMENT_PLACEHOLDER_START = encodeURIComponent("<!-- comment-start -->");
23
22
  export const DOCUMENT_COMMENT_PLACEHOLDER_END = encodeURIComponent("<!-- comment-end -->");
24
23
  export const PLACEHOLDER_REPLACER_MAP = {
25
- [DOCUMENT_NO_SCRIPTE_PLACEHOLDER]: `We're sorry but react app doesn't work properly without JavaScript enabled. Please enable it to continue.`,
26
24
  [DOCUMENT_SSR_PLACEHOLDER]: HTML_SEPARATOR,
27
25
  [DOCUMENT_CHUNKSMAP_PLACEHOLDER]: HTML_CHUNKSMAP_SEPARATOR,
28
26
  [DOCUMENT_SSRDATASCRIPT_PLACEHOLDER]: HTML_SSRDATASCRIPT_SEPARATOR
@@ -121,6 +121,12 @@ export const routerPlugin = ({ serverBase = [], supportHtml5History = true, base
121
121
  },
122
122
  pickContext: ({ context, pickedContext }, next) => {
123
123
  const { remixRouter } = context;
124
+ if (!remixRouter) {
125
+ return next({
126
+ context,
127
+ pickedContext
128
+ });
129
+ }
124
130
  const router = {
125
131
  navigate: remixRouter.navigate,
126
132
  get location() {
@@ -4,8 +4,8 @@ const PLUGIN_IDENTIFIER = "ssr";
4
4
  const hasStringSSREntry = (userConfig) => {
5
5
  var _server, _server1;
6
6
  const isStreaming = (ssr) => ssr && typeof ssr === "object" && ssr.mode === "stream";
7
- const { server } = userConfig;
8
- if (((_server = server) === null || _server === void 0 ? void 0 : _server.ssr) && !isStreaming(server.ssr)) {
7
+ const { server, output } = userConfig;
8
+ if ((((_server = server) === null || _server === void 0 ? void 0 : _server.ssr) || output.ssg) && !isStreaming(server.ssr)) {
9
9
  return true;
10
10
  }
11
11
  if (((_server1 = server) === null || _server1 === void 0 ? void 0 : _server1.ssrByEntries) && typeof server.ssrByEntries === "object") {
@@ -17,6 +17,11 @@ const hasStringSSREntry = (userConfig) => {
17
17
  }
18
18
  return false;
19
19
  };
20
+ const checkUseStringSSR = (config) => {
21
+ var _output;
22
+ const { output } = config;
23
+ return Boolean((_output = output) === null || _output === void 0 ? void 0 : _output.ssg) || hasStringSSREntry(config);
24
+ };
20
25
  export const ssrPlugin = () => ({
21
26
  name: "@modern-js/plugin-ssr",
22
27
  required: [
@@ -29,29 +34,30 @@ export const ssrPlugin = () => ({
29
34
  config() {
30
35
  const appContext = api.useAppContext();
31
36
  pluginsExportsUtils = createRuntimeExportsUtils(appContext.internalDirectory, "plugins");
32
- const userConfig = api.useConfigContext();
33
37
  const { bundlerType = "webpack" } = api.useAppContext();
34
- const babelConfig = (() => {
38
+ const babelHandler = (() => {
35
39
  if (bundlerType === "webpack") {
36
40
  return (config) => {
37
41
  var _config_plugins;
42
+ const userConfig = api.useResolvedConfigContext();
38
43
  (_config_plugins = config.plugins) === null || _config_plugins === void 0 ? void 0 : _config_plugins.push(path.join(__dirname, "./babel-plugin-ssr-loader-id"));
39
- if (isUseSSRBundle(userConfig) && hasStringSSREntry(userConfig)) {
44
+ if (isUseSSRBundle(userConfig) && checkUseStringSSR(userConfig)) {
40
45
  var _config_plugins1;
41
46
  (_config_plugins1 = config.plugins) === null || _config_plugins1 === void 0 ? void 0 : _config_plugins1.push(require.resolve("@loadable/babel-plugin"));
42
47
  }
43
48
  };
44
49
  } else if (bundlerType === "rspack") {
45
- if (isUseSSRBundle(userConfig)) {
46
- return (config) => {
50
+ return (config) => {
51
+ const userConfig = api.useResolvedConfigContext();
52
+ if (isUseSSRBundle(userConfig)) {
47
53
  var _config_plugins;
48
54
  (_config_plugins = config.plugins) === null || _config_plugins === void 0 ? void 0 : _config_plugins.push(path.join(__dirname, "./babel-plugin-ssr-loader-id"));
49
- if (hasStringSSREntry(userConfig)) {
55
+ if (checkUseStringSSR(userConfig)) {
50
56
  var _config_plugins1;
51
57
  (_config_plugins1 = config.plugins) === null || _config_plugins1 === void 0 ? void 0 : _config_plugins1.push(require.resolve("@loadable/babel-plugin"));
52
58
  }
53
- };
54
- }
59
+ }
60
+ };
55
61
  }
56
62
  })();
57
63
  return {
@@ -67,8 +73,8 @@ export const ssrPlugin = () => ({
67
73
  },
68
74
  tools: {
69
75
  bundlerChain(chain, { isServer, isServiceWorker, CHAIN_ID }) {
70
- const userConfig2 = api.useResolvedConfigContext();
71
- if (isUseSSRBundle(userConfig2) && !isServer && !isServiceWorker && hasStringSSREntry(userConfig2)) {
76
+ const userConfig = api.useResolvedConfigContext();
77
+ if (isUseSSRBundle(userConfig) && !isServer && !isServiceWorker && checkUseStringSSR(userConfig)) {
72
78
  const LoadableBundlerPlugin = require("./loadable-bundler-plugin.js");
73
79
  chain.plugin(CHAIN_ID.PLUGIN.LOADABLE).use(LoadableBundlerPlugin, [
74
80
  {
@@ -77,7 +83,7 @@ export const ssrPlugin = () => ({
77
83
  ]);
78
84
  }
79
85
  },
80
- babel: babelConfig
86
+ babel: babelHandler
81
87
  }
82
88
  };
83
89
  },
@@ -0,0 +1,6 @@
1
+ export var ServerTimingNames;
2
+ (function(ServerTimingNames2) {
3
+ ServerTimingNames2["SSR_RENDER_TOTAL"] = "ssr-render-total";
4
+ ServerTimingNames2["SSR_PREFETCH"] = "ssr-prefetch";
5
+ ServerTimingNames2["SSR_RENDER_HTML"] = "ssr-render-html";
6
+ })(ServerTimingNames || (ServerTimingNames = {}));
@@ -1,7 +1,7 @@
1
1
  import { createElement } from "react";
2
2
  import { run } from "@modern-js/utils/runtime-node";
3
+ import { time } from "@modern-js/utils/universal/time";
3
4
  import { PreRender } from "../../react/prerender";
4
- import { time } from "../time";
5
5
  import renderToPipe from "./renderToPipe";
6
6
  export const render = ({ App, context }) => {
7
7
  const { ssrContext } = context;
@@ -3,17 +3,18 @@ import React from "react";
3
3
  import ReactDomServer from "react-dom/server";
4
4
  import { serializeJson } from "@modern-js/utils/runtime-node";
5
5
  import ReactHelmet from "react-helmet";
6
+ import { time } from "@modern-js/utils/universal/time";
6
7
  import { serializeErrors } from "../../../router/runtime/utils";
7
8
  import helmetReplace from "../helmet";
8
9
  import { RenderLevel } from "../types";
9
- import { time } from "../time";
10
10
  import prefetch from "../../prefetch";
11
11
  import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID, attributesToString } from "../utils";
12
+ import { SSRErrors, SSRTimings, createSSRTracker } from "../tracker";
12
13
  import { toFragments } from "./template";
13
14
  import { reduce } from "./reduce";
14
15
  import * as loadableRenderer from "./loadable";
15
16
  import * as styledComponentRenderer from "./styledComponent";
16
- const buildTemplateData = (context, data, renderLevel) => {
17
+ const buildTemplateData = (context, data, renderLevel, tracker) => {
17
18
  const { request, enableUnsafeCtx } = context;
18
19
  const unsafeContext = {
19
20
  headers: request.headers
@@ -28,6 +29,9 @@ const buildTemplateData = (context, data, renderLevel) => {
28
29
  host: request.host,
29
30
  url: request.url,
30
31
  ...enableUnsafeCtx ? unsafeContext : {}
32
+ },
33
+ reporter: {
34
+ sessionId: tracker.sessionId
31
35
  }
32
36
  },
33
37
  renderLevel
@@ -56,7 +60,7 @@ class Entry {
56
60
  errors: serializeErrors(routerContext.errors)
57
61
  } : void 0;
58
62
  let html = "";
59
- const templateData = buildTemplateData(ssrContext, prefetchData, this.result.renderLevel);
63
+ const templateData = buildTemplateData(ssrContext, prefetchData, this.result.renderLevel, this.tracker);
60
64
  const SSRData = this.getSSRDataScript(templateData, routerData);
61
65
  for (const fragment of this.fragments) {
62
66
  if (fragment.isVariable && fragment.content === "SSRDataScript") {
@@ -75,12 +79,10 @@ class Entry {
75
79
  prefetchData = await prefetch(this.App, context);
76
80
  this.result.renderLevel = RenderLevel.SERVER_PREFETCH;
77
81
  const prefetchCost = end();
78
- this.logger.debug(`App Prefetch cost = %d ms`, prefetchCost);
79
- this.metrics.emitTimer("app.prefetch.cost", prefetchCost);
82
+ this.tracker.trackTiming(SSRTimings.SSR_PREFETCH, prefetchCost);
80
83
  } catch (e) {
81
84
  this.result.renderLevel = RenderLevel.CLIENT_RENDER;
82
- this.logger.error("App Prefetch Render", e);
83
- this.metrics.emitCounter("app.prefetch.render.error", 1);
85
+ this.tracker.trackError(SSRErrors.PREFETCH, e);
84
86
  }
85
87
  return prefetchData || {};
86
88
  }
@@ -109,12 +111,10 @@ class Entry {
109
111
  (jsx) => ReactDomServer.renderToString(jsx)
110
112
  ]);
111
113
  const cost = end();
112
- this.logger.debug("App Render To HTML cost = %d ms", cost);
113
- this.metrics.emitTimer("app.render.html.cost", cost);
114
+ this.tracker.trackTiming(SSRTimings.SSR_RENDER_HTML, cost);
114
115
  this.result.renderLevel = RenderLevel.SERVER_RENDER;
115
116
  } catch (e) {
116
- this.logger.error("App Render To HTML", e);
117
- this.metrics.emitCounter("app.render.html.error", 1);
117
+ this.tracker.trackError(SSRErrors.RENDER_HTML, e);
118
118
  }
119
119
  return html;
120
120
  }
@@ -139,7 +139,7 @@ class Entry {
139
139
  _define_property(this, "entryName", void 0);
140
140
  _define_property(this, "result", void 0);
141
141
  _define_property(this, "metrics", void 0);
142
- _define_property(this, "logger", void 0);
142
+ _define_property(this, "tracker", void 0);
143
143
  _define_property(this, "template", void 0);
144
144
  _define_property(this, "App", void 0);
145
145
  _define_property(this, "fragments", void 0);
@@ -154,8 +154,8 @@ class Entry {
154
154
  this.host = host;
155
155
  this.App = options.App;
156
156
  this.pluginConfig = config;
157
+ this.tracker = createSSRTracker(ctx);
157
158
  this.metrics = ctx.metrics;
158
- this.logger = ctx.logger;
159
159
  this.nonce = nonce;
160
160
  this.result = {
161
161
  renderLevel: RenderLevel.CLIENT_RENDER,
@@ -1,6 +1,7 @@
1
1
  import { run } from "@modern-js/utils/runtime-node";
2
+ import { time } from "@modern-js/utils/universal/time";
2
3
  import { PreRender } from "../../react/prerender";
3
- import { time } from "../time";
4
+ import { SSRTimings } from "../tracker";
4
5
  import SSREntry from "./entry";
5
6
  export const render = ({ App, context, config }) => {
6
7
  const ssrContext = context.ssrContext;
@@ -14,8 +15,7 @@ export const render = ({ App, context, config }) => {
14
15
  const end = time();
15
16
  const html = await entry.renderToHtml(context);
16
17
  const cost = end();
17
- entry.logger.info("App Render Total cost = %d ms", cost);
18
- entry.metrics.emitTimer("app.render.cost", cost);
18
+ entry.tracker.trackTiming(SSRTimings.SSR_RENDER_TOTAL, cost);
19
19
  const cacheConfig = PreRender.config();
20
20
  if (cacheConfig) {
21
21
  context.ssrContext.cacheConfig = cacheConfig;
@@ -0,0 +1,64 @@
1
+ export var SSRTimings;
2
+ (function(SSRTimings2) {
3
+ SSRTimings2[SSRTimings2["SSR_RENDER_TOTAL"] = 0] = "SSR_RENDER_TOTAL";
4
+ SSRTimings2[SSRTimings2["SSR_PREFETCH"] = 1] = "SSR_PREFETCH";
5
+ SSRTimings2[SSRTimings2["SSR_RENDER_HTML"] = 2] = "SSR_RENDER_HTML";
6
+ })(SSRTimings || (SSRTimings = {}));
7
+ export var SSRErrors;
8
+ (function(SSRErrors2) {
9
+ SSRErrors2[SSRErrors2["PREFETCH"] = 0] = "PREFETCH";
10
+ SSRErrors2[SSRErrors2["RENDER_HTML"] = 1] = "RENDER_HTML";
11
+ })(SSRErrors || (SSRErrors = {}));
12
+ const errors = {
13
+ [SSRErrors.PREFETCH]: {
14
+ reporter: "SSR Error - App Prefetch Render",
15
+ logger: "App Prefetch Render",
16
+ metrics: "app.prefetch.render.error"
17
+ },
18
+ [SSRErrors.RENDER_HTML]: {
19
+ reporter: "SSR Error - App Render To HTML",
20
+ logger: "App Render To HTML",
21
+ metrics: "app.render.html.error"
22
+ }
23
+ };
24
+ const timings = {
25
+ [SSRTimings.SSR_PREFETCH]: {
26
+ reporter: "ssr-prefetch",
27
+ serverTiming: "ssr-prefetch",
28
+ metrics: "app.prefeth.cost",
29
+ logger: "App Prefetch cost = %d ms"
30
+ },
31
+ [SSRTimings.SSR_RENDER_HTML]: {
32
+ reporter: "ssr-render-html",
33
+ serverTiming: "ssr-render-html",
34
+ metrics: "app.render.html.cost",
35
+ logger: "App Render To HTML cost = %d ms"
36
+ },
37
+ [SSRTimings.SSR_RENDER_TOTAL]: {
38
+ reporter: "ssr-render-total",
39
+ serverTiming: "ssr-render-total",
40
+ metrics: "app.render.cost",
41
+ logger: "App Render Total cost = %d ms"
42
+ }
43
+ };
44
+ export function createSSRTracker({ reporter, serverTiming, metrics, logger }) {
45
+ const tracker = {
46
+ get sessionId() {
47
+ return reporter.sessionId;
48
+ },
49
+ trackError(key, e) {
50
+ const { reporter: reporterContent, metrics: metricsContent, logger: loggerContent } = errors[key];
51
+ reporterContent && reporter.reportError(reporterContent, e);
52
+ metricsContent && metrics.emitCounter(metricsContent, 1);
53
+ loggerContent && logger.error(loggerContent, e);
54
+ },
55
+ trackTiming(key, cost) {
56
+ const { reporter: reporterName, serverTiming: serverTimingName, logger: loggerName, metrics: metricsName } = timings[key];
57
+ reporterName && reporter.reportTiming(reporterName, cost);
58
+ serverTimingName && serverTiming.addServeTiming(serverTimingName, cost);
59
+ metricsName && metrics.emitTimer(metricsName, cost);
60
+ loggerName && logger.debug(loggerName, cost);
61
+ }
62
+ };
63
+ return tracker;
64
+ }
@@ -8,7 +8,6 @@ export declare const DOCUMENT_SSRDATASCRIPT_PLACEHOLDER: string;
8
8
  export declare const DOCUMENT_FILE_NAME = "Document";
9
9
  export declare const DOCUMENT_SCRIPTS_PLACEHOLDER: string;
10
10
  export declare const DOCUMENT_LINKS_PLACEHOLDER: string;
11
- export declare const DOCUMENT_NO_SCRIPTE_PLACEHOLDER: string;
12
11
  export declare const DOCUMENT_SCRIPT_PLACEHOLDER_START: string;
13
12
  export declare const DOCUMENT_SCRIPT_PLACEHOLDER_END: string;
14
13
  export declare const DOCUMENT_STYLE_PLACEHOLDER_START: string;
@@ -30,6 +30,10 @@ export type RouterConfig = {
30
30
  globalApp?: React.ComponentType<any>;
31
31
  routes: (NestedRoute | PageRoute)[];
32
32
  };
33
+ /**
34
+ * You should not use it
35
+ */
36
+ oldVersion?: boolean;
33
37
  serverBase?: string[];
34
38
  supportHtml5History?: boolean;
35
39
  basename?: string;
@@ -1,5 +1,5 @@
1
1
  import type { Plugin } from '../core';
2
- import { SSRPluginConfig } from './serverRender/types';
2
+ import type { SSRPluginConfig } from './serverRender/types';
3
3
  export declare const ssr: (config?: SSRPluginConfig) => Plugin;
4
4
  export default ssr;
5
5
  export * from './react';
@@ -0,0 +1,5 @@
1
+ export declare enum ServerTimingNames {
2
+ SSR_RENDER_TOTAL = "ssr-render-total",
3
+ SSR_PREFETCH = "ssr-prefetch",
4
+ SSR_RENDER_HTML = "ssr-render-html",
5
+ }
@@ -1,4 +1,5 @@
1
1
  import { RuntimeContext, ModernSSRReactComponent, SSRPluginConfig } from '../types';
2
+ import { SSRTracker } from '../tracker';
2
3
  import { SSRServerContext, RenderResult } from './type';
3
4
  type EntryOptions = {
4
5
  ctx: SSRServerContext;
@@ -9,7 +10,7 @@ export default class Entry {
9
10
  entryName: string;
10
11
  result: RenderResult;
11
12
  metrics: SSRServerContext['metrics'];
12
- logger: SSRServerContext['logger'];
13
+ tracker: SSRTracker;
13
14
  private readonly template;
14
15
  private readonly App;
15
16
  private readonly fragments;
@@ -0,0 +1,21 @@
1
+ import { SSRServerContext } from './types';
2
+ export type SSRTracker = ReturnType<typeof createSSRTracker>;
3
+ export declare enum SSRTimings {
4
+ SSR_RENDER_TOTAL = 0,
5
+ SSR_PREFETCH = 1,
6
+ SSR_RENDER_HTML = 2,
7
+ }
8
+ export declare enum SSRErrors {
9
+ PREFETCH = 0,
10
+ RENDER_HTML = 1,
11
+ }
12
+ export declare function createSSRTracker({
13
+ reporter,
14
+ serverTiming,
15
+ metrics,
16
+ logger
17
+ }: SSRServerContext): {
18
+ readonly sessionId: string | undefined;
19
+ trackError(key: SSRErrors, e: Error): void;
20
+ trackTiming(key: SSRTimings, cost: number): void;
21
+ };
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "modern",
16
16
  "modern.js"
17
17
  ],
18
- "version": "2.28.0",
18
+ "version": "2.30.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.28.0",
177
- "@modern-js/types": "2.28.0",
178
- "@modern-js/utils": "2.28.0"
176
+ "@modern-js/plugin": "2.30.0",
177
+ "@modern-js/utils": "2.30.0",
178
+ "@modern-js/types": "2.30.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.28.0",
200
- "@modern-js/core": "2.28.0",
201
- "@modern-js/server-core": "2.28.0",
202
- "@scripts/jest-config": "2.28.0",
203
- "@scripts/build": "2.28.0"
199
+ "@modern-js/app-tools": "2.30.0",
200
+ "@modern-js/server-core": "2.30.0",
201
+ "@modern-js/core": "2.30.0",
202
+ "@scripts/jest-config": "2.30.0",
203
+ "@scripts/build": "2.30.0"
204
204
  },
205
205
  "sideEffects": false,
206
206
  "publishConfig": {
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "time", {
6
- enumerable: true,
7
- get: function() {
8
- return time;
9
- }
10
- });
11
- const getLatency = (hrtime) => {
12
- const [s, ns] = process.hrtime(hrtime);
13
- return s * 1e3 + ns / 1e6;
14
- };
15
- const time = () => {
16
- const hrtime = process.hrtime();
17
- return () => {
18
- return getLatency(hrtime);
19
- };
20
- };
@@ -1,38 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "time", {
6
- enumerable: true,
7
- get: function() {
8
- return time;
9
- }
10
- });
11
- function processHrtime(previousTimestamp) {
12
- const now = (/* @__PURE__ */ new Date()).getTime();
13
- const clocktime = now * 1e-3;
14
- let seconds = Math.floor(clocktime);
15
- let nanoseconds = Math.floor(clocktime % 1 * 1e9);
16
- if (previousTimestamp) {
17
- seconds -= previousTimestamp[0];
18
- nanoseconds -= previousTimestamp[1];
19
- if (nanoseconds < 0) {
20
- seconds--;
21
- nanoseconds += 1e9;
22
- }
23
- }
24
- return [
25
- seconds,
26
- nanoseconds
27
- ];
28
- }
29
- const getLatency = (hrtime) => {
30
- const [s, ns] = processHrtime(hrtime);
31
- return s * 1e3 + ns / 1e6;
32
- };
33
- const time = () => {
34
- const hrtime = processHrtime();
35
- return () => {
36
- return getLatency(hrtime);
37
- };
38
- };
@@ -1,11 +0,0 @@
1
- import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
2
- var getLatency = function(hrtime) {
3
- var _process_hrtime = _sliced_to_array(process.hrtime(hrtime), 2), s = _process_hrtime[0], ns = _process_hrtime[1];
4
- return s * 1e3 + ns / 1e6;
5
- };
6
- export var time = function() {
7
- var hrtime = process.hrtime();
8
- return function() {
9
- return getLatency(hrtime);
10
- };
11
- };
@@ -1,29 +0,0 @@
1
- import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
2
- function processHrtime(previousTimestamp) {
3
- var now = (/* @__PURE__ */ new Date()).getTime();
4
- var clocktime = now * 1e-3;
5
- var seconds = Math.floor(clocktime);
6
- var nanoseconds = Math.floor(clocktime % 1 * 1e9);
7
- if (previousTimestamp) {
8
- seconds -= previousTimestamp[0];
9
- nanoseconds -= previousTimestamp[1];
10
- if (nanoseconds < 0) {
11
- seconds--;
12
- nanoseconds += 1e9;
13
- }
14
- }
15
- return [
16
- seconds,
17
- nanoseconds
18
- ];
19
- }
20
- var getLatency = function(hrtime) {
21
- var _processHrtime = _sliced_to_array(processHrtime(hrtime), 2), s = _processHrtime[0], ns = _processHrtime[1];
22
- return s * 1e3 + ns / 1e6;
23
- };
24
- export var time = function() {
25
- var hrtime = processHrtime();
26
- return function() {
27
- return getLatency(hrtime);
28
- };
29
- };
@@ -1,10 +0,0 @@
1
- const getLatency = (hrtime) => {
2
- const [s, ns] = process.hrtime(hrtime);
3
- return s * 1e3 + ns / 1e6;
4
- };
5
- export const time = () => {
6
- const hrtime = process.hrtime();
7
- return () => {
8
- return getLatency(hrtime);
9
- };
10
- };
@@ -1,28 +0,0 @@
1
- function processHrtime(previousTimestamp) {
2
- const now = (/* @__PURE__ */ new Date()).getTime();
3
- const clocktime = now * 1e-3;
4
- let seconds = Math.floor(clocktime);
5
- let nanoseconds = Math.floor(clocktime % 1 * 1e9);
6
- if (previousTimestamp) {
7
- seconds -= previousTimestamp[0];
8
- nanoseconds -= previousTimestamp[1];
9
- if (nanoseconds < 0) {
10
- seconds--;
11
- nanoseconds += 1e9;
12
- }
13
- }
14
- return [
15
- seconds,
16
- nanoseconds
17
- ];
18
- }
19
- const getLatency = (hrtime) => {
20
- const [s, ns] = processHrtime(hrtime);
21
- return s * 1e3 + ns / 1e6;
22
- };
23
- export const time = () => {
24
- const hrtime = processHrtime();
25
- return () => {
26
- return getLatency(hrtime);
27
- };
28
- };
@@ -1 +0,0 @@
1
- export declare const time: () => () => number;
@@ -1 +0,0 @@
1
- export declare const time: () => () => number;