@modern-js/runtime 1.21.2 → 2.0.0-beta.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 (148) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/js/modern/cli/index.js +1 -1
  3. package/dist/js/modern/core/index.js +1 -1
  4. package/dist/js/modern/index.js +1 -0
  5. package/dist/js/modern/router/cli/index.js +24 -8
  6. package/dist/js/modern/router/runtime/index.js +1 -1
  7. package/dist/js/modern/router/runtime/plugin.js +26 -44
  8. package/dist/js/modern/router/runtime/plugin.node.js +143 -0
  9. package/dist/js/modern/router/runtime/types.js +1 -0
  10. package/dist/js/modern/router/runtime/utils.js +97 -37
  11. package/dist/js/modern/router/runtime/withRouter.js +22 -0
  12. package/dist/js/modern/runtime-context.js +2 -1
  13. package/dist/js/modern/ssr/cli/index.js +44 -5
  14. package/dist/js/modern/ssr/index.js +67 -43
  15. package/dist/js/modern/ssr/index.node.js +6 -2
  16. package/dist/js/modern/ssr/serverRender/index.js +12 -26
  17. package/dist/js/modern/ssr/serverRender/renderToStream/buildTemplate.after.js +38 -0
  18. package/dist/js/modern/ssr/serverRender/renderToStream/buildTemplate.share.js +5 -0
  19. package/dist/js/modern/ssr/serverRender/renderToStream/bulidTemplate.before.js +24 -0
  20. package/dist/js/modern/ssr/serverRender/renderToStream/index.js +73 -0
  21. package/dist/js/modern/ssr/serverRender/renderToStream/loadable.js +26 -0
  22. package/dist/js/modern/ssr/serverRender/renderToStream/renderToPipe.js +61 -0
  23. package/dist/js/modern/ssr/serverRender/renderToStream/styledComponent.js +11 -0
  24. package/dist/js/modern/ssr/serverRender/renderToStream/template.js +22 -0
  25. package/dist/js/modern/ssr/serverRender/renderToStream/type.js +0 -0
  26. package/dist/js/modern/ssr/serverRender/{entry.js → renderToString/entry.js} +4 -6
  27. package/dist/js/modern/ssr/serverRender/renderToString/index.js +31 -0
  28. package/dist/js/modern/ssr/serverRender/{loadable.js → renderToString/loadable.js} +5 -13
  29. package/dist/js/modern/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -0
  30. package/dist/js/modern/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -0
  31. package/dist/js/modern/ssr/serverRender/{template.js → renderToString/template.js} +0 -0
  32. package/dist/js/modern/ssr/serverRender/{type.js → renderToString/type.js} +0 -1
  33. package/dist/js/modern/ssr/serverRender/types.js +2 -0
  34. package/dist/js/modern/ssr/serverRender/utils.js +24 -0
  35. package/dist/js/modern/ssr/utils.js +9 -3
  36. package/dist/js/node/cli/index.js +1 -1
  37. package/dist/js/node/core/index.js +8 -1
  38. package/dist/js/node/index.js +8 -0
  39. package/dist/js/node/router/cli/index.js +24 -8
  40. package/dist/js/node/router/runtime/index.js +4 -4
  41. package/dist/js/node/router/runtime/plugin.js +24 -49
  42. package/dist/js/node/router/runtime/plugin.node.js +169 -0
  43. package/dist/js/node/router/runtime/types.js +5 -0
  44. package/dist/js/node/router/runtime/utils.js +97 -35
  45. package/dist/js/node/router/runtime/withRouter.js +35 -0
  46. package/dist/js/node/runtime-context.js +4 -2
  47. package/dist/js/node/ssr/cli/index.js +43 -5
  48. package/dist/js/node/ssr/index.js +66 -43
  49. package/dist/js/node/ssr/index.node.js +7 -3
  50. package/dist/js/node/ssr/serverRender/index.js +13 -35
  51. package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.after.js +49 -0
  52. package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.share.js +14 -0
  53. package/dist/js/node/ssr/serverRender/renderToStream/bulidTemplate.before.js +37 -0
  54. package/dist/js/node/ssr/serverRender/renderToStream/index.js +90 -0
  55. package/dist/js/node/ssr/serverRender/renderToStream/loadable.js +34 -0
  56. package/dist/js/node/ssr/serverRender/renderToStream/renderToPipe.js +70 -0
  57. package/dist/js/node/ssr/serverRender/renderToStream/styledComponent.js +19 -0
  58. package/dist/js/node/ssr/serverRender/renderToStream/template.js +32 -0
  59. package/dist/js/node/ssr/serverRender/renderToStream/type.js +0 -0
  60. package/dist/js/node/ssr/serverRender/{entry.js → renderToString/entry.js} +13 -15
  61. package/dist/js/node/ssr/serverRender/renderToString/index.js +47 -0
  62. package/dist/js/node/ssr/serverRender/{loadable.js → renderToString/loadable.js} +7 -14
  63. package/dist/js/node/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -0
  64. package/dist/js/node/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -0
  65. package/dist/js/node/ssr/serverRender/{template.js → renderToString/template.js} +0 -0
  66. package/dist/js/node/ssr/serverRender/{type.js → renderToString/type.js} +0 -1
  67. package/dist/js/node/ssr/serverRender/types.js +13 -0
  68. package/dist/js/node/ssr/serverRender/utils.js +34 -0
  69. package/dist/js/node/ssr/utils.js +13 -4
  70. package/dist/js/treeshaking/cli/index.js +1 -1
  71. package/dist/js/treeshaking/core/index.js +1 -1
  72. package/dist/js/treeshaking/index.js +1 -0
  73. package/dist/js/treeshaking/router/cli/index.js +24 -8
  74. package/dist/js/treeshaking/router/runtime/index.js +1 -1
  75. package/dist/js/treeshaking/router/runtime/plugin.js +25 -43
  76. package/dist/js/treeshaking/router/runtime/plugin.node.js +174 -0
  77. package/dist/js/treeshaking/router/runtime/types.js +1 -0
  78. package/dist/js/treeshaking/router/runtime/utils.js +100 -36
  79. package/dist/js/treeshaking/router/runtime/withRouter.js +17 -0
  80. package/dist/js/treeshaking/runtime-context.js +2 -1
  81. package/dist/js/treeshaking/ssr/cli/index.js +47 -5
  82. package/dist/js/treeshaking/ssr/index.js +74 -45
  83. package/dist/js/treeshaking/ssr/index.node.js +6 -2
  84. package/dist/js/treeshaking/ssr/serverRender/index.js +41 -55
  85. package/dist/js/treeshaking/ssr/serverRender/renderToStream/buildTemplate.after.js +33 -0
  86. package/dist/js/treeshaking/ssr/serverRender/renderToStream/buildTemplate.share.js +7 -0
  87. package/dist/js/treeshaking/ssr/serverRender/renderToStream/bulidTemplate.before.js +29 -0
  88. package/dist/js/treeshaking/ssr/serverRender/renderToStream/index.js +120 -0
  89. package/dist/js/treeshaking/ssr/serverRender/renderToStream/loadable.js +24 -0
  90. package/dist/js/treeshaking/ssr/serverRender/renderToStream/renderToPipe.js +57 -0
  91. package/dist/js/treeshaking/ssr/serverRender/renderToStream/styledComponent.js +10 -0
  92. package/dist/js/treeshaking/ssr/serverRender/renderToStream/template.js +29 -0
  93. package/dist/js/treeshaking/ssr/serverRender/renderToStream/type.js +0 -0
  94. package/dist/js/treeshaking/ssr/serverRender/{entry.js → renderToString/entry.js} +3 -3
  95. package/dist/js/treeshaking/ssr/serverRender/renderToString/index.js +48 -0
  96. package/dist/js/treeshaking/ssr/serverRender/{loadable.js → renderToString/loadable.js} +5 -17
  97. package/dist/js/treeshaking/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -0
  98. package/dist/js/treeshaking/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -0
  99. package/dist/js/treeshaking/ssr/serverRender/{template.js → renderToString/template.js} +0 -0
  100. package/dist/js/treeshaking/ssr/serverRender/{type.js → renderToString/type.js} +0 -1
  101. package/dist/js/treeshaking/ssr/serverRender/types.js +2 -0
  102. package/dist/js/treeshaking/ssr/serverRender/{measure.js → utils.js} +16 -0
  103. package/dist/js/treeshaking/ssr/utils.js +15 -3
  104. package/dist/types/common.d.ts +0 -2
  105. package/dist/types/core/index.d.ts +1 -1
  106. package/dist/types/core/plugin.d.ts +1 -1
  107. package/dist/types/exports/server.d.ts +21 -1
  108. package/dist/types/index.d.ts +1 -0
  109. package/dist/types/router/runtime/DefaultNotFound.d.ts +1 -0
  110. package/dist/types/router/runtime/index.d.ts +3 -3
  111. package/dist/types/router/runtime/plugin.d.ts +2 -45
  112. package/dist/types/router/runtime/plugin.node.d.ts +8 -0
  113. package/dist/types/router/runtime/types.d.ts +38 -0
  114. package/dist/types/router/runtime/utils.d.ts +5 -2
  115. package/dist/types/router/runtime/withRouter.d.ts +8 -0
  116. package/dist/types/runtime-context.d.ts +2 -1
  117. package/dist/types/ssr/index.d.ts +2 -2
  118. package/dist/types/ssr/index.node.d.ts +1 -1
  119. package/dist/types/ssr/react/nossr/index.d.ts +3 -1
  120. package/dist/types/ssr/serverRender/index.d.ts +2 -3
  121. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +6 -0
  122. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.share.d.ts +3 -0
  123. package/dist/types/ssr/serverRender/renderToStream/bulidTemplate.before.d.ts +1 -0
  124. package/dist/types/ssr/serverRender/renderToStream/index.d.ts +6 -0
  125. package/dist/types/ssr/serverRender/renderToStream/loadable.d.ts +16 -0
  126. package/dist/types/ssr/serverRender/renderToStream/renderToPipe.d.ts +8 -0
  127. package/dist/types/ssr/serverRender/renderToStream/styledComponent.d.ts +12 -0
  128. package/dist/types/ssr/serverRender/renderToStream/template.d.ts +3 -0
  129. package/dist/types/ssr/serverRender/renderToStream/type.d.ts +4 -0
  130. package/dist/types/ssr/serverRender/{entry.d.ts → renderToString/entry.d.ts} +2 -2
  131. package/dist/types/ssr/serverRender/renderToString/index.d.ts +6 -0
  132. package/dist/types/ssr/serverRender/{loadable.d.ts → renderToString/loadable.d.ts} +0 -0
  133. package/dist/types/ssr/serverRender/{reduce.d.ts → renderToString/reduce.d.ts} +0 -0
  134. package/dist/types/ssr/serverRender/{styledComponent.d.ts → renderToString/styledComponent.d.ts} +0 -0
  135. package/dist/types/ssr/serverRender/{template.d.ts → renderToString/template.d.ts} +0 -0
  136. package/dist/types/ssr/serverRender/{type.d.ts → renderToString/type.d.ts} +1 -8
  137. package/dist/types/ssr/serverRender/types.d.ts +18 -0
  138. package/dist/types/ssr/serverRender/utils.d.ts +3 -0
  139. package/dist/types/ssr/utils.d.ts +4 -2
  140. package/dist/types/state/runtime/plugin.d.ts +1 -1
  141. package/package.json +57 -73
  142. package/types/index.d.ts +13 -0
  143. package/types/router.d.ts +14 -0
  144. package/dist/js/modern/ssr/serverRender/measure.js +0 -11
  145. package/dist/js/node/ssr/serverRender/measure.js +0 -20
  146. package/dist/types/ssr/serverRender/measure.d.ts +0 -1
  147. package/lib/types.d.ts +0 -10
  148. package/type.d.ts +0 -5
