@modern-js/runtime 2.21.1 → 2.22.1
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 +44 -0
- package/dist/cjs/cli/index.js +11 -1
- package/dist/cjs/common.js +9 -3
- package/dist/cjs/core/appConfig.js +6 -2
- package/dist/cjs/core/compatible.js +9 -3
- package/dist/cjs/core/index.js +24 -8
- package/dist/cjs/core/loader/index.js +3 -1
- package/dist/cjs/core/loader/loaderManager.js +6 -2
- package/dist/cjs/core/loader/useLoader.js +3 -1
- package/dist/cjs/core/plugin.js +12 -4
- package/dist/cjs/document/Body.js +3 -1
- package/dist/cjs/document/Comment.js +3 -1
- package/dist/cjs/document/DocumentContext.js +3 -1
- package/dist/cjs/document/DocumentStructureContext.js +3 -1
- package/dist/cjs/document/Head.js +6 -2
- package/dist/cjs/document/Html.js +5 -2
- package/dist/cjs/document/Links.js +3 -1
- package/dist/cjs/document/Root.js +6 -2
- package/dist/cjs/document/Script.js +3 -1
- package/dist/cjs/document/Scripts.js +3 -1
- package/dist/cjs/document/Style.js +26 -0
- package/dist/cjs/document/cli/index.js +9 -2
- package/dist/cjs/document/constants.js +59 -17
- package/dist/cjs/document/index.js +1 -0
- package/dist/cjs/exports/head.js +3 -1
- package/dist/cjs/exports/loadable.js +3 -1
- package/dist/cjs/exports/server.js +3 -1
- package/dist/cjs/exports/styled.js +3 -1
- package/dist/cjs/index.js +27 -9
- package/dist/cjs/router/cli/index.js +3 -1
- package/dist/cjs/router/index.js +6 -2
- package/dist/cjs/router/runtime/DefaultNotFound.js +3 -1
- package/dist/cjs/router/runtime/DeferredDataScripts.js +3 -1
- package/dist/cjs/router/runtime/DeferredDataScripts.node.js +12 -5
- package/dist/cjs/router/runtime/PrefetchLink.js +9 -3
- package/dist/cjs/router/runtime/fetch.js +3 -1
- package/dist/cjs/router/runtime/fetch.node.js +3 -1
- package/dist/cjs/router/runtime/fetch.worker.js +3 -1
- package/dist/cjs/router/runtime/hooks.js +3 -1
- package/dist/cjs/router/runtime/index.js +183 -61
- package/dist/cjs/router/runtime/plugin.js +33 -5
- package/dist/cjs/router/runtime/plugin.node.js +33 -8
- package/dist/cjs/router/runtime/utils.js +21 -7
- package/dist/cjs/router/runtime/withRouter.js +3 -1
- package/dist/cjs/runtimeContext.js +6 -2
- package/dist/cjs/ssr/cli/index.js +10 -3
- package/dist/cjs/ssr/index.js +11 -4
- package/dist/cjs/ssr/index.node.js +6 -2
- package/dist/cjs/ssr/prefetch.js +3 -1
- package/dist/cjs/ssr/react/index.js +6 -2
- package/dist/cjs/ssr/react/nossr/index.js +3 -1
- package/dist/cjs/ssr/react/prerender/index.js +3 -1
- package/dist/cjs/ssr/react/prerender/util.js +15 -5
- package/dist/cjs/ssr/react/withCallback/index.js +3 -1
- package/dist/cjs/ssr/serverRender/helmet.js +3 -1
- package/dist/cjs/ssr/serverRender/index.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.share.js +6 -2
- package/dist/cjs/ssr/serverRender/renderToStream/bulidTemplate.before.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToStream/index.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToStream/loadable.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.worker.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToStream/styledComponent.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToStream/template.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToString/entry.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToString/index.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToString/loadable.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToString/reduce.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToString/styledComponent.js +3 -1
- package/dist/cjs/ssr/serverRender/renderToString/template.js +6 -2
- package/dist/cjs/ssr/serverRender/renderToString/type.js +3 -1
- package/dist/cjs/ssr/serverRender/time.js +3 -1
- package/dist/cjs/ssr/serverRender/time.worker.js +3 -1
- package/dist/cjs/ssr/serverRender/types.js +3 -1
- package/dist/cjs/ssr/serverRender/utils.js +15 -5
- package/dist/cjs/ssr/utils.js +15 -5
- package/dist/cjs/state/cli/index.js +3 -1
- package/dist/cjs/state/index.js +6 -2
- package/dist/cjs/state/plugins.js +12 -4
- package/dist/cjs/state/runtime/index.js +3 -1
- package/dist/cjs/state/runtime/plugin.js +3 -1
- package/dist/esm/cli/index.js +8 -0
- package/dist/esm/document/Html.js +8 -3
- package/dist/esm/document/Style.js +14 -0
- package/dist/esm/document/cli/index.js +6 -1
- package/dist/esm/document/constants.js +2 -0
- package/dist/esm/document/index.js +1 -0
- package/dist/esm/router/runtime/DeferredDataScripts.node.js +9 -4
- package/dist/esm/router/runtime/plugin.js +20 -0
- package/dist/esm/router/runtime/plugin.node.js +25 -6
- package/dist/esm/ssr/cli/index.js +10 -2
- package/dist/esm/ssr/index.js +5 -2
- package/dist/esm-node/cli/index.js +8 -0
- package/dist/esm-node/document/Html.js +2 -1
- package/dist/esm-node/document/Style.js +14 -0
- package/dist/esm-node/document/cli/index.js +4 -1
- package/dist/esm-node/document/constants.js +2 -0
- package/dist/esm-node/document/index.js +1 -0
- package/dist/esm-node/router/runtime/DeferredDataScripts.node.js +9 -4
- package/dist/esm-node/router/runtime/plugin.js +20 -0
- package/dist/esm-node/router/runtime/plugin.node.js +24 -5
- package/dist/esm-node/ssr/cli/index.js +7 -2
- package/dist/esm-node/ssr/index.js +5 -2
- package/dist/types/document/Style.d.ts +5 -0
- package/dist/types/document/constants.d.ts +2 -0
- package/dist/types/document/index.d.ts +1 -0
- package/dist/types/router/runtime/DeferredDataScripts.node.d.ts +3 -1
- package/dist/types/runtimeContext.d.ts +5 -1
- package/dist/types/ssr/serverRender/types.d.ts +1 -0
- package/package.json +10 -9
|
@@ -8,7 +8,7 @@ import { serializeErrors } from "./utils";
|
|
|
8
8
|
var setupFnStr = "function s(r,e){_ROUTER_DATA.r=_ROUTER_DATA.r||{},_ROUTER_DATA.r[r]=_ROUTER_DATA.r[r]||{};return new Promise((function(A,R){_ROUTER_DATA.r[r][e]={resolve:A,reject:R}}))};";
|
|
9
9
|
var resolveFnStr = "function r(e,r,o,A){A?_ROUTER_DATA.r[e][r].reject(A):_ROUTER_DATA.r[e][r].resolve(o)};";
|
|
10
10
|
var preResolvedFnStr = "function p(e,r){return void 0!==r?Promise.reject(new Error(r.message)):Promise.resolve(e)};";
|
|
11
|
-
var DeferredDataScripts = function() {
|
|
11
|
+
var DeferredDataScripts = function(props) {
|
|
12
12
|
var context = useContext(DataRouterContext);
|
|
13
13
|
var staticContext = (context || {}).staticContext;
|
|
14
14
|
var hydratedRef = useRef(false);
|
|
@@ -38,6 +38,7 @@ var DeferredDataScripts = function() {
|
|
|
38
38
|
var deferredKeyPromiseStr = deferredKeys.map(function(key) {
|
|
39
39
|
if (pendingKeys.has(key)) {
|
|
40
40
|
deferredDataScripts.push(/* @__PURE__ */ _jsx(DeferredDataScript, {
|
|
41
|
+
nonce: props === null || props === void 0 ? void 0 : props.nonce,
|
|
41
42
|
data: deferredData.data[key],
|
|
42
43
|
dataKey: key,
|
|
43
44
|
routeId: routeId
|
|
@@ -73,6 +74,7 @@ var DeferredDataScripts = function() {
|
|
|
73
74
|
children: [
|
|
74
75
|
!hydratedRef.current && /* @__PURE__ */ _jsx("script", {
|
|
75
76
|
async: true,
|
|
77
|
+
nonce: props === null || props === void 0 ? void 0 : props.nonce,
|
|
76
78
|
suppressHydrationWarning: true,
|
|
77
79
|
dangerouslySetInnerHTML: {
|
|
78
80
|
__html: deferredScripts[0]
|
|
@@ -84,17 +86,19 @@ var DeferredDataScripts = function() {
|
|
|
84
86
|
});
|
|
85
87
|
};
|
|
86
88
|
var DeferredDataScript = function(param) {
|
|
87
|
-
var data = param.data, routeId = param.routeId, dataKey = param.dataKey;
|
|
89
|
+
var data = param.data, routeId = param.routeId, dataKey = param.dataKey, nonce = param.nonce;
|
|
88
90
|
return /* @__PURE__ */ _jsx(Suspense, {
|
|
89
91
|
children: typeof document === "undefined" && data && dataKey && routeId ? /* @__PURE__ */ _jsx(Await, {
|
|
90
92
|
resolve: data,
|
|
91
93
|
errorElement: /* @__PURE__ */ _jsx(ErrorDeferredDataScript, {
|
|
92
94
|
routeId: routeId,
|
|
93
|
-
dataKey: dataKey
|
|
95
|
+
dataKey: dataKey,
|
|
96
|
+
nonce: nonce
|
|
94
97
|
}),
|
|
95
98
|
children: function(data2) {
|
|
96
99
|
return /* @__PURE__ */ _jsx("script", {
|
|
97
100
|
async: true,
|
|
101
|
+
nonce: nonce,
|
|
98
102
|
suppressHydrationWarning: true,
|
|
99
103
|
dangerouslySetInnerHTML: {
|
|
100
104
|
__html: "_ROUTER_DATA.r(".concat(JSON.stringify(routeId), ", ").concat(JSON.stringify(dataKey), ", ").concat(serializeJson(data2), ");")
|
|
@@ -105,9 +109,10 @@ var DeferredDataScript = function(param) {
|
|
|
105
109
|
});
|
|
106
110
|
};
|
|
107
111
|
var ErrorDeferredDataScript = function(param) {
|
|
108
|
-
var routeId = param.routeId, dataKey = param.dataKey;
|
|
112
|
+
var routeId = param.routeId, dataKey = param.dataKey, nonce = param.nonce;
|
|
109
113
|
var error = useAsyncError();
|
|
110
114
|
return /* @__PURE__ */ _jsx("script", {
|
|
115
|
+
nonce: nonce,
|
|
111
116
|
suppressHydrationWarning: true,
|
|
112
117
|
dangerouslySetInnerHTML: {
|
|
113
118
|
__html: "_ROUTER_DATA.r(".concat(JSON.stringify(routeId), ", ").concat(JSON.stringify(dataKey), ", ").concat(void 0, ", ").concat(serializeJson({
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
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 { jsx as _jsx } from "react/jsx-runtime";
|
|
4
|
+
import { useContext } from "react";
|
|
4
5
|
import { createBrowserRouter, createHashRouter, RouterProvider, createRoutesFromElements, useMatches, useLocation } from "@modern-js/utils/runtime/router";
|
|
5
6
|
import hoistNonReactStatics from "hoist-non-react-statics";
|
|
6
7
|
import { parsedJSONFromElement } from "@modern-js/utils/runtime-browser";
|
|
8
|
+
import { RuntimeReactContext } from "../../core";
|
|
7
9
|
import { modifyRoutes as modifyRoutesHook } from "./hooks";
|
|
8
10
|
import { deserializeErrors, renderRoutes, urlJoin } from "./utils";
|
|
9
11
|
export var finalRouteConfig = {
|
|
@@ -83,6 +85,8 @@ export var routerPlugin = function(param) {
|
|
|
83
85
|
basename: _basename,
|
|
84
86
|
hydrationData: hydrationData
|
|
85
87
|
});
|
|
88
|
+
var runtimeContext = useContext(RuntimeReactContext);
|
|
89
|
+
runtimeContext.remixRouter = router;
|
|
86
90
|
return /* @__PURE__ */ _jsx(App, _object_spread_props(_object_spread({}, props), {
|
|
87
91
|
children: /* @__PURE__ */ _jsx(RouterProvider, {
|
|
88
92
|
router: router
|
|
@@ -102,6 +106,22 @@ export var routerPlugin = function(param) {
|
|
|
102
106
|
return next({
|
|
103
107
|
App: RouteApp
|
|
104
108
|
});
|
|
109
|
+
},
|
|
110
|
+
pickContext: function(param2, next) {
|
|
111
|
+
var context = param2.context, pickedContext = param2.pickedContext;
|
|
112
|
+
var remixRouter = context.remixRouter;
|
|
113
|
+
var router = {
|
|
114
|
+
navigate: remixRouter.navigate,
|
|
115
|
+
get location() {
|
|
116
|
+
return remixRouter.state.location;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
return next({
|
|
120
|
+
context: context,
|
|
121
|
+
pickedContext: _object_spread_props(_object_spread({}, pickedContext), {
|
|
122
|
+
router: router
|
|
123
|
+
})
|
|
124
|
+
});
|
|
105
125
|
}
|
|
106
126
|
};
|
|
107
127
|
}
|
|
@@ -87,7 +87,7 @@ export var routerPlugin = function(param) {
|
|
|
87
87
|
init: function init(param2, next) {
|
|
88
88
|
var context = param2.context;
|
|
89
89
|
return _async_to_generator(function() {
|
|
90
|
-
var _context_ssrContext, request, ssrMode, baseUrl, _basename, routes, query, remixRequest, routerContext, router, runner;
|
|
90
|
+
var _context_ssrContext, request, ssrMode, nonce, baseUrl, _basename, routes, query, remixRequest, routerContext, router, runner;
|
|
91
91
|
return _ts_generator(this, function(_state) {
|
|
92
92
|
switch (_state.label) {
|
|
93
93
|
case 0:
|
|
@@ -99,12 +99,15 @@ export var routerPlugin = function(param) {
|
|
|
99
99
|
})
|
|
100
100
|
];
|
|
101
101
|
}
|
|
102
|
-
_context_ssrContext = context.ssrContext, request = _context_ssrContext.request, ssrMode = _context_ssrContext.mode;
|
|
102
|
+
_context_ssrContext = context.ssrContext, request = _context_ssrContext.request, ssrMode = _context_ssrContext.mode, nonce = _context_ssrContext.nonce;
|
|
103
103
|
baseUrl = request.baseUrl;
|
|
104
104
|
_basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
|
|
105
105
|
routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
|
|
106
106
|
routesConfig: routesConfig,
|
|
107
|
-
ssrMode: ssrMode
|
|
107
|
+
ssrMode: ssrMode,
|
|
108
|
+
props: {
|
|
109
|
+
nonce: nonce
|
|
110
|
+
}
|
|
108
111
|
}));
|
|
109
112
|
query = createStaticHandler(routes, {
|
|
110
113
|
basename: _basename
|
|
@@ -123,7 +126,7 @@ export var routerPlugin = function(param) {
|
|
|
123
126
|
];
|
|
124
127
|
}
|
|
125
128
|
router = createStaticRouter(routes, routerContext);
|
|
126
|
-
context.
|
|
129
|
+
context.remixRouter = router;
|
|
127
130
|
context.routerContext = routerContext;
|
|
128
131
|
context.routes = routes;
|
|
129
132
|
context.routeManifest = context.ssrContext.routeManifest;
|
|
@@ -148,10 +151,10 @@ export var routerPlugin = function(param) {
|
|
|
148
151
|
}
|
|
149
152
|
var getRouteApp = function() {
|
|
150
153
|
return function(props) {
|
|
151
|
-
var _useContext = useContext(RuntimeReactContext),
|
|
154
|
+
var _useContext = useContext(RuntimeReactContext), remixRouter = _useContext.remixRouter, routerContext = _useContext.routerContext;
|
|
152
155
|
return /* @__PURE__ */ _jsx(App, _object_spread_props(_object_spread({}, props), {
|
|
153
156
|
children: /* @__PURE__ */ _jsx(StaticRouterProvider, {
|
|
154
|
-
router:
|
|
157
|
+
router: remixRouter,
|
|
155
158
|
context: routerContext,
|
|
156
159
|
hydrate: false
|
|
157
160
|
})
|
|
@@ -167,6 +170,22 @@ export var routerPlugin = function(param) {
|
|
|
167
170
|
return next({
|
|
168
171
|
App: RouteApp
|
|
169
172
|
});
|
|
173
|
+
},
|
|
174
|
+
pickContext: function(param2, next) {
|
|
175
|
+
var context = param2.context, pickedContext = param2.pickedContext;
|
|
176
|
+
var remixRouter = context.remixRouter;
|
|
177
|
+
var router = {
|
|
178
|
+
navigate: remixRouter.navigate,
|
|
179
|
+
get location() {
|
|
180
|
+
return remixRouter.state.location;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
return next({
|
|
184
|
+
context: context,
|
|
185
|
+
pickedContext: _object_spread_props(_object_spread({}, pickedContext), {
|
|
186
|
+
router: router
|
|
187
|
+
})
|
|
188
|
+
});
|
|
170
189
|
}
|
|
171
190
|
};
|
|
172
191
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
|
|
2
|
+
import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
|
|
1
3
|
import path from "path";
|
|
2
4
|
import { getEntryOptions, SERVER_RENDER_FUNCTION_NAME, LOADABLE_STATS_FILE, isUseSSRBundle, createRuntimeExportsUtils, isSSGEntry } from "@modern-js/utils";
|
|
3
5
|
var PLUGIN_IDENTIFIER = "ssr";
|
|
@@ -137,11 +139,17 @@ export default function() {
|
|
|
137
139
|
};
|
|
138
140
|
},
|
|
139
141
|
modifyEntryRuntimePlugins: function modifyEntryRuntimePlugins(param) {
|
|
140
|
-
var entrypoint = param.entrypoint, plugins = param.plugins;
|
|
142
|
+
var entrypoint = param.entrypoint, plugins = param.plugins, bundlerConfigs = param.bundlerConfigs;
|
|
141
143
|
if (ssrConfigMap.get(entrypoint.entryName)) {
|
|
144
|
+
var _bundlerConfigs_find, _bundlerConfigs_find_output;
|
|
145
|
+
var chunkLoadingGlobal = (_bundlerConfigs_find = bundlerConfigs === null || bundlerConfigs === void 0 ? void 0 : bundlerConfigs.find(function(config) {
|
|
146
|
+
return config.name === "client";
|
|
147
|
+
})) === null || _bundlerConfigs_find === void 0 ? void 0 : (_bundlerConfigs_find_output = _bundlerConfigs_find.output) === null || _bundlerConfigs_find_output === void 0 ? void 0 : _bundlerConfigs_find_output.chunkLoadingGlobal;
|
|
142
148
|
plugins.push({
|
|
143
149
|
name: PLUGIN_IDENTIFIER,
|
|
144
|
-
options: JSON.stringify(ssrConfigMap.get(entrypoint.entryName))
|
|
150
|
+
options: JSON.stringify(_object_spread_props(_object_spread({}, ssrConfigMap.get(entrypoint.entryName) || {}), {
|
|
151
|
+
chunkLoadingGlobal: chunkLoadingGlobal
|
|
152
|
+
}))
|
|
145
153
|
});
|
|
146
154
|
}
|
|
147
155
|
return {
|
package/dist/esm/ssr/index.js
CHANGED
|
@@ -29,6 +29,9 @@ export var ssr = function(config) {
|
|
|
29
29
|
context: context
|
|
30
30
|
}));
|
|
31
31
|
} else if (renderLevel === RenderLevel.SERVER_RENDER) {
|
|
32
|
+
var loadableReadyOptions = {
|
|
33
|
+
chunkLoadingGlobal: config.chunkLoadingGlobal
|
|
34
|
+
};
|
|
32
35
|
if (isReact18()) {
|
|
33
36
|
loadableReady(function() {
|
|
34
37
|
var SSRApp = function() {
|
|
@@ -41,13 +44,13 @@ export var ssr = function(config) {
|
|
|
41
44
|
};
|
|
42
45
|
SSRApp = hoistNonReactStatics(SSRApp, App);
|
|
43
46
|
ModernHydrate(/* @__PURE__ */ _jsx(SSRApp, {}));
|
|
44
|
-
});
|
|
47
|
+
}, loadableReadyOptions);
|
|
45
48
|
} else {
|
|
46
49
|
loadableReady(function() {
|
|
47
50
|
ModernHydrate(/* @__PURE__ */ _jsx(App, {
|
|
48
51
|
context: hydrateContext
|
|
49
52
|
}), callback);
|
|
50
|
-
});
|
|
53
|
+
}, loadableReadyOptions);
|
|
51
54
|
}
|
|
52
55
|
} else {
|
|
53
56
|
console.warn("unknow render level: ".concat(renderLevel, ", execute render()"));
|
|
@@ -40,6 +40,14 @@ export default () => ({
|
|
|
40
40
|
globalVars: {
|
|
41
41
|
"process.env.IS_REACT18": process.env.IS_REACT18
|
|
42
42
|
}
|
|
43
|
+
},
|
|
44
|
+
tools: {
|
|
45
|
+
styledComponents: {
|
|
46
|
+
// https://github.com/styled-components/babel-plugin-styled-components/issues/287
|
|
47
|
+
topLevelImportPaths: [
|
|
48
|
+
"@modern-js/runtime/styled"
|
|
49
|
+
]
|
|
50
|
+
}
|
|
43
51
|
}
|
|
44
52
|
};
|
|
45
53
|
},
|
|
@@ -25,7 +25,7 @@ function findTargetElement(tag, children) {
|
|
|
25
25
|
return findTargetElement(tag, nextChildren);
|
|
26
26
|
}
|
|
27
27
|
export function Html(props) {
|
|
28
|
-
const { children } = props;
|
|
28
|
+
const { children, ...rest } = props;
|
|
29
29
|
const hasSetHead = Boolean(findTargetChild("Head", children));
|
|
30
30
|
const hasSetScripts = Boolean(findTargetElement("Scripts", children));
|
|
31
31
|
const hasSetLinks = Boolean(findTargetElement("Links", children));
|
|
@@ -58,6 +58,7 @@ export function Html(props) {
|
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
60
|
return /* @__PURE__ */ _jsx("html", {
|
|
61
|
+
...rest,
|
|
61
62
|
children: /* @__PURE__ */ _jsxs(DocumentStructureContext.Provider, {
|
|
62
63
|
value: {
|
|
63
64
|
hasSetHead,
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { DOCUMENT_STYLE_PLACEHOLDER_START, DOCUMENT_STYLE_PLACEHOLDER_END } from "./constants";
|
|
3
|
+
export function Style(props) {
|
|
4
|
+
const { content, children } = props;
|
|
5
|
+
const contentStr = children || content;
|
|
6
|
+
const contentIIFE = encodeURIComponent(`(${contentStr})()`);
|
|
7
|
+
return /* @__PURE__ */ _jsxs(_Fragment, {
|
|
8
|
+
children: [
|
|
9
|
+
`${DOCUMENT_STYLE_PLACEHOLDER_START}`,
|
|
10
|
+
`${contentIIFE}`,
|
|
11
|
+
`${DOCUMENT_STYLE_PLACEHOLDER_END}`
|
|
12
|
+
]
|
|
13
|
+
});
|
|
14
|
+
}
|
|
@@ -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 } 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 } from "../constants";
|
|
8
8
|
const debug = createDebugger("html_genarate");
|
|
9
9
|
export const getDocumenByEntryName = function(entrypoints, entryName, fallbackDir) {
|
|
10
10
|
var _entrypoints_find;
|
|
@@ -126,6 +126,9 @@ export default () => {
|
|
|
126
126
|
const nonceAttr = nonce ? `nonce=${nonce}` : "";
|
|
127
127
|
html = html.replace(new RegExp(`${DOCUMENT_SCRIPT_PLACEHOLDER_START}(.*?)${DOCUMENT_SCRIPT_PLACEHOLDER_END}`, "g"), (_scriptStr, $1) => `<script ${nonceAttr}>${decodeURIComponent($1)}</script>`);
|
|
128
128
|
}
|
|
129
|
+
if (html.includes(DOCUMENT_STYLE_PLACEHOLDER_START) && html.includes(DOCUMENT_STYLE_PLACEHOLDER_END)) {
|
|
130
|
+
html = html.replace(new RegExp(`${DOCUMENT_STYLE_PLACEHOLDER_START}(.*?)${DOCUMENT_STYLE_PLACEHOLDER_END}`, "g"), (_styleStr, $1) => `<style>${decodeURIComponent($1)}</style>`);
|
|
131
|
+
}
|
|
129
132
|
if (html.includes(DOCUMENT_COMMENT_PLACEHOLDER_START) && html.includes(DOCUMENT_COMMENT_PLACEHOLDER_END)) {
|
|
130
133
|
html = html.replace(new RegExp(`${DOCUMENT_COMMENT_PLACEHOLDER_START}(.*?)${DOCUMENT_COMMENT_PLACEHOLDER_END}`, "g"), (_scriptStr, $1) => `${decodeURIComponent($1)}`);
|
|
131
134
|
}
|
|
@@ -17,6 +17,8 @@ export const DOCUMENT_LINKS_PLACEHOLDER = encodeURIComponent("<!-- chunk links p
|
|
|
17
17
|
export const DOCUMENT_NO_SCRIPTE_PLACEHOLDER = encodeURIComponent("<!-- no-script -->");
|
|
18
18
|
export const DOCUMENT_SCRIPT_PLACEHOLDER_START = encodeURIComponent("<!-- script-start -->");
|
|
19
19
|
export const DOCUMENT_SCRIPT_PLACEHOLDER_END = encodeURIComponent("<!-- script-end -->");
|
|
20
|
+
export const DOCUMENT_STYLE_PLACEHOLDER_START = encodeURIComponent("<!-- style-start -->");
|
|
21
|
+
export const DOCUMENT_STYLE_PLACEHOLDER_END = encodeURIComponent("<!-- style-end -->");
|
|
20
22
|
export const DOCUMENT_COMMENT_PLACEHOLDER_START = encodeURIComponent("<!-- comment-start -->");
|
|
21
23
|
export const DOCUMENT_COMMENT_PLACEHOLDER_END = encodeURIComponent("<!-- comment-end -->");
|
|
22
24
|
export const PLACEHOLDER_REPLACER_MAP = {
|
|
@@ -7,7 +7,7 @@ import { serializeErrors } from "./utils";
|
|
|
7
7
|
const setupFnStr = `function s(r,e){_ROUTER_DATA.r=_ROUTER_DATA.r||{},_ROUTER_DATA.r[r]=_ROUTER_DATA.r[r]||{};return new Promise((function(A,R){_ROUTER_DATA.r[r][e]={resolve:A,reject:R}}))};`;
|
|
8
8
|
const resolveFnStr = `function r(e,r,o,A){A?_ROUTER_DATA.r[e][r].reject(A):_ROUTER_DATA.r[e][r].resolve(o)};`;
|
|
9
9
|
const preResolvedFnStr = `function p(e,r){return void 0!==r?Promise.reject(new Error(r.message)):Promise.resolve(e)};`;
|
|
10
|
-
const DeferredDataScripts = () => {
|
|
10
|
+
const DeferredDataScripts = (props) => {
|
|
11
11
|
const context = useContext(DataRouterContext);
|
|
12
12
|
const { staticContext } = context || {};
|
|
13
13
|
const hydratedRef = useRef(false);
|
|
@@ -36,6 +36,7 @@ const DeferredDataScripts = () => {
|
|
|
36
36
|
const deferredKeyPromiseStr = deferredKeys.map((key) => {
|
|
37
37
|
if (pendingKeys.has(key)) {
|
|
38
38
|
deferredDataScripts.push(/* @__PURE__ */ _jsx(DeferredDataScript, {
|
|
39
|
+
nonce: props === null || props === void 0 ? void 0 : props.nonce,
|
|
39
40
|
data: deferredData.data[key],
|
|
40
41
|
dataKey: key,
|
|
41
42
|
routeId
|
|
@@ -71,6 +72,7 @@ const DeferredDataScripts = () => {
|
|
|
71
72
|
children: [
|
|
72
73
|
!hydratedRef.current && /* @__PURE__ */ _jsx("script", {
|
|
73
74
|
async: true,
|
|
75
|
+
nonce: props === null || props === void 0 ? void 0 : props.nonce,
|
|
74
76
|
suppressHydrationWarning: true,
|
|
75
77
|
dangerouslySetInnerHTML: {
|
|
76
78
|
__html: deferredScripts[0]
|
|
@@ -81,16 +83,18 @@ const DeferredDataScripts = () => {
|
|
|
81
83
|
]
|
|
82
84
|
});
|
|
83
85
|
};
|
|
84
|
-
const DeferredDataScript = ({ data, routeId, dataKey }) => {
|
|
86
|
+
const DeferredDataScript = ({ data, routeId, dataKey, nonce }) => {
|
|
85
87
|
return /* @__PURE__ */ _jsx(Suspense, {
|
|
86
88
|
children: typeof document === "undefined" && data && dataKey && routeId ? /* @__PURE__ */ _jsx(Await, {
|
|
87
89
|
resolve: data,
|
|
88
90
|
errorElement: /* @__PURE__ */ _jsx(ErrorDeferredDataScript, {
|
|
89
91
|
routeId,
|
|
90
|
-
dataKey
|
|
92
|
+
dataKey,
|
|
93
|
+
nonce
|
|
91
94
|
}),
|
|
92
95
|
children: (data2) => /* @__PURE__ */ _jsx("script", {
|
|
93
96
|
async: true,
|
|
97
|
+
nonce,
|
|
94
98
|
suppressHydrationWarning: true,
|
|
95
99
|
dangerouslySetInnerHTML: {
|
|
96
100
|
__html: `_ROUTER_DATA.r(${JSON.stringify(routeId)}, ${JSON.stringify(dataKey)}, ${serializeJson(data2)});`
|
|
@@ -99,9 +103,10 @@ const DeferredDataScript = ({ data, routeId, dataKey }) => {
|
|
|
99
103
|
}) : null
|
|
100
104
|
});
|
|
101
105
|
};
|
|
102
|
-
const ErrorDeferredDataScript = ({ routeId, dataKey }) => {
|
|
106
|
+
const ErrorDeferredDataScript = ({ routeId, dataKey, nonce }) => {
|
|
103
107
|
const error = useAsyncError();
|
|
104
108
|
return /* @__PURE__ */ _jsx("script", {
|
|
109
|
+
nonce,
|
|
105
110
|
suppressHydrationWarning: true,
|
|
106
111
|
dangerouslySetInnerHTML: {
|
|
107
112
|
__html: `_ROUTER_DATA.r(${JSON.stringify(routeId)}, ${JSON.stringify(dataKey)}, ${void 0}, ${serializeJson({
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useContext } from "react";
|
|
2
3
|
import { createBrowserRouter, createHashRouter, RouterProvider, createRoutesFromElements, useMatches, useLocation } from "@modern-js/utils/runtime/router";
|
|
3
4
|
import hoistNonReactStatics from "hoist-non-react-statics";
|
|
4
5
|
import { parsedJSONFromElement } from "@modern-js/utils/runtime-browser";
|
|
6
|
+
import { RuntimeReactContext } from "../../core";
|
|
5
7
|
import { modifyRoutes as modifyRoutesHook } from "./hooks";
|
|
6
8
|
import { deserializeErrors, renderRoutes, urlJoin } from "./utils";
|
|
7
9
|
export let finalRouteConfig = {
|
|
@@ -75,6 +77,8 @@ export const routerPlugin = ({ serverBase = [], supportHtml5History = true, base
|
|
|
75
77
|
basename: _basename,
|
|
76
78
|
hydrationData
|
|
77
79
|
});
|
|
80
|
+
const runtimeContext = useContext(RuntimeReactContext);
|
|
81
|
+
runtimeContext.remixRouter = router;
|
|
78
82
|
return /* @__PURE__ */ _jsx(App, {
|
|
79
83
|
...props,
|
|
80
84
|
children: /* @__PURE__ */ _jsx(RouterProvider, {
|
|
@@ -95,6 +99,22 @@ export const routerPlugin = ({ serverBase = [], supportHtml5History = true, base
|
|
|
95
99
|
return next({
|
|
96
100
|
App: RouteApp
|
|
97
101
|
});
|
|
102
|
+
},
|
|
103
|
+
pickContext: ({ context, pickedContext }, next) => {
|
|
104
|
+
const { remixRouter } = context;
|
|
105
|
+
const router = {
|
|
106
|
+
navigate: remixRouter.navigate,
|
|
107
|
+
get location() {
|
|
108
|
+
return remixRouter.state.location;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
return next({
|
|
112
|
+
context,
|
|
113
|
+
pickedContext: {
|
|
114
|
+
...pickedContext,
|
|
115
|
+
router
|
|
116
|
+
}
|
|
117
|
+
});
|
|
98
118
|
}
|
|
99
119
|
};
|
|
100
120
|
}
|
|
@@ -49,12 +49,15 @@ export const routerPlugin = ({ basename = "", routesConfig, createRoutes }) => {
|
|
|
49
49
|
context
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
|
-
const { request, mode: ssrMode } = context.ssrContext;
|
|
52
|
+
const { request, mode: ssrMode, nonce } = context.ssrContext;
|
|
53
53
|
const baseUrl = request.baseUrl;
|
|
54
54
|
const _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
|
|
55
55
|
const routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
|
|
56
56
|
routesConfig,
|
|
57
|
-
ssrMode
|
|
57
|
+
ssrMode,
|
|
58
|
+
props: {
|
|
59
|
+
nonce
|
|
60
|
+
}
|
|
58
61
|
}));
|
|
59
62
|
const { query } = createStaticHandler(routes, {
|
|
60
63
|
basename: _basename
|
|
@@ -65,7 +68,7 @@ export const routerPlugin = ({ basename = "", routesConfig, createRoutes }) => {
|
|
|
65
68
|
return routerContext;
|
|
66
69
|
}
|
|
67
70
|
const router = createStaticRouter(routes, routerContext);
|
|
68
|
-
context.
|
|
71
|
+
context.remixRouter = router;
|
|
69
72
|
context.routerContext = routerContext;
|
|
70
73
|
context.routes = routes;
|
|
71
74
|
context.routeManifest = context.ssrContext.routeManifest;
|
|
@@ -83,11 +86,11 @@ export const routerPlugin = ({ basename = "", routesConfig, createRoutes }) => {
|
|
|
83
86
|
}
|
|
84
87
|
const getRouteApp = () => {
|
|
85
88
|
return (props) => {
|
|
86
|
-
const {
|
|
89
|
+
const { remixRouter, routerContext } = useContext(RuntimeReactContext);
|
|
87
90
|
return /* @__PURE__ */ _jsx(App, {
|
|
88
91
|
...props,
|
|
89
92
|
children: /* @__PURE__ */ _jsx(StaticRouterProvider, {
|
|
90
|
-
router,
|
|
93
|
+
router: remixRouter,
|
|
91
94
|
context: routerContext,
|
|
92
95
|
hydrate: false
|
|
93
96
|
})
|
|
@@ -103,6 +106,22 @@ export const routerPlugin = ({ basename = "", routesConfig, createRoutes }) => {
|
|
|
103
106
|
return next({
|
|
104
107
|
App: RouteApp
|
|
105
108
|
});
|
|
109
|
+
},
|
|
110
|
+
pickContext: ({ context, pickedContext }, next) => {
|
|
111
|
+
const { remixRouter } = context;
|
|
112
|
+
const router = {
|
|
113
|
+
navigate: remixRouter.navigate,
|
|
114
|
+
get location() {
|
|
115
|
+
return remixRouter.state.location;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
return next({
|
|
119
|
+
context,
|
|
120
|
+
pickedContext: {
|
|
121
|
+
...pickedContext,
|
|
122
|
+
router
|
|
123
|
+
}
|
|
124
|
+
});
|
|
106
125
|
}
|
|
107
126
|
};
|
|
108
127
|
}
|
|
@@ -114,11 +114,16 @@ export default () => {
|
|
|
114
114
|
imports
|
|
115
115
|
};
|
|
116
116
|
},
|
|
117
|
-
modifyEntryRuntimePlugins({ entrypoint, plugins }) {
|
|
117
|
+
modifyEntryRuntimePlugins({ entrypoint, plugins, bundlerConfigs }) {
|
|
118
118
|
if (ssrConfigMap.get(entrypoint.entryName)) {
|
|
119
|
+
var _bundlerConfigs_find, _bundlerConfigs_find_output;
|
|
120
|
+
const chunkLoadingGlobal = (_bundlerConfigs_find = bundlerConfigs === null || bundlerConfigs === void 0 ? void 0 : bundlerConfigs.find((config) => config.name === "client")) === null || _bundlerConfigs_find === void 0 ? void 0 : (_bundlerConfigs_find_output = _bundlerConfigs_find.output) === null || _bundlerConfigs_find_output === void 0 ? void 0 : _bundlerConfigs_find_output.chunkLoadingGlobal;
|
|
119
121
|
plugins.push({
|
|
120
122
|
name: PLUGIN_IDENTIFIER,
|
|
121
|
-
options: JSON.stringify(
|
|
123
|
+
options: JSON.stringify({
|
|
124
|
+
...ssrConfigMap.get(entrypoint.entryName) || {},
|
|
125
|
+
chunkLoadingGlobal
|
|
126
|
+
})
|
|
122
127
|
});
|
|
123
128
|
}
|
|
124
129
|
return {
|
|
@@ -39,6 +39,9 @@ export const ssr = (config) => {
|
|
|
39
39
|
context
|
|
40
40
|
}));
|
|
41
41
|
} else if (renderLevel === RenderLevel.SERVER_RENDER) {
|
|
42
|
+
const loadableReadyOptions = {
|
|
43
|
+
chunkLoadingGlobal: config.chunkLoadingGlobal
|
|
44
|
+
};
|
|
42
45
|
if (isReact18()) {
|
|
43
46
|
loadableReady(() => {
|
|
44
47
|
let SSRApp = () => /* @__PURE__ */ _jsx(WithCallback, {
|
|
@@ -49,13 +52,13 @@ export const ssr = (config) => {
|
|
|
49
52
|
});
|
|
50
53
|
SSRApp = hoistNonReactStatics(SSRApp, App);
|
|
51
54
|
ModernHydrate(/* @__PURE__ */ _jsx(SSRApp, {}));
|
|
52
|
-
});
|
|
55
|
+
}, loadableReadyOptions);
|
|
53
56
|
} else {
|
|
54
57
|
loadableReady(() => {
|
|
55
58
|
ModernHydrate(/* @__PURE__ */ _jsx(App, {
|
|
56
59
|
context: hydrateContext
|
|
57
60
|
}), callback);
|
|
58
|
-
});
|
|
61
|
+
}, loadableReadyOptions);
|
|
59
62
|
}
|
|
60
63
|
} else {
|
|
61
64
|
console.warn(`unknow render level: ${renderLevel}, execute render()`);
|
|
@@ -12,6 +12,8 @@ export declare const DOCUMENT_LINKS_PLACEHOLDER: string;
|
|
|
12
12
|
export declare const DOCUMENT_NO_SCRIPTE_PLACEHOLDER: string;
|
|
13
13
|
export declare const DOCUMENT_SCRIPT_PLACEHOLDER_START: string;
|
|
14
14
|
export declare const DOCUMENT_SCRIPT_PLACEHOLDER_END: string;
|
|
15
|
+
export declare const DOCUMENT_STYLE_PLACEHOLDER_START: string;
|
|
16
|
+
export declare const DOCUMENT_STYLE_PLACEHOLDER_END: string;
|
|
15
17
|
export declare const DOCUMENT_COMMENT_PLACEHOLDER_START: string;
|
|
16
18
|
export declare const DOCUMENT_COMMENT_PLACEHOLDER_END: string;
|
|
17
19
|
export declare const PLACEHOLDER_REPLACER_MAP: {
|
|
@@ -3,5 +3,7 @@
|
|
|
3
3
|
* DeferredDataScripts only renders in server side,
|
|
4
4
|
* it doesn't need to be hydrated in client side.
|
|
5
5
|
*/
|
|
6
|
-
declare const DeferredDataScripts: (
|
|
6
|
+
declare const DeferredDataScripts: (props?: {
|
|
7
|
+
nonce?: string;
|
|
8
|
+
}) => JSX.Element | null;
|
|
7
9
|
export default DeferredDataScripts;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { Store } from '@modern-js-reduck/store';
|
|
3
|
-
import type
|
|
3
|
+
import { type StaticHandlerContext, type Router, type RouterState } from '@modern-js/utils/runtime/remix-router';
|
|
4
4
|
import { createLoaderManager } from './core/loader/loaderManager';
|
|
5
5
|
import { runtime } from './core/plugin';
|
|
6
6
|
import { RouteManifest } from './router/runtime/types';
|
|
@@ -24,6 +24,10 @@ export interface BaseTRuntimeContext {
|
|
|
24
24
|
request?: SSRServerContext['request'];
|
|
25
25
|
response?: SSRServerContext['response'];
|
|
26
26
|
store?: Store;
|
|
27
|
+
router?: {
|
|
28
|
+
navigate: Router['navigate'];
|
|
29
|
+
location: RouterState['location'];
|
|
30
|
+
};
|
|
27
31
|
}
|
|
28
32
|
export interface TRuntimeContext extends BaseTRuntimeContext {
|
|
29
33
|
[key: string]: any;
|
|
@@ -7,6 +7,7 @@ export type ModernSSRReactComponent = React.ComponentType<any>;
|
|
|
7
7
|
export { RuntimeContext, RenderLevel };
|
|
8
8
|
export type SSRPluginConfig = {
|
|
9
9
|
crossorigin?: boolean | 'anonymous' | 'use-credentials';
|
|
10
|
+
chunkLoadingGlobal?: string;
|
|
10
11
|
} & Exclude<ServerUserConfig['ssr'], boolean>;
|
|
11
12
|
export type ServerRenderOptions = {
|
|
12
13
|
App: ModernSSRReactComponent;
|
package/package.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"modern",
|
|
16
16
|
"modern.js"
|
|
17
17
|
],
|
|
18
|
-
"version": "2.
|
|
18
|
+
"version": "2.22.1",
|
|
19
19
|
"engines": {
|
|
20
20
|
"node": ">=14.17.6"
|
|
21
21
|
},
|
|
@@ -169,9 +169,9 @@
|
|
|
169
169
|
"redux-logger": "^3.0.6",
|
|
170
170
|
"styled-components": "^5.3.1",
|
|
171
171
|
"@swc/helpers": "0.5.1",
|
|
172
|
-
"@modern-js/plugin": "2.
|
|
173
|
-
"@modern-js/types": "2.
|
|
174
|
-
"@modern-js/utils": "2.
|
|
172
|
+
"@modern-js/plugin": "2.22.1",
|
|
173
|
+
"@modern-js/types": "2.22.1",
|
|
174
|
+
"@modern-js/utils": "2.22.1"
|
|
175
175
|
},
|
|
176
176
|
"peerDependencies": {
|
|
177
177
|
"react": ">=17",
|
|
@@ -191,11 +191,12 @@
|
|
|
191
191
|
"react-dom": "^18",
|
|
192
192
|
"ts-jest": "^29.1.0",
|
|
193
193
|
"typescript": "^5",
|
|
194
|
-
"
|
|
195
|
-
"@modern-js/
|
|
196
|
-
"@modern-js/
|
|
197
|
-
"@
|
|
198
|
-
"@scripts/build": "2.
|
|
194
|
+
"webpack": "^5.82.1",
|
|
195
|
+
"@modern-js/app-tools": "2.22.1",
|
|
196
|
+
"@modern-js/core": "2.22.1",
|
|
197
|
+
"@modern-js/server-core": "2.22.1",
|
|
198
|
+
"@scripts/build": "2.22.1",
|
|
199
|
+
"@scripts/jest-config": "2.22.1"
|
|
199
200
|
},
|
|
200
201
|
"sideEffects": false,
|
|
201
202
|
"modernConfig": {},
|