@modern-js/runtime 2.29.0 → 2.31.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 (37) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/cjs/document/Body.js +1 -0
  3. package/dist/cjs/document/Head.js +2 -0
  4. package/dist/cjs/document/cli/index.js +8 -1
  5. package/dist/cjs/document/constants.js +12 -5
  6. package/dist/cjs/router/runtime/plugin.js +49 -37
  7. package/dist/cjs/ssr/cli/index.js +19 -13
  8. package/dist/cjs/ssr/serverRender/renderToString/entry.js +10 -25
  9. package/dist/cjs/ssr/serverRender/renderToString/index.js +2 -5
  10. package/dist/cjs/ssr/serverRender/tracker.js +86 -0
  11. package/dist/esm/document/Body.js +2 -1
  12. package/dist/esm/document/Head.js +3 -1
  13. package/dist/esm/document/cli/index.js +9 -2
  14. package/dist/esm/document/constants.js +4 -2
  15. package/dist/esm/router/runtime/plugin.js +52 -40
  16. package/dist/esm/ssr/cli/index.js +19 -13
  17. package/dist/esm/ssr/serverRender/renderToString/entry.js +10 -25
  18. package/dist/esm/ssr/serverRender/renderToString/index.js +2 -5
  19. package/dist/esm/ssr/serverRender/tracker.js +61 -0
  20. package/dist/esm-node/document/Body.js +2 -1
  21. package/dist/esm-node/document/Head.js +3 -1
  22. package/dist/esm-node/document/cli/index.js +9 -2
  23. package/dist/esm-node/document/constants.js +3 -2
  24. package/dist/esm-node/router/runtime/plugin.js +50 -38
  25. package/dist/esm-node/ssr/cli/index.js +19 -13
  26. package/dist/esm-node/ssr/serverRender/renderToString/entry.js +10 -25
  27. package/dist/esm-node/ssr/serverRender/renderToString/index.js +2 -5
  28. package/dist/esm-node/ssr/serverRender/tracker.js +64 -0
  29. package/dist/types/document/constants.d.ts +3 -1
  30. package/dist/types/ssr/index.node.d.ts +1 -1
  31. package/dist/types/ssr/serverRender/renderToString/entry.d.ts +2 -4
  32. package/dist/types/ssr/serverRender/tracker.d.ts +21 -0
  33. package/package.json +9 -9
  34. package/dist/cjs/ssr/serverRender/reporter.js +0 -27
  35. package/dist/esm/ssr/serverRender/reporter.js +0 -17
  36. package/dist/esm-node/ssr/serverRender/reporter.js +0 -17
  37. package/dist/types/ssr/serverRender/reporter.d.ts +0 -8
@@ -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
  },
@@ -9,13 +9,12 @@ import helmetReplace from "../helmet";
9
9
  import { RenderLevel } from "../types";
10
10
  import prefetch from "../../prefetch";
11
11
  import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID, attributesToString } from "../utils";
12
- import { createSSRReporter } from "../reporter";
13
- import { ServerTimingNames } from "../constants";
12
+ import { SSRErrors, SSRTimings, createSSRTracker } from "../tracker";
14
13
  import { toFragments } from "./template";
15
14
  import { reduce } from "./reduce";
16
15
  import * as loadableRenderer from "./loadable";
17
16
  import * as styledComponentRenderer from "./styledComponent";
