@modern-js/runtime 2.4.0 → 2.4.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/js/modern/core/compatible.js +1 -0
- package/dist/js/modern/router/runtime/fetch.js +5 -0
- package/dist/js/modern/router/runtime/fetch.node.js +4 -0
- package/dist/js/modern/router/runtime/fetch.worker.js +5 -0
- package/dist/js/modern/router/runtime/plugin.node.js +50 -10
- package/dist/js/modern/ssr/cli/index.js +2 -2
- package/dist/js/modern/ssr/prefetch.worker.js +66 -0
- package/dist/js/modern/ssr/react/nossr/index.js +6 -2
- package/dist/js/modern/ssr/serverRender/renderToStream/index.js +1 -1
- package/dist/js/modern/ssr/serverRender/renderToStream/index.worker.js +35 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/renderToPipe.worker.js +110 -0
- package/dist/js/modern/ssr/serverRender/renderToString/entry.js +5 -4
- package/dist/js/modern/ssr/serverRender/renderToString/index.js +1 -1
- package/dist/js/modern/ssr/serverRender/renderToString/index.worker.js +49 -0
- package/dist/js/modern/ssr/serverRender/time.js +13 -0
- package/dist/js/modern/ssr/serverRender/time.worker.js +28 -0
- package/dist/js/modern/ssr/serverRender/utils.js +1 -12
- package/dist/js/node/core/compatible.js +1 -0
- package/dist/js/node/router/runtime/fetch.js +28 -0
- package/dist/js/node/router/runtime/fetch.node.js +27 -0
- package/dist/js/node/router/runtime/fetch.worker.js +28 -0
- package/dist/js/node/router/runtime/plugin.node.js +46 -9
- package/dist/js/node/ssr/cli/index.js +2 -2
- package/dist/js/node/ssr/prefetch.worker.js +87 -0
- package/dist/js/node/ssr/react/nossr/index.js +6 -2
- package/dist/js/node/ssr/serverRender/renderToStream/index.js +2 -2
- package/dist/js/node/ssr/serverRender/renderToStream/index.worker.js +64 -0
- package/dist/js/node/ssr/serverRender/renderToStream/renderToPipe.worker.js +129 -0
- package/dist/js/node/ssr/serverRender/renderToString/entry.js +7 -6
- package/dist/js/node/ssr/serverRender/renderToString/index.js +2 -2
- package/dist/js/node/ssr/serverRender/renderToString/index.worker.js +78 -0
- package/dist/js/node/ssr/serverRender/time.js +36 -0
- package/dist/js/node/ssr/serverRender/time.worker.js +51 -0
- package/dist/js/node/ssr/serverRender/utils.js +2 -14
- package/dist/js/treeshaking/core/compatible.js +8 -7
- package/dist/js/treeshaking/core/loader/loaderManager.js +3 -3
- package/dist/js/treeshaking/core/loader/useLoader.js +15 -15
- package/dist/js/treeshaking/document/Head.js +1 -1
- package/dist/js/treeshaking/document/Html.js +2 -2
- package/dist/js/treeshaking/document/Root.js +2 -2
- package/dist/js/treeshaking/document/cli/index.js +4 -4
- package/dist/js/treeshaking/router/cli/index.js +2 -2
- package/dist/js/treeshaking/router/runtime/fetch.js +2 -0
- package/dist/js/treeshaking/router/runtime/fetch.node.js +2 -0
- package/dist/js/treeshaking/router/runtime/fetch.worker.js +2 -0
- package/dist/js/treeshaking/router/runtime/plugin.js +3 -3
- package/dist/js/treeshaking/router/runtime/plugin.node.js +70 -13
- package/dist/js/treeshaking/router/runtime/utils.js +3 -3
- package/dist/js/treeshaking/ssr/cli/index.js +5 -5
- package/dist/js/treeshaking/ssr/index.js +6 -6
- package/dist/js/treeshaking/ssr/index.node.js +1 -1
- package/dist/js/treeshaking/ssr/prefetch.js +2 -2
- package/dist/js/treeshaking/ssr/prefetch.worker.js +191 -0
- package/dist/js/treeshaking/ssr/react/nossr/index.js +3 -3
- package/dist/js/treeshaking/ssr/react/prerender/index.js +2 -2
- package/dist/js/treeshaking/ssr/react/prerender/util.js +2 -2
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/bulidTemplate.before.js +2 -2
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/index.js +1 -1
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/index.worker.js +32 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/loadable.js +1 -1
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/renderToPipe.js +8 -8
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/renderToPipe.worker.js +280 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/template.js +1 -1
- package/dist/js/treeshaking/ssr/serverRender/renderToString/entry.js +5 -5
- package/dist/js/treeshaking/ssr/serverRender/renderToString/index.js +1 -1
- package/dist/js/treeshaking/ssr/serverRender/renderToString/index.worker.js +167 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToString/loadable.js +1 -1
- package/dist/js/treeshaking/ssr/serverRender/time.js +57 -0
- package/dist/js/treeshaking/ssr/serverRender/time.worker.js +75 -0
- package/dist/js/treeshaking/ssr/serverRender/utils.js +1 -57
- package/dist/js/treeshaking/ssr/utils.js +5 -5
- package/dist/js/treeshaking/state/cli/index.js +2 -2
- package/dist/js/treeshaking/state/runtime/plugin.js +3 -3
- package/dist/types/router/runtime/fetch.d.ts +2 -0
- package/dist/types/router/runtime/fetch.node.d.ts +2 -0
- package/dist/types/router/runtime/fetch.worker.d.ts +2 -0
- package/dist/types/ssr/prefetch.worker.d.ts +13 -0
- package/dist/types/ssr/react/nossr/index.d.ts +4 -2
- package/dist/types/ssr/serverRender/renderToStream/index.worker.d.ts +6 -0
- package/dist/types/ssr/serverRender/renderToStream/renderToPipe.worker.d.ts +8 -0
- package/dist/types/ssr/serverRender/renderToString/index.worker.d.ts +6 -0
- package/dist/types/ssr/serverRender/time.d.ts +1 -0
- package/dist/types/ssr/serverRender/time.worker.d.ts +1 -0
- package/dist/types/ssr/serverRender/utils.d.ts +2 -3
- package/package.json +36 -23
|
@@ -248,6 +248,7 @@ const bootstrap = (BootApp, id, root, ReactDOM) => __async(void 0, null, functio
|
|
|
248
248
|
if (ssrContext) {
|
|
249
249
|
ssrContext.res.statusCode = status;
|
|
250
250
|
ssrContext.res.setHeader("Location", redirectUrl);
|
|
251
|
+
ssrContext.redirection = ssrContext.redirection || {};
|
|
251
252
|
ssrContext.redirection.status = status;
|
|
252
253
|
ssrContext.redirection.url = redirectUrl;
|
|
253
254
|
}
|
|
@@ -37,18 +37,22 @@ var __async = (__this, __arguments, generator) => {
|
|
|
37
37
|
step((generator = generator.apply(__this, __arguments)).next());
|
|
38
38
|
});
|
|
39
39
|
};
|
|
40
|
-
import { jsx } from "react/jsx-runtime";
|
|
40
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
41
41
|
import { useContext } from "react";
|
|
42
|
-
import
|
|
42
|
+
import serialize from "serialize-javascript";
|
|
43
|
+
import {
|
|
44
|
+
createStaticHandler,
|
|
45
|
+
isRouteErrorResponse
|
|
46
|
+
} from "@remix-run/router";
|
|
43
47
|
import {
|
|
44
48
|
createStaticRouter,
|
|
45
49
|
StaticRouterProvider
|
|
46
50
|
} from "react-router-dom/server";
|
|
47
51
|
import hoistNonReactStatics from "hoist-non-react-statics";
|
|
48
|
-
import { installGlobals } from "@remix-run/node";
|
|
49
52
|
import { createRoutesFromElements } from "react-router-dom";
|
|
50
53
|
import { RuntimeReactContext } from "../../core";
|
|
51
54
|
import { renderRoutes, urlJoin } from "./utils";
|
|
55
|
+
import { installGlobals } from "./fetch";
|
|
52
56
|
installGlobals();
|
|
53
57
|
function createFetchRequest(req) {
|
|
54
58
|
const origin = `${req.protocol}://${req.host}`;
|
|
@@ -63,7 +67,7 @@ function createFetchRequest(req) {
|
|
|
63
67
|
}
|
|
64
68
|
function createFetchHeaders(requestHeaders) {
|
|
65
69
|
const headers = new Headers();
|
|
66
|
-
for (const [key, values] of Object.entries(requestHeaders)) {
|
|
70
|
+
for (const [key, values] of Object.entries(requestHeaders || {})) {
|
|
67
71
|
if (values) {
|
|
68
72
|
if (Array.isArray(values)) {
|
|
69
73
|
for (const value of values) {
|
|
@@ -76,6 +80,26 @@ function createFetchHeaders(requestHeaders) {
|
|
|
76
80
|
}
|
|
77
81
|
return headers;
|
|
78
82
|
}
|
|
83
|
+
function serializeErrors(errors) {
|
|
84
|
+
if (!errors) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const entries = Object.entries(errors);
|
|
88
|
+
const serialized = {};
|
|
89
|
+
for (const [key, val] of entries) {
|
|
90
|
+
if (isRouteErrorResponse(val)) {
|
|
91
|
+
serialized[key] = __spreadProps(__spreadValues({}, val), { __type: "RouteErrorResponse" });
|
|
92
|
+
} else if (val instanceof Error) {
|
|
93
|
+
serialized[key] = {
|
|
94
|
+
message: val.message,
|
|
95
|
+
__type: "Error"
|
|
96
|
+
};
|
|
97
|
+
} else {
|
|
98
|
+
serialized[key] = val;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return serialized;
|
|
102
|
+
}
|
|
79
103
|
const routerPlugin = ({
|
|
80
104
|
basename = "",
|
|
81
105
|
routesConfig,
|
|
@@ -117,12 +141,28 @@ const routerPlugin = ({
|
|
|
117
141
|
const getRouteApp = () => {
|
|
118
142
|
return (props) => {
|
|
119
143
|
const { router, routerContext } = useContext(RuntimeReactContext);
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
144
|
+
const data = {
|
|
145
|
+
loaderData: routerContext.loaderData,
|
|
146
|
+
actionData: routerContext.actionData,
|
|
147
|
+
errors: serializeErrors(routerContext.errors)
|
|
148
|
+
};
|
|
149
|
+
const hydrateScript = `window.__staticRouterHydrationData = ${serialize(
|
|
150
|
+
data,
|
|
151
|
+
{ isJSON: true }
|
|
152
|
+
)};`;
|
|
153
|
+
return /* @__PURE__ */ jsxs(App, __spreadProps(__spreadValues({}, props), {
|
|
154
|
+
children: [
|
|
155
|
+
/* @__PURE__ */ jsx(StaticRouterProvider, {
|
|
156
|
+
router,
|
|
157
|
+
context: routerContext,
|
|
158
|
+
hydrate: false
|
|
159
|
+
}),
|
|
160
|
+
/* @__PURE__ */ jsx("script", {
|
|
161
|
+
suppressHydrationWarning: true,
|
|
162
|
+
id: "the-nonce",
|
|
163
|
+
dangerouslySetInnerHTML: { __html: hydrateScript }
|
|
164
|
+
})
|
|
165
|
+
]
|
|
126
166
|
}));
|
|
127
167
|
};
|
|
128
168
|
};
|
|
@@ -59,7 +59,7 @@ var cli_default = () => ({
|
|
|
59
59
|
}
|
|
60
60
|
},
|
|
61
61
|
tools: {
|
|
62
|
-
webpackChain: (chain, { name, isServer, CHAIN_ID }) => {
|
|
62
|
+
webpackChain: (chain, { name, isServer, isServiceWorker, CHAIN_ID }) => {
|
|
63
63
|
const userConfig = api.useResolvedConfigContext();
|
|
64
64
|
if (isUseSSRBundle(userConfig) && name !== "server" && hasStringSSREntry(userConfig)) {
|
|
65
65
|
const LoadableWebpackPlugin = require("@loadable/webpack-plugin");
|
|
@@ -69,7 +69,7 @@ var cli_default = () => ({
|
|
|
69
69
|
}
|
|
70
70
|
const modernVars = {
|
|
71
71
|
[`process.env.MODERN_TARGET`]: JSON.stringify(
|
|
72
|
-
isServer ? "node" : "browser"
|
|
72
|
+
isServer || isServiceWorker ? "node" : "browser"
|
|
73
73
|
)
|
|
74
74
|
};
|
|
75
75
|
chain.plugin(CHAIN_ID.PLUGIN.DEFINE).tap((args) => {
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
var __async = (__this, __arguments, generator) => {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
var fulfilled = (value) => {
|
|
4
|
+
try {
|
|
5
|
+
step(generator.next(value));
|
|
6
|
+
} catch (e) {
|
|
7
|
+
reject(e);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var rejected = (value) => {
|
|
11
|
+
try {
|
|
12
|
+
step(generator.throw(value));
|
|
13
|
+
} catch (e) {
|
|
14
|
+
reject(e);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
18
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
import { jsx } from "react/jsx-runtime";
|
|
22
|
+
import { renderToStaticMarkup } from "react-dom/server";
|
|
23
|
+
import { ChunkExtractor } from "@loadable/server";
|
|
24
|
+
const prefetch = (App, context) => __async(void 0, null, function* () {
|
|
25
|
+
var _a;
|
|
26
|
+
const { ssrContext } = context;
|
|
27
|
+
const { loadableStats } = ssrContext;
|
|
28
|
+
if (loadableStats) {
|
|
29
|
+
const extractor = new ChunkExtractor({
|
|
30
|
+
stats: loadableStats,
|
|
31
|
+
entrypoints: [ssrContext.entryName].filter(Boolean)
|
|
32
|
+
});
|
|
33
|
+
renderToStaticMarkup(extractor.collectChunks(/* @__PURE__ */ jsx(App, {
|
|
34
|
+
context
|
|
35
|
+
})));
|
|
36
|
+
} else {
|
|
37
|
+
renderToStaticMarkup(/* @__PURE__ */ jsx(App, {
|
|
38
|
+
context
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
if (!context.loaderManager.hasPendingLoaders()) {
|
|
42
|
+
return {
|
|
43
|
+
initialData: context.initialData,
|
|
44
|
+
i18nData: context.__i18nData__
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const loadersData = yield context.loaderManager.awaitPendingLoaders();
|
|
48
|
+
Object.keys(loadersData).forEach((id) => {
|
|
49
|
+
const data = loadersData[id];
|
|
50
|
+
if (data._error) {
|
|
51
|
+
ssrContext.logger.error("App Prefetch Loader", data._error);
|
|
52
|
+
ssrContext.metrics.emitCounter("app.prefetch.loader.error", 1);
|
|
53
|
+
delete data._error;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
return {
|
|
57
|
+
loadersData,
|
|
58
|
+
initialData: context.initialData,
|
|
59
|
+
i18nData: context.__i18nData__,
|
|
60
|
+
storeState: (_a = context == null ? void 0 : context.store) == null ? void 0 : _a.getState()
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
var prefetch_worker_default = prefetch;
|
|
64
|
+
export {
|
|
65
|
+
prefetch_worker_default as default
|
|
66
|
+
};
|
|
@@ -6,8 +6,12 @@ const NoSSR = (props) => {
|
|
|
6
6
|
csr = true;
|
|
7
7
|
setMounted(true);
|
|
8
8
|
});
|
|
9
|
-
const { children } = props;
|
|
10
|
-
return React.createElement(
|
|
9
|
+
const { children, fallback = null } = props;
|
|
10
|
+
return React.createElement(
|
|
11
|
+
React.Fragment,
|
|
12
|
+
null,
|
|
13
|
+
isMounted ? children : fallback
|
|
14
|
+
);
|
|
11
15
|
};
|
|
12
16
|
export {
|
|
13
17
|
NoSSR
|
|
@@ -21,7 +21,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
21
21
|
import { createElement } from "react";
|
|
22
22
|
import { run } from "@modern-js/utils/ssr";
|
|
23
23
|
import { PreRender } from "../../react/prerender";
|
|
24
|
-
import { time } from "../
|
|
24
|
+
import { time } from "../time";
|
|
25
25
|
import renderToPipe from "./renderToPipe";
|
|
26
26
|
const render = ({ App, context }) => {
|
|
27
27
|
const { ssrContext } = context;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createElement } from "react";
|
|
2
|
+
import { PreRender } from "../../react/prerender";
|
|
3
|
+
import { time } from "../time";
|
|
4
|
+
import renderToPipe from "./renderToPipe";
|
|
5
|
+
const render = ({ App, context }) => {
|
|
6
|
+
const { ssrContext } = context;
|
|
7
|
+
if (!ssrContext) {
|
|
8
|
+
throw new Error(
|
|
9
|
+
'The "ssrContext" must not be undefined, but received undefined'
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
const end = time();
|
|
13
|
+
const rootElement = createElement(App, {
|
|
14
|
+
context: Object.assign(context || {}, {
|
|
15
|
+
ssr: true
|
|
16
|
+
})
|
|
17
|
+
});
|
|
18
|
+
const pipe = renderToPipe(rootElement, context, {
|
|
19
|
+
onShellReady() {
|
|
20
|
+
const cacheConfig = PreRender.config();
|
|
21
|
+
if (cacheConfig) {
|
|
22
|
+
ssrContext.cacheConfig = cacheConfig;
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
onAllReady() {
|
|
26
|
+
const cost = end();
|
|
27
|
+
ssrContext.logger.debug("App Render To HTML cost = %d ms", cost);
|
|
28
|
+
ssrContext.metrics.emitTimer("app.render.html.cost", cost);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
return pipe;
|
|
32
|
+
};
|
|
33
|
+
export {
|
|
34
|
+
render
|
|
35
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
var __async = (__this, __arguments, generator) => {
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
var fulfilled = (value) => {
|
|
23
|
+
try {
|
|
24
|
+
step(generator.next(value));
|
|
25
|
+
} catch (e) {
|
|
26
|
+
reject(e);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
var rejected = (value) => {
|
|
30
|
+
try {
|
|
31
|
+
step(generator.throw(value));
|
|
32
|
+
} catch (e) {
|
|
33
|
+
reject(e);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
37
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
import { RenderLevel } from "../types";
|
|
41
|
+
import { getTemplates } from "./template";
|
|
42
|
+
function renderToPipe(rootElement, context, options) {
|
|
43
|
+
let isShellStream = true;
|
|
44
|
+
const { ssrContext } = context;
|
|
45
|
+
const forUserPipe = (stream) => __async(this, null, function* () {
|
|
46
|
+
let renderToReadableStream;
|
|
47
|
+
try {
|
|
48
|
+
({ renderToReadableStream } = require("react-dom/server"));
|
|
49
|
+
} catch (e) {
|
|
50
|
+
}
|
|
51
|
+
const { shellAfter, shellBefore } = getTemplates(
|
|
52
|
+
context,
|
|
53
|
+
RenderLevel.SERVER_RENDER
|
|
54
|
+
);
|
|
55
|
+
try {
|
|
56
|
+
let _a;
|
|
57
|
+
const readableOriginal = yield renderToReadableStream(rootElement, __spreadProps(__spreadValues({}, options), {
|
|
58
|
+
onError(error) {
|
|
59
|
+
var _a2;
|
|
60
|
+
ssrContext.logger.error(
|
|
61
|
+
"An error occurs during streaming SSR",
|
|
62
|
+
error
|
|
63
|
+
);
|
|
64
|
+
ssrContext.metrics.emitCounter("app.render.streaming.error", 1);
|
|
65
|
+
(_a2 = options == null ? void 0 : options.onError) == null ? void 0 : _a2.call(options, error);
|
|
66
|
+
}
|
|
67
|
+
}));
|
|
68
|
+
const reader = readableOriginal.getReader();
|
|
69
|
+
const injectableStream = new ReadableStream({
|
|
70
|
+
start(controller) {
|
|
71
|
+
return __async(this, null, function* () {
|
|
72
|
+
const { value } = yield reader.read();
|
|
73
|
+
if (isShellStream) {
|
|
74
|
+
controller.enqueue(encodeForWebStream(shellBefore));
|
|
75
|
+
controller.enqueue(value);
|
|
76
|
+
controller.enqueue(encodeForWebStream(shellAfter));
|
|
77
|
+
isShellStream = false;
|
|
78
|
+
} else {
|
|
79
|
+
controller.enqueue(value);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
return readableOriginal(injectableStream).readableOriginal(stream);
|
|
85
|
+
} catch (err) {
|
|
86
|
+
ssrContext.metrics.emitCounter("app.render.streaming.shell.error", 1);
|
|
87
|
+
const { shellAfter: shellAfter2, shellBefore: shellBefore2 } = getTemplates(
|
|
88
|
+
context,
|
|
89
|
+
RenderLevel.CLIENT_RENDER
|
|
90
|
+
);
|
|
91
|
+
const fallbackHtml = `${shellBefore2}${shellAfter2}`;
|
|
92
|
+
return fallbackHtml;
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
return forUserPipe;
|
|
96
|
+
}
|
|
97
|
+
let encoder;
|
|
98
|
+
function encodeForWebStream(thing) {
|
|
99
|
+
if (!encoder) {
|
|
100
|
+
encoder = new TextEncoder();
|
|
101
|
+
}
|
|
102
|
+
if (typeof thing === "string") {
|
|
103
|
+
return encoder.encode(thing);
|
|
104
|
+
}
|
|
105
|
+
return thing;
|
|
106
|
+
}
|
|
107
|
+
var renderToPipe_worker_default = renderToPipe;
|
|
108
|
+
export {
|
|
109
|
+
renderToPipe_worker_default as default
|
|
110
|
+
};
|
|
@@ -26,7 +26,7 @@ import helmetReplace from "../helmet";
|
|
|
26
26
|
import {
|
|
27
27
|
RenderLevel
|
|
28
28
|
} from "../types";
|
|
29
|
-
import { time } from "../
|
|
29
|
+
import { time } from "../time";
|
|
30
30
|
import prefetch from "../../prefetch";
|
|
31
31
|
import { toFragments } from "./template";
|
|
32
32
|
import { reduce } from "./reduce";
|
|
@@ -76,18 +76,19 @@ class Entry {
|
|
|
76
76
|
}
|
|
77
77
|
renderToHtml(context) {
|
|
78
78
|
return __async(this, null, function* () {
|
|
79
|
+
var _a, _b, _c;
|
|
79
80
|
const ssrContext = context.ssrContext;
|
|
80
|
-
if (ssrContext.redirection.url) {
|
|
81
|
+
if ((_a = ssrContext.redirection) == null ? void 0 : _a.url) {
|
|
81
82
|
return "";
|
|
82
83
|
}
|
|
83
84
|
const prefetchData = yield this.prefetch(context);
|
|
84
|
-
if (ssrContext.redirection.url) {
|
|
85
|
+
if ((_b = ssrContext.redirection) == null ? void 0 : _b.url) {
|
|
85
86
|
return "";
|
|
86
87
|
}
|
|
87
88
|
if (this.result.renderLevel >= RenderLevel.SERVER_PREFETCH) {
|
|
88
89
|
this.result.html = this.renderToString(context);
|
|
89
90
|
}
|
|
90
|
-
if (ssrContext.redirection.url) {
|
|
91
|
+
if ((_c = ssrContext.redirection) == null ? void 0 : _c.url) {
|
|
91
92
|
return "";
|
|
92
93
|
}
|
|
93
94
|
let html = "";
|
|
@@ -20,7 +20,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
20
20
|
};
|
|
21
21
|
import { run } from "@modern-js/utils/ssr";
|
|
22
22
|
import { PreRender } from "../../react/prerender";
|
|
23
|
-
import { time } from "../
|
|
23
|
+
import { time } from "../time";
|
|
24
24
|
import SSREntry from "./entry";
|
|
25
25
|
const render = ({
|
|
26
26
|
App,
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
var __async = (__this, __arguments, generator) => {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
var fulfilled = (value) => {
|
|
4
|
+
try {
|
|
5
|
+
step(generator.next(value));
|
|
6
|
+
} catch (e) {
|
|
7
|
+
reject(e);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var rejected = (value) => {
|
|
11
|
+
try {
|
|
12
|
+
step(generator.throw(value));
|
|
13
|
+
} catch (e) {
|
|
14
|
+
reject(e);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
18
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
import { PreRender } from "../../react/prerender";
|
|
22
|
+
import { time } from "../time";
|
|
23
|
+
import SSREntry from "./entry";
|
|
24
|
+
const render = (_0) => __async(void 0, [_0], function* ({
|
|
25
|
+
App,
|
|
26
|
+
context,
|
|
27
|
+
config
|
|
28
|
+
}) {
|
|
29
|
+
const ssrContext = context.ssrContext;
|
|
30
|
+
const entry = new SSREntry({
|
|
31
|
+
ctx: ssrContext,
|
|
32
|
+
App,
|
|
33
|
+
config
|
|
34
|
+
});
|
|
35
|
+
entry.metrics.emitCounter("app.visit.count", 1);
|
|
36
|
+
const end = time();
|
|
37
|
+
const html = yield entry.renderToHtml(context);
|
|
38
|
+
const cost = end();
|
|
39
|
+
entry.logger.info("App Render Total cost = %d ms", cost);
|
|
40
|
+
entry.metrics.emitTimer("app.render.cost", cost);
|
|
41
|
+
const cacheConfig = PreRender.config();
|
|
42
|
+
if (cacheConfig) {
|
|
43
|
+
context.ssrContext.cacheConfig = cacheConfig;
|
|
44
|
+
}
|
|
45
|
+
return html;
|
|
46
|
+
});
|
|
47
|
+
export {
|
|
48
|
+
render
|
|
49
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
function processHrtime(previousTimestamp) {
|
|
2
|
+
const now = 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 [seconds, nanoseconds];
|
|
15
|
+
}
|
|
16
|
+
const getLatency = (hrtime) => {
|
|
17
|
+
const [s, ns] = processHrtime(hrtime);
|
|
18
|
+
return s * 1e3 + ns / 1e6;
|
|
19
|
+
};
|
|
20
|
+
const time = () => {
|
|
21
|
+
const hrtime = processHrtime();
|
|
22
|
+
return () => {
|
|
23
|
+
return getLatency(hrtime);
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export {
|
|
27
|
+
time
|
|
28
|
+
};
|
|
@@ -6,17 +6,6 @@ function getLoadableScripts(extractor) {
|
|
|
6
6
|
}
|
|
7
7
|
return scripts.split("<\/script>").slice(0, 2).map((i) => `${i}<\/script>`).join("");
|
|
8
8
|
}
|
|
9
|
-
const getLatency = (hrtime) => {
|
|
10
|
-
const [s, ns] = process.hrtime(hrtime);
|
|
11
|
-
return s * 1e3 + ns / 1e6;
|
|
12
|
-
};
|
|
13
|
-
const time = () => {
|
|
14
|
-
const hrtime = process.hrtime();
|
|
15
|
-
return () => {
|
|
16
|
-
return getLatency(hrtime);
|
|
17
|
-
};
|
|
18
|
-
};
|
|
19
9
|
export {
|
|
20
|
-
getLoadableScripts
|
|
21
|
-
time
|
|
10
|
+
getLoadableScripts
|
|
22
11
|
};
|
|
@@ -274,6 +274,7 @@ const bootstrap = (BootApp, id, root, ReactDOM) => __async(void 0, null, functio
|
|
|
274
274
|
if (ssrContext) {
|
|
275
275
|
ssrContext.res.statusCode = status;
|
|
276
276
|
ssrContext.res.setHeader("Location", redirectUrl);
|
|
277
|
+
ssrContext.redirection = ssrContext.redirection || {};
|
|
277
278
|
ssrContext.redirection.status = status;
|
|
278
279
|
ssrContext.redirection.url = redirectUrl;
|
|
279
280
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var fetch_exports = {};
|
|
19
|
+
__export(fetch_exports, {
|
|
20
|
+
installGlobals: () => installGlobals
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(fetch_exports);
|
|
23
|
+
function installGlobals() {
|
|
24
|
+
}
|
|
25
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
26
|
+
0 && (module.exports = {
|
|
27
|
+
installGlobals
|
|
28
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var fetch_node_exports = {};
|
|
19
|
+
__export(fetch_node_exports, {
|
|
20
|
+
installGlobals: () => import_node.installGlobals
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(fetch_node_exports);
|
|
23
|
+
var import_node = require("@remix-run/node");
|
|
24
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
25
|
+
0 && (module.exports = {
|
|
26
|
+
installGlobals
|
|
27
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var fetch_worker_exports = {};
|
|
19
|
+
__export(fetch_worker_exports, {
|
|
20
|
+
installGlobals: () => installGlobals
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(fetch_worker_exports);
|
|
23
|
+
function installGlobals() {
|
|
24
|
+
}
|
|
25
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
26
|
+
0 && (module.exports = {
|
|
27
|
+
installGlobals
|
|
28
|
+
});
|