@modern-js/runtime 1.21.5 → 2.0.0-beta.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.
Files changed (256) hide show
  1. package/CHANGELOG.md +117 -18
  2. package/dist/js/modern/cli/index.js +3 -5
  3. package/dist/js/modern/core/app-config.js +2 -1
  4. package/dist/js/modern/core/compatible.js +47 -48
  5. package/dist/js/modern/core/index.js +4 -3
  6. package/dist/js/modern/core/loader/loaderManager.js +12 -34
  7. package/dist/js/modern/core/loader/useLoader.js +8 -26
  8. package/dist/js/modern/core/plugin.js +6 -28
  9. package/dist/js/modern/document/Body.js +17 -0
  10. package/dist/js/modern/document/DocumentContext.js +6 -0
  11. package/dist/js/modern/document/DocumentStructrueContext.js +7 -0
  12. package/dist/js/modern/document/Head.js +24 -0
  13. package/dist/js/modern/document/Html.js +92 -0
  14. package/dist/js/modern/document/Root.js +31 -0
  15. package/dist/js/modern/document/Scripts.js +10 -0
  16. package/dist/js/modern/document/cli/index.js +130 -0
  17. package/dist/js/modern/document/constants.js +19 -0
  18. package/dist/js/modern/document/index.js +8 -0
  19. package/dist/js/modern/index.js +2 -1
  20. package/dist/js/modern/router/cli/index.js +20 -20
  21. package/dist/js/modern/router/runtime/index.js +1 -1
  22. package/dist/js/modern/router/runtime/plugin.js +25 -52
  23. package/dist/js/modern/router/runtime/plugin.node.js +137 -0
  24. package/dist/js/modern/router/runtime/root/index.js +19 -0
  25. package/dist/js/modern/router/runtime/root/load.js +61 -0
  26. package/dist/js/modern/router/runtime/types.js +1 -0
  27. package/dist/js/modern/router/runtime/utils.js +99 -58
  28. package/dist/js/modern/router/runtime/withRouter.js +20 -0
  29. package/dist/js/modern/runtime-context.js +2 -1
  30. package/dist/js/modern/ssr/cli/index.js +35 -17
  31. package/dist/js/modern/ssr/index.js +64 -51
  32. package/dist/js/modern/ssr/index.node.js +6 -15
  33. package/dist/js/modern/ssr/prefetch.js +0 -7
  34. package/dist/js/modern/ssr/react/prerender/index.js +2 -23
  35. package/dist/js/modern/ssr/react/prerender/util.js +2 -17
  36. package/dist/js/modern/ssr/react/withCallback/index.js +0 -1
  37. package/dist/js/modern/ssr/serverRender/helmet.js +12 -20
  38. package/dist/js/modern/ssr/serverRender/index.js +12 -27
  39. package/dist/js/modern/ssr/serverRender/renderToStream/buildTemplate.after.js +38 -0
  40. package/dist/js/modern/ssr/serverRender/renderToStream/buildTemplate.share.js +5 -0
  41. package/dist/js/modern/ssr/serverRender/renderToStream/bulidTemplate.before.js +58 -0
  42. package/dist/js/modern/ssr/serverRender/renderToStream/index.js +40 -0
  43. package/dist/js/modern/ssr/serverRender/renderToStream/loadable.js +24 -0
  44. package/dist/js/modern/ssr/serverRender/renderToStream/renderToPipe.js +72 -0
  45. package/dist/js/modern/ssr/serverRender/renderToStream/styledComponent.js +11 -0
  46. package/dist/js/modern/ssr/serverRender/renderToStream/template.js +18 -0
  47. package/dist/js/modern/ssr/serverRender/renderToStream/type.js +0 -0
  48. package/dist/js/modern/ssr/serverRender/{entry.js → renderToString/entry.js} +6 -40
  49. package/dist/js/modern/ssr/serverRender/renderToString/index.js +29 -0
  50. package/dist/js/modern/ssr/serverRender/{loadable.js → renderToString/loadable.js} +2 -24
  51. package/dist/js/modern/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -2
  52. package/dist/js/modern/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -0
  53. package/dist/js/modern/ssr/serverRender/{template.js → renderToString/template.js} +0 -15
  54. package/dist/js/modern/ssr/serverRender/{type.js → renderToString/type.js} +0 -2
  55. package/dist/js/modern/ssr/serverRender/types.js +2 -0
  56. package/dist/js/modern/ssr/serverRender/utils.js +20 -0
  57. package/dist/js/modern/ssr/utils.js +8 -13
  58. package/dist/js/modern/state/cli/index.js +0 -10
  59. package/dist/js/modern/state/runtime/plugin.js +1 -14
  60. package/dist/js/node/cli/index.js +3 -13
  61. package/dist/js/node/common.js +0 -2
  62. package/dist/js/node/core/app-config.js +2 -5
  63. package/dist/js/node/core/compatible.js +47 -66
  64. package/dist/js/node/core/index.js +8 -17
  65. package/dist/js/node/core/loader/index.js +0 -2
  66. package/dist/js/node/core/loader/loaderManager.js +12 -37
  67. package/dist/js/node/core/loader/useLoader.js +8 -31
  68. package/dist/js/node/core/plugin.js +5 -34
  69. package/dist/js/node/document/Body.js +26 -0
  70. package/dist/js/node/document/DocumentContext.js +14 -0
  71. package/dist/js/node/document/DocumentStructrueContext.js +15 -0
  72. package/dist/js/node/document/Head.js +33 -0
  73. package/dist/js/node/document/Html.js +98 -0
  74. package/dist/js/node/document/Root.js +41 -0
  75. package/dist/js/node/document/Scripts.js +17 -0
  76. package/dist/js/node/document/cli/index.js +140 -0
  77. package/dist/js/node/document/constants.js +36 -0
  78. package/dist/js/node/document/index.js +93 -0
  79. package/dist/js/node/exports/head.js +0 -5
  80. package/dist/js/node/exports/loadable.js +0 -5
  81. package/dist/js/node/exports/server.js +0 -2
  82. package/dist/js/node/exports/styled.js +0 -5
  83. package/dist/js/node/index.js +5 -5
  84. package/dist/js/node/router/cli/index.js +20 -24
  85. package/dist/js/node/router/index.js +0 -4
  86. package/dist/js/node/router/runtime/DefaultNotFound.js +1 -5
  87. package/dist/js/node/router/runtime/index.js +4 -9
  88. package/dist/js/node/router/runtime/plugin.js +23 -65
  89. package/dist/js/node/router/runtime/plugin.node.js +147 -0
  90. package/dist/js/node/router/runtime/root/index.js +26 -0
  91. package/dist/js/node/router/runtime/root/load.js +69 -0
  92. package/dist/js/node/router/runtime/types.js +5 -0
  93. package/dist/js/node/router/runtime/utils.js +101 -67
  94. package/dist/js/node/router/runtime/withRouter.js +26 -0
  95. package/dist/js/node/runtime-context.js +4 -4
  96. package/dist/js/node/ssr/cli/index.js +35 -21
  97. package/dist/js/node/ssr/index.js +63 -62
  98. package/dist/js/node/ssr/index.node.js +6 -25
  99. package/dist/js/node/ssr/prefetch.js +0 -11
  100. package/dist/js/node/ssr/react/index.js +0 -2
  101. package/dist/js/node/ssr/react/nossr/index.js +0 -6
  102. package/dist/js/node/ssr/react/prerender/index.js +2 -30
  103. package/dist/js/node/ssr/react/prerender/util.js +2 -25
  104. package/dist/js/node/ssr/react/withCallback/index.js +1 -4
  105. package/dist/js/node/ssr/serverRender/helmet.js +13 -20
  106. package/dist/js/node/ssr/serverRender/index.js +14 -39
  107. package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.after.js +45 -0
  108. package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.share.js +13 -0
  109. package/dist/js/node/ssr/serverRender/renderToStream/bulidTemplate.before.js +65 -0
  110. package/dist/js/node/ssr/serverRender/renderToStream/index.js +48 -0
  111. package/dist/js/node/ssr/serverRender/renderToStream/loadable.js +30 -0
  112. package/dist/js/node/ssr/serverRender/renderToStream/renderToPipe.js +79 -0
  113. package/dist/js/node/ssr/serverRender/renderToStream/styledComponent.js +17 -0
  114. package/dist/js/node/ssr/serverRender/renderToStream/template.js +25 -0
  115. package/dist/js/node/ssr/serverRender/renderToStream/type.js +0 -0
  116. package/dist/js/node/ssr/serverRender/{entry.js → renderToString/entry.js} +13 -64
  117. package/dist/js/node/ssr/serverRender/renderToString/index.js +37 -0
  118. package/dist/js/node/ssr/serverRender/{loadable.js → renderToString/loadable.js} +3 -28
  119. package/dist/js/node/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -3
  120. package/dist/js/node/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -3
  121. package/dist/js/node/ssr/serverRender/{template.js → renderToString/template.js} +0 -18
  122. package/dist/js/node/ssr/serverRender/{type.js → renderToString/type.js} +0 -2
  123. package/dist/js/node/ssr/serverRender/types.js +12 -0
  124. package/dist/js/node/ssr/serverRender/utils.js +28 -0
  125. package/dist/js/node/ssr/utils.js +10 -21
  126. package/dist/js/node/state/cli/index.js +0 -15
  127. package/dist/js/node/state/index.js +0 -4
  128. package/dist/js/node/state/plugins.js +0 -11
  129. package/dist/js/node/state/runtime/index.js +0 -7
  130. package/dist/js/node/state/runtime/plugin.js +1 -25
  131. package/dist/js/treeshaking/cli/index.js +3 -3
  132. package/dist/js/treeshaking/core/app-config.js +2 -1
  133. package/dist/js/treeshaking/core/compatible.js +50 -65
  134. package/dist/js/treeshaking/core/index.js +4 -3
  135. package/dist/js/treeshaking/core/loader/loaderManager.js +19 -51
  136. package/dist/js/treeshaking/core/loader/useLoader.js +11 -28
  137. package/dist/js/treeshaking/core/plugin.js +6 -51
  138. package/dist/js/treeshaking/document/Body.js +14 -0
  139. package/dist/js/treeshaking/document/DocumentContext.js +6 -0
  140. package/dist/js/treeshaking/document/DocumentStructrueContext.js +7 -0
  141. package/dist/js/treeshaking/document/Head.js +21 -0
  142. package/dist/js/treeshaking/document/Html.js +104 -0
  143. package/dist/js/treeshaking/document/Root.js +24 -0
  144. package/dist/js/treeshaking/document/Scripts.js +10 -0
  145. package/dist/js/treeshaking/document/cli/index.js +170 -0
  146. package/dist/js/treeshaking/document/constants.js +16 -0
  147. package/dist/js/treeshaking/document/index.js +8 -0
  148. package/dist/js/treeshaking/index.js +2 -1
  149. package/dist/js/treeshaking/router/cli/index.js +26 -22
  150. package/dist/js/treeshaking/router/runtime/index.js +1 -1
  151. package/dist/js/treeshaking/router/runtime/plugin.js +28 -54
  152. package/dist/js/treeshaking/router/runtime/plugin.node.js +161 -0
  153. package/dist/js/treeshaking/router/runtime/root/index.js +17 -0
  154. package/dist/js/treeshaking/router/runtime/root/load.js +102 -0
  155. package/dist/js/treeshaking/router/runtime/types.js +1 -0
  156. package/dist/js/treeshaking/router/runtime/utils.js +104 -58
  157. package/dist/js/treeshaking/router/runtime/withRouter.js +18 -0
  158. package/dist/js/treeshaking/runtime-context.js +2 -1
  159. package/dist/js/treeshaking/ssr/cli/index.js +43 -23
  160. package/dist/js/treeshaking/ssr/index.js +74 -59
  161. package/dist/js/treeshaking/ssr/index.node.js +18 -31
  162. package/dist/js/treeshaking/ssr/prefetch.js +0 -13
  163. package/dist/js/treeshaking/ssr/react/nossr/index.js +3 -4
  164. package/dist/js/treeshaking/ssr/react/prerender/index.js +2 -21
  165. package/dist/js/treeshaking/ssr/react/prerender/util.js +3 -20
  166. package/dist/js/treeshaking/ssr/react/withCallback/index.js +1 -2
  167. package/dist/js/treeshaking/ssr/serverRender/helmet.js +12 -11
  168. package/dist/js/treeshaking/ssr/serverRender/index.js +33 -55
  169. package/dist/js/treeshaking/ssr/serverRender/renderToStream/buildTemplate.after.js +32 -0
  170. package/dist/js/treeshaking/ssr/serverRender/renderToStream/buildTemplate.share.js +7 -0
  171. package/dist/js/treeshaking/ssr/serverRender/renderToStream/bulidTemplate.before.js +60 -0
  172. package/dist/js/treeshaking/ssr/serverRender/renderToStream/index.js +50 -0
  173. package/dist/js/treeshaking/ssr/serverRender/renderToStream/loadable.js +22 -0
  174. package/dist/js/treeshaking/ssr/serverRender/renderToStream/renderToPipe.js +68 -0
  175. package/dist/js/treeshaking/ssr/serverRender/renderToStream/styledComponent.js +10 -0
  176. package/dist/js/treeshaking/ssr/serverRender/renderToStream/template.js +22 -0
  177. package/dist/js/treeshaking/ssr/serverRender/renderToStream/type.js +0 -0
  178. package/dist/js/treeshaking/ssr/serverRender/{entry.js → renderToString/entry.js} +23 -76
  179. package/dist/js/treeshaking/ssr/serverRender/renderToString/index.js +44 -0
  180. package/dist/js/treeshaking/ssr/serverRender/{loadable.js → renderToString/loadable.js} +7 -34
  181. package/dist/js/treeshaking/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -2
  182. package/dist/js/treeshaking/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -0
  183. package/dist/js/treeshaking/ssr/serverRender/{template.js → renderToString/template.js} +2 -18
  184. package/dist/js/treeshaking/ssr/serverRender/{type.js → renderToString/type.js} +0 -2
  185. package/dist/js/treeshaking/ssr/serverRender/types.js +2 -0
  186. package/dist/js/treeshaking/ssr/serverRender/utils.js +28 -0
  187. package/dist/js/treeshaking/ssr/utils.js +20 -17
  188. package/dist/js/treeshaking/state/cli/index.js +3 -10
  189. package/dist/js/treeshaking/state/runtime/plugin.js +2 -10
  190. package/dist/types/cli/index.d.ts +0 -2
  191. package/dist/types/common.d.ts +0 -2
  192. package/dist/types/core/compatible.d.ts +2 -2
  193. package/dist/types/core/index.d.ts +2 -2
  194. package/dist/types/core/loader/loaderManager.d.ts +0 -1
  195. package/dist/types/core/loader/useLoader.d.ts +0 -5
  196. package/dist/types/core/plugin.d.ts +2 -14
  197. package/dist/types/document/Body.d.ts +4 -0
  198. package/dist/types/document/DocumentContext.d.ts +13 -0
  199. package/dist/types/document/DocumentStructrueContext.d.ts +10 -0
  200. package/dist/types/document/Head.d.ts +5 -0
  201. package/dist/types/document/Html.d.ts +4 -0
  202. package/dist/types/document/Root.d.ts +8 -0
  203. package/dist/types/document/Scripts.d.ts +2 -0
  204. package/dist/types/document/cli/index.d.ts +3 -0
  205. package/dist/types/document/constants.d.ts +14 -0
  206. package/dist/types/document/index.d.ts +8 -0
  207. package/dist/types/exports/server.d.ts +21 -1
  208. package/dist/types/index.d.ts +2 -1
  209. package/dist/types/router/cli/index.d.ts +0 -2
  210. package/dist/types/router/runtime/DefaultNotFound.d.ts +1 -0
  211. package/dist/types/router/runtime/index.d.ts +3 -3
  212. package/dist/types/router/runtime/plugin.d.ts +2 -45
  213. package/dist/types/router/runtime/plugin.node.d.ts +8 -0
  214. package/dist/types/router/runtime/root/index.d.ts +8 -0
  215. package/dist/types/router/runtime/root/load.d.ts +22 -0
  216. package/dist/types/router/runtime/types.d.ts +36 -0
  217. package/dist/types/router/runtime/utils.d.ts +5 -2
  218. package/dist/types/router/runtime/withRouter.d.ts +8 -0
  219. package/dist/types/runtime-context.d.ts +3 -1
  220. package/dist/types/ssr/cli/index.d.ts +0 -2
  221. package/dist/types/ssr/index.d.ts +2 -2
  222. package/dist/types/ssr/index.node.d.ts +1 -1
  223. package/dist/types/ssr/prefetch.d.ts +2 -2
  224. package/dist/types/ssr/react/nossr/index.d.ts +3 -1
  225. package/dist/types/ssr/serverRender/index.d.ts +2 -3
  226. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +7 -0
  227. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.share.d.ts +3 -0
  228. package/dist/types/ssr/serverRender/renderToStream/bulidTemplate.before.d.ts +2 -0
  229. package/dist/types/ssr/serverRender/renderToStream/index.d.ts +6 -0
  230. package/dist/types/ssr/serverRender/renderToStream/loadable.d.ts +16 -0
  231. package/dist/types/ssr/serverRender/renderToStream/renderToPipe.d.ts +8 -0
  232. package/dist/types/ssr/serverRender/renderToStream/styledComponent.d.ts +12 -0
  233. package/dist/types/ssr/serverRender/renderToStream/template.d.ts +3 -0
  234. package/dist/types/ssr/serverRender/renderToStream/type.d.ts +4 -0
  235. package/dist/types/ssr/serverRender/{entry.d.ts → renderToString/entry.d.ts} +2 -2
  236. package/dist/types/ssr/serverRender/renderToString/index.d.ts +6 -0
  237. package/dist/types/ssr/serverRender/{loadable.d.ts → renderToString/loadable.d.ts} +0 -0
  238. package/dist/types/ssr/serverRender/{reduce.d.ts → renderToString/reduce.d.ts} +0 -0
  239. package/dist/types/ssr/serverRender/{styledComponent.d.ts → renderToString/styledComponent.d.ts} +0 -0
  240. package/dist/types/ssr/serverRender/{template.d.ts → renderToString/template.d.ts} +0 -0
  241. package/dist/types/ssr/serverRender/{type.d.ts → renderToString/type.d.ts} +1 -8
  242. package/dist/types/ssr/serverRender/types.d.ts +15 -0
  243. package/dist/types/ssr/serverRender/utils.d.ts +3 -0
  244. package/dist/types/ssr/utils.d.ts +4 -2
  245. package/dist/types/state/cli/index.d.ts +0 -2
  246. package/dist/types/state/runtime/plugin.d.ts +1 -1
  247. package/dist/types/state/types.d.ts +0 -1
  248. package/package.json +63 -71
  249. package/types/index.d.ts +13 -0
  250. package/types/router.d.ts +14 -0
  251. package/dist/js/modern/ssr/serverRender/measure.js +0 -11
  252. package/dist/js/node/ssr/serverRender/measure.js +0 -20
  253. package/dist/js/treeshaking/ssr/serverRender/measure.js +0 -17
  254. package/dist/types/ssr/serverRender/measure.d.ts +0 -1
  255. package/lib/types.d.ts +0 -10
  256. package/type.d.ts +0 -5
