@modern-js/runtime 1.3.5 → 1.4.2

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 (155) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/dist/js/modern/cli/index.js +4 -4
  3. package/dist/js/modern/common.js +1 -0
  4. package/dist/js/modern/exports/model.js +2 -1
  5. package/dist/js/modern/exports/router.js +2 -1
  6. package/dist/js/modern/exports/server.js +0 -1
  7. package/dist/js/modern/exports/ssr.js +2 -1
  8. package/dist/js/modern/router/cli/index.js +106 -0
  9. package/dist/js/modern/router/index.js +2 -0
  10. package/dist/js/modern/router/runtime/DefaultNotFound.js +13 -0
  11. package/dist/js/modern/router/runtime/index.js +4 -0
  12. package/dist/js/modern/router/runtime/plugin.js +88 -0
  13. package/dist/js/modern/router/runtime/utils.js +108 -0
  14. package/dist/js/modern/ssr/cli/index.js +120 -0
  15. package/dist/js/modern/ssr/index.js +109 -0
  16. package/dist/js/modern/ssr/index.node.js +78 -0
  17. package/dist/js/modern/ssr/prefetch.js +58 -0
  18. package/dist/js/modern/ssr/react/index.js +2 -0
  19. package/dist/js/modern/ssr/react/nossr/index.js +13 -0
  20. package/dist/js/modern/ssr/react/prerender/index.js +104 -0
  21. package/dist/js/modern/ssr/react/prerender/type.js +0 -0
  22. package/dist/js/modern/ssr/react/prerender/util.js +99 -0
  23. package/dist/js/modern/ssr/serverRender/entry.js +179 -0
  24. package/dist/js/modern/ssr/serverRender/helmet.js +46 -0
  25. package/dist/js/modern/ssr/serverRender/index.js +29 -0
  26. package/dist/js/modern/ssr/serverRender/loadable.js +48 -0
  27. package/dist/js/modern/ssr/serverRender/measure.js +11 -0
  28. package/dist/js/modern/ssr/serverRender/reduce.js +7 -0
  29. package/dist/js/modern/ssr/serverRender/styledComponent.js +8 -0
  30. package/dist/js/modern/ssr/serverRender/template.js +90 -0
  31. package/dist/js/modern/ssr/serverRender/type.js +8 -0
  32. package/dist/js/modern/ssr/utils.js +51 -0
  33. package/dist/js/modern/state/cli/index.js +110 -0
  34. package/dist/js/modern/state/index.js +2 -0
  35. package/dist/js/modern/state/plugins.js +7 -0
  36. package/dist/js/modern/state/runtime/index.js +4 -0
  37. package/dist/js/modern/state/runtime/plugin.js +71 -0
  38. package/dist/js/modern/state/types.js +1 -0
  39. package/dist/js/node/cli/index.js +5 -5
  40. package/dist/js/node/common.js +10 -0
  41. package/dist/js/node/exports/model.js +19 -5
  42. package/dist/js/node/exports/router.js +19 -5
  43. package/dist/js/node/exports/server.js +0 -17
  44. package/dist/js/node/exports/ssr.js +19 -5
  45. package/dist/js/node/router/cli/index.js +122 -0
  46. package/dist/js/node/router/index.js +30 -0
  47. package/dist/js/node/router/runtime/DefaultNotFound.js +26 -0
  48. package/dist/js/node/router/runtime/index.js +39 -0
  49. package/dist/js/node/router/runtime/plugin.js +111 -0
  50. package/dist/js/node/router/runtime/utils.js +128 -0
  51. package/dist/js/node/ssr/cli/index.js +136 -0
  52. package/dist/js/node/ssr/index.js +138 -0
  53. package/dist/js/node/ssr/index.node.js +105 -0
  54. package/dist/js/node/ssr/prefetch.js +75 -0
  55. package/dist/js/node/ssr/react/index.js +21 -0
  56. package/dist/js/node/ssr/react/nossr/index.js +28 -0
  57. package/dist/js/node/ssr/react/prerender/index.js +121 -0
  58. package/dist/js/node/ssr/react/prerender/type.js +0 -0
  59. package/dist/js/node/ssr/react/prerender/util.js +119 -0
  60. package/dist/js/node/ssr/serverRender/entry.js +208 -0
  61. package/dist/js/node/ssr/serverRender/helmet.js +52 -0
  62. package/dist/js/node/ssr/serverRender/index.js +46 -0
  63. package/dist/js/node/ssr/serverRender/loadable.js +60 -0
  64. package/dist/js/node/ssr/serverRender/measure.js +20 -0
  65. package/dist/js/node/ssr/serverRender/reduce.js +14 -0
  66. package/dist/js/node/ssr/serverRender/styledComponent.js +18 -0
  67. package/dist/js/node/ssr/serverRender/template.js +103 -0
  68. package/dist/js/node/ssr/serverRender/type.js +15 -0
  69. package/dist/js/node/ssr/utils.js +65 -0
  70. package/dist/js/node/state/cli/index.js +127 -0
  71. package/dist/js/node/state/index.js +30 -0
  72. package/dist/js/node/state/plugins.js +35 -0
  73. package/dist/js/node/state/runtime/index.js +61 -0
  74. package/dist/js/node/state/runtime/plugin.js +101 -0
  75. package/dist/js/node/state/types.js +5 -0
  76. package/dist/js/treeshaking/cli/index.js +4 -4
  77. package/dist/js/treeshaking/common.js +3 -0
  78. package/dist/js/treeshaking/exports/model.js +2 -1
  79. package/dist/js/treeshaking/exports/router.js +2 -1
  80. package/dist/js/treeshaking/exports/server.js +0 -1
  81. package/dist/js/treeshaking/exports/ssr.js +2 -1
  82. package/dist/js/treeshaking/router/cli/index.js +100 -0
  83. package/dist/js/treeshaking/router/index.js +2 -0
  84. package/dist/js/treeshaking/router/runtime/DefaultNotFound.js +15 -0
  85. package/dist/js/treeshaking/router/runtime/index.js +4 -0
  86. package/dist/js/treeshaking/router/runtime/plugin.js +89 -0
  87. package/dist/js/treeshaking/router/runtime/utils.js +106 -0
  88. package/dist/js/treeshaking/ssr/cli/index.js +113 -0
  89. package/dist/js/treeshaking/ssr/index.js +129 -0
  90. package/dist/js/treeshaking/ssr/index.node.js +100 -0
  91. package/dist/js/treeshaking/ssr/prefetch.js +97 -0
  92. package/dist/js/treeshaking/ssr/react/index.js +2 -0
  93. package/dist/js/treeshaking/ssr/react/nossr/index.js +16 -0
  94. package/dist/js/treeshaking/ssr/react/prerender/index.js +119 -0
  95. package/dist/js/treeshaking/ssr/react/prerender/type.js +0 -0
  96. package/dist/js/treeshaking/ssr/react/prerender/util.js +115 -0
  97. package/dist/js/treeshaking/ssr/serverRender/entry.js +267 -0
  98. package/dist/js/treeshaking/ssr/serverRender/helmet.js +37 -0
  99. package/dist/js/treeshaking/ssr/serverRender/index.js +69 -0
  100. package/dist/js/treeshaking/ssr/serverRender/loadable.js +59 -0
  101. package/dist/js/treeshaking/ssr/serverRender/measure.js +17 -0
  102. package/dist/js/treeshaking/ssr/serverRender/reduce.js +11 -0
  103. package/dist/js/treeshaking/ssr/serverRender/styledComponent.js +8 -0
  104. package/dist/js/treeshaking/ssr/serverRender/template.js +111 -0
  105. package/dist/js/treeshaking/ssr/serverRender/type.js +8 -0
  106. package/dist/js/treeshaking/ssr/utils.js +53 -0
  107. package/dist/js/treeshaking/state/cli/index.js +100 -0
  108. package/dist/js/treeshaking/state/index.js +2 -0
  109. package/dist/js/treeshaking/state/plugins.js +13 -0
  110. package/dist/js/treeshaking/state/runtime/index.js +4 -0
  111. package/dist/js/treeshaking/state/runtime/plugin.js +63 -0
  112. package/dist/js/treeshaking/state/types.js +1 -0
  113. package/dist/types/common.d.ts +1 -0
  114. package/dist/types/exports/model.d.ts +2 -1
  115. package/dist/types/exports/router.d.ts +2 -1
  116. package/dist/types/exports/server.d.ts +0 -1
  117. package/dist/types/exports/ssr.d.ts +2 -1
  118. package/dist/types/index.d.ts +2 -2
  119. package/dist/types/router/cli/index.d.ts +5 -0
  120. package/dist/types/router/index.d.ts +2 -0
  121. package/dist/types/router/runtime/DefaultNotFound.d.ts +2 -0
  122. package/dist/types/router/runtime/index.d.ts +6 -0
  123. package/dist/types/router/runtime/plugin.d.ts +51 -0
  124. package/dist/types/router/runtime/utils.d.ts +6 -0
  125. package/dist/types/ssr/cli/index.d.ts +5 -0
  126. package/dist/types/ssr/index.d.ts +18 -0
  127. package/dist/types/ssr/index.node.d.ts +4 -0
  128. package/dist/types/ssr/prefetch.d.ts +13 -0
  129. package/dist/types/ssr/react/index.d.ts +2 -0
  130. package/dist/types/ssr/react/nossr/index.d.ts +2 -0
  131. package/dist/types/ssr/react/prerender/index.d.ts +1 -0
  132. package/dist/types/ssr/react/prerender/type.d.ts +29 -0
  133. package/dist/types/ssr/react/prerender/util.d.ts +6 -0
  134. package/dist/types/ssr/serverRender/entry.d.ts +20 -0
  135. package/dist/types/ssr/serverRender/helmet.d.ts +2 -0
  136. package/dist/types/ssr/serverRender/index.d.ts +8 -0
  137. package/dist/types/ssr/serverRender/loadable.d.ts +2 -0
  138. package/dist/types/ssr/serverRender/measure.d.ts +1 -0
  139. package/dist/types/ssr/serverRender/reduce.d.ts +3 -0
  140. package/dist/types/ssr/serverRender/styledComponent.d.ts +2 -0
  141. package/dist/types/ssr/serverRender/template.d.ts +14 -0
  142. package/dist/types/ssr/serverRender/type.d.ts +32 -0
  143. package/dist/types/ssr/utils.d.ts +8 -0
  144. package/dist/types/state/cli/index.d.ts +5 -0
  145. package/dist/types/state/index.d.ts +2 -0
  146. package/dist/types/state/plugins.d.ts +4 -0
  147. package/dist/types/state/runtime/index.d.ts +4 -0
  148. package/dist/types/state/runtime/plugin.d.ts +17 -0
  149. package/dist/types/state/types.d.ts +17 -0
  150. package/package.json +36 -20
  151. package/types/model.d.ts +4 -1
  152. package/dist/js/modern/exports/request.js +0 -1
  153. package/dist/js/node/exports/request.js +0 -13
  154. package/dist/js/treeshaking/exports/request.js +0 -1
  155. package/dist/types/exports/request.d.ts +0 -1
