@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,63 +1,41 @@
1
1
  import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
2
  import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
- import { run } from '@modern-js/utils/ssr';
4
- import { PreRender } from "../react/prerender";
5
- import SSREntry from "./entry";
6
- import { time } from "./measure";
7
- export var render = /*#__PURE__*/function () {
8
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(ctx, config, App) {
9
- var ssrContext;
10
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
3
+ /* eslint-disable eslint-comments/disable-enable-pair */
4
+ /* eslint-disable @typescript-eslint/no-var-requires */
5
+ /* eslint-disable @typescript-eslint/no-require-imports */
6
+
7
+ import { isReact18 } from "../utils";
8
+ export default function serverRender(_x) {
9
+ return _serverRender.apply(this, arguments);
10
+ }
11
+ function _serverRender() {
12
+ _serverRender = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
13
+ var pipe, html;
14
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
11
15
  while (1) {
12
- switch (_context2.prev = _context2.next) {
16
+ switch (_context.prev = _context.next) {
13
17
  case 0:
14
- ssrContext = ctx.ssrContext;
15
- return _context2.abrupt("return", run(ssrContext.request.headers, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
16
- var entry, end, html, cost, cacheConfig;
17
- return _regeneratorRuntime().wrap(function _callee$(_context) {
18
- while (1) {
19
- switch (_context.prev = _context.next) {
20
- case 0:
21
- entry = new SSREntry({
22
- ctx: ssrContext,
23
- App: App,
24
- config: config
25
- });
26
- entry.metrics.emitCounter('app.visit.count', 1);
27
- end = time();
28
- _context.next = 5;
29
- return entry.renderToHtml(ctx);
30
-
31
- case 5:
32
- html = _context.sent;
33
- cost = end();
34
- entry.logger.info('App Render Total cost = %d ms', cost);
35
- entry.metrics.emitTimer('app.render.cost', cost);
36
- cacheConfig = PreRender.config();
37
-
38
- if (cacheConfig) {
39
- ctx.ssrContext.cacheConfig = cacheConfig;
40
- }
41
-
42
- return _context.abrupt("return", html);
43
-
44
- case 12:
45
- case "end":
46
- return _context.stop();
47
- }
48
- }
49
- }, _callee);
50
- }))));
51
-
52
- case 2:
18
+ if (!(isReact18() && options.config.mode === 'stream')) {
19
+ _context.next = 7;
20
+ break;
21
+ }
22
+ _context.next = 3;
23
+ return require("./renderToStream").render(options);
24
+ case 3:
25
+ pipe = _context.sent;
26
+ return _context.abrupt("return", pipe);
27
+ case 7:
28
+ _context.next = 9;
29
+ return require("./renderToString").render(options);
30
+ case 9:
31
+ html = _context.sent;
32
+ return _context.abrupt("return", html);
33
+ case 11:
53
34
  case "end":
54
- return _context2.stop();
35
+ return _context.stop();
55
36
  }
56
37
  }
57
- }, _callee2);
38
+ }, _callee);
58
39
  }));