18
- const buildTemplateData = (context, data, renderLevel, reporter) => {
17
+ const buildTemplateData = (context, data, renderLevel, tracker) => {
19
18
  const { request, enableUnsafeCtx } = context;
20
19
  const unsafeContext = {
21
20
  headers: request.headers
@@ -32,7 +31,7 @@ const buildTemplateData = (context, data, renderLevel, reporter) => {
32
31
  ...enableUnsafeCtx ? unsafeContext : {}
33
32
  },
34
33
  reporter: {
35
- sessionId: reporter.sessionId
34
+ sessionId: tracker.sessionId
36
35
  }
37
36
  },
38
37
  renderLevel
@@ -61,7 +60,7 @@ class Entry {
61
60
  errors: serializeErrors(routerContext.errors)
62
61
  } : void 0;
63
62
  let html = "";
64
- const templateData = buildTemplateData(ssrContext, prefetchData, this.result.renderLevel, this.reporter);
63
+ const templateData = buildTemplateData(ssrContext, prefetchData, this.result.renderLevel, this.tracker);
65
64
  const SSRData = this.getSSRDataScript(templateData, routerData);
66
65
  for (const fragment of this.fragments) {
67
66
  if (fragment.isVariable && fragment.content === "SSRDataScript") {
@@ -80,15 +79,10 @@ class Entry {
80
79
  prefetchData = await prefetch(this.App, context);
81
80
  this.result.renderLevel = RenderLevel.SERVER_PREFETCH;
82
81
  const prefetchCost = end();
83
- this.logger.debug(`App Prefetch cost = %d ms`, prefetchCost);
84
- this.metrics.emitTimer("app.prefetch.cost", prefetchCost);
85
- this.reporter.reportTime("app_prefetch_cost", prefetchCost);
86
- this.severTiming.addServeTiming(ServerTimingNames.SSR_PREFETCH, prefetchCost);
82
+ this.tracker.trackTiming(SSRTimings.SSR_PREFETCH, prefetchCost);
87
83
  } catch (e) {
88
84
  this.result.renderLevel = RenderLevel.CLIENT_RENDER;
89
- this.logger.error("App Prefetch Render", e);
90
- this.reporter.reportError("App Prefetch Render", e);
91
- this.metrics.emitCounter("app.prefetch.render.error", 1);
85
+ this.tracker.trackError(SSRErrors.PREFETCH, e);
92
86
  }
93
87
  return prefetchData || {};
94
88
  }
@@ -117,15 +111,10 @@ class Entry {
117
111
  (jsx) => ReactDomServer.renderToString(jsx)
118
112
  ]);
119
113
  const cost = end();
120
- this.logger.debug("App Render To HTML cost = %d ms", cost);
121
- this.metrics.emitTimer("app.render.html.cost", cost);
122
- this.reporter.reportTime("app_render_html_cost", cost);
123
- this.severTiming.addServeTiming(ServerTimingNames.SSR_RENDER_HTML, cost);
114
+ this.tracker.trackTiming(SSRTimings.SSR_RENDER_HTML, cost);
124
115
  this.result.renderLevel = RenderLevel.SERVER_RENDER;
125
116
  } catch (e) {
126
- this.logger.error("App Render To HTML", e);
127
- this.reporter.reportError("App Render To HTML", e);
128
- this.metrics.emitCounter("app.render.html.error", 1);
117
+ this.tracker.trackError(SSRErrors.RENDER_HTML, e);
129
118
  }
130
119
  return html;
131
120
  }
