@modern-js/runtime 2.0.0-beta.0 → 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 (204) hide show
  1. package/CHANGELOG.md +77 -0
  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 +63 -46
  5. package/dist/js/modern/core/index.js +3 -2
  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 +1 -1
  20. package/dist/js/modern/router/cli/index.js +0 -16
  21. package/dist/js/modern/router/runtime/plugin.js +0 -9
  22. package/dist/js/modern/router/runtime/plugin.node.js +18 -24
  23. package/dist/js/modern/router/runtime/root/index.js +19 -0
  24. package/dist/js/modern/router/runtime/root/load.js +61 -0
  25. package/dist/js/modern/router/runtime/utils.js +16 -35
  26. package/dist/js/modern/router/runtime/withRouter.js +1 -3
  27. package/dist/js/modern/ssr/cli/index.js +2 -23
  28. package/dist/js/modern/ssr/index.js +23 -34
  29. package/dist/js/modern/ssr/index.node.js +0 -13
  30. package/dist/js/modern/ssr/prefetch.js +0 -7
  31. package/dist/js/modern/ssr/react/prerender/index.js +2 -23
  32. package/dist/js/modern/ssr/react/prerender/util.js +2 -17
  33. package/dist/js/modern/ssr/react/withCallback/index.js +0 -1
  34. package/dist/js/modern/ssr/serverRender/helmet.js +12 -20
  35. package/dist/js/modern/ssr/serverRender/index.js +1 -2
  36. package/dist/js/modern/ssr/serverRender/renderToStream/buildTemplate.after.js +5 -5
  37. package/dist/js/modern/ssr/serverRender/renderToStream/bulidTemplate.before.js +45 -11
  38. package/dist/js/modern/ssr/serverRender/renderToStream/index.js +6 -39
  39. package/dist/js/modern/ssr/serverRender/renderToStream/loadable.js +0 -2
  40. package/dist/js/modern/ssr/serverRender/renderToStream/renderToPipe.js +26 -15
  41. package/dist/js/modern/ssr/serverRender/renderToStream/template.js +14 -18
  42. package/dist/js/modern/ssr/serverRender/renderToString/entry.js +2 -34
  43. package/dist/js/modern/ssr/serverRender/renderToString/index.js +0 -2
  44. package/dist/js/modern/ssr/serverRender/renderToString/loadable.js +0 -10
  45. package/dist/js/modern/ssr/serverRender/renderToString/reduce.js +0 -2
  46. package/dist/js/modern/ssr/serverRender/renderToString/template.js +0 -15
  47. package/dist/js/modern/ssr/serverRender/renderToString/type.js +0 -1
  48. package/dist/js/modern/ssr/serverRender/utils.js +2 -6
  49. package/dist/js/modern/ssr/utils.js +0 -11
  50. package/dist/js/modern/state/cli/index.js +0 -10
  51. package/dist/js/modern/state/runtime/plugin.js +1 -14
  52. package/dist/js/node/cli/index.js +3 -13
  53. package/dist/js/node/common.js +0 -2
  54. package/dist/js/node/core/app-config.js +2 -5
  55. package/dist/js/node/core/compatible.js +63 -64
  56. package/dist/js/node/core/index.js +0 -16
  57. package/dist/js/node/core/loader/index.js +0 -2
  58. package/dist/js/node/core/loader/loaderManager.js +12 -37
  59. package/dist/js/node/core/loader/useLoader.js +8 -31
  60. package/dist/js/node/core/plugin.js +5 -34
  61. package/dist/js/node/document/Body.js +26 -0
  62. package/dist/js/node/document/DocumentContext.js +14 -0
  63. package/dist/js/node/document/DocumentStructrueContext.js +15 -0
  64. package/dist/js/node/document/Head.js +33 -0
  65. package/dist/js/node/document/Html.js +98 -0
  66. package/dist/js/node/document/Root.js +41 -0
  67. package/dist/js/node/document/Scripts.js +17 -0
  68. package/dist/js/node/document/cli/index.js +140 -0
  69. package/dist/js/node/document/constants.js +36 -0
  70. package/dist/js/node/document/index.js +93 -0
  71. package/dist/js/node/exports/head.js +0 -5
  72. package/dist/js/node/exports/loadable.js +0 -5
  73. package/dist/js/node/exports/server.js +0 -2
  74. package/dist/js/node/exports/styled.js +0 -5
  75. package/dist/js/node/index.js +0 -8
  76. package/dist/js/node/router/cli/index.js +0 -20
  77. package/dist/js/node/router/index.js +0 -4
  78. package/dist/js/node/router/runtime/DefaultNotFound.js +1 -5
  79. package/dist/js/node/router/runtime/index.js +0 -5
  80. package/dist/js/node/router/runtime/plugin.js +0 -17
  81. package/dist/js/node/router/runtime/plugin.node.js +16 -38
  82. package/dist/js/node/router/runtime/root/index.js +26 -0
  83. package/dist/js/node/router/runtime/root/load.js +69 -0
  84. package/dist/js/node/router/runtime/utils.js +16 -44
  85. package/dist/js/node/router/runtime/withRouter.js +0 -9
  86. package/dist/js/node/runtime-context.js +0 -2
  87. package/dist/js/node/ssr/cli/index.js +2 -26
  88. package/dist/js/node/ssr/index.js +23 -45
  89. package/dist/js/node/ssr/index.node.js +0 -23
  90. package/dist/js/node/ssr/prefetch.js +0 -11
  91. package/dist/js/node/ssr/react/index.js +0 -2
  92. package/dist/js/node/ssr/react/nossr/index.js +0 -6
  93. package/dist/js/node/ssr/react/prerender/index.js +2 -30
  94. package/dist/js/node/ssr/react/prerender/util.js +2 -25
  95. package/dist/js/node/ssr/react/withCallback/index.js +1 -4
  96. package/dist/js/node/ssr/serverRender/helmet.js +13 -20
  97. package/dist/js/node/ssr/serverRender/index.js +1 -4
  98. package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.after.js +5 -9
  99. package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.share.js +0 -1
  100. package/dist/js/node/ssr/serverRender/renderToStream/bulidTemplate.before.js +43 -15
  101. package/dist/js/node/ssr/serverRender/renderToStream/index.js +6 -48
  102. package/dist/js/node/ssr/serverRender/renderToStream/loadable.js +0 -4
  103. package/dist/js/node/ssr/serverRender/renderToStream/renderToPipe.js +26 -17
  104. package/dist/js/node/ssr/serverRender/renderToStream/styledComponent.js +0 -2
  105. package/dist/js/node/ssr/serverRender/renderToStream/template.js +16 -23
  106. package/dist/js/node/ssr/serverRender/renderToString/entry.js +2 -51
  107. package/dist/js/node/ssr/serverRender/renderToString/index.js +0 -10
  108. package/dist/js/node/ssr/serverRender/renderToString/loadable.js +0 -14
  109. package/dist/js/node/ssr/serverRender/renderToString/reduce.js +0 -3
  110. package/dist/js/node/ssr/serverRender/renderToString/styledComponent.js +0 -3
  111. package/dist/js/node/ssr/serverRender/renderToString/template.js +0 -18
  112. package/dist/js/node/ssr/serverRender/renderToString/type.js +0 -1
  113. package/dist/js/node/ssr/serverRender/types.js +0 -1
  114. package/dist/js/node/ssr/serverRender/utils.js +2 -8
  115. package/dist/js/node/ssr/utils.js +0 -20
  116. package/dist/js/node/state/cli/index.js +0 -15
  117. package/dist/js/node/state/index.js +0 -4
  118. package/dist/js/node/state/plugins.js +0 -11
  119. package/dist/js/node/state/runtime/index.js +0 -7
  120. package/dist/js/node/state/runtime/plugin.js +1 -25
  121. package/dist/js/treeshaking/cli/index.js +3 -3
  122. package/dist/js/treeshaking/core/app-config.js +2 -1
  123. package/dist/js/treeshaking/core/compatible.js +66 -63
  124. package/dist/js/treeshaking/core/index.js +3 -2
  125. package/dist/js/treeshaking/core/loader/loaderManager.js +19 -51
  126. package/dist/js/treeshaking/core/loader/useLoader.js +11 -28
  127. package/dist/js/treeshaking/core/plugin.js +6 -51
  128. package/dist/js/treeshaking/document/Body.js +14 -0
  129. package/dist/js/treeshaking/document/DocumentContext.js +6 -0
  130. package/dist/js/treeshaking/document/DocumentStructrueContext.js +7 -0
  131. package/dist/js/treeshaking/document/Head.js +21 -0
  132. package/dist/js/treeshaking/document/Html.js +104 -0
  133. package/dist/js/treeshaking/document/Root.js +24 -0
  134. package/dist/js/treeshaking/document/Scripts.js +10 -0
  135. package/dist/js/treeshaking/document/cli/index.js +170 -0
  136. package/dist/js/treeshaking/document/constants.js +16 -0
  137. package/dist/js/treeshaking/document/index.js +8 -0
  138. package/dist/js/treeshaking/index.js +1 -1
  139. package/dist/js/treeshaking/router/cli/index.js +6 -18
  140. package/dist/js/treeshaking/router/runtime/plugin.js +5 -13
  141. package/dist/js/treeshaking/router/runtime/plugin.node.js +23 -36
  142. package/dist/js/treeshaking/router/runtime/root/index.js +17 -0
  143. package/dist/js/treeshaking/router/runtime/root/load.js +102 -0
  144. package/dist/js/treeshaking/router/runtime/utils.js +21 -39
  145. package/dist/js/treeshaking/router/runtime/withRouter.js +1 -0
  146. package/dist/js/treeshaking/ssr/cli/index.js +9 -31
  147. package/dist/js/treeshaking/ssr/index.js +26 -40
  148. package/dist/js/treeshaking/ssr/index.node.js +12 -29
  149. package/dist/js/treeshaking/ssr/prefetch.js +0 -13
  150. package/dist/js/treeshaking/ssr/react/nossr/index.js +3 -4
  151. package/dist/js/treeshaking/ssr/react/prerender/index.js +2 -21
  152. package/dist/js/treeshaking/ssr/react/prerender/util.js +3 -20
  153. package/dist/js/treeshaking/ssr/react/withCallback/index.js +1 -2
  154. package/dist/js/treeshaking/ssr/serverRender/helmet.js +12 -11
  155. package/dist/js/treeshaking/ssr/serverRender/index.js +1 -9
  156. package/dist/js/treeshaking/ssr/serverRender/renderToStream/buildTemplate.after.js +5 -6
  157. package/dist/js/treeshaking/ssr/serverRender/renderToStream/bulidTemplate.before.js +46 -15
  158. package/dist/js/treeshaking/ssr/serverRender/renderToStream/index.js +9 -79
  159. package/dist/js/treeshaking/ssr/serverRender/renderToStream/loadable.js +3 -5
  160. package/dist/js/treeshaking/ssr/serverRender/renderToStream/renderToPipe.js +46 -35
  161. package/dist/js/treeshaking/ssr/serverRender/renderToStream/template.js +17 -24
  162. package/dist/js/treeshaking/ssr/serverRender/renderToString/entry.js +20 -73
  163. package/dist/js/treeshaking/ssr/serverRender/renderToString/index.js +2 -6
  164. package/dist/js/treeshaking/ssr/serverRender/renderToString/loadable.js +5 -16
  165. package/dist/js/treeshaking/ssr/serverRender/renderToString/reduce.js +0 -2
  166. package/dist/js/treeshaking/ssr/serverRender/renderToString/template.js +2 -18
  167. package/dist/js/treeshaking/ssr/serverRender/renderToString/type.js +0 -1
  168. package/dist/js/treeshaking/ssr/serverRender/utils.js +5 -10
  169. package/dist/js/treeshaking/ssr/utils.js +8 -17
  170. package/dist/js/treeshaking/state/cli/index.js +3 -10
  171. package/dist/js/treeshaking/state/runtime/plugin.js +2 -10
  172. package/dist/types/cli/index.d.ts +0 -2
  173. package/dist/types/core/compatible.d.ts +5 -5
  174. package/dist/types/core/index.d.ts +1 -1
  175. package/dist/types/core/loader/loaderManager.d.ts +0 -1
  176. package/dist/types/core/loader/useLoader.d.ts +0 -5
  177. package/dist/types/core/plugin.d.ts +1 -13
  178. package/dist/types/document/Body.d.ts +4 -0
  179. package/dist/types/document/DocumentContext.d.ts +13 -0
  180. package/dist/types/document/DocumentStructrueContext.d.ts +10 -0
  181. package/dist/types/document/Head.d.ts +5 -0
  182. package/dist/types/document/Html.d.ts +4 -0
  183. package/dist/types/document/Root.d.ts +8 -0
  184. package/dist/types/document/Scripts.d.ts +2 -0
  185. package/dist/types/document/cli/index.d.ts +3 -0
  186. package/dist/types/document/constants.d.ts +14 -0
  187. package/dist/types/document/index.d.ts +8 -0
  188. package/dist/types/exports/server.d.ts +3 -3
  189. package/dist/types/index.d.ts +1 -1
  190. package/dist/types/router/cli/index.d.ts +0 -2
  191. package/dist/types/router/runtime/root/index.d.ts +8 -0
  192. package/dist/types/router/runtime/root/load.d.ts +22 -0
  193. package/dist/types/router/runtime/types.d.ts +0 -2
  194. package/dist/types/runtime-context.d.ts +1 -0
  195. package/dist/types/ssr/cli/index.d.ts +0 -2
  196. package/dist/types/ssr/prefetch.d.ts +2 -2
  197. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +3 -2
  198. package/dist/types/ssr/serverRender/renderToStream/bulidTemplate.before.d.ts +2 -1
  199. package/dist/types/ssr/serverRender/renderToStream/renderToPipe.d.ts +3 -3
  200. package/dist/types/ssr/serverRender/renderToStream/template.d.ts +2 -2
  201. package/dist/types/ssr/serverRender/types.d.ts +1 -4
  202. package/dist/types/state/cli/index.d.ts +0 -2
  203. package/dist/types/state/types.d.ts +0 -1
  204. package/package.json +19 -11