59
-
60
- return function render(_x, _x2, _x3) {
61
- return _ref.apply(this, arguments);
62
- };
63
- }();
40
+ return _serverRender.apply(this, arguments);
41
+ }
@@ -0,0 +1,32 @@
1
+ import serialize from 'serialize-javascript';
2
+ import { buildTemplate } from "./buildTemplate.share";
3
+ export function buildShellAfterTemplate(afterAppTemplate, options) {
4
+ var callbacks = [injectSSRDataScript];
5
+ return buildTemplate(afterAppTemplate, callbacks);
6
+ function injectSSRDataScript(template) {
7
+ var ssrDataScript = buildSSRDataScript();
8
+ return template.replace('<!--<?- SSRDataScript ?>-->', ssrDataScript);
9
+ function buildSSRDataScript() {
10
+ var ssrContext = options.ssrContext,
11
+ renderLevel = options.renderLevel;
12
+ var request = ssrContext.request;
13
+ var SSRData = {
14
+ context: {
15
+ request: {
16
+ params: request.params,
17
+ query: request.query,
18
+ pathname: request.pathname,
19
+ host: request.host,
20
+ url: request.url,
21
+ headers: request.headers,
22
+ cookieMap: request.cookieMap
23
+ }
24
+ },
25
+ renderLevel: renderLevel
26
+ };
27
+ return "\n <script>window._SSR_DATA = ".concat(serialize(SSRData, {
28
+ isJSON: true
29
+ }), "</script>\n ");
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,7 @@
1
+ // share script
2
+ export var HEAD_REG_EXP = /<head(.|\n)*>(.|\n)*<\/head>/;
3
+ export function buildTemplate(template, callbacks) {
4
+ return callbacks.reduce(function (template, buildTemplateCb) {
5
+ return buildTemplateCb(template);
6
+ }, template);
7
+ }
@@ -0,0 +1,60 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
+ import ReactHelmet from 'react-helmet';
4
+ import { matchRoutes } from 'react-router-dom';
5
+ import helmetReplace from "../helmet";
6
+ import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
7
+ var CSS_CHUNKS_PLACEHOLDER = '<!--<?- chunksMap.css ?>-->';
8
+
9
+ // build head template
10
+ function getHeadTemplate(beforeEntryTemplate, context) {
11
+ var callbacks = [function (headTemplate) {
12
+ var helmetData = ReactHelmet.renderStatic();
13
+ return helmetData ? helmetReplace(headTemplate, helmetData) : headTemplate;
14
+ },
15
+ // @TODO: prefetch scripts of lazy component
16
+ injectCss];
17
+ var _ref = beforeEntryTemplate.match(HEAD_REG_EXP) || [],
18
+ _ref2 = _slicedToArray(_ref, 1),
19
+ _ref2$ = _ref2[0],
20
+ headTemplate = _ref2$ === void 0 ? '' : _ref2$;
21
+ if (!headTemplate.length) {
22
+ return '';
23
+ }
24
+ return buildTemplate(headTemplate, callbacks);
25
+ function injectCss(headTemplate) {
26
+ return headTemplate.replace(CSS_CHUNKS_PLACEHOLDER, getCssChunks());
27
+ function getCssChunks() {
28
+ var routeManifest = context.routeManifest,
29
+ routerContext = context.routerContext,
30
+ routes = context.routes;
31
+ if (!routeManifest || !routerContext || !routes) {
32
+ return '';
33
+ }
34
+ var routeAssets = routeManifest.routeAssets;
35
+ var cssChunks = [];
36
+ var matches = matchRoutes(routes, routerContext.location);
37
+ matches === null || matches === void 0 ? void 0 : matches.forEach(function (match) {
38
+ var routeId = match.route.id;
39
+ if (routeId) {
40
+ var _routeAssets$routeId$ = routeAssets[routeId].assets,
41
+ assets = _routeAssets$routeId$ === void 0 ? [] : _routeAssets$routeId$;
42
+ var _cssChunks = assets.filter(function (asset) {
43
+ return asset === null || asset === void 0 ? void 0 : asset.endsWith('.css');
44
+ });
45
+ cssChunks.push.apply(cssChunks, _toConsumableArray(_cssChunks));
46
+ }
47
+ });
48
+ var styleLinks = cssChunks.map(function (chunk) {
49
+ return "<link href=\"".concat(chunk, "\" rel=\"stylesheet\" />");
50
+ });
51
+ return "".concat(styleLinks.join(''));
52
+ }
53
+ }
54
+ }
55
+
56
+ // build script
57
+ export function buildShellBeforeTemplate(beforeAppTemplate, context) {
58
+ var headTemplate = getHeadTemplate(beforeAppTemplate, context);
59
+ return beforeAppTemplate.replace(HEAD_REG_EXP, headTemplate);
60
+ }
@@ -0,0 +1,50 @@
1
+ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
+ import { createElement } from 'react';
4
+ import { run } from '@modern-js/utils/ssr';
5
+ import { PreRender } from "../../react/prerender";
6
+ import { time } from "../utils";
7
+ import renderToPipe from "./renderToPipe";
8
+ export var render = function render(_ref) {
9
+ var App = _ref.App,
10
+ context = _ref.context;
11
+ var ssrContext = context.ssrContext;
12
+ if (!ssrContext) {
13
+ throw new Error('The "ssrContext" must not be undefined, but received undefined');
14
+ }
15
+ return run(ssrContext.request.headers, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
16
+ var end, rootElement, pipe;
17
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
18
+ while (1) {
19
+ switch (_context.prev = _context.next) {
20
+ case 0:
21
+ end = time();
22
+ rootElement = /*#__PURE__*/createElement(App, {
23
+ context: Object.assign(context || {}, {
24
+ ssr: true
25
+ })
26
+ });
27
+ pipe = renderToPipe(rootElement, context, {
28
+ onShellReady: function onShellReady() {
29
+ // set cacheConfig
30
+ var cacheConfig = PreRender.config();
31
+ if (cacheConfig) {
32
+ ssrContext.cacheConfig = cacheConfig;
33
+ }
34
+ },
35
+ onAllReady: function onAllReady() {
36
+ // calculate streaming ssr cost
37
+ var cost = end();
38
+ ssrContext.logger.debug('App Render To HTML cost = %d ms', cost);
39
+ ssrContext.metrics.emitTimer('app.render.html.cost', cost);
40
+ }
41
+ });
42
+ return _context.abrupt("return", pipe);
43
+ case 4:
44
+ case "end":
45
+ return _context.stop();
46
+ }
47
+ }
48
+ }, _callee);
49
+ })));
50
+ };
@@ -0,0 +1,22 @@
1
+ import { ChunkExtractor } from '@loadable/server';
2
+ export function getLoadableChunks(_ref) {
3
+ var context = _ref.context,
4
+ jsx = _ref.jsx;
5
+ var _ref2 = context.ssrContext,
6
+ loadableStats = _ref2.loadableStats,
7
+ entryName = _ref2.entryName;
8
+ if (!loadableStats) {
9
+ return {
10
+ jsx: jsx
11
+ };
12
+ }
13
+ var extractor = new ChunkExtractor({
14
+ stats: loadableStats,
15
+ entrypoints: [entryName]
16
+ });
17
+ var collectedJsx = extractor.collectChunks(jsx);
18
+ return {
19
+ jsx: collectedJsx,
20
+ chunkExtractor: extractor
21
+ };
22
+ }
@@ -0,0 +1,68 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ import { Transform } from 'stream';
3
+ import { renderToPipeableStream } from 'react-dom/server';
4
+ import { RenderLevel } from "../types";
5
+ import { getTemplates } from "./template";
6
+ function renderToPipe(rootElement, context, options) {
7
+ var isShellStream = true;
8
+ var ssrContext = context.ssrContext;
9
+ var forUserPipe = function forUserPipe(stream) {
10
+ return new Promise(function (resolve) {
11
+ var _renderToPipeableStre = renderToPipeableStream(rootElement, _objectSpread(_objectSpread({}, options), {}, {
12
+ onShellReady: function onShellReady() {
13
+ var _options$onShellReady;
14
+ var _getTemplates = getTemplates(context, RenderLevel.SERVER_RENDER),
15
+ shellAfter = _getTemplates.shellAfter,
16
+ shellBefore = _getTemplates.shellBefore;
17
+ options === null || options === void 0 ? void 0 : (_options$onShellReady = options.onShellReady) === null || _options$onShellReady === void 0 ? void 0 : _options$onShellReady.call(options);
18
+ var injectableTransform = new Transform({
19
+ transform: function transform(chunk, _encoding, callback) {
20
+ try {
21
+ if (isShellStream) {
22
+ this.push(joinChunk(shellBefore, chunk, shellAfter));
23
+ isShellStream = false;
24
+ } else {
25
+ this.push(chunk);
26
+ }
27
+ callback();
28
+ } catch (e) {
29
+ if (e instanceof Error) {
30
+ callback(e);
31
+ } else {
32
+ callback(new Error('Received unkown error when streaming'));
33
+ }
34
+ }
35
+ }
36
+ });
37
+ resolve(pipe(injectableTransform).pipe(stream));
38
+ },
39
+ onShellError: function onShellError(error) {
40
+ var _options$onShellError;
41
+ // Don't log error in `onShellError` callback, since it has been logged in `onError` callback
42
+ ssrContext.metrics.emitCounter('app.render.streaming.shell.error', 1);
43
+ var _getTemplates2 = getTemplates(context, RenderLevel.CLIENT_RENDER),
44
+ shellAfter = _getTemplates2.shellAfter,
45
+ shellBefore = _getTemplates2.shellBefore;
46
+ var fallbackHtml = "".concat(shellBefore).concat(shellAfter);
47
+ resolve(fallbackHtml);
48
+ options === null || options === void 0 ? void 0 : (_options$onShellError = options.onShellError) === null || _options$onShellError === void 0 ? void 0 : _options$onShellError.call(options, error);
49
+ },
50
+ onError: function onError(error) {
51
+ var _options$onError;
52
+ ssrContext.logger.error('An error occurs during streaming SSR', error);
53
+ ssrContext.metrics.emitCounter('app.render.streaming.error', 1);
54
+ options === null || options === void 0 ? void 0 : (_options$onError = options.onError) === null || _options$onError === void 0 ? void 0 : _options$onError.call(options, error);
55
+ }
56
+ })),
57
+ pipe = _renderToPipeableStre.pipe;
58
+ });
59
+ };
60
+ return forUserPipe;
61
+ function joinChunk() {
62
+ var before = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
63
+ var chunk = arguments.length > 1 ? arguments[1] : undefined;
64
+ var after = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
65
+ return "".concat(before).concat(chunk.toString()).concat(after);
66
+ }
67
+ }
68
+ export default renderToPipe;
@@ -0,0 +1,10 @@
1
+ import { ServerStyleSheet } from 'styled-components';
2
+ export function getStyledComponentCss(_ref) {
3
+ var jsx = _ref.jsx;
4
+ var sheet = new ServerStyleSheet();
5
+ var collectedJsx = sheet.collectStyles(jsx);
6
+ return {
7
+ styleSheet: sheet,
8
+ jsx: collectedJsx
9
+ };
10
+ }
@@ -0,0 +1,22 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import { buildShellAfterTemplate } from "./buildTemplate.after";
3
+ import { buildShellBeforeTemplate } from "./bulidTemplate.before";
4
+ var HTML_SEPARATOR = '<!--<?- html ?>-->';
5
+ export var getTemplates = function getTemplates(context, renderLevel) {
6
+ var ssrContext = context.ssrContext;
7
+ var _ref = ssrContext.template.split(HTML_SEPARATOR) || [],
8
+ _ref2 = _slicedToArray(_ref, 2),
9
+ _ref2$ = _ref2[0],
10
+ beforeAppTemplate = _ref2$ === void 0 ? '' : _ref2$,
11
+ _ref2$2 = _ref2[1],
12
+ afterAppHtmlTemplate = _ref2$2 === void 0 ? '' : _ref2$2;
13
+ var builtBeforeTemplate = buildShellBeforeTemplate(beforeAppTemplate, context);
14
+ var builtAfterTemplate = buildShellAfterTemplate(afterAppHtmlTemplate, {
15
+ ssrContext: ssrContext,
16
+ renderLevel: renderLevel
17
+ });
18
+ return {
19
+ shellBefore: builtBeforeTemplate,
20
+ shellAfter: builtAfterTemplate
21
+ };
22
+ };
@@ -8,14 +8,14 @@ import React from 'react';
8
8
  import ReactDomServer from 'react-dom/server';
