@modern-js/runtime 2.3.1-alpha.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.
Files changed (105) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +14 -18
  3. package/dist/js/modern/core/compatible.js +1 -0
  4. package/dist/js/modern/document/Body.js +2 -2
  5. package/dist/js/modern/document/{DocumentStructrueContext.js → DocumentStructureContext.js} +2 -2
  6. package/dist/js/modern/document/Head.js +2 -2
  7. package/dist/js/modern/document/Html.js +2 -2
  8. package/dist/js/modern/document/index.js +1 -1
  9. package/dist/js/modern/router/runtime/fetch.js +5 -0
  10. package/dist/js/modern/router/runtime/fetch.node.js +4 -0
  11. package/dist/js/modern/router/runtime/fetch.worker.js +5 -0
  12. package/dist/js/modern/router/runtime/plugin.node.js +50 -22
  13. package/dist/js/modern/ssr/cli/index.js +2 -2
  14. package/dist/js/modern/ssr/prefetch.worker.js +66 -0
  15. package/dist/js/modern/ssr/react/nossr/index.js +6 -2
  16. package/dist/js/modern/ssr/serverRender/renderToStream/index.js +1 -1
  17. package/dist/js/modern/ssr/serverRender/renderToStream/index.worker.js +35 -0
  18. package/dist/js/modern/ssr/serverRender/renderToStream/renderToPipe.js +5 -3
  19. package/dist/js/modern/ssr/serverRender/renderToStream/renderToPipe.worker.js +110 -0
  20. package/dist/js/modern/ssr/serverRender/renderToString/entry.js +6 -7
  21. package/dist/js/modern/ssr/serverRender/renderToString/index.js +1 -1
  22. package/dist/js/modern/ssr/serverRender/renderToString/index.worker.js +49 -0
  23. package/dist/js/modern/ssr/serverRender/time.js +13 -0
  24. package/dist/js/modern/ssr/serverRender/time.worker.js +28 -0
  25. package/dist/js/modern/ssr/serverRender/utils.js +1 -12
  26. package/dist/js/node/core/compatible.js +1 -0
  27. package/dist/js/node/document/Body.js +2 -2
  28. package/dist/js/node/document/{DocumentStructrueContext.js → DocumentStructureContext.js} +6 -6
  29. package/dist/js/node/document/Head.js +2 -2
  30. package/dist/js/node/document/Html.js +2 -2
  31. package/dist/js/node/document/index.js +1 -1
  32. package/dist/js/node/router/runtime/fetch.js +28 -0
  33. package/dist/js/node/router/runtime/fetch.node.js +27 -0
  34. package/dist/js/node/router/runtime/fetch.worker.js +28 -0
  35. package/dist/js/node/router/runtime/plugin.node.js +46 -21
  36. package/dist/js/node/ssr/cli/index.js +2 -2
  37. package/dist/js/node/ssr/prefetch.worker.js +87 -0
  38. package/dist/js/node/ssr/react/nossr/index.js +6 -2
  39. package/dist/js/node/ssr/serverRender/renderToStream/index.js +2 -2
  40. package/dist/js/node/ssr/serverRender/renderToStream/index.worker.js +64 -0
  41. package/dist/js/node/ssr/serverRender/renderToStream/renderToPipe.js +6 -2
  42. package/dist/js/node/ssr/serverRender/renderToStream/renderToPipe.worker.js +129 -0
  43. package/dist/js/node/ssr/serverRender/renderToString/entry.js +8 -9
  44. package/dist/js/node/ssr/serverRender/renderToString/index.js +2 -2
  45. package/dist/js/node/ssr/serverRender/renderToString/index.worker.js +78 -0
  46. package/dist/js/node/ssr/serverRender/time.js +36 -0
  47. package/dist/js/node/ssr/serverRender/time.worker.js +51 -0
  48. package/dist/js/node/ssr/serverRender/utils.js +2 -14
  49. package/dist/js/treeshaking/core/compatible.js +8 -7
  50. package/dist/js/treeshaking/core/loader/loaderManager.js +3 -3
  51. package/dist/js/treeshaking/core/loader/useLoader.js +15 -15
  52. package/dist/js/treeshaking/document/Body.js +2 -2
  53. package/dist/js/treeshaking/document/{DocumentStructrueContext.js → DocumentStructureContext.js} +2 -2
  54. package/dist/js/treeshaking/document/Head.js +2 -2
  55. package/dist/js/treeshaking/document/Html.js +4 -4
  56. package/dist/js/treeshaking/document/Root.js +2 -2
  57. package/dist/js/treeshaking/document/cli/index.js +4 -4
  58. package/dist/js/treeshaking/document/index.js +1 -1
  59. package/dist/js/treeshaking/router/cli/index.js +2 -2
  60. package/dist/js/treeshaking/router/runtime/fetch.js +2 -0
  61. package/dist/js/treeshaking/router/runtime/fetch.node.js +2 -0
  62. package/dist/js/treeshaking/router/runtime/fetch.worker.js +2 -0
  63. package/dist/js/treeshaking/router/runtime/plugin.js +3 -3
  64. package/dist/js/treeshaking/router/runtime/plugin.node.js +70 -22
  65. package/dist/js/treeshaking/router/runtime/utils.js +3 -3
  66. package/dist/js/treeshaking/ssr/cli/index.js +5 -5
  67. package/dist/js/treeshaking/ssr/index.js +6 -6
  68. package/dist/js/treeshaking/ssr/index.node.js +1 -1
  69. package/dist/js/treeshaking/ssr/prefetch.js +2 -2
  70. package/dist/js/treeshaking/ssr/prefetch.worker.js +191 -0
  71. package/dist/js/treeshaking/ssr/react/nossr/index.js +3 -3
  72. package/dist/js/treeshaking/ssr/react/prerender/index.js +2 -2
  73. package/dist/js/treeshaking/ssr/react/prerender/util.js +2 -2
  74. package/dist/js/treeshaking/ssr/serverRender/renderToStream/bulidTemplate.before.js +2 -2
  75. package/dist/js/treeshaking/ssr/serverRender/renderToStream/index.js +1 -1
  76. package/dist/js/treeshaking/ssr/serverRender/renderToStream/index.worker.js +32 -0
  77. package/dist/js/treeshaking/ssr/serverRender/renderToStream/loadable.js +1 -1
  78. package/dist/js/treeshaking/ssr/serverRender/renderToStream/renderToPipe.js +12 -9
  79. package/dist/js/treeshaking/ssr/serverRender/renderToStream/renderToPipe.worker.js +280 -0
  80. package/dist/js/treeshaking/ssr/serverRender/renderToStream/template.js +1 -1
  81. package/dist/js/treeshaking/ssr/serverRender/renderToString/entry.js +6 -8
  82. package/dist/js/treeshaking/ssr/serverRender/renderToString/index.js +1 -1
  83. package/dist/js/treeshaking/ssr/serverRender/renderToString/index.worker.js +167 -0
  84. package/dist/js/treeshaking/ssr/serverRender/renderToString/loadable.js +1 -1
  85. package/dist/js/treeshaking/ssr/serverRender/time.js +57 -0
  86. package/dist/js/treeshaking/ssr/serverRender/time.worker.js +75 -0
  87. package/dist/js/treeshaking/ssr/serverRender/utils.js +1 -57
  88. package/dist/js/treeshaking/ssr/utils.js +5 -5
  89. package/dist/js/treeshaking/state/cli/index.js +2 -2
  90. package/dist/js/treeshaking/state/runtime/plugin.js +3 -3
  91. package/dist/types/document/{DocumentStructrueContext.d.ts → DocumentStructureContext.d.ts} +2 -2
  92. package/dist/types/document/index.d.ts +1 -1
  93. package/dist/types/router/runtime/fetch.d.ts +2 -0
  94. package/dist/types/router/runtime/fetch.node.d.ts +2 -0
  95. package/dist/types/router/runtime/fetch.worker.d.ts +2 -0
  96. package/dist/types/ssr/prefetch.worker.d.ts +13 -0
  97. package/dist/types/ssr/react/nossr/index.d.ts +4 -2
  98. package/dist/types/ssr/serverRender/renderToStream/index.worker.d.ts +6 -0
  99. package/dist/types/ssr/serverRender/renderToStream/renderToPipe.d.ts +1 -1
  100. package/dist/types/ssr/serverRender/renderToStream/renderToPipe.worker.d.ts +8 -0
  101. package/dist/types/ssr/serverRender/renderToString/index.worker.d.ts +6 -0
  102. package/dist/types/ssr/serverRender/time.d.ts +1 -0
  103. package/dist/types/ssr/serverRender/time.worker.d.ts +1 -0
  104. package/dist/types/ssr/serverRender/utils.d.ts +2 -3
  105. package/package.json +35 -22
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @modern-js/runtime
2
2
 