@@ -16,10 +16,9 @@ var PROP_NAMES = {
16
16
  FALLBACK: 'fallback',
17
17
  MATCHES: 'matches'
18
18
  };
19
-
20
- var handleClientStateChange = function handleClientStateChange() {// not used
19
+ var handleClientStateChange = function handleClientStateChange() {
20
+ // not used
21
21
  };
22
-
23
22
  var mapStateOnServer = function mapStateOnServer(reduceProps) {
24
23
  var defaultProps = {
25
24
  interval: 10,
@@ -34,15 +33,12 @@ var mapStateOnServer = function mapStateOnServer(reduceProps) {
34
33
  var propKey = key;
35
34
  var reduceProp = reduceProps[propKey];
36
35
  var nextProps = props;
37
-
38
36
  if (exist(reduceProp)) {
39
37
  nextProps = _objectSpread(_objectSpread({}, props), {}, _defineProperty({}, propKey, reduceProp));
40
38
  }
41
-
42
39
  return nextProps;
43
40
  }, defaultProps);
44
41
  };
45
-
46
42
  var reducePropsToState = function reducePropsToState(propsList) {
47
43
  var reduceProps = {
48
44
  interval: getOutermostProperty(propsList, PROP_NAMES.INTERVAL),
@@ -55,19 +51,14 @@ var reducePropsToState = function reducePropsToState(propsList) {
55
51
  };
56
52
  return reduceProps;
57
53
  };
58
-
59
54
  function factory(Component) {
60
55
  var Spr = /*#__PURE__*/function (_React$Component) {
61
56
  _inherits(Spr, _React$Component);
62
-
63
57
  var _super = _createSuper(Spr);
64
-
65
58
  function Spr() {
66
59
  _classCallCheck(this, Spr);
67
-
68
60
  return _super.apply(this, arguments);
69
61
  }
70
-
71
62
  _createClass(Spr, [{
72
63
  key: "verify",
73
64
  value: function verify() {
@@ -77,13 +68,10 @@ function factory(Component) {
77
68
  key: "render",
78
69
  value: function render() {
79
70
  var newProps = _objectSpread({}, this.props);
80
-
81
71
  var validate = this.verify();
82
-
83
72
  if (!validate) {
84
73
  throw new Error('invalid props, check usage');
85
74
  }
86
-
87
75
  return /*#__PURE__*/createElement(Component, _objectSpread({}, newProps));
88
76
  }
89
77
  }], [{
@@ -95,25 +83,18 @@ function factory(Component) {
95
83
  Component.canUseDOM = canUseDOM;
96
84
  }
97
85
  }]);
98
-
99
86
  return Spr;
100
87
  }(React.Component);
101
-
102
88
  _defineProperty(Spr, "peek", Component.peek);
103
-
104
89
  _defineProperty(Spr, "rewind", Component.rewind);
105
-
106
90
  _defineProperty(Spr, "config", function () {
107
91
  var mappedState = Component.rewind();
108
92
  return mappedState;
109
93
  });
110
-
111
94
  return Spr;
112
95
  }
113
-
114
96
  var NullComponent = function NullComponent() {
115
97
  return null;
116
98
  };
117
-
118
99
  var SprSideEffects = withSideEffect(reducePropsToState, handleClientStateChange, mapStateOnServer)(NullComponent);
119
100
  export var PreRender = factory(SprSideEffects);
@@ -3,22 +3,18 @@ var REQUEST_META = ['header', 'query'];
3
3
  export var getInnermostProperty = function getInnermostProperty(propsList, propName) {
4
4
  for (var i = propsList.length - 1; i >= 0; i--) {
5
5
  var props = propsList[i];
6
-
7
6
  if (props.hasOwnProperty(propName)) {
8
7
  return props[propName];
9
8
  }
10
9
  }
11
-
12
10
  return null;
13
11
  };
14
12
  export var getOutermostProperty = function getOutermostProperty(propsList, propName) {
15
13
  var _iterator = _createForOfIteratorHelper(propsList),
16
- _step;
17
-
14
+ _step;
18
15
  try {
19
16
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
20
17
  var props = _step.value;
21
-
22
18
  if (props.hasOwnProperty(propName)) {
23
19
  return props[propName];
24
20
  }
@@ -28,7 +24,6 @@ export var getOutermostProperty = function getOutermostProperty(propsList, propN
28
24
  } finally {
29
25
  _iterator.f();
30
26
  }
31
-
32
27
  return null;
33
28
  };
34
29
  export var aggKeysFromPropsList = function aggKeysFromPropsList(propsList, propName) {
@@ -42,7 +37,6 @@ export var aggKeysFromPropsList = function aggKeysFromPropsList(propsList, propN
42
37
  }).reduce(function (result, next) {
43
38
  REQUEST_META.forEach(function (key) {
44
39
  var prop = next[propName];
45
-
46
40
  if (prop !== null && prop !== void 0 && prop.hasOwnProperty(key) && usefulArray(prop[key])) {
47
41
  result[key] = unique(result[key].concat(prop[key]));
48
42
  }
@@ -51,13 +45,10 @@ export var aggKeysFromPropsList = function aggKeysFromPropsList(propsList, propN
51
45
  }, initResult);
52
46
  return REQUEST_META.reduce(function (result, next) {
53
47
  var _result$key;
54
-
55
48
  var key = next;
56
-
57
49
  if (result[key] && ((_result$key = result[key]) === null || _result$key === void 0 ? void 0 : _result$key.length) === 0) {
58
50
  delete result[key];
59
51
  }
60
-
61
52
  return result;
62
53
  }, res);
63
54
  };
@@ -71,8 +62,8 @@ export var aggMatchesFromPropsList = function aggMatchesFromPropsList(propsList,
71
62
  return usefulObject(props[propName]);
72
63
  }).reduce(function (result, next) {
73
64
  REQUEST_META.forEach(function (key) {
74
- var prop = next[propName]; // 这边目前是浅拷贝,越后渲染优先级越高
75
-
65
+ var prop = next[propName];
66
+ // 这边目前是浅拷贝,越后渲染优先级越高
76
67
  if (prop !== null && prop !== void 0 && prop.hasOwnProperty(key) && usefulObject(prop[key])) {
77
68
  result[key] = Object.assign(result[key], prop[key]);
78
69
  }
@@ -81,35 +72,27 @@ export var aggMatchesFromPropsList = function aggMatchesFromPropsList(propsList,
81
72
  }, initResult);
82
73
  return REQUEST_META.reduce(function (result, next) {
83
74
  var key = next;
84
-
85
75
  if (result[key] && Object.keys(result[key]).length === 0) {
86
76
  delete result[key];
87
77
  }
88
-
89
78
  return result;
90
79
  }, res);
91
80
  };
92
-
93
81
  function unique(arr) {
94
82
  return Array.from(new Set(arr));
95
83
  }
96
-
97
84
  function usefulObject(target) {
98
85
  if (!exist(target)) {
99
86
  return false;
100
87
  }
101
-
102
88
  return target.constructor === Object && Object.keys(target).length > 0;
103
89
  }
104
-
105
90
  function usefulArray(target) {
106
91
  if (!exist(target)) {
107
92
  return false;
108
93
  }
109
-
110
94
  return Array.isArray(target) && target.length > 0;
111
95
  }
112
-
113
96
  export function exist(target) {
114
97
  return target != null;
115
98
  }
@@ -2,13 +2,12 @@
2
2
  import { useRef, useLayoutEffect } from 'react';
3
3
  export var WithCallback = function WithCallback(_ref) {
4
4
  var callback = _ref.callback,
5
- children = _ref.children;
5
+ children = _ref.children;
6
6
  var once = useRef(false);
7
7
  useLayoutEffect(function () {
8
8
  if (once.current) {
9
9
  return;
10
10
  }
11
-
12
11
  once.current = true;
13
12
  callback();
14
13
  }, [callback]);
@@ -1,37 +1,38 @@
1
1
  // 用于 react-helmet 正则替换
2
+ import { EOL } from 'os';
2
3
  var RE_HTML_ATTR = /<html[^>]*>/;
3
4
  var RE_BODY_ATTR = /<body[^>]*>/;
4
5
  var RE_LAST_IN_HEAD = /<\/head>/;
5
6
  var RE_TITLE = /<title[^>]*>([\s\S\n\r]*?)<\/title>/;
6
- var TEST_TITLE_CONTENT = /(?<=<title[^>]*>)([\s\S\n\r]*?)([.|\S])([\s\S\n\r]*?)(?=<\/title>)/; // 通过 react-helmet 修改模板
7
+ var TEST_TITLE_CONTENT = /(?<=<title[^>]*>)([\s\S\n\r]*?)([.|\S])([\s\S\n\r]*?)(?=<\/title>)/;
7
8
 
9
+ // 通过 react-helmet 修改模板
8
10
  export default function helmet(content, helmetData) {
9
11
  var result = content;
10
12
  var bodyAttributes = helmetData.bodyAttributes.toString();
11
-
12
13
  if (bodyAttributes) {
13
14
  result = result.replace(RE_BODY_ATTR, "<body ".concat(bodyAttributes, ">"));
14
15
  }
15
-
16
16
  var htmlAttributes = helmetData.htmlAttributes.toString();
17
-
18
17
  if (htmlAttributes) {
19
18
  result = result.replace(RE_HTML_ATTR, "<html ".concat(htmlAttributes, ">"));
20
19
  }
21
-
22
20
  var base = helmetData.base.toString();
23
21
  var link = helmetData.link.toString();
24
22
  var meta = helmetData.meta.toString();
25
23
  var noscript = helmetData.noscript.toString();
26
24
  var script = helmetData.script.toString();
27
25
  var style = helmetData.style.toString();
28
- var title = helmetData.title.toString(); // 如果模板中存在 title,且 helmetData title 有内容则做替换
29
-
30
- var existTitle = RE_TITLE.test(content);
26
+ var title = helmetData.title.toString();
31
27
 
32
- if (TEST_TITLE_CONTENT.test(title.trim()) && existTitle) {
28
+ // 如果模板中存在 title,且 helmetData title 有内容则做替换
29
+ var existTitleTag = RE_TITLE.test(content);
30
+ var shouldReplaceTitle = existTitleTag && TEST_TITLE_CONTENT.test(title.trim());
31
+ if (shouldReplaceTitle) {
33
32
  result = result.replace(RE_TITLE, title);
34
33
  }
35
-
36
- return result.replace(RE_LAST_IN_HEAD, "\n ".concat(base, "\n ").concat(link, "\n ").concat(meta, "\n ").concat(noscript, "\n ").concat(script, "\n ").concat(style, "\n ").concat(existTitle ? '' : title, "\n </head>\n "));
34
+ var helmetStr = [base, link, meta, noscript, script, style, !existTitleTag ? title : ''].reduce(function (pre, cur) {
35
+ return pre + (cur.length > 0 ? " ".concat(cur).concat(EOL) : '');
36
+ }, '');
37
+ return result.replace(RE_LAST_IN_HEAD, "".concat(helmetStr, "</head>"));
37
38
  }
@@ -1,16 +1,13 @@
1
1
  import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
2
  import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
-
4
3
  /* eslint-disable eslint-comments/disable-enable-pair */
5
-
6
4
  /* eslint-disable @typescript-eslint/no-var-requires */
7
-
8
5
  /* eslint-disable @typescript-eslint/no-require-imports */
6
+
9
7
  import { isReact18 } from "../utils";
10
8
  export default function serverRender(_x) {
11
9
  return _serverRender.apply(this, arguments);
12
10
  }
13
-
14
11
  function _serverRender() {
15
12
  _serverRender = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
16
13
  var pipe, html;
@@ -22,22 +19,17 @@ function _serverRender() {
22
19
  _context.next = 7;
23
20
  break;
24
21
  }
25
-
26
22
  _context.next = 3;
27
23
  return require("./renderToStream").render(options);
28
-
29
24
  case 3:
30
25
  pipe = _context.sent;
31
26
  return _context.abrupt("return", pipe);
32
-
33
27
  case 7:
34
28
  _context.next = 9;
35
29
  return require("./renderToString").render(options);
36
-
37
30
  case 9:
38
31
  html = _context.sent;
39
32
  return _context.abrupt("return", html);
40
-
41
33
  case 11:
42
34
  case "end":
43
35
  return _context.stop();
@@ -3,15 +3,13 @@ import { buildTemplate } from "./buildTemplate.share";
3
3
  export function buildShellAfterTemplate(afterAppTemplate, options) {
4
4
  var callbacks = [injectSSRDataScript];
5
5
  return buildTemplate(afterAppTemplate, callbacks);
6
-
7
6
  function injectSSRDataScript(template) {
8
7
  var ssrDataScript = buildSSRDataScript();
9
8
  return template.replace('<!--<?- SSRDataScript ?>-->', ssrDataScript);
10
-
11
9
  function buildSSRDataScript() {
12
- var ssrContext = options.context.ssrContext;
13
- var _ref = ssrContext,
14
- request = _ref.request;
10
+ var ssrContext = options.ssrContext,
11
+ renderLevel = options.renderLevel;
12
+ var request = ssrContext.request;
15
13
  var SSRData = {
16
14
  context: {
17
15
  request: {
@@ -23,7 +21,8 @@ export function buildShellAfterTemplate(afterAppTemplate, options) {
23
21
  headers: request.headers,
24
22
  cookieMap: request.cookieMap
25
23
  }
26
- }
24
+ },
25
+ renderLevel: renderLevel
27
26
  };
28
27
  return "\n <script>window._SSR_DATA = ".concat(serialize(SSRData, {
29
28
  isJSON: true
@@ -1,29 +1,60 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
1
2
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
3
  import ReactHelmet from 'react-helmet';
4
+ import { matchRoutes } from 'react-router-dom';
3
5
  import helmetReplace from "../helmet";
4
- import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share"; // build head template
6
+ import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
7
+ var CSS_CHUNKS_PLACEHOLDER = '<!--<?- chunksMap.css ?>-->';
5
8
 
6
- function getHeadTemplate(beforeEntryTemplate) {
9
+ // build head template
10
+ function getHeadTemplate(beforeEntryTemplate, context) {
7
11
  var callbacks = [function (headTemplate) {
8
12
  var helmetData = ReactHelmet.renderStatic();
9
13
  return helmetData ? helmetReplace(headTemplate, helmetData) : headTemplate;
10
- }];
11
-
14
+ },
15
+ // @TODO: prefetch scripts of lazy component
16
+ injectCss];
12
17
  var _ref = beforeEntryTemplate.match(HEAD_REG_EXP) || [],
13
- _ref2 = _slicedToArray(_ref, 1),
14
- _ref2$ = _ref2[0],
15
- headTemplate = _ref2$ === void 0 ? '' : _ref2$;
16
-
18
+ _ref2 = _slicedToArray(_ref, 1),
19
+ _ref2$ = _ref2[0],
20
+ headTemplate = _ref2$ === void 0 ? '' : _ref2$;
17
21
  if (!headTemplate.length) {
18
22
  return '';
19
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
+ }
20
55
 
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);
56
+ // build script
57
+ export function buildShellBeforeTemplate(beforeAppTemplate, context) {
58
+ var headTemplate = getHeadTemplate(beforeAppTemplate, context);
28
59
  return beforeAppTemplate.replace(HEAD_REG_EXP, headTemplate);
29
60
  }
@@ -4,117 +4,47 @@ import { createElement } from 'react';
4
4
  import { run } from '@modern-js/utils/ssr';
5
5
  import { PreRender } from "../../react/prerender";
6
6
  import { time } from "../utils";
7
- import { createTemplates } from "./template";
8
7
  import renderToPipe from "./renderToPipe";
9
8
  export var render = function render(_ref) {
10
9
  var App = _ref.App,
11
- context = _ref.context;
10
+ context = _ref.context;
12
11
  var ssrContext = context.ssrContext;
13
-
14
12
  if (!ssrContext) {
15
13
  throw new Error('The "ssrContext" must not be undefined, but received undefined');
16
14
  }
17
-
18
15
  return run(ssrContext.request.headers, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
19
- var end_all, rootElement, getTemplates, end, pipe;
16
+ var end, rootElement, pipe;
20
17
  return _regeneratorRuntime().wrap(function _callee$(_context) {
21
18
  while (1) {
22
19
  switch (_context.prev = _context.next) {
23
20
  case 0:
24
- end_all = time();
21
+ end = time();
25
22
  rootElement = /*#__PURE__*/createElement(App, {
26
23
  context: Object.assign(context || {}, {
27
24
  ssr: true
28
25
  })
29
26
  });
30
- getTemplates = createTemplates(context);
31
- end = time();
32
- pipe = renderToPipe(rootElement, getTemplates, {
27
+ pipe = renderToPipe(rootElement, context, {
33
28
  onShellReady: function onShellReady() {
34
29
  // set cacheConfig
35
30
  var cacheConfig = PreRender.config();
36
-
37
31
  if (cacheConfig) {
38
- context.ssrContext.cacheConfig = cacheConfig;
32
+ ssrContext.cacheConfig = cacheConfig;
39
33
  }
40
34
  },
41
35
  onAllReady: function onAllReady() {
42
- // computed render html cost
36
+ // calculate streaming ssr cost
43
37
  var cost = end();
44
38
  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);
39
+ ssrContext.metrics.emitTimer('app.render.html.cost', cost);
50
40
  }
51
41
  });
52
42
  return _context.abrupt("return", pipe);
53
-
54
- case 6:
43
+ case 4:
55
44
  case "end":
56
45
  return _context.stop();
57
46
  }
58
47
  }
59
48
  }, _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
- }
49
+ })));
120
50
  };
@@ -1,17 +1,15 @@
1
1
  import { ChunkExtractor } from '@loadable/server';
2
2
  export function getLoadableChunks(_ref) {
3
3
  var context = _ref.context,
4
- jsx = _ref.jsx;
4
+ jsx = _ref.jsx;
5
5
  var _ref2 = context.ssrContext,
6
- loadableStats = _ref2.loadableStats,
7
- entryName = _ref2.entryName;
8
-
6
+ loadableStats = _ref2.loadableStats,
7
+ entryName = _ref2.entryName;
9
8
  if (!loadableStats) {
10
9
  return {
11
10
  jsx: jsx
12
11
  };
13
12
  }
14
-
15
13
  var extractor = new ChunkExtractor({
16
14
  stats: loadableStats,
17
15
  entrypoints: [entryName]
@@ -1,51 +1,63 @@
1
1
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import { Transform } from 'stream';
3
3
  import { renderToPipeableStream } from 'react-dom/server';
4
-
5
- function renderToPipe(rootElement, getTemplates, options) {
4
+ import { RenderLevel } from "../types";
5
+ import { getTemplates } from "./template";
6
+ function renderToPipe(rootElement, context, options) {
6
7
  var isShellStream = true;
7
-
8
+ var ssrContext = context.ssrContext;
8
9
  var forUserPipe = function forUserPipe(stream) {
9
10
  return new Promise(function (resolve) {
10
11
  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(),
12
+ onShellReady: function onShellReady() {
13
+ var _options$onShellReady;
14
+ var _getTemplates = getTemplates(context, RenderLevel.SERVER_RENDER),
17
15
  shellAfter = _getTemplates.shellAfter,
18
16
  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'));
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
+ }
36
34
  }
37
35
  }
38
- }
39
- });
40
- resolve(pipe(injectableTransform).pipe(stream));
41
- }
42
- })),
43
- pipe = _renderToPipeableStre.pipe;
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;
44
58
  });
45
59
  };
46
-
47
60
  return forUserPipe;
48
-
49
61
  function joinChunk() {
50
62
  var before = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
51
63
  var chunk = arguments.length > 1 ? arguments[1] : undefined;
@@ -53,5 +65,4 @@ function renderToPipe(rootElement, getTemplates, options) {
53
65
  return "".concat(before).concat(chunk.toString()).concat(after);
54
66
  }
55
67
  }
56
-
57
68
  export default renderToPipe;