@@ -0,0 +1,267 @@
1
+ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
+ import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
4
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
5
+ import _createClass from "@babel/runtime/helpers/esm/createClass";
6
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
7
+ import path from 'path';
8
+ import { LOADABLE_STATS_FILE } from '@modern-js/utils/constants';
9
+ import React from 'react';
10
+ import ReactDomServer from 'react-dom/server';
11
+ import serialize from 'serialize-javascript';
12
+ import ReactHelmet from 'react-helmet';
13
+ import { toFragments } from "./template";
14
+ import { RenderLevel } from "./type";
15
+ import helmetReplace from "./helmet";
16
+ import { reduce } from "./reduce";
17
+ import * as loadableRenderer from "./loadable";
18
+ import * as styledComponentRenderer from "./styledComponent";
19
+ import { time } from "./measure";
20
+
21
+ var buildTemplateData = function buildTemplateData(context, data, renderLevel) {
22
+ var request = context.request;
23
+ return {
24
+ data: data,
25
+ context: {
26
+ request: {
27
+ params: request.params,
28
+ query: request.query,
29
+ pathname: request.pathname,
30
+ host: request.host,
31
+ url: request.url,
32
+ headers: request.headers,
33
+ cookieMap: request.cookieMap
34
+ }
35
+ },
36
+ renderLevel: renderLevel
37
+ };
38
+ };
39
+
40
+ var Entry = /*#__PURE__*/function () {
41
+ function Entry(options) {
42
+ _classCallCheck(this, Entry);
43
+
44
+ _defineProperty(this, "entryName", void 0);
45
+
46
+ _defineProperty(this, "result", void 0);
47
+
48
+ _defineProperty(this, "metrics", void 0);
49
+
50
+ _defineProperty(this, "logger", void 0);
51
+
52
+ _defineProperty(this, "App", void 0);
53
+
54
+ _defineProperty(this, "fragments", void 0);
55
+
56
+ var ctx = options.ctx;
57
+ var entryName = ctx.entryName,
58
+ templateHTML = ctx.template;
59
+ this.fragments = toFragments(templateHTML);
60
+ this.entryName = entryName;
61
+ this.App = options.App;
62
+ this.metrics = ctx.metrics;
63
+ this.logger = ctx.logger;
64
+ this.result = {
65
+ renderLevel: RenderLevel.CLIENT_RENDER,
66
+ html: '',
67
+ chunksMap: {
68
+ js: '',
69
+ css: ''
70
+ }
71
+ };
72
+ }
73
+
74
+ _createClass(Entry, [{
75
+ key: "renderToHtml",
76
+ value: function () {
77
+ var _renderToHtml = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(context) {
78
+ var ssrContext, prefetchData, html, templateData, SSRData, _iterator, _step, fragment, helmetData;
79
+
80
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
81
+ while (1) {
82
+ switch (_context.prev = _context.next) {
83
+ case 0:
84
+ ssrContext = context.ssrContext;
85
+
86
+ if (!ssrContext.redirection.url) {
87
+ _context.next = 3;
88
+ break;
89
+ }
90
+
91
+ return _context.abrupt("return", '');
92
+
93
+ case 3:
94
+ _context.next = 5;
95
+ return this.prefetch(context);
96
+
97
+ case 5:
98
+ prefetchData = _context.sent;
99
+
100
+ if (!ssrContext.redirection.url) {
101
+ _context.next = 8;
102
+ break;
103
+ }
104
+
105
+ return _context.abrupt("return", '');
106
+
107
+ case 8:
108
+ if (this.result.renderLevel >= RenderLevel.SERVER_PREFETCH) {
109
+ this.result.html = this.renderToString(context);
110
+ }
111
+
112
+ if (!ssrContext.redirection.url) {
113
+ _context.next = 11;
114
+ break;
115
+ }
116
+
117
+ return _context.abrupt("return", '');
118
+
119
+ case 11:
120
+ html = '';
121
+ templateData = buildTemplateData(ssrContext, prefetchData, this.result.renderLevel);
122
+ SSRData = this.getSSRDataScript(templateData);
123
+ _iterator = _createForOfIteratorHelper(this.fragments);
124
+
125
+ try {
126
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
127
+ fragment = _step.value;
128
+
129
+ if (fragment.isVariable && fragment.content === 'SSRDataScript') {
130
+ html += fragment.getValue(SSRData);
131
+ } else {
132
+ html += fragment.getValue(this.result);
133
+ }
134
+ }
135
+ } catch (err) {
136
+ _iterator.e(err);
137
+ } finally {
138
+ _iterator.f();
139
+ }
140
+
141
+ helmetData = ReactHelmet.renderStatic();
142
+ return _context.abrupt("return", helmetData ? helmetReplace(html, helmetData) : html);
143
+
144
+ case 18:
145
+ case "end":
146
+ return _context.stop();
147
+ }
148
+ }
149
+ }, _callee, this);
150
+ }));
151
+
152
+ function renderToHtml(_x) {
153
+ return _renderToHtml.apply(this, arguments);
154
+ }
155
+
156
+ return renderToHtml;
157
+ }()
158
+ }, {
159
+ key: "prefetch",
160
+ value: function () {
161
+ var _prefetch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(context) {
162
+ var prefetch, prefetchData, end, prefetchCost;
163
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
164
+ while (1) {
165
+ switch (_context2.prev = _context2.next) {
166
+ case 0:
167
+ prefetch = this.App.prefetch;
168
+ end = time();
169
+ _context2.prev = 2;
170
+
171
+ if (!prefetch) {
172
+ _context2.next = 9;
173
+ break;
174
+ }
175
+
176
+ _context2.next = 6;
177
+ return prefetch(context);
178
+
179
+ case 6:
180
+ _context2.t0 = _context2.sent;
181
+ _context2.next = 10;
182
+ break;
183
+
184
+ case 9:
185
+ _context2.t0 = null;
186
+
187
+ case 10:
188
+ prefetchData = _context2.t0;
189
+ this.result.renderLevel = RenderLevel.SERVER_PREFETCH;
190
+ prefetchCost = end();
191
+ this.logger.debug("App Prefetch cost = %d ms", prefetchCost);
192
+ this.metrics.emitTimer('app.prefetch.cost', prefetchCost);
193
+ _context2.next = 22;
194
+ break;
195
+
196
+ case 17:
197
+ _context2.prev = 17;
198
+ _context2.t1 = _context2["catch"](2);
199
+ this.result.renderLevel = RenderLevel.CLIENT_RENDER;
200
+ this.logger.error('App Prefetch Render', _context2.t1);
201
+ this.metrics.emitCounter('app.prefetch.render.error', 1);
202
+
203
+ case 22:
204
+ return _context2.abrupt("return", prefetchData || {});
205
+
206
+ case 23:
207
+ case "end":
208
+ return _context2.stop();
209
+ }
210
+ }
211
+ }, _callee2, this, [[2, 17]]);
212
+ }));
213
+
214
+ function prefetch(_x2) {
215
+ return _prefetch.apply(this, arguments);
216
+ }
217
+
218
+ return prefetch;
219
+ }()
220
+ }, {
221
+ key: "renderToString",
222
+ value: function renderToString(context) {
223
+ var html = '';
224
+ var end = time();
225
+ var ssrContext = context.ssrContext;
226
+
227
+ try {
228
+ var App = /*#__PURE__*/React.createElement(this.App, {
229
+ context: Object.assign(context, {
230
+ ssr: true
231
+ })
232
+ }); // Todo render Hook
233
+
234
+ var renderContext = {
235
+ loadableManifest: path.resolve(ssrContext.distDir, LOADABLE_STATS_FILE),
236
+ result: this.result,
237
+ entryName: this.entryName
238
+ };
239
+ html = reduce(App, renderContext, [styledComponentRenderer.toHtml, loadableRenderer.toHtml, function (jsx) {
240
+ return ReactDomServer.renderToString(jsx);
241
+ }]);
242
+ var cost = end();
243
+ this.logger.debug('App Render To HTML cost = %d ms', cost);
244
+ this.metrics.emitTimer('app.render.html.cost', cost);
245
+ this.result.renderLevel = RenderLevel.SERVER_RENDER;
246
+ } catch (e) {
247
+ this.logger.error('App Render To HTML', e);
248
+ this.metrics.emitCounter('app.render.html.error', 1);
249
+ }
250
+
251
+ return html;
252
+ }
253
+ }, {
254
+ key: "getSSRDataScript",
255
+ value: function getSSRDataScript(templateData) {
256
+ return {
257
+ SSRDataScript: "\n <script>window._SSR_DATA = ".concat(serialize(templateData, {
258
+ isJSON: true
259
+ }), "</script>\n ")
260
+ };
261
+ }
262
+ }]);
263
+
264
+ return Entry;
265
+ }();
266
+
267
+ export { Entry as default };
@@ -0,0 +1,37 @@
1
+ // 用于 react-helmet 正则替换
2
+ var RE_HTML_ATTR = /<html[^>]*>/;
3
+ var RE_BODY_ATTR = /<body[^>]*>/;
4
+ var RE_LAST_IN_HEAD = /<\/head>/;
5
+ var RE_TITLE = /<title[^>]*>([\s\S\n\r]*?)<\/title>/g;
6
+ var TEST_TITLE_CONTENT = /(?<=<title[^>]*>)([\s\S\n\r]*?)([.|\S])([\s\S\n\r]*?)(?=<\/title>)/g; // 通过 react-helmet 修改模板
7
+
8
+ export default function helmet(content, helmetData) {
9
+ var result = content;
10
+ var bodyAttributes = helmetData.bodyAttributes.toString();
11
+
12
+ if (bodyAttributes) {
13
+ result = result.replace(RE_BODY_ATTR, "<body ".concat(bodyAttributes, ">"));
14
+ }
15
+
16
+ var htmlAttributes = helmetData.htmlAttributes.toString();
17
+
18
+ if (htmlAttributes) {
19
+ result = result.replace(RE_HTML_ATTR, "<html ".concat(htmlAttributes, ">"));
20
+ }
21
+
22
+ var base = helmetData.base.toString();
23
+ var link = helmetData.link.toString();
24
+ var meta = helmetData.meta.toString();
25
+ var noscript = helmetData.noscript.toString();
26
+ var script = helmetData.script.toString();
27
+ var style = helmetData.style.toString();
28
+ var title = helmetData.title.toString(); // 如果模板中存在 title,且 helmetData title 有内容则做替换
29
+
30
+ var existTitle = RE_TITLE.test(content);
31
+
32
+ if (TEST_TITLE_CONTENT.test(title.trim()) && existTitle) {
33
+ result = result.replace(RE_TITLE, title);
34
+ }
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 "));
37
+ }
@@ -0,0 +1,69 @@
1
+ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
+ import { RuntimeContext } from '@modern-js/runtime-core';
4
+ import { run } from '@modern-js/utils/ssr';
5
+ import { PreRender } from "../react/prerender";
6
+ import SSREntry from "./entry";
7
+ import { time } from "./measure";
8
+ export var render = /*#__PURE__*/function () {
9
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(ctx) {
10
+ var _,
11
+ App,
12
+ ssrContext,
13
+ _args2 = arguments;
14
+
15
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
16
+ while (1) {
17
+ switch (_context2.prev = _context2.next) {
18
+ case 0:
19
+ _ = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : process.cwd();
20
+ App = _args2.length > 2 ? _args2[2] : undefined;
21
+ ssrContext = ctx.ssrContext;
22
+ return _context2.abrupt("return", run(ssrContext.request.headers, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
23
+ var entry, end, html, cost, cacheConfig;
24
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
25
+ while (1) {
26
+ switch (_context.prev = _context.next) {
27
+ case 0:
28
+ entry = new SSREntry({
29
+ ctx: ssrContext,
30
+ App: App
31
+ });
32
+ entry.metrics.emitCounter('app.visit.count', 1);
33
+ end = time();
34
+ _context.next = 5;
35
+ return entry.renderToHtml(ctx);
36
+
37
+ case 5:
38
+ html = _context.sent;
39
+ cost = end();
40
+ entry.logger.info('App Render Total cost = %d ms', cost);
41
+ entry.metrics.emitTimer('app.render.cost', cost);
42
+ cacheConfig = PreRender.config();
43
+
44
+ if (cacheConfig) {
45
+ ctx.ssrContext.cacheConfig = cacheConfig;
46
+ }
47
+
48
+ return _context.abrupt("return", html);
49
+
50
+ case 12:
51
+ case "end":
52
+ return _context.stop();
53
+ }
54
+ }
55
+ }, _callee);
56
+ }))));
57
+
58
+ case 4:
59
+ case "end":
60
+ return _context2.stop();
61
+ }
62
+ }
63
+ }, _callee2);
64
+ }));
65
+
66
+ return function render(_x) {
67
+ return _ref.apply(this, arguments);
68
+ };
69
+ }();
@@ -0,0 +1,59 @@
1
+ import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
2
+ import path from 'path';
3
+ import { ChunkExtractor } from '@loadable/server';
4
+
5
+ function getLoadableScripts(extractor) {
6
+ var check = function check(scripts) {
7
+ return (scripts || '').includes('__LOADABLE_REQUIRED_CHUNKS___ext');
8
+ };
9
+
10
+ var scripts = extractor.getScriptTags();
11
+
12
+ if (!check(scripts)) {
13
+ return '';
14
+ }
15
+
16
+ return scripts.split('</script>') // 前两个 script为 loadable 必须的 script
17
+ .slice(0, 2).map(function (i) {
18
+ return "".concat(i, "</script>");
19
+ }).join('');
20
+ }
21
+
22
+ export var toHtml = function toHtml(jsx, renderer, next) {
23
+ var loadableManifest = renderer.loadableManifest,
24
+ chunksMap = renderer.result.chunksMap;
25
+
26
+ if (!loadableManifest || chunksMap.js) {
27
+ return next(jsx);
28
+ }
29
+
30
+ var extractor = new ChunkExtractor({
31
+ statsFile: loadableManifest,
32
+ entrypoints: [renderer.entryName]
33
+ });
34
+ var html = next(extractor.collectChunks(jsx));
35
+ var chunks = extractor.getChunkAssets(extractor.chunks);
36
+ chunksMap.js = (chunksMap.js || '') + getLoadableScripts(extractor);
37
+
38
+ var _iterator = _createForOfIteratorHelper(chunks),
39
+ _step;
40
+
41
+ try {
42
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
43
+ var v = _step.value;
44
+ var fileType = path.extname(v.url).slice(1);
45
+
46
+ if (fileType === 'js') {
47
+ chunksMap[fileType] += "<script src=\"".concat(v.url, "\"></script>");
48
+ } else if (fileType === 'css') {
49
+ chunksMap[fileType] += "<link href=\"".concat(v.url, "\" rel=\"stylesheet\" />");
50
+ }
51
+ }
52
+ } catch (err) {
53
+ _iterator.e(err);
54
+ } finally {
55
+ _iterator.f();
56
+ }
57
+
58
+ return html;
59
+ };
@@ -0,0 +1,17 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+
3
+ var getLatency = function getLatency(hrtime) {
4
+ var _process$hrtime = process.hrtime(hrtime),
5
+ _process$hrtime2 = _slicedToArray(_process$hrtime, 2),
6
+ s = _process$hrtime2[0],
7
+ ns = _process$hrtime2[1];
8
+
9
+ return s * 1e3 + ns / 1e6;
10
+ };
11
+
12
+ export var time = function time() {
13
+ var hrtime = process.hrtime();
14
+ return function () {
15
+ return getLatency(hrtime);
16
+ };
17
+ };
@@ -0,0 +1,11 @@
1
+ export function reduce(jsx, renderer, middleware) {
2
+ var index = 0;
3
+
4
+ var createNext = function createNext() {
5
+ return function (App) {
6
+ return middleware[index++](App, renderer, createNext());
7
+ };
8
+ };
9
+
10
+ return createNext()(jsx);
11
+ }
@@ -0,0 +1,8 @@
1
+ import { ServerStyleSheet } from '@modern-js/runtime-core/styled';
2
+ export var toHtml = function toHtml(jsx, renderer, next) {
3
+ var sheet = new ServerStyleSheet();
4
+ var html = next(sheet.collectStyles(jsx));
5
+ var css = sheet.getStyleTags();
6
+ renderer.result.chunksMap.css += css;
7
+ return html;
8
+ };
@@ -0,0 +1,111 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
3
+ import _createClass from "@babel/runtime/helpers/esm/createClass";
4
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
5
+ import fs from 'fs';
6
+
7
+ var readFile = function readFile(filepath) {
8
+ if (fs.existsSync(filepath)) {
9
+ return fs.readFileSync(filepath, 'utf-8');
10
+ } else {
11
+ return null;
12
+ }
13
+ };
14
+
15
+ var VARIABLE_REG_EXP = /<!--<\?([-=+])\s*(.*?)\s*\?>-->/;
16
+ var VARIABLE_SPLITTER = /(<!--<\?.*?\?>-->)/;
17
+ var ENCODE_HTML_RULES = {
18
+ '&': '&amp;',
19
+ '<': '&lt;',
20
+ '>': '&gt;',
21
+ '"': '&#34;',
22
+ "'": '&#39;'
23
+ };
24
+ var MATCH_HTML = /[&<>'"]/g;
25
+
26
+ function encodeChar(c) {
27
+ return ENCODE_HTML_RULES[c] || c;
28
+ }
29
+
30
+ function escape(str) {
31
+ return str.replace(MATCH_HTML, encodeChar);
32
+ }
33
+
34
+ export var Fragment = /*#__PURE__*/function () {
35
+ function Fragment(template) {
36
+ _classCallCheck(this, Fragment);
37
+
38
+ _defineProperty(this, "isVariable", void 0);
39
+
40
+ _defineProperty(this, "content", void 0);
41
+
42
+ _defineProperty(this, "filters", void 0);
43
+
44
+ _defineProperty(this, "path", void 0);
45
+
46
+ var match = VARIABLE_REG_EXP.exec(template);
47
+
48
+ if (match) {
49
+ var _match = _slicedToArray(match, 3),
50
+ filterFlag = _match[1],
51
+ content = _match[2];
52
+
53
+ this.isVariable = true;
54
+ this.content = content;
55
+ this.filters = [Fragment.filterMap[filterFlag]];
56
+ this.path = content.replace(/\[['"](.*?)['"]\]/g, '.$1').split('.');
57
+ } else {
58
+ this.isVariable = false;
59
+ this.content = template;
60
+ this.filters = [];
61
+ this.path = [];
62
+ }
63
+ }
64
+
65
+ _createClass(Fragment, [{
66
+ key: "getValue",
67
+ value: function getValue(data) {
68
+ if (this.isVariable) {
69
+ var value = this.path.reduce(function (p, n) {
70
+ return p != null ? p[n] : p;
71
+ }, data);
72
+ return this.filters.reduce(function (p, n) {
73
+ return n(p);
74
+ }, value != null ? value : '');
75
+ }
76
+
77
+ return this.content;
78
+ }
79
+ }]);
80
+
81
+ return Fragment;
82
+ }();
83
+
84
+ _defineProperty(Fragment, "filterMap", {
85
+ '=': escape,
86
+ '-': function _(v) {
87
+ return v;
88
+ }
89
+ });
90
+
91
+ var fragmentListMap = {};
92
+ export function toFragments(filename) {
93
+ if (fragmentListMap[filename]) {
94
+ return fragmentListMap[filename];
95
+ } // 未开启现代构建的项目无 -es6.html
96
+
97
+
98
+ var template = readFile(filename);
99
+
100
+ if (!template) {
101
+ throw new Error("Could not find template file: ".concat(filename));
102
+ }
103
+
104
+ var fragmentList = template.split(VARIABLE_SPLITTER).filter(function (v) {
105
+ return Boolean(v);
106
+ }).map(function (v) {
107
+ return new Fragment(v);
108
+ });
109
+ fragmentListMap[filename] = fragmentList;
110
+ return fragmentList;
111
+ }
@@ -0,0 +1,8 @@
1
+ // import { IncomingHttpHeaders } from 'http';
2
+ export var RenderLevel;
3
+
4
+ (function (RenderLevel) {
5
+ RenderLevel[RenderLevel["CLIENT_RENDER"] = 0] = "CLIENT_RENDER";
6
+ RenderLevel[RenderLevel["SERVER_PREFETCH"] = 1] = "SERVER_PREFETCH";
7
+ RenderLevel[RenderLevel["SERVER_RENDER"] = 2] = "SERVER_RENDER";
8
+ })(RenderLevel || (RenderLevel = {}));
@@ -0,0 +1,53 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
+ export var formatServer = function formatServer(request) {
4
+ var _ref = request.headers || {},
5
+ _ref$cookie = _ref.cookie,
6
+ cookie = _ref$cookie === void 0 ? '' : _ref$cookie,
7
+ _ref$userAgent = _ref['user-agent'],
8
+ userAgent = _ref$userAgent === void 0 ? '' : _ref$userAgent,
9
+ referer = _ref.referer;
10
+
11
+ return _objectSpread({
12
+ cookie: cookie,
13
+ userAgent: userAgent,
14
+ referer: referer
15
+ }, request);
16
+ };
17
+
18
+ var getQuery = function getQuery() {
19
+ return window.location.search.substring(1).split('&').reduce(function (res, item) {
20
+ var _item$split = item.split('='),
21
+ _item$split2 = _slicedToArray(_item$split, 2),
22
+ key = _item$split2[0],
23
+ value = _item$split2[1];
24
+
25
+ res[key] = value;
26
+ return res;
27
+ }, {});
28
+ };
29
+
30
+ export var formatClient = function formatClient(request) {
31
+ return {
32
+ params: request.params || {},
33
+ host: request.host || location.host,
34
+ pathname: request.pathname || location.pathname,
35
+ headers: request.headers || {},
36
+ cookieMap: request.cookieMap || {},
37
+ cookie: request.headers.cookie || document.cookie,
38
+ userAgent: request.headers['user-agent'] || navigator.userAgent,
39
+ referer: request.referer || document.referrer,
40
+ query: request.query || getQuery(),
41
+ url: location.href
42
+ };
43
+ };
44
+ export var mockResponse = function mockResponse() {
45
+ return {
46
+ setHeader: function setHeader() {
47
+ console.info('setHeader can only be used in the server side');
48
+ },
49
+ status: function status() {
50
+ console.info('status can only be used in the server side');
51
+ }
52
+ };
53
+ };