3
+ ## 2.4.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 9e907ec: chore: catch react-dom/server require for react 17
8
+ chore: 捕获引入 react-dom/server 的逻辑,避免在 react 17 下报错
9
+ - Updated dependencies [98a2733]
10
+ - Updated dependencies [8c2db5f]
11
+ - @modern-js/utils@2.4.0
12
+ - @modern-js/plugin@2.4.0
13
+ - @modern-js/types@2.4.0
14
+
3
15
  ## 2.3.0
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -1,30 +1,26 @@
1
-
2
1
  <p align="center">
3
2
  <a href="https://modernjs.dev" target="blank"><img src="https://lf3-static.bytednsdoc.com/obj/eden-cn/ylaelkeh7nuhfnuhf/modernjs-cover.png" width="300" alt="Modern.js Logo" /></a>
4
3
  </p>
4
+
5
+ <h1 align="center">Modern.js</h1>
6
+
5
7
  <p align="center">
6
- 现代 Web 工程体系
7
- <br/>
8
- <a href="https://modernjs.dev" target="blank">
9
- modernjs.dev
10
- </a>
11
- </p>
12
- <p align="center">
13
- The meta-framework suite designed from scratch for frontend-focused modern web development
8
+ A Progressive React Framework for modern web development.
14
9
  </p>
