@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.
- package/CHANGELOG.md +52 -0
- package/dist/js/modern/cli/index.js +1 -1
- package/dist/js/modern/core/index.js +1 -1
- package/dist/js/modern/index.js +1 -0
- package/dist/js/modern/router/cli/index.js +24 -8
- package/dist/js/modern/router/runtime/index.js +1 -1
- package/dist/js/modern/router/runtime/plugin.js +26 -44
- package/dist/js/modern/router/runtime/plugin.node.js +143 -0
- package/dist/js/modern/router/runtime/types.js +1 -0
- package/dist/js/modern/router/runtime/utils.js +97 -37
- package/dist/js/modern/router/runtime/withRouter.js +22 -0
- package/dist/js/modern/runtime-context.js +2 -1
- package/dist/js/modern/ssr/cli/index.js +44 -5
- package/dist/js/modern/ssr/index.js +67 -43
- package/dist/js/modern/ssr/index.node.js +6 -2
- package/dist/js/modern/ssr/serverRender/index.js +12 -26
- package/dist/js/modern/ssr/serverRender/renderToStream/buildTemplate.after.js +38 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/buildTemplate.share.js +5 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/bulidTemplate.before.js +24 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/index.js +73 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/loadable.js +26 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/renderToPipe.js +61 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/styledComponent.js +11 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/template.js +22 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/type.js +0 -0
- package/dist/js/modern/ssr/serverRender/{entry.js → renderToString/entry.js} +4 -6
- package/dist/js/modern/ssr/serverRender/renderToString/index.js +31 -0
- package/dist/js/modern/ssr/serverRender/{loadable.js → renderToString/loadable.js} +5 -13
- package/dist/js/modern/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -0
- package/dist/js/modern/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -0
- package/dist/js/modern/ssr/serverRender/{template.js → renderToString/template.js} +0 -0
- package/dist/js/modern/ssr/serverRender/{type.js → renderToString/type.js} +0 -1
- package/dist/js/modern/ssr/serverRender/types.js +2 -0
- package/dist/js/modern/ssr/serverRender/utils.js +24 -0
- package/dist/js/modern/ssr/utils.js +9 -3
- package/dist/js/node/cli/index.js +1 -1
- package/dist/js/node/core/index.js +8 -1
- package/dist/js/node/index.js +8 -0
- package/dist/js/node/router/cli/index.js +24 -8
- package/dist/js/node/router/runtime/index.js +4 -4
- package/dist/js/node/router/runtime/plugin.js +24 -49
- package/dist/js/node/router/runtime/plugin.node.js +169 -0
- package/dist/js/node/router/runtime/types.js +5 -0
- package/dist/js/node/router/runtime/utils.js +97 -35
- package/dist/js/node/router/runtime/withRouter.js +35 -0
- package/dist/js/node/runtime-context.js +4 -2
- package/dist/js/node/ssr/cli/index.js +43 -5
- package/dist/js/node/ssr/index.js +66 -43
- package/dist/js/node/ssr/index.node.js +7 -3
- package/dist/js/node/ssr/serverRender/index.js +13 -35
- package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.after.js +49 -0
- package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.share.js +14 -0
- package/dist/js/node/ssr/serverRender/renderToStream/bulidTemplate.before.js +37 -0
- package/dist/js/node/ssr/serverRender/renderToStream/index.js +90 -0
- package/dist/js/node/ssr/serverRender/renderToStream/loadable.js +34 -0
- package/dist/js/node/ssr/serverRender/renderToStream/renderToPipe.js +70 -0
- package/dist/js/node/ssr/serverRender/renderToStream/styledComponent.js +19 -0
- package/dist/js/node/ssr/serverRender/renderToStream/template.js +32 -0
- package/dist/js/node/ssr/serverRender/renderToStream/type.js +0 -0
- package/dist/js/node/ssr/serverRender/{entry.js → renderToString/entry.js} +13 -15
- package/dist/js/node/ssr/serverRender/renderToString/index.js +47 -0
- package/dist/js/node/ssr/serverRender/{loadable.js → renderToString/loadable.js} +7 -14
- package/dist/js/node/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -0
- package/dist/js/node/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -0
- package/dist/js/node/ssr/serverRender/{template.js → renderToString/template.js} +0 -0
- package/dist/js/node/ssr/serverRender/{type.js → renderToString/type.js} +0 -1
- package/dist/js/node/ssr/serverRender/types.js +13 -0
- package/dist/js/node/ssr/serverRender/utils.js +34 -0
- package/dist/js/node/ssr/utils.js +13 -4
- package/dist/js/treeshaking/cli/index.js +1 -1
- package/dist/js/treeshaking/core/index.js +1 -1
- package/dist/js/treeshaking/index.js +1 -0
- package/dist/js/treeshaking/router/cli/index.js +24 -8
- package/dist/js/treeshaking/router/runtime/index.js +1 -1
- package/dist/js/treeshaking/router/runtime/plugin.js +25 -43
- package/dist/js/treeshaking/router/runtime/plugin.node.js +174 -0
- package/dist/js/treeshaking/router/runtime/types.js +1 -0
- package/dist/js/treeshaking/router/runtime/utils.js +100 -36
- package/dist/js/treeshaking/router/runtime/withRouter.js +17 -0
- package/dist/js/treeshaking/runtime-context.js +2 -1
- package/dist/js/treeshaking/ssr/cli/index.js +47 -5
- package/dist/js/treeshaking/ssr/index.js +74 -45
- package/dist/js/treeshaking/ssr/index.node.js +6 -2
- package/dist/js/treeshaking/ssr/serverRender/index.js +41 -55
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/buildTemplate.after.js +33 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/buildTemplate.share.js +7 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/bulidTemplate.before.js +29 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/index.js +120 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/loadable.js +24 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/renderToPipe.js +57 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/styledComponent.js +10 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/template.js +29 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/type.js +0 -0
- package/dist/js/treeshaking/ssr/serverRender/{entry.js → renderToString/entry.js} +3 -3
- package/dist/js/treeshaking/ssr/serverRender/renderToString/index.js +48 -0
- package/dist/js/treeshaking/ssr/serverRender/{loadable.js → renderToString/loadable.js} +5 -17
- package/dist/js/treeshaking/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -0
- package/dist/js/treeshaking/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -0
- package/dist/js/treeshaking/ssr/serverRender/{template.js → renderToString/template.js} +0 -0
- package/dist/js/treeshaking/ssr/serverRender/{type.js → renderToString/type.js} +0 -1
- package/dist/js/treeshaking/ssr/serverRender/types.js +2 -0
- package/dist/js/treeshaking/ssr/serverRender/{measure.js → utils.js} +16 -0
- package/dist/js/treeshaking/ssr/utils.js +15 -3
- package/dist/types/common.d.ts +0 -2
- package/dist/types/core/index.d.ts +1 -1
- package/dist/types/core/plugin.d.ts +1 -1
- package/dist/types/exports/server.d.ts +21 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/router/runtime/DefaultNotFound.d.ts +1 -0
- package/dist/types/router/runtime/index.d.ts +3 -3
- package/dist/types/router/runtime/plugin.d.ts +2 -45
- package/dist/types/router/runtime/plugin.node.d.ts +8 -0
- package/dist/types/router/runtime/types.d.ts +38 -0
- package/dist/types/router/runtime/utils.d.ts +5 -2
- package/dist/types/router/runtime/withRouter.d.ts +8 -0
- package/dist/types/runtime-context.d.ts +2 -1
- package/dist/types/ssr/index.d.ts +2 -2
- package/dist/types/ssr/index.node.d.ts +1 -1
- package/dist/types/ssr/react/nossr/index.d.ts +3 -1
- package/dist/types/ssr/serverRender/index.d.ts +2 -3
- package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +6 -0
- package/dist/types/ssr/serverRender/renderToStream/buildTemplate.share.d.ts +3 -0
- package/dist/types/ssr/serverRender/renderToStream/bulidTemplate.before.d.ts +1 -0
- package/dist/types/ssr/serverRender/renderToStream/index.d.ts +6 -0
- package/dist/types/ssr/serverRender/renderToStream/loadable.d.ts +16 -0
- package/dist/types/ssr/serverRender/renderToStream/renderToPipe.d.ts +8 -0
- package/dist/types/ssr/serverRender/renderToStream/styledComponent.d.ts +12 -0
- package/dist/types/ssr/serverRender/renderToStream/template.d.ts +3 -0
- package/dist/types/ssr/serverRender/renderToStream/type.d.ts +4 -0
- package/dist/types/ssr/serverRender/{entry.d.ts → renderToString/entry.d.ts} +2 -2
- package/dist/types/ssr/serverRender/renderToString/index.d.ts +6 -0
- package/dist/types/ssr/serverRender/{loadable.d.ts → renderToString/loadable.d.ts} +0 -0
- package/dist/types/ssr/serverRender/{reduce.d.ts → renderToString/reduce.d.ts} +0 -0
- package/dist/types/ssr/serverRender/{styledComponent.d.ts → renderToString/styledComponent.d.ts} +0 -0
- package/dist/types/ssr/serverRender/{template.d.ts → renderToString/template.d.ts} +0 -0
- package/dist/types/ssr/serverRender/{type.d.ts → renderToString/type.d.ts} +1 -8
- package/dist/types/ssr/serverRender/types.d.ts +18 -0
- package/dist/types/ssr/serverRender/utils.d.ts +3 -0
- package/dist/types/ssr/utils.d.ts +4 -2
- package/dist/types/state/runtime/plugin.d.ts +1 -1
- package/package.json +57 -73
- package/types/index.d.ts +13 -0
- package/types/router.d.ts +14 -0
- package/dist/js/modern/ssr/serverRender/measure.js +0 -11
- package/dist/js/node/ssr/serverRender/measure.js +0 -20
- package/dist/types/ssr/serverRender/measure.d.ts +0 -1
- package/lib/types.d.ts +0 -10
- 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/
|
|
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
|
|
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
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
47
|
-
|
|
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
|
-
|
|
57
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
65
|
+
loadableReady(function () {
|
|
66
|
+
ModernHydrate( /*#__PURE__*/_jsx(App, {
|
|
67
|
+
context: hydrateContext
|
|
68
|
+
}), callback);
|
|
69
|
+
});
|
|
62
70
|
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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 (
|
|
19
|
+
switch (_context.prev = _context.next) {
|
|
13
20
|
case 0:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
43
|
+
return _context.stop();
|
|
55
44
|
}
|
|
56
45
|
}
|
|
57
|
-
},
|
|
46
|
+
}, _callee);
|
|
58
47
|
}));
|
|
59
|
-
|
|
60
|
-
|
|
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,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
|
+
}
|
|
File without changes
|
|
@@ -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
|
+
};
|