@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.
- package/CHANGELOG.md +38 -0
- package/dist/cjs/document/Body.js +1 -0
- package/dist/cjs/document/Head.js +2 -0
- package/dist/cjs/document/cli/index.js +8 -1
- package/dist/cjs/document/constants.js +12 -5
- package/dist/cjs/router/runtime/plugin.js +49 -37
- package/dist/cjs/ssr/cli/index.js +19 -13
- package/dist/cjs/ssr/serverRender/renderToString/entry.js +10 -25
- package/dist/cjs/ssr/serverRender/renderToString/index.js +2 -5
- package/dist/cjs/ssr/serverRender/tracker.js +86 -0
- package/dist/esm/document/Body.js +2 -1
- package/dist/esm/document/Head.js +3 -1
- package/dist/esm/document/cli/index.js +9 -2
- package/dist/esm/document/constants.js +4 -2
- package/dist/esm/router/runtime/plugin.js +52 -40
- package/dist/esm/ssr/cli/index.js +19 -13
- package/dist/esm/ssr/serverRender/renderToString/entry.js +10 -25
- package/dist/esm/ssr/serverRender/renderToString/index.js +2 -5
- package/dist/esm/ssr/serverRender/tracker.js +61 -0
- package/dist/esm-node/document/Body.js +2 -1
- package/dist/esm-node/document/Head.js +3 -1
- package/dist/esm-node/document/cli/index.js +9 -2
- package/dist/esm-node/document/constants.js +3 -2
- package/dist/esm-node/router/runtime/plugin.js +50 -38
- package/dist/esm-node/ssr/cli/index.js +19 -13
- package/dist/esm-node/ssr/serverRender/renderToString/entry.js +10 -25
- package/dist/esm-node/ssr/serverRender/renderToString/index.js +2 -5
- package/dist/esm-node/ssr/serverRender/tracker.js +64 -0
- package/dist/types/document/constants.d.ts +3 -1
- package/dist/types/ssr/index.node.d.ts +1 -1
- package/dist/types/ssr/serverRender/renderToString/entry.d.ts +2 -4
- package/dist/types/ssr/serverRender/tracker.d.ts +21 -0
- package/package.json +9 -9
- package/dist/cjs/ssr/serverRender/reporter.js +0 -27
- package/dist/esm/ssr/serverRender/reporter.js +0 -17
- package/dist/esm-node/ssr/serverRender/reporter.js +0 -17
- package/dist/types/ssr/serverRender/reporter.d.ts +0 -8
|
@@ -2,7 +2,7 @@ import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
|
|
|
2
2
|
import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
|
|
3
3
|
import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
|
|
4
4
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
|
-
import { useContext } from "react";
|
|
5
|
+
import { useContext, useMemo } from "react";
|
|
6
6
|
import { createBrowserRouter, createHashRouter, RouterProvider, createRoutesFromElements, useMatches, useLocation } from "@modern-js/utils/runtime/router";
|
|
7
7
|
import hoistNonReactStatics from "hoist-non-react-statics";
|
|
8
8
|
import { parsedJSONFromElement } from "@modern-js/utils/runtime-browser";
|
|
@@ -63,53 +63,65 @@ export var routerPlugin = function(param) {
|
|
|
63
63
|
});
|
|
64
64
|
}
|
|
65
65
|
var getRouteApp = function() {
|
|
66
|
-
|
|
67
|
-
var _window__SERVER_DATA
|
|
68
|
-
beforeCreateRouter = false;
|
|
69
|
-
routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
|
|
70
|
-
routesConfig: finalRouteConfig,
|
|
71
|
-
props: props
|
|
72
|
-
}));
|
|
73
|
-
var runner = api.useHookRunners();
|
|
74
|
-
routes = runner.modifyRoutes(routes);
|
|
66
|
+
var useCreateRouter = function(props) {
|
|
67
|
+
var _window__SERVER_DATA;
|
|
75
68
|
var baseUrl = ((_window__SERVER_DATA = window._SERVER_DATA) === null || _window__SERVER_DATA === void 0 ? void 0 : _window__SERVER_DATA.router.baseUrl) || select(location.pathname);
|
|
76
69
|
var _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
|
|
77
70
|
var hydrationData = window._ROUTER_DATA;
|
|
78
|
-
if ((_hydrationData = hydrationData) === null || _hydrationData === void 0 ? void 0 : _hydrationData.errors) {
|
|
79
|
-
hydrationData = _object_spread_props(_object_spread({}, hydrationData), {
|
|
80
|
-
errors: deserializeErrors(hydrationData.errors)
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
var router = supportHtml5History ? createBrowserRouter(routes, {
|
|
84
|
-
basename: _basename,
|
|
85
|
-
hydrationData: hydrationData
|
|
86
|
-
}) : createHashRouter(routes, {
|
|
87
|
-
basename: _basename,
|
|
88
|
-
hydrationData: hydrationData
|
|
89
|
-
});
|
|
90
71
|
var runtimeContext = useContext(RuntimeReactContext);
|
|
91
|
-
|
|
72
|
+
var getBlockNavState = runtimeContext.unstable_getBlockNavState;
|
|
73
|
+
return useMemo(function() {
|
|
74
|
+
var _hydrationData;
|
|
75
|
+
if ((_hydrationData = hydrationData) === null || _hydrationData === void 0 ? void 0 : _hydrationData.errors) {
|
|
76
|
+
hydrationData = _object_spread_props(_object_spread({}, hydrationData), {
|
|
77
|
+
errors: deserializeErrors(hydrationData.errors)
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
|
|
81
|
+
routesConfig: finalRouteConfig,
|
|
82
|
+
props: props
|
|
83
|
+
}));
|
|
84
|
+
var runner = api.useHookRunners();
|
|
85
|
+
routes = runner.modifyRoutes(routes);
|
|
86
|
+
var router = supportHtml5History ? createBrowserRouter(routes, {
|
|
87
|
+
basename: _basename,
|
|
88
|
+
hydrationData: hydrationData
|
|
89
|
+
}) : createHashRouter(routes, {
|
|
90
|
+
basename: _basename,
|
|
91
|
+
hydrationData: hydrationData
|
|
92
|
+
});
|
|
93
|
+
var originSubscribe = router.subscribe;
|
|
94
|
+
router.subscribe = function(listener) {
|
|
95
|
+
var wrapedListener = function() {
|
|
96
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
97
|
+
args[_key] = arguments[_key];
|
|
98
|
+
}
|
|
99
|
+
var blockRoute = getBlockNavState ? getBlockNavState() : false;
|
|
100
|
+
if (blockRoute) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
return listener.apply(void 0, _to_consumable_array(args));
|
|
104
|
+
};
|
|
105
|
+
return originSubscribe(wrapedListener);
|
|
106
|
+
};
|
|
92
107
|
Object.defineProperty(runtimeContext, "remixRouter", {
|
|
93
108
|
get: function get() {
|
|
94
109
|
return router;
|
|
95
|
-
}
|
|
110
|
+
},
|
|
111
|
+
configurable: true
|
|
96
112
|
});
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
return listener.apply(void 0, _to_consumable_array(args));
|
|
110
|
-
};
|
|
111
|
-
return originSubscribe(wrapedListener);
|
|
112
|
-
};
|
|
113
|
+
return router;
|
|
114
|
+
}, [
|
|
115
|
+
finalRouteConfig,
|
|
116
|
+
props,
|
|
117
|
+
_basename,
|
|
118
|
+
hydrationData,
|
|
119
|
+
getBlockNavState
|
|
120
|
+
]);
|
|
121
|
+
};
|
|
122
|
+
return function(props) {
|
|
123
|
+
beforeCreateRouter = false;
|
|
124
|
+
var router = useCreateRouter(props);
|
|
113
125
|
return /* @__PURE__ */ _jsx(App, _object_spread_props(_object_spread({}, props), {
|
|
114
126
|
children: /* @__PURE__ */ _jsx(RouterProvider, {
|
|
115
127
|
router: router
|
|
@@ -8,8 +8,8 @@ var hasStringSSREntry = function(userConfig) {
|
|
|
8
8
|
var isStreaming = function(ssr) {
|
|
9
9
|
return ssr && typeof ssr === "object" && ssr.mode === "stream";
|
|
10
10
|
};
|
|
11
|
-
var server = userConfig.server;
|
|
12
|
-
if (((_server = server) === null || _server === void 0 ? void 0 : _server.ssr) && !isStreaming(server.ssr)) {
|
|
11
|
+
var server = userConfig.server, output = userConfig.output;
|
|
12
|
+
if ((((_server = server) === null || _server === void 0 ? void 0 : _server.ssr) || output.ssg) && !isStreaming(server.ssr)) {
|
|
13
13
|
return true;
|
|
14
14
|
}
|
|
15
15
|
if (((_server1 = server) === null || _server1 === void 0 ? void 0 : _server1.ssrByEntries) && typeof server.ssrByEntries === "object") {
|
|
@@ -38,6 +38,11 @@ var hasStringSSREntry = function(userConfig) {
|
|
|
38
38
|
}
|
|
39
39
|
return false;
|
|
40
40
|
};
|
|
41
|
+
var checkUseStringSSR = function(config) {
|
|
42
|
+
var _output;
|
|
43
|
+
var output = config.output;
|
|
44
|
+
return Boolean((_output = output) === null || _output === void 0 ? void 0 : _output.ssg) || hasStringSSREntry(config);
|
|
45
|
+
};
|
|
41
46
|
export var ssrPlugin = function() {
|
|
42
47
|
return {
|
|
43
48
|
name: "@modern-js/plugin-ssr",
|
|
@@ -51,29 +56,30 @@ export var ssrPlugin = function() {
|
|
|
51
56
|
config: function config() {
|
|
52
57
|
var appContext = api.useAppContext();
|
|
53
58
|
pluginsExportsUtils = createRuntimeExportsUtils(appContext.internalDirectory, "plugins");
|
|
54
|
-
var userConfig = api.useConfigContext();
|
|
55
59
|
var _api_useAppContext = api.useAppContext(), _api_useAppContext_bundlerType = _api_useAppContext.bundlerType, bundlerType = _api_useAppContext_bundlerType === void 0 ? "webpack" : _api_useAppContext_bundlerType;
|
|
56
|
-
var
|
|
60
|
+
var babelHandler = function() {
|
|
57
61
|
if (bundlerType === "webpack") {
|
|
58
62
|
return function(config2) {
|
|
59
63
|
var _config_plugins;
|
|
64
|
+
var userConfig = api.useResolvedConfigContext();
|
|
60
65
|
(_config_plugins = config2.plugins) === null || _config_plugins === void 0 ? void 0 : _config_plugins.push(path.join(__dirname, "./babel-plugin-ssr-loader-id"));
|
|
61
|
-
if (isUseSSRBundle(userConfig) &&
|
|
66
|
+
if (isUseSSRBundle(userConfig) && checkUseStringSSR(userConfig)) {
|
|
62
67
|
var _config_plugins1;
|
|
63
68
|
(_config_plugins1 = config2.plugins) === null || _config_plugins1 === void 0 ? void 0 : _config_plugins1.push(require.resolve("@loadable/babel-plugin"));
|
|
64
69
|
}
|
|
65
70
|
};
|
|
66
71
|
} else if (bundlerType === "rspack") {
|
|
67
|
-
|
|
68
|
-
|
|
72
|
+
return function(config2) {
|
|
73
|
+
var userConfig = api.useResolvedConfigContext();
|
|
74
|
+
if (isUseSSRBundle(userConfig)) {
|
|
69
75
|
var _config_plugins;
|
|
70
76
|
(_config_plugins = config2.plugins) === null || _config_plugins === void 0 ? void 0 : _config_plugins.push(path.join(__dirname, "./babel-plugin-ssr-loader-id"));
|
|
71
|
-
if (
|
|
77
|
+
if (checkUseStringSSR(userConfig)) {
|
|
72
78
|
var _config_plugins1;
|
|
73
79
|
(_config_plugins1 = config2.plugins) === null || _config_plugins1 === void 0 ? void 0 : _config_plugins1.push(require.resolve("@loadable/babel-plugin"));
|
|
74
80
|
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
81
|
+
}
|
|
82
|
+
};
|
|
77
83
|
}
|
|
78
84
|
}();
|
|
79
85
|
return {
|
|
@@ -91,8 +97,8 @@ export var ssrPlugin = function() {
|
|
|
91
97
|
tools: {
|
|
92
98
|
bundlerChain: function bundlerChain(chain, param) {
|
|
93
99
|
var isServer = param.isServer, isServiceWorker = param.isServiceWorker, CHAIN_ID = param.CHAIN_ID;
|
|
94
|
-
var
|
|
95
|
-
if (isUseSSRBundle(
|
|
100
|
+
var userConfig = api.useResolvedConfigContext();
|
|
101
|
+
if (isUseSSRBundle(userConfig) && !isServer && !isServiceWorker && checkUseStringSSR(userConfig)) {
|
|
96
102
|
var LoadableBundlerPlugin = require("./loadable-bundler-plugin.js");
|
|
97
103
|
chain.plugin(CHAIN_ID.PLUGIN.LOADABLE).use(LoadableBundlerPlugin, [
|
|
98
104
|
{
|
|
@@ -101,7 +107,7 @@ export var ssrPlugin = function() {
|
|
|
101
107
|
]);
|
|
102
108
|
}
|
|
103
109
|
},
|
|
104
|
-
babel:
|
|
110
|
+
babel: babelHandler
|
|
105
111
|
}
|
|
106
112
|
};
|
|
107
113
|
},
|
|
@@ -14,13 +14,12 @@ 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 {
|
|
18
|
-
import { ServerTimingNames } from "../constants";
|
|
17
|
+
import { SSRErrors, SSRTimings, createSSRTracker } from "../tracker";
|
|
19
18
|
import { toFragments } from "./template";
|
|
20
19
|
import { reduce } from "./reduce";
|
|
21
20
|
import * as loadableRenderer from "./loadable";
|
|
22
21
|
import * as styledComponentRenderer from "./styledComponent";
|
|
23
|
-
var buildTemplateData = function(context, data, renderLevel,
|
|
22
|
+
var buildTemplateData = function(context, data, renderLevel, tracker) {
|
|
24
23
|
var request = context.request, enableUnsafeCtx = context.enableUnsafeCtx;
|
|
25
24
|
var unsafeContext = {
|
|
26
25
|
headers: request.headers
|
|
@@ -36,7 +35,7 @@ var buildTemplateData = function(context, data, renderLevel, reporter) {
|
|
|
36
35
|
url: request.url
|
|
37
36
|
}, enableUnsafeCtx ? unsafeContext : {}),
|
|
38
37
|
reporter: {
|
|
39
|
-
sessionId:
|
|
38
|
+
sessionId: tracker.sessionId
|
|
40
39
|
}
|
|
41
40
|
},
|
|
42
41
|
renderLevel: renderLevel
|
|
@@ -49,9 +48,7 @@ var Entry = /* @__PURE__ */ function() {
|
|
|
49
48
|
_define_property(this, "entryName", void 0);
|
|
50
49
|
_define_property(this, "result", void 0);
|
|
51
50
|
_define_property(this, "metrics", void 0);
|
|
52
|
-
_define_property(this, "
|
|
53
|
-
_define_property(this, "severTiming", void 0);
|
|
54
|
-
_define_property(this, "reporter", void 0);
|
|
51
|
+
_define_property(this, "tracker", void 0);
|
|
55
52
|
_define_property(this, "template", void 0);
|
|
56
53
|
_define_property(this, "App", void 0);
|
|
57
54
|
_define_property(this, "fragments", void 0);
|
|
@@ -66,10 +63,8 @@ var Entry = /* @__PURE__ */ function() {
|
|
|
66
63
|
this.host = host;
|
|
67
64
|
this.App = options.App;
|
|
68
65
|
this.pluginConfig = config;
|
|
69
|
-
this.
|
|
70
|
-
this.severTiming = ctx.serverTiming;
|
|
66
|
+
this.tracker = createSSRTracker(ctx);
|
|
71
67
|
this.metrics = ctx.metrics;
|
|
72
|
-
this.logger = ctx.logger;
|
|
73
68
|
this.nonce = nonce;
|
|
74
69
|
this.result = {
|
|
75
70
|
renderLevel: RenderLevel.CLIENT_RENDER,
|
|
@@ -124,7 +119,7 @@ var Entry = /* @__PURE__ */ function() {
|
|
|
124
119
|
errors: serializeErrors(routerContext.errors)
|
|
125
120
|
} : void 0;
|
|
126
121
|
html = "";
|
|
127
|
-
templateData = buildTemplateData(ssrContext, prefetchData, _this.result.renderLevel, _this.
|
|
122
|
+
templateData = buildTemplateData(ssrContext, prefetchData, _this.result.renderLevel, _this.tracker);
|
|
128
123
|
SSRData = _this.getSSRDataScript(templateData, routerData);
|
|
129
124
|
_iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
|
|
130
125
|
try {
|
|
@@ -186,10 +181,7 @@ var Entry = /* @__PURE__ */ function() {
|
|
|
186
181
|
prefetchData = _state.sent();
|
|
187
182
|
_this.result.renderLevel = RenderLevel.SERVER_PREFETCH;
|
|
188
183
|
prefetchCost = end();
|
|
189
|
-
_this.
|
|
190
|
-
_this.metrics.emitTimer("app.prefetch.cost", prefetchCost);
|
|
191
|
-
_this.reporter.reportTime("app_prefetch_cost", prefetchCost);
|
|
192
|
-
_this.severTiming.addServeTiming(ServerTimingNames.SSR_PREFETCH, prefetchCost);
|
|
184
|
+
_this.tracker.trackTiming(SSRTimings.SSR_PREFETCH, prefetchCost);
|
|
193
185
|
return [
|
|
194
186
|
3,
|
|
195
187
|
4
|
|
@@ -197,9 +189,7 @@ var Entry = /* @__PURE__ */ function() {
|
|
|
197
189
|
case 3:
|
|
198
190
|
e = _state.sent();
|
|
199
191
|
_this.result.renderLevel = RenderLevel.CLIENT_RENDER;
|
|
200
|
-
_this.
|
|
201
|
-
_this.reporter.reportError("App Prefetch Render", e);
|
|
202
|
-
_this.metrics.emitCounter("app.prefetch.render.error", 1);
|
|
192
|
+
_this.tracker.trackError(SSRErrors.PREFETCH, e);
|
|
203
193
|
return [
|
|
204
194
|
3,
|
|
205
195
|
4
|
|
@@ -243,15 +233,10 @@ var Entry = /* @__PURE__ */ function() {
|
|
|
243
233
|
}
|
|
244
234
|
]);
|
|
245
235
|
var cost = end();
|
|
246
|
-
this.
|
|
247
|
-
this.metrics.emitTimer("app.render.html.cost", cost);
|
|
248
|
-
this.reporter.reportTime("app_render_html_cost", cost);
|
|
249
|
-
this.severTiming.addServeTiming(ServerTimingNames.SSR_RENDER_HTML, cost);
|
|
236
|
+
this.tracker.trackTiming(SSRTimings.SSR_RENDER_HTML, cost);
|
|
250
237
|
this.result.renderLevel = RenderLevel.SERVER_RENDER;
|
|
251
238
|
} catch (e) {
|
|
252
|
-
this.
|
|
253
|
-
this.reporter.reportError("App Render To HTML", e);
|
|
254
|
-
this.metrics.emitCounter("app.render.html.error", 1);
|
|
239
|
+
this.tracker.trackError(SSRErrors.RENDER_HTML, e);
|
|
255
240
|
}
|
|
256
241
|
return html;
|
|
257
242
|
}
|
|
@@ -3,7 +3,7 @@ import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
|
|
|
3
3
|
import { run } from "@modern-js/utils/runtime-node";
|
|
4
4
|
import { time } from "@modern-js/utils/universal/time";
|
|
5
5
|
import { PreRender } from "../../react/prerender";
|
|
6
|
-
import {
|
|
6
|
+
import { SSRTimings } from "../tracker";
|
|
7
7
|
import SSREntry from "./entry";
|
|
8
8
|
export var render = function(param) {
|
|
9
9
|
var App = param.App, context = param.context, config = param.config;
|
|
@@ -27,10 +27,7 @@ export var render = function(param) {
|
|
|
27
27
|
case 1:
|
|
28
28
|
html = _state.sent();
|
|
29
29
|
cost = end();
|
|
30
|
-
entry.
|
|
31
|
-
entry.metrics.emitTimer("app.render.cost", cost);
|
|
32
|
-
entry.reporter.reportTime("app_render_cost", cost);
|
|
33
|
-
entry.severTiming.addServeTiming(ServerTimingNames.SSR_RENDER_TOTAL, cost);
|
|
30
|
+
entry.tracker.trackTiming(SSRTimings.SSR_RENDER_TOTAL, cost);
|
|
34
31
|
cacheConfig = PreRender.config();
|
|
35
32
|
if (cacheConfig) {
|
|
36
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
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useContext } from "react";
|
|
3
|
-
import { DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER } from "./constants";
|
|
3
|
+
import { BODY_PARTICALS_SEPARATOR, DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER } from "./constants";
|
|
4
4
|
import { DocumentStructureContext } from "./DocumentStructureContext";
|
|
5
5
|
import { DefaultRoot } from "./Root";
|
|
6
6
|
export function Body(props) {
|
|
@@ -11,6 +11,7 @@ export function Body(props) {
|
|
|
11
11
|
children: [
|
|
12
12
|
hasSetRoot ? null : /* @__PURE__ */ _jsx(DefaultRoot, {}),
|
|
13
13
|
children,
|
|
14
|
+
`${BODY_PARTICALS_SEPARATOR}`,
|
|
14
15
|
`${DOCUMENT_CHUNKSMAP_PLACEHOLDER}`,
|
|
15
16
|
`${DOCUMENT_SSRDATASCRIPT_PLACEHOLDER}`
|
|
16
17
|
]
|
|
@@ -3,16 +3,18 @@ import { useContext } from "react";
|
|
|
3
3
|
import { DocumentStructureContext } from "./DocumentStructureContext";
|
|
4
4
|
import { Scripts } from "./Scripts";
|
|
5
5
|
import { Links } from "./Links";
|
|
6
|
-
import { DOCUMENT_META_PLACEHOLDER } from "./constants";
|
|
6
|
+
import { DOCUMENT_META_PLACEHOLDER, HEAD_PARTICALS_SEPARATOR, TOP_PARTICALS_SEPARATOR } from "./constants";
|
|
7
7
|
export function Head(props) {
|
|
8
8
|
const { hasSetScripts, hasSetLinks } = useContext(DocumentStructureContext);
|
|
9
9
|
const { children, ...rest } = props;
|
|
10
10
|
return /* @__PURE__ */ _jsxs("head", {
|
|
11
11
|
...rest,
|
|
12
12
|
children: [
|
|
13
|
+
`${TOP_PARTICALS_SEPARATOR}`,
|
|
13
14
|
`${DOCUMENT_META_PLACEHOLDER}`,
|
|
14
15
|
!hasSetLinks && /* @__PURE__ */ _jsx(Links, {}),
|
|
15
16
|
!hasSetScripts && /* @__PURE__ */ _jsx(Scripts, {}),
|
|
17
|
+
`${HEAD_PARTICALS_SEPARATOR}`,
|
|
16
18
|
children
|
|
17
19
|
]
|
|
18
20
|
});
|
|
@@ -4,7 +4,7 @@ import ReactDomServer from "react-dom/server";
|
|
|
4
4
|
import { build } from "esbuild";
|
|
5
5
|
import { createDebugger, findExists, fs } from "@modern-js/utils";
|
|
6
6
|
import { DocumentContext } from "../DocumentContext";
|
|
7
|
-
import { DOCUMENT_SCRIPTS_PLACEHOLDER, DOCUMENT_LINKS_PLACEHOLDER, DOCUMENT_FILE_NAME, DOCUMENT_META_PLACEHOLDER, PLACEHOLDER_REPLACER_MAP, DOC_EXT, DOCUMENT_SSR_PLACEHOLDER, DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, DOCUMENT_SCRIPT_PLACEHOLDER_START, DOCUMENT_SCRIPT_PLACEHOLDER_END, HTML_SEPARATOR, DOCUMENT_COMMENT_PLACEHOLDER_START, DOCUMENT_COMMENT_PLACEHOLDER_END, DOCUMENT_STYLE_PLACEHOLDER_START, DOCUMENT_STYLE_PLACEHOLDER_END } from "../constants";
|
|
7
|
+
import { DOCUMENT_SCRIPTS_PLACEHOLDER, DOCUMENT_LINKS_PLACEHOLDER, DOCUMENT_FILE_NAME, DOCUMENT_META_PLACEHOLDER, PLACEHOLDER_REPLACER_MAP, DOC_EXT, DOCUMENT_SSR_PLACEHOLDER, DOCUMENT_CHUNKSMAP_PLACEHOLDER, DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, DOCUMENT_SCRIPT_PLACEHOLDER_START, DOCUMENT_SCRIPT_PLACEHOLDER_END, HTML_SEPARATOR, DOCUMENT_COMMENT_PLACEHOLDER_START, DOCUMENT_COMMENT_PLACEHOLDER_END, DOCUMENT_STYLE_PLACEHOLDER_START, DOCUMENT_STYLE_PLACEHOLDER_END, TOP_PARTICALS_SEPARATOR, HEAD_PARTICALS_SEPARATOR, BODY_PARTICALS_SEPARATOR } from "../constants";
|
|
8
8
|
const debug = createDebugger("html_genarate");
|
|
9
9
|
export const getDocumenByEntryName = function(entrypoints, entryName, fallbackDir) {
|
|
10
10
|
var _entrypoints_find;
|
|
@@ -45,7 +45,7 @@ export const documentPlugin = () => ({
|
|
|
45
45
|
return null;
|
|
46
46
|
}
|
|
47
47
|
return async ({ htmlWebpackPlugin }) => {
|
|
48
|
-
var _tsConfig;
|
|
48
|
+
var _tsConfig, _partialsByEntrypoint;
|
|
49
49
|
const config = api.useResolvedConfigContext();
|
|
50
50
|
const documentParams = getDocParams({
|
|
51
51
|
config,
|
|
@@ -110,10 +110,17 @@ export const documentPlugin = () => ({
|
|
|
110
110
|
}, React.createElement(Document, null));
|
|
111
111
|
let html = ReactDomServer.renderToStaticMarkup(HTMLElement);
|
|
112
112
|
debug("entry %s's document jsx rendered html: %o", entryName, html);
|
|
113
|
+
const { partialsByEntrypoint } = api.useAppContext();
|
|
113
114
|
const scripts = [
|
|
114
115
|
htmlWebpackPlugin.tags.headTags.filter((item) => item.tagName === "script").join(""),
|
|
115
116
|
htmlWebpackPlugin.tags.bodyTags.toString()
|
|
116
117
|
].join("");
|
|
118
|
+
if ((_partialsByEntrypoint = partialsByEntrypoint) === null || _partialsByEntrypoint === void 0 ? void 0 : _partialsByEntrypoint[entryName]) {
|
|
119
|
+
const partialsTop = partialsByEntrypoint[entryName].top.join("\n");
|
|
120
|
+
const partialsHead = partialsByEntrypoint[entryName].head.join("\n");
|
|
121
|
+
const partialsBody = partialsByEntrypoint[entryName].body.join("\n");
|
|
122
|
+
html = html.replace(TOP_PARTICALS_SEPARATOR, partialsTop).replace(HEAD_PARTICALS_SEPARATOR, partialsHead).replace(BODY_PARTICALS_SEPARATOR, partialsBody);
|
|
123
|
+
}
|
|
117
124
|
const links = [
|
|
118
125
|
htmlWebpackPlugin.tags.headTags.filter((item) => item.tagName === "link").join("")
|
|
119
126
|
].join("");
|
|
@@ -7,6 +7,9 @@ export const DOC_EXT = [
|
|
|
7
7
|
];
|
|
8
8
|
export const DOCUMENT_META_PLACEHOLDER = encodeURIComponent("<%= meta %>");
|
|
9
9
|
export const HTML_SEPARATOR = "<!--<?- html ?>-->";
|
|
10
|
+
export const HEAD_PARTICALS_SEPARATOR = encodeURIComponent("<!--<?- partials.head ?>-->");
|
|
11
|
+
export const BODY_PARTICALS_SEPARATOR = encodeURIComponent("<!--<?- partials.body ?>-->");
|
|
12
|
+
export const TOP_PARTICALS_SEPARATOR = encodeURIComponent("<!--<?- partials.top ?>-->");
|
|
10
13
|
export const HTML_SSRDATASCRIPT_SEPARATOR = "<!--<?- SSRDataScript ?>-->";
|
|
11
14
|
export const DOCUMENT_SSR_PLACEHOLDER = encodeURIComponent(HTML_SEPARATOR);
|
|
12
15
|
export const DOCUMENT_CHUNKSMAP_PLACEHOLDER = encodeURIComponent(HTML_CHUNKSMAP_SEPARATOR);
|
|
@@ -14,7 +17,6 @@ export const DOCUMENT_SSRDATASCRIPT_PLACEHOLDER = encodeURIComponent(HTML_SSRDAT
|
|
|
14
17
|
export const DOCUMENT_FILE_NAME = "Document";
|
|
15
18
|
export const DOCUMENT_SCRIPTS_PLACEHOLDER = encodeURIComponent("<!-- chunk scripts placeholder -->");
|
|
16
19
|
export const DOCUMENT_LINKS_PLACEHOLDER = encodeURIComponent("<!-- chunk links placeholder -->");
|
|
17
|
-
export const DOCUMENT_NO_SCRIPTE_PLACEHOLDER = encodeURIComponent("<!-- no-script -->");
|
|
18
20
|
export const DOCUMENT_SCRIPT_PLACEHOLDER_START = encodeURIComponent("<!-- script-start -->");
|
|
19
21
|
export const DOCUMENT_SCRIPT_PLACEHOLDER_END = encodeURIComponent("<!-- script-end -->");
|
|
20
22
|
export const DOCUMENT_STYLE_PLACEHOLDER_START = encodeURIComponent("<!-- style-start -->");
|
|
@@ -22,7 +24,6 @@ export const DOCUMENT_STYLE_PLACEHOLDER_END = encodeURIComponent("<!-- style-end
|
|
|
22
24
|
export const DOCUMENT_COMMENT_PLACEHOLDER_START = encodeURIComponent("<!-- comment-start -->");
|
|
23
25
|
export const DOCUMENT_COMMENT_PLACEHOLDER_END = encodeURIComponent("<!-- comment-end -->");
|
|
24
26
|
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
27
|
[DOCUMENT_SSR_PLACEHOLDER]: HTML_SEPARATOR,
|
|
27
28
|
[DOCUMENT_CHUNKSMAP_PLACEHOLDER]: HTML_CHUNKSMAP_SEPARATOR,
|
|
28
29
|
[DOCUMENT_SSRDATASCRIPT_PLACEHOLDER]: HTML_SSRDATASCRIPT_SEPARATOR
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useContext } from "react";
|
|
2
|
+
import { useContext, useMemo } from "react";
|
|
3
3
|
import { createBrowserRouter, createHashRouter, RouterProvider, createRoutesFromElements, useMatches, useLocation } from "@modern-js/utils/runtime/router";
|
|
4
4
|
import hoistNonReactStatics from "hoist-non-react-statics";
|
|
5
5
|
import { parsedJSONFromElement } from "@modern-js/utils/runtime-browser";
|
|
@@ -53,51 +53,63 @@ export const routerPlugin = ({ serverBase = [], supportHtml5History = true, base
|
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
55
|
const getRouteApp = () => {
|
|
56
|
-
|
|
57
|
-
var _window__SERVER_DATA
|
|
58
|
-
beforeCreateRouter = false;
|
|
59
|
-
routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
|
|
60
|
-
routesConfig: finalRouteConfig,
|
|
61
|
-
props
|
|
62
|
-
}));
|
|
63
|
-
const runner = api.useHookRunners();
|
|
64
|
-
routes = runner.modifyRoutes(routes);
|
|
56
|
+
const useCreateRouter = (props) => {
|
|
57
|
+
var _window__SERVER_DATA;
|
|
65
58
|
const baseUrl = ((_window__SERVER_DATA = window._SERVER_DATA) === null || _window__SERVER_DATA === void 0 ? void 0 : _window__SERVER_DATA.router.baseUrl) || select(location.pathname);
|
|
66
59
|
const _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
|
|
67
60
|
let hydrationData = window._ROUTER_DATA;
|
|
68
|
-
if ((_hydrationData = hydrationData) === null || _hydrationData === void 0 ? void 0 : _hydrationData.errors) {
|
|
69
|
-
hydrationData = {
|
|
70
|
-
...hydrationData,
|
|
71
|
-
errors: deserializeErrors(hydrationData.errors)
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
const router = supportHtml5History ? createBrowserRouter(routes, {
|
|
75
|
-
basename: _basename,
|
|
76
|
-
hydrationData
|
|
77
|
-
}) : createHashRouter(routes, {
|
|
78
|
-
basename: _basename,
|
|
79
|
-
hydrationData
|
|
80
|
-
});
|
|
81
61
|
const runtimeContext = useContext(RuntimeReactContext);
|
|
82
|
-
|
|
62
|
+
const { unstable_getBlockNavState: getBlockNavState } = runtimeContext;
|
|
63
|
+
return useMemo(() => {
|
|
64
|
+
var _hydrationData;
|
|
65
|
+
if ((_hydrationData = hydrationData) === null || _hydrationData === void 0 ? void 0 : _hydrationData.errors) {
|
|
66
|
+
hydrationData = {
|
|
67
|
+
...hydrationData,
|
|
68
|
+
errors: deserializeErrors(hydrationData.errors)
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
|
|
72
|
+
routesConfig: finalRouteConfig,
|
|
73
|
+
props
|
|
74
|
+
}));
|
|
75
|
+
const runner = api.useHookRunners();
|
|
76
|
+
routes = runner.modifyRoutes(routes);
|
|
77
|
+
const router = supportHtml5History ? createBrowserRouter(routes, {
|
|
78
|
+
basename: _basename,
|
|
79
|
+
hydrationData
|
|
80
|
+
}) : createHashRouter(routes, {
|
|
81
|
+
basename: _basename,
|
|
82
|
+
hydrationData
|
|
83
|
+
});
|
|
84
|
+
const originSubscribe = router.subscribe;
|
|
85
|
+
router.subscribe = (listener) => {
|
|
86
|
+
const wrapedListener = (...args) => {
|
|
87
|
+
const blockRoute = getBlockNavState ? getBlockNavState() : false;
|
|
88
|
+
if (blockRoute) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
return listener(...args);
|
|
92
|
+
};
|
|
93
|
+
return originSubscribe(wrapedListener);
|
|
94
|
+
};
|
|
83
95
|
Object.defineProperty(runtimeContext, "remixRouter", {
|
|
84
96
|
get() {
|
|
85
97
|
return router;
|
|
86
|
-
}
|
|
98
|
+
},
|
|
99
|
+
configurable: true
|
|
87
100
|
});
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
};
|
|
101
|
+
return router;
|
|
102
|
+
}, [
|
|
103
|
+
finalRouteConfig,
|
|
104
|
+
props,
|
|
105
|
+
_basename,
|
|
106
|
+
hydrationData,
|
|
107
|
+
getBlockNavState
|
|
108
|
+
]);
|
|
109
|
+
};
|
|
110
|
+
return (props) => {
|
|
111
|
+
beforeCreateRouter = false;
|
|
112
|
+
const router = useCreateRouter(props);
|
|
101
113
|
return /* @__PURE__ */ _jsx(App, {
|
|
102
114
|
...props,
|
|
103
115
|
children: /* @__PURE__ */ _jsx(RouterProvider, {
|