@@ -1,29 +1,14 @@
1
- import { run } from '@modern-js/utils/ssr';
2
- import { PreRender } from "../react/prerender";
3
- import SSREntry from "./entry";
4
- import { time } from "./measure";
5
- export const render = async (ctx, config, App) => {
6
- const {
7
- ssrContext
8
- } = ctx;
9
- return run(ssrContext.request.headers, async () => {
10
- const entry = new SSREntry({
11
- ctx: ssrContext,
12
- App,
13
- config
14
- });
15
- entry.metrics.emitCounter('app.visit.count', 1);
16
- const end = time();
17
- const html = await entry.renderToHtml(ctx);
18
- const cost = end();
19
- entry.logger.info('App Render Total cost = %d ms', cost);
20
- entry.metrics.emitTimer('app.render.cost', cost);
21
- const cacheConfig = PreRender.config();
22
-
23
- if (cacheConfig) {
24
- ctx.ssrContext.cacheConfig = cacheConfig;
25
- }
1
+ /* eslint-disable eslint-comments/disable-enable-pair */
2
+ /* eslint-disable @typescript-eslint/no-var-requires */
3
+ /* eslint-disable @typescript-eslint/no-require-imports */
26
4
 
5
+ import { isReact18 } from "../utils";
6
+ export default async function serverRender(options) {
7
+ if (isReact18() && options.config.mode === 'stream') {
8
+ const pipe = await require("./renderToStream").render(options);
9
+ return pipe;
10
+ } else {
11
+ const html = await require("./renderToString").render(options);
27
12
  return html;
28
- });
29
- };
13
+ }
14
+ }
@@ -0,0 +1,38 @@
1
+ import serialize from 'serialize-javascript';
2
+ import { buildTemplate } from "./buildTemplate.share";
3
+ export function buildShellAfterTemplate(afterAppTemplate, options) {
4
+ const callbacks = [injectSSRDataScript];
5
+ return buildTemplate(afterAppTemplate, callbacks);
6
+ function injectSSRDataScript(template) {
7
+ const ssrDataScript = buildSSRDataScript();
8
+ return template.replace('<!--<?- SSRDataScript ?>-->', ssrDataScript);
9
+ function buildSSRDataScript() {
10
+ const {
11
+ ssrContext,
12
+ renderLevel
13
+ } = options;
14
+ const {
15
+ request
16
+ } = ssrContext;
17
+ const SSRData = {
18
+ context: {
19
+ request: {
20
+ params: request.params,
21
+ query: request.query,
22
+ pathname: request.pathname,
23
+ host: request.host,
24
+ url: request.url,
25
+ headers: request.headers,
26
+ cookieMap: request.cookieMap
27
+ }
28
+ },
29
+ renderLevel
30
+ };
31
+ return `
32
+ <script>window._SSR_DATA = ${serialize(SSRData, {
33
+ isJSON: true
34
+ })}</script>
35
+ `;
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,5 @@
1
+ // share script
2
+ export const HEAD_REG_EXP = /<head(.|\n)*>(.|\n)*<\/head>/;
3
+ export function buildTemplate(template, callbacks) {
4
+ return callbacks.reduce((template, buildTemplateCb) => buildTemplateCb(template), template);
5
+ }
@@ -0,0 +1,58 @@
1
+ import ReactHelmet from 'react-helmet';
2
+ import { matchRoutes } from 'react-router-dom';
3
+ import helmetReplace from "../helmet";
4
+ import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
5
+ const CSS_CHUNKS_PLACEHOLDER = '<!--<?- chunksMap.css ?>-->';
6
+
7
+ // build head template
8
+ function getHeadTemplate(beforeEntryTemplate, context) {
9
+ const callbacks = [headTemplate => {
10
+ const helmetData = ReactHelmet.renderStatic();
11
+ return helmetData ? helmetReplace(headTemplate, helmetData) : headTemplate;
12
+ },
13
+ // @TODO: prefetch scripts of lazy component
14
+ injectCss];
15
+ const [headTemplate = ''] = beforeEntryTemplate.match(HEAD_REG_EXP) || [];
16
+ if (!headTemplate.length) {
17
+ return '';
18
+ }
19
+ return buildTemplate(headTemplate, callbacks);
20
+ function injectCss(headTemplate) {
21
+ return headTemplate.replace(CSS_CHUNKS_PLACEHOLDER, getCssChunks());
22
+ function getCssChunks() {
23
+ const {
24
+ routeManifest,
25
+ routerContext,
26
+ routes
27
+ } = context;
28
+ if (!routeManifest || !routerContext || !routes) {
29
+ return '';
30
+ }
31
+ const {
32
+ routeAssets
33
+ } = routeManifest;
34
+ const cssChunks = [];
35
+ const matches = matchRoutes(routes, routerContext.location);
36
+ matches === null || matches === void 0 ? void 0 : matches.forEach(match => {
37
+ const routeId = match.route.id;
38
+ if (routeId) {
39
+ const {
40
+ assets = []
41
+ } = routeAssets[routeId];
42
+ const _cssChunks = assets.filter(asset => asset === null || asset === void 0 ? void 0 : asset.endsWith('.css'));
43
+ cssChunks.push(..._cssChunks);
44
+ }
45
+ });
46
+ const styleLinks = cssChunks.map(chunk => {
47
+ return `<link href="${chunk}" rel="stylesheet" />`;
48
+ });
49
+ return `${styleLinks.join('')}`;
50
+ }
51
+ }
52
+ }
53
+
54
+ // build script
55
+ export function buildShellBeforeTemplate(beforeAppTemplate, context) {
56
+ const headTemplate = getHeadTemplate(beforeAppTemplate, context);
57
+ return beforeAppTemplate.replace(HEAD_REG_EXP, headTemplate);
58
+ }
@@ -0,0 +1,40 @@
1
+ import { createElement } from 'react';
2
+ import { run } from '@modern-js/utils/ssr';
3
+ import { PreRender } from "../../react/prerender";
4
+ import { time } from "../utils";
5
+ import renderToPipe from "./renderToPipe";
6
+ export const render = ({
7
+ App,
8
+ context
9
+ }) => {
10
+ const {
11
+ ssrContext
12
+ } = context;
13
+ if (!ssrContext) {
14
+ throw new Error('The "ssrContext" must not be undefined, but received undefined');
15
+ }
16
+ return run(ssrContext.request.headers, async () => {
17
+ const end = time();
18
+ const rootElement = /*#__PURE__*/createElement(App, {
19
+ context: Object.assign(context || {}, {
20
+ ssr: true
21
+ })
22
+ });
23
+ const pipe = renderToPipe(rootElement, context, {
24
+ onShellReady() {
25
+ // set cacheConfig
26
+ const cacheConfig = PreRender.config();
27
+ if (cacheConfig) {
28
+ ssrContext.cacheConfig = cacheConfig;
29
+ }
30
+ },
31
+ onAllReady() {
32
+ // calculate streaming ssr cost
33
+ const cost = end();
34
+ ssrContext.logger.debug('App Render To HTML cost = %d ms', cost);
35
+ ssrContext.metrics.emitTimer('app.render.html.cost', cost);
36
+ }
37
+ });
38
+ return pipe;
39
+ });
40
+ };
@@ -0,0 +1,24 @@
1
+ import { ChunkExtractor } from '@loadable/server';
2
+ export function getLoadableChunks({
3
+ context,
4
+ jsx
5
+ }) {
6
+ const {
7
+ loadableStats,
8
+ entryName
9
+ } = context.ssrContext;
10
+ if (!loadableStats) {
11
+ return {
12
+ jsx
13
+ };
14
+ }
15
+ const extractor = new ChunkExtractor({
16
+ stats: loadableStats,
17
+ entrypoints: [entryName]
18
+ });
19
+ const collectedJsx = extractor.collectChunks(jsx);
20
+ return {
21
+ jsx: collectedJsx,
22
+ chunkExtractor: extractor
23
+ };
24
+ }
@@ -0,0 +1,72 @@
1
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
3
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4
+ import { Transform } from 'stream';
5
+ import { renderToPipeableStream } from 'react-dom/server';
6
+ import { RenderLevel } from "../types";
7
+ import { getTemplates } from "./template";
8
+ function renderToPipe(rootElement, context, options) {
9
+ let isShellStream = true;
10
+ const {
11
+ ssrContext
12
+ } = context;
13
+ const forUserPipe = stream => {
14
+ return new Promise(resolve => {
15
+ const {
16
+ pipe
17
+ } = renderToPipeableStream(rootElement, _objectSpread(_objectSpread({}, options), {}, {
18
+ onShellReady() {
19
+ var _options$onShellReady;
20
+ const {
21
+ shellAfter,
22
+ shellBefore
23
+ } = getTemplates(context, RenderLevel.SERVER_RENDER);
24
+ options === null || options === void 0 ? void 0 : (_options$onShellReady = options.onShellReady) === null || _options$onShellReady === void 0 ? void 0 : _options$onShellReady.call(options);
25
+ const injectableTransform = new Transform({
26
+ transform(chunk, _encoding, callback) {
27
+ try {
28
+ if (isShellStream) {
29
+ this.push(joinChunk(shellBefore, chunk, shellAfter));
30
+ isShellStream = false;
31
+ } else {
32
+ this.push(chunk);
33
+ }
34
+ callback();
35
+ } catch (e) {
36
+ if (e instanceof Error) {
37
+ callback(e);
38
+ } else {
39
+ callback(new Error('Received unkown error when streaming'));
40
+ }
41
+ }
42
+ }
43
+ });
44
+ resolve(pipe(injectableTransform).pipe(stream));
45
+ },
46
+ onShellError(error) {
47
+ var _options$onShellError;
48
+ // Don't log error in `onShellError` callback, since it has been logged in `onError` callback
49
+ ssrContext.metrics.emitCounter('app.render.streaming.shell.error', 1);
50
+ const {
51
+ shellAfter,
52
+ shellBefore
53
+ } = getTemplates(context, RenderLevel.CLIENT_RENDER);
54
+ const fallbackHtml = `${shellBefore}${shellAfter}`;
55
+ resolve(fallbackHtml);
56
+ options === null || options === void 0 ? void 0 : (_options$onShellError = options.onShellError) === null || _options$onShellError === void 0 ? void 0 : _options$onShellError.call(options, error);
57
+ },
58
+ onError(error) {
59
+ var _options$onError;
60
+ ssrContext.logger.error('An error occurs during streaming SSR', error);
61
+ ssrContext.metrics.emitCounter('app.render.streaming.error', 1);
62
+ options === null || options === void 0 ? void 0 : (_options$onError = options.onError) === null || _options$onError === void 0 ? void 0 : _options$onError.call(options, error);
63
+ }
64
+ }));
65
+ });
66
+ };
67
+ return forUserPipe;
68
+ function joinChunk(before = '', chunk, after = '') {
69
+ return `${before}${chunk.toString()}${after}`;
70
+ }
71
+ }
72
+ export default renderToPipe;
@@ -0,0 +1,11 @@
1
+ import { ServerStyleSheet } from 'styled-components';
2
+ export function getStyledComponentCss({
3
+ jsx
4
+ }) {
5
+ const sheet = new ServerStyleSheet();
6
+ const collectedJsx = sheet.collectStyles(jsx);
7
+ return {
8
+ styleSheet: sheet,
9
+ jsx: collectedJsx
10
+ };
11
+ }
@@ -0,0 +1,18 @@
1
+ import { buildShellAfterTemplate } from "./buildTemplate.after";
2
+ import { buildShellBeforeTemplate } from "./bulidTemplate.before";
3
+ const HTML_SEPARATOR = '<!--<?- html ?>-->';
4
+ export const getTemplates = (context, renderLevel) => {
5
+ const {
6
+ ssrContext
7
+ } = context;
8
+ const [beforeAppTemplate = '', afterAppHtmlTemplate = ''] = ssrContext.template.split(HTML_SEPARATOR) || [];
9
+ const builtBeforeTemplate = buildShellBeforeTemplate(beforeAppTemplate, context);
10
+ const builtAfterTemplate = buildShellAfterTemplate(afterAppHtmlTemplate, {
11
+ ssrContext: ssrContext,
12
+ renderLevel
13
+ });
14
+ return {
15
+ shellBefore: builtBeforeTemplate,
16
+ shellAfter: builtAfterTemplate
17
+ };
18
+ };
@@ -1,17 +1,16 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
-
3
2
  import React from 'react';
4
3
  import ReactDomServer from 'react-dom/server';
5
4
  import serialize from 'serialize-javascript';
6
5
  import ReactHelmet from 'react-helmet';
6
+ import helmetReplace from "../helmet";
7
+ import { RenderLevel } from "../types";
8
+ import { time } from "../utils";
9
+ import prefetch from "../../prefetch";
7
10
  import { toFragments } from "./template";
8
- import { RenderLevel } from "./type";
9
- import helmetReplace from "./helmet";
10
11
  import { reduce } from "./reduce";
11
12
  import * as loadableRenderer from "./loadable";
12
13
  import * as styledComponentRenderer from "./styledComponent";
13
- import { time } from "./measure";
14
-
15
14
  const buildTemplateData = (context, data, renderLevel) => {
16
15
  const {
17
16
  request
@@ -32,25 +31,16 @@ const buildTemplateData = (context, data, renderLevel) => {
32
31
  renderLevel
33
32
  };
34
33
  };
35
-
36
34
  export default class Entry {
37
35
  constructor(options) {
38
36
  _defineProperty(this, "entryName", void 0);
39
-
40
37
  _defineProperty(this, "result", void 0);
41
-
42
38
  _defineProperty(this, "metrics", void 0);
43
-
44
39
  _defineProperty(this, "logger", void 0);
45
-
46
40
  _defineProperty(this, "App", void 0);
47
-
48
41
  _defineProperty(this, "fragments", void 0);
49
-
50
42
  _defineProperty(this, "pluginConfig", void 0);
51
-
52
43
  _defineProperty(this, "host", void 0);
53
-
54
44
  const {
55
45
  ctx,
56
46
  config
@@ -78,34 +68,24 @@ export default class Entry {
78
68
  }
79
69
  };
80
70
  }
81
-
82
71
  async renderToHtml(context) {
83
- const {
84
- ssrContext
85
- } = context;
86
-
72
+ const ssrContext = context.ssrContext;
87
73
  if (ssrContext.redirection.url) {
88
74
  return '';
89
75
  }
90
-
91
76
  const prefetchData = await this.prefetch(context);
92
-
93
77
  if (ssrContext.redirection.url) {
94
78
  return '';
95
79
  }
96
-
97
80
  if (this.result.renderLevel >= RenderLevel.SERVER_PREFETCH) {
98
81
  this.result.html = this.renderToString(context);
99
82
  }
100
-
101
83
  if (ssrContext.redirection.url) {
102
84
  return '';
103
85
  }
104
-
105
86
  let html = '';
106
87
  const templateData = buildTemplateData(ssrContext, prefetchData, this.result.renderLevel);
107
88
  const SSRData = this.getSSRDataScript(templateData);
108
-
109
89
  for (const fragment of this.fragments) {
110
90
  if (fragment.isVariable && fragment.content === 'SSRDataScript') {
111
91
  html += fragment.getValue(SSRData);
@@ -113,22 +93,14 @@ export default class Entry {
113
93
  html += fragment.getValue(this.result);
114
94
  }
115
95
  }
116
-
117
96
  const helmetData = ReactHelmet.renderStatic();
118
97
  return helmetData ? helmetReplace(html, helmetData) : html;
119
98
  }
120
-
121
99
  async prefetch(context) {
122
- const {
123
- App: {
124
- prefetch
125
- }
126
- } = this;
127
100
  let prefetchData;
128
101
  const end = time();
129
-
130
102
  try {
131
- prefetchData = prefetch ? await prefetch(context) : null;
103
+ prefetchData = await prefetch(this.App, context);
132
104
  this.result.renderLevel = RenderLevel.SERVER_PREFETCH;
133
105
  const prefetchCost = end();
134
106
  this.logger.debug(`App Prefetch cost = %d ms`, prefetchCost);
@@ -138,17 +110,14 @@ export default class Entry {
138
110
  this.logger.error('App Prefetch Render', e);
139
111
  this.metrics.emitCounter('app.prefetch.render.error', 1);
140
112
  }
141
-
142
113
  return prefetchData || {};
143
114
  }
144
-
145
115
  renderToString(context) {
146
116
  let html = '';
147
117
  const end = time();
148
118
  const {
149
119
  ssrContext
150
120
  } = context;
151
-
152
121
  try {
153
122
  const App = /*#__PURE__*/React.createElement(this.App, {
154
123
  context: Object.assign(context, {
@@ -171,10 +140,8 @@ export default class Entry {
171
140
  this.logger.error('App Render To HTML', e);
172
141
  this.metrics.emitCounter('app.render.html.error', 1);
173
142
  }
174
-
175
143
  return html;
176
144
  }
177
-
178
145
  getSSRDataScript(templateData) {
179
146
  return {
180
147
  SSRDataScript: `
@@ -184,5 +151,4 @@ export default class Entry {
184
151
  `
185
152
  };
186
153
  }
187
-
188
154
  }
@@ -0,0 +1,29 @@
1
+ import { run } from '@modern-js/utils/ssr';
2
+ import { PreRender } from "../../react/prerender";
3
+ import { time } from "../utils";
4
+ import SSREntry from "./entry";
5
+ export const render = ({
6
+ App,
7
+ context,
8
+ config
9
+ }) => {
10
+ const ssrContext = context.ssrContext;
11
+ return run(ssrContext.request.headers, async () => {
12
+ const entry = new SSREntry({
13
+ ctx: ssrContext,
14
+ App,
15
+ config
16
+ });
17
+ entry.metrics.emitCounter('app.visit.count', 1);
18
+ const end = time();
19
+ const html = await entry.renderToHtml(context);
20
+ const cost = end();
21
+ entry.logger.info('App Render Total cost = %d ms', cost);
22
+ entry.metrics.emitTimer('app.render.cost', cost);
23
+ const cacheConfig = PreRender.config();
24
+ if (cacheConfig) {
25
+ context.ssrContext.cacheConfig = cacheConfig;
26
+ }
27
+ return html;
28
+ });
29
+ };
@@ -1,27 +1,12 @@
1
1
  import { ChunkExtractor } from '@loadable/server';
2
- import { isCrossOrigin } from "../utils";
3
-
2
+ import { isCrossOrigin } from "../../utils";
3
+ import { getLoadableScripts } from "../utils";
4
4
  const extname = uri => {
5
5
  if (typeof uri !== 'string' || !uri.includes('.')) {
6
6
  return '';
7
7
  }
8
-
9
8
  return `.${uri === null || uri === void 0 ? void 0 : uri.split('.').pop()}` || '';
10
9
  };
11
-
12
- function getLoadableScripts(extractor) {
13
- const check = scripts => (scripts || '').includes('__LOADABLE_REQUIRED_CHUNKS___ext');
14
-
15
- const scripts = extractor.getScriptTags();
16
-
17
- if (!check(scripts)) {
18
- return '';
19
- }
20
-
21
- return scripts.split('</script>') // 前两个 script为 loadable 必须的 script
22
- .slice(0, 2).map(i => `${i}</script>`).join('');
23
- }
24
-
25
10
  export const toHtml = (jsx, renderer, next) => {
26
11
  const {
27
12
  stats,
@@ -31,11 +16,9 @@ export const toHtml = (jsx, renderer, next) => {
31
16
  host,
32
17
  config = {}
33
18
  } = renderer;
34
-
35
19
  if (!stats || chunksMap.js) {
36
20
  return next(jsx);
37
21
  }
38
-
39
22
  const extractor = new ChunkExtractor({
40
23
  stats,
41
24
  entrypoints: [renderer.entryName]
@@ -43,25 +26,20 @@ export const toHtml = (jsx, renderer, next) => {
43
26
  const html = next(extractor.collectChunks(jsx));
44
27
  const chunks = extractor.getChunkAssets(extractor.chunks);
45
28
  chunksMap.js = (chunksMap.js || '') + getLoadableScripts(extractor);
46
-
47
29
  for (const v of chunks) {
48
30
  const fileType = extname(v.url).slice(1);
49
-
50
31
  if (fileType === 'js') {
51
32
  const props = [];
52
33
  const {
53
34
  crossorigin
54
35
  } = config;
55
-
56
36
  if (crossorigin && isCrossOrigin(v.url, host)) {
57
37
  props.push(`crossorigin="${crossorigin === true ? 'anonymous' : crossorigin}"`);
58
38
  }
59
-
60
39
  chunksMap[fileType] += `<script src="${v.url}" ${props.join(' ')}></script>`;
61
40
  } else if (fileType === 'css') {
62
41
  chunksMap[fileType] += `<link href="${v.url}" rel="stylesheet" />`;
63
42
  }
64
43
  }
65
-
66
44
  return html;
67
45
  };
@@ -1,7 +1,5 @@
1
1
  export function reduce(jsx, renderer, middleware) {
2
2
  let index = 0;
3
-
4
3
  const createNext = () => App => middleware[index++](App, renderer, createNext());
5
-
6
4
  return createNext()(jsx);
7
5
  }
@@ -1,5 +1,4 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
-
3
2
  const VARIABLE_REG_EXP = /<!--<\?([-=+])\s*(.*?)\s*\?>-->/;
4
3
  const VARIABLE_SPLITTER = /(<!--<\?.*?\?>-->)/;
5
4
  const ENCODE_HTML_RULES = {
@@ -10,27 +9,19 @@ const ENCODE_HTML_RULES = {
10
9
  "'": '&#39;'
11
10
  };
12
11
  const MATCH_HTML = /[&<>'"]/g;
13
-
14
12
  function encodeChar(c) {
15
13
  return ENCODE_HTML_RULES[c] || c;
16
14
  }
17
-
18
15
  function escape(str) {
19
16
  return str.replace(MATCH_HTML, encodeChar);
20
17
  }
21
-
22
18
  export class Fragment {
23
19
  constructor(template) {
24
20
  _defineProperty(this, "isVariable", void 0);
25
-
26
21
  _defineProperty(this, "content", void 0);
27
-
28
22
  _defineProperty(this, "filters", void 0);
29
-
30
23
  _defineProperty(this, "path", void 0);
31
-
32
24
  const match = VARIABLE_REG_EXP.exec(template);
33
-
34
25
  if (match) {
35
26
  const [, filterFlag, content] = match;
36
27
  this.isVariable = true;
@@ -44,29 +35,23 @@ export class Fragment {
44
35
  this.path = [];
45
36
  }
46
37
  }
47
-
48
38
  getValue(data) {
49
39
  if (this.isVariable) {
50
40
  const value = this.path.reduce((p, n) => p != null ? p[n] : p, data);
51
41
  return this.filters.reduce((p, n) => n(p), value != null ? value : '');
52
42
  }
53
-
54
43
  return this.content;
55
44
  }
56
-
57
45
  }
58
-
59
46
  _defineProperty(Fragment, "filterMap", {
60
47
  '=': escape,
61
48
  '-': v => v
62
49
  });
63
-
64
50
  const fragmentListMap = {};
65
51
  export function toFragments(template, entryName) {
66
52
  if (fragmentListMap[entryName]) {
67
53
  return fragmentListMap[entryName];
68
54
  }
69
-
70
55
  const fragmentList = template.split(VARIABLE_SPLITTER).filter(v => Boolean(v)).map(v => new Fragment(v));
71
56
  fragmentListMap[entryName] = fragmentList;
72
57
  return fragmentList;
@@ -1,6 +1,4 @@
1
- // import { IncomingHttpHeaders } from 'http';
2
1
  export let RenderLevel;
3
-
4
2
  (function (RenderLevel) {
5
3
  RenderLevel[RenderLevel["CLIENT_RENDER"] = 0] = "CLIENT_RENDER";
6
4
  RenderLevel[RenderLevel["SERVER_PREFETCH"] = 1] = "SERVER_PREFETCH";
@@ -0,0 +1,2 @@
1
+ import { RenderLevel } from "./renderToString/type";
2
+ export { RenderLevel };
@@ -0,0 +1,20 @@
1
+ export function getLoadableScripts(extractor) {
2
+ const check = scripts => (scripts || '').includes('__LOADABLE_REQUIRED_CHUNKS___ext');
3
+ const scripts = extractor.getScriptTags();
4
+ if (!check(scripts)) {
5
+ return '';
6
+ }
7
+ return scripts.split('</script>')
8
+ // 前两个 script为 loadable 必须的 script
9
+ .slice(0, 2).map(i => `${i}</script>`).join('');
10
+ }
11
+ const getLatency = hrtime => {
12
+ const [s, ns] = process.hrtime(hrtime);
13
+ return s * 1e3 + ns / 1e6;
14
+ };
15
+ export const time = () => {
16
+ const hrtime = process.hrtime();
17
+ return () => {
18
+ return getLatency(hrtime);
19
+ };
20
+ };