9
9
  import serialize from 'serialize-javascript';
10
10
  import ReactHelmet from 'react-helmet';
11
+ import helmetReplace from "../helmet";
12
+ import { RenderLevel } from "../types";
13
+ import { time } from "../utils";
14
+ import _prefetch from "../../prefetch";
11
15
  import { toFragments } from "./template";
12
- import { RenderLevel } from "./type";
13
- import helmetReplace from "./helmet";
14
16
  import { reduce } from "./reduce";
15
17
  import * as loadableRenderer from "./loadable";
16
18
  import * as styledComponentRenderer from "./styledComponent";
17
- import { time } from "./measure";
18
-
19
19
  var buildTemplateData = function buildTemplateData(context, data, renderLevel) {
20
20
  var request = context.request;
21
21
  return {
@@ -34,32 +34,22 @@ var buildTemplateData = function buildTemplateData(context, data, renderLevel) {
34
34
  renderLevel: renderLevel
35
35
  };
36
36
  };
37
-
38
37
  var Entry = /*#__PURE__*/function () {
39
38
  function Entry(options) {
40
39
  _classCallCheck(this, Entry);
41
-
42
40
  _defineProperty(this, "entryName", void 0);
43
-
44
41
  _defineProperty(this, "result", void 0);
45
-
46
42
  _defineProperty(this, "metrics", void 0);
47
-
48
43
  _defineProperty(this, "logger", void 0);
49
-
50
44
  _defineProperty(this, "App", void 0);
51
-
52
45
  _defineProperty(this, "fragments", void 0);
53
-
54
46
  _defineProperty(this, "pluginConfig", void 0);
55
-
56
47
  _defineProperty(this, "host", void 0);
57
-
58
48
  var ctx = options.ctx,
59
- config = options.config;
49
+ config = options.config;
60
50
  var entryName = ctx.entryName,
61
- template = ctx.template,
62
- host = ctx.request.host;
51
+ template = ctx.template,
52
+ host = ctx.request.host;
63
53
  this.fragments = toFragments(template, entryName);
64
54
  this.entryName = entryName;
65
55
  this.host = host;
@@ -76,62 +66,48 @@ var Entry = /*#__PURE__*/function () {
76
66
  }
77
67
  };
78
68
  }
79
-
80
69
  _createClass(Entry, [{
81
70
  key: "renderToHtml",
82
71
  value: function () {
83
72
  var _renderToHtml = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(context) {
84
73
  var ssrContext, prefetchData, html, templateData, SSRData, _iterator, _step, fragment, helmetData;
85
-
86
74
  return _regeneratorRuntime().wrap(function _callee$(_context) {
87
75
  while (1) {
88
76
  switch (_context.prev = _context.next) {
89
77
  case 0:
90
78
  ssrContext = context.ssrContext;
91
-
92
79
  if (!ssrContext.redirection.url) {
93
80
  _context.next = 3;
94
81
  break;
95
82
  }
96
-
97
83
  return _context.abrupt("return", '');
98
-
99
84
  case 3:
100
85
  _context.next = 5;
101
86
  return this.prefetch(context);
102
-
103
87
  case 5:
104
88
  prefetchData = _context.sent;
105
-
106
89
  if (!ssrContext.redirection.url) {
107
90
  _context.next = 8;
108
91
  break;
109
92
  }
110
-
111
93
  return _context.abrupt("return", '');
112
-
113
94
  case 8:
114
95
  if (this.result.renderLevel >= RenderLevel.SERVER_PREFETCH) {
115
96
  this.result.html = this.renderToString(context);
116
97
  }
117
-
118
98
  if (!ssrContext.redirection.url) {
119
99
  _context.next = 11;
120
100
  break;
121
101
  }
122
-
123
102
  return _context.abrupt("return", '');
124
-
125
103
  case 11:
126
104
  html = '';
127
105
  templateData = buildTemplateData(ssrContext, prefetchData, this.result.renderLevel);
128
106
  SSRData = this.getSSRDataScript(templateData);
129
107
  _iterator = _createForOfIteratorHelper(this.fragments);
130
-
131
108
  try {
132
109
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
133
110
  fragment = _step.value;
134
-
135
111
  if (fragment.isVariable && fragment.content === 'SSRDataScript') {
136
112
  html += fragment.getValue(SSRData);
137
113
  } else {
@@ -143,10 +119,8 @@ var Entry = /*#__PURE__*/function () {
143
119
  } finally {
144
120
  _iterator.f();
145
121
  }
146
-
147
122
  helmetData = ReactHelmet.renderStatic();
148
123
  return _context.abrupt("return", helmetData ? helmetReplace(html, helmetData) : html);
149
-
150
124
  case 18:
151
125
  case "end":
152
126
  return _context.stop();
@@ -154,73 +128,50 @@ var Entry = /*#__PURE__*/function () {
154
128
  }
155
129
  }, _callee, this);
156
130
  }));
157
-
158
131
  function renderToHtml(_x) {
159
132
  return _renderToHtml.apply(this, arguments);
160
133
  }
161
-
162
134
  return renderToHtml;
163
135
  }()
164
136
  }, {
165
137
  key: "prefetch",
166
138
  value: function () {
167
- var _prefetch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(context) {
168
- var prefetch, prefetchData, end, prefetchCost;
139
+ var _prefetch2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(context) {
140
+ var prefetchData, end, prefetchCost;
169
141
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
170
142
  while (1) {
171
143
  switch (_context2.prev = _context2.next) {
172
144
  case 0:
173
- prefetch = this.App.prefetch;
174
145
  end = time();
175
- _context2.prev = 2;
176
-
177
- if (!prefetch) {
178
- _context2.next = 9;
179
- break;
180
- }
181
-
182
- _context2.next = 6;
183
- return prefetch(context);
184
-
185
- case 6:
186
- _context2.t0 = _context2.sent;
187
- _context2.next = 10;
188
- break;
189
-
190
- case 9:
191
- _context2.t0 = null;
192
-
193
- case 10:
194
- prefetchData = _context2.t0;
146
+ _context2.prev = 1;
147
+ _context2.next = 4;
148
+ return _prefetch(this.App, context);
149
+ case 4:
150
+ prefetchData = _context2.sent;
195
151
  this.result.renderLevel = RenderLevel.SERVER_PREFETCH;
196
152
  prefetchCost = end();
197
153
  this.logger.debug("App Prefetch cost = %d ms", prefetchCost);
198
154
  this.metrics.emitTimer('app.prefetch.cost', prefetchCost);
199
- _context2.next = 22;
155
+ _context2.next = 16;
200
156
  break;
201
-
202
- case 17:
203
- _context2.prev = 17;
204
- _context2.t1 = _context2["catch"](2);
157
+ case 11:
158
+ _context2.prev = 11;
159
+ _context2.t0 = _context2["catch"](1);
205
160
  this.result.renderLevel = RenderLevel.CLIENT_RENDER;
206
- this.logger.error('App Prefetch Render', _context2.t1);
161
+ this.logger.error('App Prefetch Render', _context2.t0);
207
162
  this.metrics.emitCounter('app.prefetch.render.error', 1);
208
-
209
- case 22:
163
+ case 16:
210
164
  return _context2.abrupt("return", prefetchData || {});
211
-
212
- case 23:
165
+ case 17:
213
166
  case "end":
214
167
  return _context2.stop();
215
168
  }
216
169
  }
217
- }, _callee2, this, [[2, 17]]);
170
+ }, _callee2, this, [[1, 11]]);
218
171
  }));
219
-
220
172
  function prefetch(_x2) {
221
- return _prefetch.apply(this, arguments);
173
+ return _prefetch2.apply(this, arguments);
222
174
  }
223
-
224
175
  return prefetch;
225
176
  }()
226
177
  }, {
@@ -229,7 +180,6 @@ var Entry = /*#__PURE__*/function () {
229
180
  var html = '';
230
181
  var end = time();
231
182
  var ssrContext = context.ssrContext;
232
-
233
183
  try {
234
184
  var App = /*#__PURE__*/React.createElement(this.App, {
235
185
  context: Object.assign(context, {
@@ -254,7 +204,6 @@ var Entry = /*#__PURE__*/function () {
254
204
  this.logger.error('App Render To HTML', e);
255
205
  this.metrics.emitCounter('app.render.html.error', 1);
256
206
  }
257
-
258
207
  return html;
259
208
  }
260
209
  }, {
@@ -267,8 +216,6 @@ var Entry = /*#__PURE__*/function () {
267
216
  };
268
217
  }
269
218
  }]);
270
-
271
219
  return Entry;
272
220
  }();
273
-
274
221
  export { Entry as default };
@@ -0,0 +1,44 @@
1
+ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
+ import { run } from '@modern-js/utils/ssr';
4
+ import { PreRender } from "../../react/prerender";
5
+ import { time } from "../utils";
6
+ import SSREntry from "./entry";
7
+ export var render = function render(_ref) {
8
+ var App = _ref.App,
9
+ context = _ref.context,
10
+ config = _ref.config;
11
+ var ssrContext = context.ssrContext;
12
+ return run(ssrContext.request.headers, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
13
+ var entry, end, html, cost, cacheConfig;
14
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
15
+ while (1) {
16
+ switch (_context.prev = _context.next) {
17
+ case 0:
18
+ entry = new SSREntry({
19
+ ctx: ssrContext,
20
+ App: App,
21
+ config: config
22
+ });
23
+ entry.metrics.emitCounter('app.visit.count', 1);
24
+ end = time();
25
+ _context.next = 5;
26
+ return entry.renderToHtml(context);
27
+ case 5:
28
+ html = _context.sent;
29
+ cost = end();
30
+ entry.logger.info('App Render Total cost = %d ms', cost);
31
+ entry.metrics.emitTimer('app.render.cost', cost);
32
+ cacheConfig = PreRender.config();
33
+ if (cacheConfig) {
34
+ context.ssrContext.cacheConfig = cacheConfig;
35
+ }
36
+ return _context.abrupt("return", html);
37
+ case 12:
38
+ case "end":
39
+ return _context.stop();
40
+ }
41
+ }
42
+ }, _callee);
43
+ })));
44
+ };