@@ -150,9 +139,7 @@ class Entry {
150
139
  _define_property(this, "entryName", void 0);
151
140
  _define_property(this, "result", void 0);
152
141
  _define_property(this, "metrics", void 0);
153
- _define_property(this, "logger", void 0);
154
- _define_property(this, "severTiming", void 0);
155
- _define_property(this, "reporter", void 0);
142
+ _define_property(this, "tracker", void 0);
156
143
  _define_property(this, "template", void 0);
157
144
  _define_property(this, "App", void 0);
158
145
  _define_property(this, "fragments", void 0);
@@ -167,10 +154,8 @@ class Entry {
167
154
  this.host = host;
168
155
  this.App = options.App;
169
156
  this.pluginConfig = config;
170
- this.reporter = createSSRReporter(ctx.reporter);
171
- this.severTiming = ctx.serverTiming;
157
+ this.tracker = createSSRTracker(ctx);
172
158
  this.metrics = ctx.metrics;
173
- this.logger = ctx.logger;
174
159
  this.nonce = nonce;
175
160
  this.result = {
176
161
  renderLevel: RenderLevel.CLIENT_RENDER,
@@ -1,7 +1,7 @@
1
1
  import { run } from "@modern-js/utils/runtime-node";
2
2
  import { time } from "@modern-js/utils/universal/time";
3
3
  import { PreRender } from "../../react/prerender";
4
- import { ServerTimingNames } from "../constants";
4
+ import { SSRTimings } from "../tracker";
5
5
  import SSREntry from "./entry";
6
6
  export const render = ({ App, context, config }) => {
7
7
  const ssrContext = context.ssrContext;
@@ -15,10 +15,7 @@ export const render = ({ App, context, config }) => {
15
15
  const end = time();
16
16
  const html = await entry.renderToHtml(context);
17
17
  const cost = end();
18
- entry.logger.info("App Render Total cost = %d ms", cost);
19
- entry.metrics.emitTimer("app.render.cost", cost);
20
- entry.reporter.reportTime("app_render_cost", cost);
21
- entry.severTiming.addServeTiming(ServerTimingNames.SSR_RENDER_TOTAL, cost);
18
+ entry.tracker.trackTiming(SSRTimings.SSR_RENDER_TOTAL, cost);
22
19
  const cacheConfig = PreRender.config();
23
20
  if (cacheConfig) {
24
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
+ }
@@ -1,6 +1,9 @@
1
1
  export declare const DOC_EXT: string[];
2
2
  export declare const DOCUMENT_META_PLACEHOLDER: string;
3
3
  export declare const HTML_SEPARATOR = "<!--<?- html ?>-->";
4
+ export declare const HEAD_PARTICALS_SEPARATOR: string;
5
+ export declare const BODY_PARTICALS_SEPARATOR: string;
6
+ export declare const TOP_PARTICALS_SEPARATOR: string;
4
7
  export declare const HTML_SSRDATASCRIPT_SEPARATOR = "<!--<?- SSRDataScript ?>-->";
5
8
  export declare const DOCUMENT_SSR_PLACEHOLDER: string;
6
9
  export declare const DOCUMENT_CHUNKSMAP_PLACEHOLDER: string;
@@ -8,7 +11,6 @@ export declare const DOCUMENT_SSRDATASCRIPT_PLACEHOLDER: string;
8
11
  export declare const DOCUMENT_FILE_NAME = "Document";
9
12
  export declare const DOCUMENT_SCRIPTS_PLACEHOLDER: string;
10
13
  export declare const DOCUMENT_LINKS_PLACEHOLDER: string;
11
- export declare const DOCUMENT_NO_SCRIPTE_PLACEHOLDER: string;
12
14
  export declare const DOCUMENT_SCRIPT_PLACEHOLDER_START: string;
13
15
  export declare const DOCUMENT_SCRIPT_PLACEHOLDER_END: string;
14
16
  export declare const DOCUMENT_STYLE_PLACEHOLDER_START: 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';
@@ -1,5 +1,5 @@
1
1
  import { RuntimeContext, ModernSSRReactComponent, SSRPluginConfig } from '../types';
2
- import { SSRReporter } from '../reporter';
2
+ import { SSRTracker } from '../tracker';
3
3
  import { SSRServerContext, RenderResult } from './type';
4
4
  type EntryOptions = {
5
5
  ctx: SSRServerContext;
@@ -10,9 +10,7 @@ export default class Entry {
10
10
  entryName: string;
11
11
  result: RenderResult;
12
12
  metrics: SSRServerContext['metrics'];
13
- logger: SSRServerContext['logger'];
14
- severTiming: SSRServerContext['serverTiming'];
15
- reporter: SSRReporter;
13
+ tracker: SSRTracker;
16
14
  private readonly template;
17
15
  private readonly App;
18
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.29.0",
18
+ "version": "2.31.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.29.0",
177
- "@modern-js/types": "2.29.0",
178
- "@modern-js/utils": "2.29.0"
176
+ "@modern-js/plugin": "2.31.0",
177
+ "@modern-js/types": "2.31.0",
178
+ "@modern-js/utils": "2.31.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.29.0",
200
- "@modern-js/core": "2.29.0",
201
- "@modern-js/server-core": "2.29.0",
202
- "@scripts/build": "2.29.0",
203
- "@scripts/jest-config": "2.29.0"
199
+ "@modern-js/app-tools": "2.31.0",
200
+ "@modern-js/core": "2.31.0",
201
+ "@modern-js/server-core": "2.31.0",
202
+ "@scripts/jest-config": "2.31.0",
203
+ "@scripts/build": "2.31.0"
204
204
  },
205
205
  "sideEffects": false,
206
206
  "publishConfig": {
@@ -1,27 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "createSSRReporter", {
6
- enumerable: true,
7
- get: function() {
8
- return createSSRReporter;
9
- }
10
- });
11
- function createSSRReporter(reporter) {
12
- const _reporter = {
13
- get sessionId() {
14
- return reporter.sessionId;
15
- },
16
- get userId() {
17
- return reporter.userId;
18
- },
19
- reportError(content, e) {
20
- reporter.reportError(`SSR Error - ${content}`, e);
21
- },
22
- reportTime(name, cost) {
23
- reporter.reportTiming(`ssr_${name}`, cost);
24
- }
25
- };
26
- return _reporter;
27
- }
@@ -1,17 +0,0 @@
1
- export function createSSRReporter(reporter) {
2
- var _reporter = {
3
- get sessionId() {
4
- return reporter.sessionId;
5
- },
6
- get userId() {
7
- return reporter.userId;
8
- },
9
- reportError: function reportError(content, e) {
10
- reporter.reportError("SSR Error - ".concat(content), e);
11
- },
12
- reportTime: function reportTime(name, cost) {
13
- reporter.reportTiming("ssr_".concat(name), cost);
14
- }
15
- };
16
- return _reporter;
17
- }
@@ -1,17 +0,0 @@
1
- export function createSSRReporter(reporter) {
2
- const _reporter = {
3
- get sessionId() {
4
- return reporter.sessionId;
5
- },
6
- get userId() {
7
- return reporter.userId;
8
- },
9
- reportError(content, e) {
10
- reporter.reportError(`SSR Error - ${content}`, e);
11
- },
12
- reportTime(name, cost) {
13
- reporter.reportTiming(`ssr_${name}`, cost);
14
- }
15
- };
16
- return _reporter;
17
- }
@@ -1,8 +0,0 @@
1
- import { SSRServerContext } from './types';
2
- export type SSRReporter = ReturnType<typeof createSSRReporter>;
3
- export declare function createSSRReporter(reporter: SSRServerContext['reporter']): {
4
- readonly sessionId: string | undefined;
5
- readonly userId: string | undefined;
6
- reportError(content: string, e: Error): void;
7
- reportTime(name: string, cost: number): void;
8
- };