15
10
 
16
- # Introduction
17
-
18
- > The doc site ([modernjs.dev](https://modernjs.dev)) and articles are only available in Chinese for now, we are planning to add English versions soon.
11
+ ## Getting Started
19
12
 
20
- - [Modern.js: Hello, World!](https://zhuanlan.zhihu.com/p/426707646)
13
+ Please follow [Quick Start](https://modernjs.dev/en/guides/get-started/quick-start) to get started with Modern.js.
21
14
 
22
- ## Getting Started
15
+ ## Documentation
23
16
 
24
- - [Quick Start](https://modernjs.dev/docs/start)
25
- - [Guides](https://modernjs.dev/docs/guides)
26
- - [API References](https://modernjs.dev/docs/apis)
17
+ - [English Documentation](https://modernjs.dev/en/)
18
+ - [中文文档](https://modernjs.dev)
27
19
 
28
20
  ## Contributing
29
21
 
30
- - [Contributing Guide](https://github.com/modern-js-dev/modern.js/blob/main/CONTRIBUTING.md)
22
+ Please read the [Contributing Guide](https://github.com/modern-js-dev/modern.js/blob/main/CONTRIBUTING.md).
23
+
24
+ ## License
25
+
26
+ Modern.js is [MIT licensed](https://github.com/modern-js-dev/modern.js/blob/main/LICENSE).
@@ -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
  }
@@ -4,10 +4,10 @@ import {
4
4
  DOCUMENT_CHUNKSMAP_PLACEHOLDER,
5
5
  DOCUMENT_SSRDATASCRIPT_PLACEHOLDER
6
6
  } from "./constants";
7
- import { DocumentStructrueContext } from "./DocumentStructrueContext";
7
+ import { DocumentStructureContext } from "./DocumentStructureContext";
8
8
  import { DefaultRoot } from "./Root";
9
9
  function Body(props) {
10
- const { hasSetRoot } = useContext(DocumentStructrueContext);
10
+ const { hasSetRoot } = useContext(DocumentStructureContext);
11
11
  const { children } = props;
12
12
  return /* @__PURE__ */ jsxs("body", {
13
13
  children: [
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- const DocumentStructrueContext = React.createContext({
2
+ const DocumentStructureContext = React.createContext({
3
3
  hasSetHead: false,
4
4
  hasSetScripts: false,
5
5
  hasSetBody: false,
@@ -7,5 +7,5 @@ const DocumentStructrueContext = React.createContext({
7
7
  hasSetLinks: false
8
8
  });
9
9
  export {
10
- DocumentStructrueContext
10
+ DocumentStructureContext
11
11
  };
@@ -1,11 +1,11 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useContext } from "react";
3
- import { DocumentStructrueContext } from "./DocumentStructrueContext";
3
+ import { DocumentStructureContext } from "./DocumentStructureContext";
4
4
  import { Scripts } from "./Scripts";
5
5
  import { Links } from "./Links";
6
6
  import { DOCUMENT_META_PLACEHOLDER } from "./constants";
7
7
  function Head(props) {
8
- const { hasSetScripts, hasSetLinks } = useContext(DocumentStructrueContext);
8
+ const { hasSetScripts, hasSetLinks } = useContext(DocumentStructureContext);
9
9
  const { children } = props;
10
10
  return /* @__PURE__ */ jsxs("head", {
11
11
  children: [
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { Body } from "./Body";
3
- import { DocumentStructrueContext } from "./DocumentStructrueContext";
3
+ import { DocumentStructureContext } from "./DocumentStructureContext";
4
4
  import { Head } from "./Head";
5
5
  function findTargetChild(tag, children) {
6
6
  return children.find((item) => getEleType(item) === tag);
@@ -56,7 +56,7 @@ function Html(props) {
56
56
  });
57
57
  }
58
58
  return /* @__PURE__ */ jsx("html", {
59
- children: /* @__PURE__ */ jsxs(DocumentStructrueContext.Provider, {
59
+ children: /* @__PURE__ */ jsxs(DocumentStructureContext.Provider, {
60
60
  value: {
61
61
  hasSetHead,
62
62
  hasSetScripts,
@@ -1,6 +1,6 @@
1
1
  export * from "./Html";
2
2
  export * from "./DocumentContext";
3
- export * from "./DocumentStructrueContext";
3
+ export * from "./DocumentStructureContext";
4
4
  export * from "./Head";
5
5
  export * from "./Body";
6
6
  export * from "./Root";
@@ -0,0 +1,5 @@
1
+ function installGlobals() {
2
+ }
3
+ export {
4
+ installGlobals
5
+ };
@@ -0,0 +1,4 @@
1
+ import { installGlobals } from "@remix-run/node";
2
+ export {
3
+ installGlobals
4
+ };
@@ -0,0 +1,5 @@
1
+ function installGlobals() {
2
+ }
3
+ export {
4
+ installGlobals
5
+ };
@@ -37,19 +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 { createStaticHandler } from "@remix-run/router";
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
- import serialize from "serialize-javascript";
51
53
  import { RuntimeReactContext } from "../../core";
52
54
  import { renderRoutes, urlJoin } from "./utils";
55
+ import { installGlobals } from "./fetch";
53
56
  installGlobals();
54
57
  function createFetchRequest(req) {
55
58
  const origin = `${req.protocol}://${req.host}`;
@@ -64,7 +67,7 @@ function createFetchRequest(req) {
64
67
  }
65
68
  function createFetchHeaders(requestHeaders) {
66
69
  const headers = new Headers();
67
- for (const [key, values] of Object.entries(requestHeaders)) {
70
+ for (const [key, values] of Object.entries(requestHeaders || {})) {
68
71
  if (values) {
69
72
  if (Array.isArray(values)) {
70
73
  for (const value of values) {
@@ -77,6 +80,26 @@ function createFetchHeaders(requestHeaders) {
77
80
  }
78
81
  return headers;
79
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
+ }
80
103
  const routerPlugin = ({
81
104
  basename = "",
82
105
  routesConfig,
@@ -103,17 +126,6 @@ const routerPlugin = ({
103
126
  if (routerContext instanceof Response) {
104
127
  return routerContext;
105
128
  }
106
- if (routerContext.loaderData) {
107
- routerContext.loaderData = JSON.parse(
108
- JSON.stringify(routerContext.loaderData),
109
- (k, v) => {
110
- if (typeof v === "string") {
111
- return serialize(v);
112
- }
113
- return v;
114
- }
115
- );
116
- }
117
129
  const router = createStaticRouter(routes, routerContext);
118
130
  context.router = router;
119
131
  context.routerContext = routerContext;
@@ -129,12 +141,28 @@ const routerPlugin = ({
129
141
  const getRouteApp = () => {
130
142
  return (props) => {
131
143
  const { router, routerContext } = useContext(RuntimeReactContext);
132
- return /* @__PURE__ */ jsx(App, __spreadProps(__spreadValues({}, props), {
133
- children: /* @__PURE__ */ jsx(StaticRouterProvider, {
134
- router,
135
- context: routerContext,
136
- nonce: "the-nonce"
137
- })
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
+ ]
138
166
  }));
139
167
  };
140
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(React.Fragment, null, isMounted ? children : null);
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 "../utils";
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
+ };
@@ -18,9 +18,6 @@ var __spreadValues = (a, b) => {
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
20
  import { Transform } from "stream";
21
- import {
22
- renderToPipeableStream
23
- } from "react-dom/server";
24
21
  import { RenderLevel } from "../types";
25
22
  import { getTemplates } from "./template";
26
23
  function renderToPipe(rootElement, context, options) {
@@ -28,6 +25,11 @@ function renderToPipe(rootElement, context, options) {
28
25
  const { ssrContext } = context;
29
26
  const forUserPipe = (stream) => {
30
27
  return new Promise((resolve) => {
28
+ let renderToPipeableStream;
29
+ try {
30
+ ({ renderToPipeableStream } = require("react-dom/server"));
31
+ } catch (e) {
32
+ }
31
33
  const { pipe } = renderToPipeableStream(rootElement, __spreadProps(__spreadValues({}, options), {
32
34
  onShellReady() {
33
35
  var _a;
@@ -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 "../utils";
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 = "";
@@ -101,9 +102,7 @@ class Entry {
101
102
  if (fragment.isVariable && fragment.content === "SSRDataScript") {
102
103
  html += fragment.getValue(SSRData);
103
104
  } else {
104
- let value = fragment.getValue(this.result);
105
- value = value.replace(/\\\\\\u/g, `u`);
106
- html += value;
105
+ html += fragment.getValue(this.result);
107
106
  }
108
107
  }
109
108
  const helmetData = ReactHelmet.renderStatic();
@@ -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 "../utils";
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
+ };