@@ -3,12 +3,11 @@ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
3
  import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
4
4
  import { loadableReady } from '@loadable/component';
5
5
  import hoistNonReactStatics from 'hoist-non-react-statics';
6
- import { RenderLevel } from "./serverRender/type";
6
+ import { RenderLevel } from "./serverRender/types";
7
7
  import { WithCallback } from "./react/withCallback";
8
- import { formatClient, mockResponse } from "./utils";
8
+ import { formatClient, mockResponse, isReact18 } from "./utils";
9
9
  import { jsx as _jsx } from "react/jsx-runtime";
10
- var IS_REACT18 = process.env.IS_REACT18 === 'true';
11
- export var ssr = function ssr(_) {
10
+ export var ssr = function ssr(config) {
12
11
  return {
13
12
  name: '@modern-js/plugin-ssr',
14
13
  setup: function setup() {
@@ -16,60 +15,90 @@ export var ssr = function ssr(_) {
16
15
  return {
17
16
  client: function () {
18
17
  var _client = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
19
- var _window, _window$_SSR_DATA;
20
-
21
- var App, context, ModernRender, ModernHydrate, renderLevel;
18
+ var App, context, ModernRender, ModernHydrate, hydrateContext, callback, stringSSRHydrate, streamSSRHydrate;
22
19
  return _regeneratorRuntime().wrap(function _callee$(_context) {
23
20
  while (1) {
24
21
  switch (_context.prev = _context.next) {
25
22
  case 0:
26
- App = _ref.App, context = _ref.context, ModernRender = _ref.ModernRender, ModernHydrate = _ref.ModernHydrate;
27
- // if render level not exist, use client render
28
- renderLevel = ((_window = window) === null || _window === void 0 ? void 0 : (_window$_SSR_DATA = _window._SSR_DATA) === null || _window$_SSR_DATA === void 0 ? void 0 : _window$_SSR_DATA.renderLevel) || RenderLevel.CLIENT_RENDER; // client render and server prefetch use same logic
29
-
30
- if (renderLevel === RenderLevel.CLIENT_RENDER || renderLevel === RenderLevel.SERVER_PREFETCH) {
31
- ModernRender( /*#__PURE__*/_jsx(App, {
32
- context: context
33
- }));
34
- } else if (renderLevel === RenderLevel.SERVER_RENDER) {
35
- loadableReady(function () {
36
- var hydrateContext = _objectSpread(_objectSpread({}, context), {}, {
37
- _hydration: true
23
+ streamSSRHydrate = function _streamSSRHydrate() {
24
+ // callback: https://github.com/reactwg/react-18/discussions/5
25
+ var SSRApp = function SSRApp() {
26
+ return /*#__PURE__*/_jsx(WithCallback, {
27
+ callback: callback,
28
+ children: /*#__PURE__*/_jsx(App, {
29
+ context: hydrateContext
30
+ })
38
31
  });
32
+ };
39
33
 
40
- var callback = function callback() {
41
- // won't cause component re-render because context's reference identity doesn't change
42
- delete hydrateContext._hydration;
43
- }; // callback: https://github.com/reactwg/react-18/discussions/5
34
+ SSRApp = hoistNonReactStatics(SSRApp, App);
35
+ ModernHydrate( /*#__PURE__*/_jsx(SSRApp, {}));
36
+ };
44
37
 
38
+ stringSSRHydrate = function _stringSSRHydrate() {
39
+ var _window, _window$_SSR_DATA;
45
40
 
46
- if (IS_REACT18) {
47
- var SSRApp = function SSRApp() {
48
- return /*#__PURE__*/_jsx(WithCallback, {
49
- callback: callback,
50
- children: /*#__PURE__*/_jsx(App, {
51
- context: hydrateContext
52
- })
53
- });
54
- };
41
+ // if render level not exist, use client render
42
+ var renderLevel = ((_window = window) === null || _window === void 0 ? void 0 : (_window$_SSR_DATA = _window._SSR_DATA) === null || _window$_SSR_DATA === void 0 ? void 0 : _window$_SSR_DATA.renderLevel) || RenderLevel.CLIENT_RENDER; // client render and server prefetch use same logic
55
43
 
56
- SSRApp = hoistNonReactStatics(SSRApp, App);
57
- ModernHydrate( /*#__PURE__*/_jsx(SSRApp, {}));
44
+ if (renderLevel === RenderLevel.CLIENT_RENDER || renderLevel === RenderLevel.SERVER_PREFETCH) {
45
+ ModernRender( /*#__PURE__*/_jsx(App, {
46
+ context: context
47
+ }));
48
+ } else if (renderLevel === RenderLevel.SERVER_RENDER) {
49
+ if (isReact18()) {
50
+ loadableReady(function () {
51
+ // callback: https://github.com/reactwg/react-18/discussions/5
52
+ var SSRApp = function SSRApp() {
53
+ return /*#__PURE__*/_jsx(WithCallback, {
54
+ callback: callback,
55
+ children: /*#__PURE__*/_jsx(App, {
56
+ context: hydrateContext
57
+ })
58
+ });
59
+ };
60
+
61
+ SSRApp = hoistNonReactStatics(SSRApp, App);
62
+ ModernHydrate( /*#__PURE__*/_jsx(SSRApp, {}));
63
+ });
58
64
  } else {
59
- ModernHydrate( /*#__PURE__*/_jsx(App, {
60
- context: hydrateContext
61
- }), callback);
65
+ loadableReady(function () {
66
+ ModernHydrate( /*#__PURE__*/_jsx(App, {
67
+ context: hydrateContext
68
+ }), callback);
69
+ });
62
70
  }
63
- });
64
- } else {
65
- // unknown renderlevel or renderlevel is server prefetch.
66
- console.warn("unknow render level: ".concat(renderLevel, ", execute render()"));
67
- ModernRender( /*#__PURE__*/_jsx(App, {
68
- context: context
69
- }));
71
+ } else {
72
+ // unknown renderlevel or renderlevel is server prefetch.
73
+ console.warn("unknow render level: ".concat(renderLevel, ", execute render()"));
74
+ ModernRender( /*#__PURE__*/_jsx(App, {
75
+ context: context
76
+ }));
77
+ }
78
+ };
79
+
80
+ App = _ref.App, context = _ref.context, ModernRender = _ref.ModernRender, ModernHydrate = _ref.ModernHydrate;
81
+ hydrateContext = _objectSpread(_objectSpread({}, context), {}, {
82
+ _hydration: true
83
+ });
84
+
85
+ callback = function callback() {
86
+ // won't cause component re-render because context's reference identity doesn't change
87
+ delete hydrateContext._hydration;
88
+ }; // react streamSSR hydrate
89
+
90
+
91
+ if (!(isReact18() && config.mode === 'stream')) {
92
+ _context.next = 7;
93
+ break;
70
94
  }
71
95
 
72
- case 3:
96
+ return _context.abrupt("return", streamSSRHydrate());
97
+
98
+ case 7:
99
+ return _context.abrupt("return", stringSSRHydrate());
100
+
101
+ case 8:
73
102
  case "end":
74
103
  return _context.stop();
75
104
  }
@@ -2,9 +2,9 @@ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
3
3
  import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
4
4
  import { registerPrefetch } from "../core";
5
- import { render } from "./serverRender";
6
5
  import prefetch from "./prefetch";
7
6
  import { formatServer } from "./utils";
7
+ import render from "./serverRender";
8
8
  var registeredApps = new WeakSet();
9
9
  export var ssr = function ssr() {
10
10
  var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -29,7 +29,11 @@ export var ssr = function ssr() {
29
29
  }
30
30
 
31
31
  _context2.next = 4;
32
- return render(context, config, App);
32
+ return render({
33
+ context: context,
34
+ App: App,
35
+ config: config
36
+ });
33
37
 
34
38
  case 4:
35
39
  html = _context2.sent;
@@ -1,63 +1,49 @@
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
+
4
+ /* eslint-disable eslint-comments/disable-enable-pair */
5
+
6
+ /* eslint-disable @typescript-eslint/no-var-requires */
7
+
8
+ /* eslint-disable @typescript-eslint/no-require-imports */
9
+ import { isReact18 } from "../utils";
10
+ export default function serverRender(_x) {
11
+ return _serverRender.apply(this, arguments);
12
+ }
13
+
14
+ function _serverRender() {
15
+ _serverRender = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
16
+ var pipe, html;
17
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
11
18
  while (1) {
12
- switch (_context2.prev = _context2.next) {
19
+ switch (_context.prev = _context.next) {
13
20
  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:
21
+ if (!(isReact18() && options.config.mode === 'stream')) {
22
+ _context.next = 7;
23
+ break;
24
+ }
25
+
26
+ _context.next = 3;
27
+ return require("./renderToStream").render(options);
28
+
29
+ case 3:
30
+ pipe = _context.sent;
31
+ return _context.abrupt("return", pipe);
32
+
33
+ case 7:
34
+ _context.next = 9;
35
+ return require("./renderToString").render(options);
36
+
37
+ case 9:
38
+ html = _context.sent;
39
+ return _context.abrupt("return", html);
40
+
41
+ case 11:
53
42
  case "end":
54
- return _context2.stop();
43
+ return _context.stop();
55
44
  }
56
45
  }
57
- }, _callee2);
46
+ }, _callee);
58
47
  }));
59
-
60
- return function render(_x, _x2, _x3) {
61
- return _ref.apply(this, arguments);
62
- };
63
- }();
48
+ return _serverRender.apply(this, arguments);
49
+ }
@@ -0,0 +1,33 @@
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
+
7
+ function injectSSRDataScript(template) {
8
+ var ssrDataScript = buildSSRDataScript();
9
+ return template.replace('<!--<?- SSRDataScript ?>-->', ssrDataScript);
10
+
11
+ function buildSSRDataScript() {
12
+ var ssrContext = options.context.ssrContext;
13
+ var _ref = ssrContext,
14
+ request = _ref.request;
15
+ var SSRData = {
16
+ context: {
17
+ request: {
18
+ params: request.params,
19
+ query: request.query,
20
+ pathname: request.pathname,
21
+ host: request.host,
22
+ url: request.url,
23
+ headers: request.headers,
24
+ cookieMap: request.cookieMap
25
+ }
26
+ }
27
+ };
28
+ return "\n <script>window._SSR_DATA = ".concat(serialize(SSRData, {
29
+ isJSON: true
30
+ }), "</script>\n ");
31
+ }
32
+ }
33
+ }
@@ -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,29 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import ReactHelmet from 'react-helmet';
3
+ import helmetReplace from "../helmet";
4
+ import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share"; // build head template
5
+
6
+ function getHeadTemplate(beforeEntryTemplate) {
7
+ var callbacks = [function (headTemplate) {
8
+ var helmetData = ReactHelmet.renderStatic();
9
+ return helmetData ? helmetReplace(headTemplate, helmetData) : headTemplate;
10
+ }];
11
+
12
+ var _ref = beforeEntryTemplate.match(HEAD_REG_EXP) || [],
13
+ _ref2 = _slicedToArray(_ref, 1),
14
+ _ref2$ = _ref2[0],
15
+ headTemplate = _ref2$ === void 0 ? '' : _ref2$;
16
+
17
+ if (!headTemplate.length) {
18
+ return '';
19
+ }
20
+
21
+ return buildTemplate(headTemplate, callbacks); // @TODO: inject css chunks of lazy components
22
+ // @TODO: prefetch scripts of lazy component
23
+ } // build script
24
+
25
+
26
+ export function buildShellBeforeTemplate(beforeAppTemplate) {
27
+ var headTemplate = getHeadTemplate(beforeAppTemplate);
28
+ return beforeAppTemplate.replace(HEAD_REG_EXP, headTemplate);
29
+ }
@@ -0,0 +1,120 @@
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 { createTemplates } from "./template";
8
+ import renderToPipe from "./renderToPipe";
9
+ export var render = function render(_ref) {
10
+ var App = _ref.App,
11
+ context = _ref.context;
12
+ var ssrContext = context.ssrContext;
13
+
14
+ if (!ssrContext) {
15
+ throw new Error('The "ssrContext" must not be undefined, but received undefined');
16
+ }
17
+
18
+ return run(ssrContext.request.headers, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
19
+ var end_all, rootElement, getTemplates, end, pipe;
20
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
21
+ while (1) {
22
+ switch (_context.prev = _context.next) {
23
+ case 0:
24
+ end_all = time();
25
+ rootElement = /*#__PURE__*/createElement(App, {
26
+ context: Object.assign(context || {}, {
27
+ ssr: true
28
+ })
29
+ });
30
+ getTemplates = createTemplates(context);
31
+ end = time();
32
+ pipe = renderToPipe(rootElement, getTemplates, {
33
+ onShellReady: function onShellReady() {
34
+ // set cacheConfig
35
+ var cacheConfig = PreRender.config();
36
+
37
+ if (cacheConfig) {
38
+ context.ssrContext.cacheConfig = cacheConfig;
39
+ }
40
+ },
41
+ onAllReady: function onAllReady() {
42
+ // computed render html cost
43
+ var cost = end();
44
+ ssrContext.logger.debug('App Render To HTML cost = %d ms', cost);
45
+ ssrContext.metrics.emitTimer('app.render.html.cost', cost); // computed all ssr const
46
+
47
+ var cost_all = end_all();
48
+ ssrContext.logger.info('App Render Total cost = %d ms', cost_all);
49
+ ssrContext.metrics.emitTimer('app.render.cost', cost_all);
50
+ }
51
+ });
52
+ return _context.abrupt("return", pipe);
53
+
54
+ case 6:
55
+ case "end":
56
+ return _context.stop();
57
+ }
58
+ }
59
+ }, _callee);
60
+ }))); // eslint-disable-next-line @typescript-eslint/no-unused-vars
61
+
62
+ function prefetch(_x, _x2) {
63
+ return _prefetch.apply(this, arguments);
64
+ }
65
+
66
+ function _prefetch() {
67
+ _prefetch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(App, context) {
68
+ var prefetch, ssrContext, prefetchData, end, prefetchCost;
69
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
70
+ while (1) {
71
+ switch (_context2.prev = _context2.next) {
72
+ case 0:
73
+ prefetch = App.prefetch;
74
+ ssrContext = context.ssrContext;
75
+ end = time();
76
+ _context2.prev = 3;
77
+
78
+ if (!prefetch) {
79
+ _context2.next = 10;
80
+ break;
81
+ }
82
+
83
+ _context2.next = 7;
84
+ return prefetch(context);
85
+
86
+ case 7:
87
+ _context2.t0 = _context2.sent;
88
+ _context2.next = 11;
89
+ break;
90
+
91
+ case 10:
92
+ _context2.t0 = null;
93
+
94
+ case 11:
95
+ prefetchData = _context2.t0;
96
+ prefetchCost = end();
97
+ ssrContext.logger.debug("App Prefetch cost = %d ms", prefetchCost);
98
+ ssrContext.metrics.emitTimer('app.prefetch.cost', prefetchCost);
99
+ _context2.next = 21;
100
+ break;
101
+
102
+ case 17:
103
+ _context2.prev = 17;
104
+ _context2.t1 = _context2["catch"](3);
105
+ ssrContext.logger.error('App Prefetch Render', _context2.t1);
106
+ ssrContext.metrics.emitCounter('app.prefetch.render.error', 1);
107
+
108
+ case 21:
109
+ return _context2.abrupt("return", prefetchData || {});
110
+
111
+ case 22:
112
+ case "end":
113
+ return _context2.stop();
114
+ }
115
+ }
116
+ }, _callee2, null, [[3, 17]]);
117
+ }));
118
+ return _prefetch.apply(this, arguments);
119
+ }
120
+ };
@@ -0,0 +1,24 @@
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
+
9
+ if (!loadableStats) {
10
+ return {
11
+ jsx: jsx
12
+ };
13
+ }
14
+
15
+ var extractor = new ChunkExtractor({
16
+ stats: loadableStats,
17
+ entrypoints: [entryName]
18
+ });
19
+ var collectedJsx = extractor.collectChunks(jsx);
20
+ return {
21
+ jsx: collectedJsx,
22
+ chunkExtractor: extractor
23
+ };
24
+ }
@@ -0,0 +1,57 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ import { Transform } from 'stream';
3
+ import { renderToPipeableStream } from 'react-dom/server';
4
+
5
+ function renderToPipe(rootElement, getTemplates, options) {
6
+ var isShellStream = true;
7
+
8
+ var forUserPipe = function forUserPipe(stream) {
9
+ return new Promise(function (resolve) {
10
+ var _renderToPipeableStre = renderToPipeableStream(rootElement, _objectSpread(_objectSpread({}, options), {}, {
11
+ onShellReady: function onShellReady() {
12
+ var _options$onShellReady;
13
+
14
+ options === null || options === void 0 ? void 0 : (_options$onShellReady = options.onShellReady) === null || _options$onShellReady === void 0 ? void 0 : _options$onShellReady.call(options);
15
+
16
+ var _getTemplates = getTemplates(),
17
+ shellAfter = _getTemplates.shellAfter,
18
+ shellBefore = _getTemplates.shellBefore;
19
+
20
+ var injectableTransform = new Transform({
21
+ transform: function transform(chunk, _encoding, callback) {
22
+ try {
23
+ if (isShellStream) {
24
+ this.push(joinChunk(shellBefore, chunk, shellAfter));
25
+ isShellStream = false;
26
+ } else {
27
+ this.push(chunk);
28
+ }
29
+
30
+ callback();
31
+ } catch (e) {
32
+ if (e instanceof Error) {
33
+ callback(e);
34
+ } else {
35
+ callback(new Error('Received unkown error when streaming'));
36
+ }
37
+ }
38
+ }
39
+ });
40
+ resolve(pipe(injectableTransform).pipe(stream));
41
+ }
42
+ })),
43
+ pipe = _renderToPipeableStre.pipe;
44
+ });
45
+ };
46
+
47
+ return forUserPipe;
48
+
49
+ function joinChunk() {
50
+ var before = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
51
+ var chunk = arguments.length > 1 ? arguments[1] : undefined;
52
+ var after = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
53
+ return "".concat(before).concat(chunk.toString()).concat(after);
54
+ }
55
+ }
56
+
57
+ 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,29 @@
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 function createTemplates(context) {
6
+ var getTemplates = function getTemplates() {
7
+ var _ref = context.ssrContext,
8
+ template = _ref.template;
9
+
10
+ var _ref2 = template.split(HTML_SEPARATOR) || [],
11
+ _ref3 = _slicedToArray(_ref2, 2),
12
+ _ref3$ = _ref3[0],
13
+ beforeAppTemplate = _ref3$ === void 0 ? '' : _ref3$,
14
+ _ref3$2 = _ref3[1],
15
+ afterAppHtmlTemplate = _ref3$2 === void 0 ? '' : _ref3$2; // templates injected some variables
16
+
17
+
18
+ var builtBeforeTemplate = buildShellBeforeTemplate(beforeAppTemplate);
19
+ var builtAfterTemplate = buildShellAfterTemplate(afterAppHtmlTemplate, {
20
+ context: context
21
+ });
22
+ return {
23
+ shellBefore: builtBeforeTemplate,
24
+ shellAfter: builtAfterTemplate
25
+ };
26
+ };
27
+
28
+ return getTemplates;
29
+ }
@@ -8,13 +8,13 @@ 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";
11
14
  import { toFragments } from "./template";
12
- import { RenderLevel } from "./type";
13
- import helmetReplace from "./helmet";
14
15
  import { reduce } from "./reduce";
15
16
  import * as loadableRenderer from "./loadable";
16
17
  import * as styledComponentRenderer from "./styledComponent";
17
- import { time } from "./measure";
18
18
 
19
19
  var buildTemplateData = function buildTemplateData(context, data, renderLevel) {
20
20
  var request = context.request;
@@ -0,0 +1,48 @@
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
+
28
+ case 5:
29
+ html = _context.sent;
30
+ cost = end();
31
+ entry.logger.info('App Render Total cost = %d ms', cost);
32
+ entry.metrics.emitTimer('app.render.cost', cost);
33
+ cacheConfig = PreRender.config();
34
+
35
+ if (cacheConfig) {
36
+ context.ssrContext.cacheConfig = cacheConfig;
37
+ }
38
+
39
+ return _context.abrupt("return", html);
40
+
41
+ case 12:
42
+ case "end":
43
+ return _context.stop();
44
+ }
45
+ }
46
+ }, _callee);
47
+ })));
48
+ };