@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.
- package/CHANGELOG.md +77 -0
- package/dist/js/modern/cli/index.js +3 -5
- package/dist/js/modern/core/app-config.js +2 -1
- package/dist/js/modern/core/compatible.js +63 -46
- package/dist/js/modern/core/index.js +3 -2
- package/dist/js/modern/core/loader/loaderManager.js +12 -34
- package/dist/js/modern/core/loader/useLoader.js +8 -26
- package/dist/js/modern/core/plugin.js +6 -28
- package/dist/js/modern/document/Body.js +17 -0
- package/dist/js/modern/document/DocumentContext.js +6 -0
- package/dist/js/modern/document/DocumentStructrueContext.js +7 -0
- package/dist/js/modern/document/Head.js +24 -0
- package/dist/js/modern/document/Html.js +92 -0
- package/dist/js/modern/document/Root.js +31 -0
- package/dist/js/modern/document/Scripts.js +10 -0
- package/dist/js/modern/document/cli/index.js +130 -0
- package/dist/js/modern/document/constants.js +19 -0
- package/dist/js/modern/document/index.js +8 -0
- package/dist/js/modern/index.js +1 -1
- package/dist/js/modern/router/cli/index.js +0 -16
- package/dist/js/modern/router/runtime/plugin.js +0 -9
- package/dist/js/modern/router/runtime/plugin.node.js +18 -24
- package/dist/js/modern/router/runtime/root/index.js +19 -0
- package/dist/js/modern/router/runtime/root/load.js +61 -0
- package/dist/js/modern/router/runtime/utils.js +16 -35
- package/dist/js/modern/router/runtime/withRouter.js +1 -3
- package/dist/js/modern/ssr/cli/index.js +2 -23
- package/dist/js/modern/ssr/index.js +23 -34
- package/dist/js/modern/ssr/index.node.js +0 -13
- package/dist/js/modern/ssr/prefetch.js +0 -7
- package/dist/js/modern/ssr/react/prerender/index.js +2 -23
- package/dist/js/modern/ssr/react/prerender/util.js +2 -17
- package/dist/js/modern/ssr/react/withCallback/index.js +0 -1
- package/dist/js/modern/ssr/serverRender/helmet.js +12 -20
- package/dist/js/modern/ssr/serverRender/index.js +1 -2
- package/dist/js/modern/ssr/serverRender/renderToStream/buildTemplate.after.js +5 -5
- package/dist/js/modern/ssr/serverRender/renderToStream/bulidTemplate.before.js +45 -11
- package/dist/js/modern/ssr/serverRender/renderToStream/index.js +6 -39
- package/dist/js/modern/ssr/serverRender/renderToStream/loadable.js +0 -2
- package/dist/js/modern/ssr/serverRender/renderToStream/renderToPipe.js +26 -15
- package/dist/js/modern/ssr/serverRender/renderToStream/template.js +14 -18
- package/dist/js/modern/ssr/serverRender/renderToString/entry.js +2 -34
- package/dist/js/modern/ssr/serverRender/renderToString/index.js +0 -2
- package/dist/js/modern/ssr/serverRender/renderToString/loadable.js +0 -10
- package/dist/js/modern/ssr/serverRender/renderToString/reduce.js +0 -2
- package/dist/js/modern/ssr/serverRender/renderToString/template.js +0 -15
- package/dist/js/modern/ssr/serverRender/renderToString/type.js +0 -1
- package/dist/js/modern/ssr/serverRender/utils.js +2 -6
- package/dist/js/modern/ssr/utils.js +0 -11
- package/dist/js/modern/state/cli/index.js +0 -10
- package/dist/js/modern/state/runtime/plugin.js +1 -14
- package/dist/js/node/cli/index.js +3 -13
- package/dist/js/node/common.js +0 -2
- package/dist/js/node/core/app-config.js +2 -5
- package/dist/js/node/core/compatible.js +63 -64
- package/dist/js/node/core/index.js +0 -16
- package/dist/js/node/core/loader/index.js +0 -2
- package/dist/js/node/core/loader/loaderManager.js +12 -37
- package/dist/js/node/core/loader/useLoader.js +8 -31
- package/dist/js/node/core/plugin.js +5 -34
- package/dist/js/node/document/Body.js +26 -0
- package/dist/js/node/document/DocumentContext.js +14 -0
- package/dist/js/node/document/DocumentStructrueContext.js +15 -0
- package/dist/js/node/document/Head.js +33 -0
- package/dist/js/node/document/Html.js +98 -0
- package/dist/js/node/document/Root.js +41 -0
- package/dist/js/node/document/Scripts.js +17 -0
- package/dist/js/node/document/cli/index.js +140 -0
- package/dist/js/node/document/constants.js +36 -0
- package/dist/js/node/document/index.js +93 -0
- package/dist/js/node/exports/head.js +0 -5
- package/dist/js/node/exports/loadable.js +0 -5
- package/dist/js/node/exports/server.js +0 -2
- package/dist/js/node/exports/styled.js +0 -5
- package/dist/js/node/index.js +0 -8
- package/dist/js/node/router/cli/index.js +0 -20
- package/dist/js/node/router/index.js +0 -4
- package/dist/js/node/router/runtime/DefaultNotFound.js +1 -5
- package/dist/js/node/router/runtime/index.js +0 -5
- package/dist/js/node/router/runtime/plugin.js +0 -17
- package/dist/js/node/router/runtime/plugin.node.js +16 -38
- package/dist/js/node/router/runtime/root/index.js +26 -0
- package/dist/js/node/router/runtime/root/load.js +69 -0
- package/dist/js/node/router/runtime/utils.js +16 -44
- package/dist/js/node/router/runtime/withRouter.js +0 -9
- package/dist/js/node/runtime-context.js +0 -2
- package/dist/js/node/ssr/cli/index.js +2 -26
- package/dist/js/node/ssr/index.js +23 -45
- package/dist/js/node/ssr/index.node.js +0 -23
- package/dist/js/node/ssr/prefetch.js +0 -11
- package/dist/js/node/ssr/react/index.js +0 -2
- package/dist/js/node/ssr/react/nossr/index.js +0 -6
- package/dist/js/node/ssr/react/prerender/index.js +2 -30
- package/dist/js/node/ssr/react/prerender/util.js +2 -25
- package/dist/js/node/ssr/react/withCallback/index.js +1 -4
- package/dist/js/node/ssr/serverRender/helmet.js +13 -20
- package/dist/js/node/ssr/serverRender/index.js +1 -4
- package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.after.js +5 -9
- package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.share.js +0 -1
- package/dist/js/node/ssr/serverRender/renderToStream/bulidTemplate.before.js +43 -15
- package/dist/js/node/ssr/serverRender/renderToStream/index.js +6 -48
- package/dist/js/node/ssr/serverRender/renderToStream/loadable.js +0 -4
- package/dist/js/node/ssr/serverRender/renderToStream/renderToPipe.js +26 -17
- package/dist/js/node/ssr/serverRender/renderToStream/styledComponent.js +0 -2
- package/dist/js/node/ssr/serverRender/renderToStream/template.js +16 -23
- package/dist/js/node/ssr/serverRender/renderToString/entry.js +2 -51
- package/dist/js/node/ssr/serverRender/renderToString/index.js +0 -10
- package/dist/js/node/ssr/serverRender/renderToString/loadable.js +0 -14
- package/dist/js/node/ssr/serverRender/renderToString/reduce.js +0 -3
- package/dist/js/node/ssr/serverRender/renderToString/styledComponent.js +0 -3
- package/dist/js/node/ssr/serverRender/renderToString/template.js +0 -18
- package/dist/js/node/ssr/serverRender/renderToString/type.js +0 -1
- package/dist/js/node/ssr/serverRender/types.js +0 -1
- package/dist/js/node/ssr/serverRender/utils.js +2 -8
- package/dist/js/node/ssr/utils.js +0 -20
- package/dist/js/node/state/cli/index.js +0 -15
- package/dist/js/node/state/index.js +0 -4
- package/dist/js/node/state/plugins.js +0 -11
- package/dist/js/node/state/runtime/index.js +0 -7
- package/dist/js/node/state/runtime/plugin.js +1 -25
- package/dist/js/treeshaking/cli/index.js +3 -3
- package/dist/js/treeshaking/core/app-config.js +2 -1
- package/dist/js/treeshaking/core/compatible.js +66 -63
- package/dist/js/treeshaking/core/index.js +3 -2
- package/dist/js/treeshaking/core/loader/loaderManager.js +19 -51
- package/dist/js/treeshaking/core/loader/useLoader.js +11 -28
- package/dist/js/treeshaking/core/plugin.js +6 -51
- package/dist/js/treeshaking/document/Body.js +14 -0
- package/dist/js/treeshaking/document/DocumentContext.js +6 -0
- package/dist/js/treeshaking/document/DocumentStructrueContext.js +7 -0
- package/dist/js/treeshaking/document/Head.js +21 -0
- package/dist/js/treeshaking/document/Html.js +104 -0
- package/dist/js/treeshaking/document/Root.js +24 -0
- package/dist/js/treeshaking/document/Scripts.js +10 -0
- package/dist/js/treeshaking/document/cli/index.js +170 -0
- package/dist/js/treeshaking/document/constants.js +16 -0
- package/dist/js/treeshaking/document/index.js +8 -0
- package/dist/js/treeshaking/index.js +1 -1
- package/dist/js/treeshaking/router/cli/index.js +6 -18
- package/dist/js/treeshaking/router/runtime/plugin.js +5 -13
- package/dist/js/treeshaking/router/runtime/plugin.node.js +23 -36
- package/dist/js/treeshaking/router/runtime/root/index.js +17 -0
- package/dist/js/treeshaking/router/runtime/root/load.js +102 -0
- package/dist/js/treeshaking/router/runtime/utils.js +21 -39
- package/dist/js/treeshaking/router/runtime/withRouter.js +1 -0
- package/dist/js/treeshaking/ssr/cli/index.js +9 -31
- package/dist/js/treeshaking/ssr/index.js +26 -40
- package/dist/js/treeshaking/ssr/index.node.js +12 -29
- package/dist/js/treeshaking/ssr/prefetch.js +0 -13
- package/dist/js/treeshaking/ssr/react/nossr/index.js +3 -4
- package/dist/js/treeshaking/ssr/react/prerender/index.js +2 -21
- package/dist/js/treeshaking/ssr/react/prerender/util.js +3 -20
- package/dist/js/treeshaking/ssr/react/withCallback/index.js +1 -2
- package/dist/js/treeshaking/ssr/serverRender/helmet.js +12 -11
- package/dist/js/treeshaking/ssr/serverRender/index.js +1 -9
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/buildTemplate.after.js +5 -6
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/bulidTemplate.before.js +46 -15
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/index.js +9 -79
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/loadable.js +3 -5
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/renderToPipe.js +46 -35
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/template.js +17 -24
- package/dist/js/treeshaking/ssr/serverRender/renderToString/entry.js +20 -73
- package/dist/js/treeshaking/ssr/serverRender/renderToString/index.js +2 -6
- package/dist/js/treeshaking/ssr/serverRender/renderToString/loadable.js +5 -16
- package/dist/js/treeshaking/ssr/serverRender/renderToString/reduce.js +0 -2
- package/dist/js/treeshaking/ssr/serverRender/renderToString/template.js +2 -18
- package/dist/js/treeshaking/ssr/serverRender/renderToString/type.js +0 -1
- package/dist/js/treeshaking/ssr/serverRender/utils.js +5 -10
- package/dist/js/treeshaking/ssr/utils.js +8 -17
- package/dist/js/treeshaking/state/cli/index.js +3 -10
- package/dist/js/treeshaking/state/runtime/plugin.js +2 -10
- package/dist/types/cli/index.d.ts +0 -2
- package/dist/types/core/compatible.d.ts +5 -5
- package/dist/types/core/index.d.ts +1 -1
- package/dist/types/core/loader/loaderManager.d.ts +0 -1
- package/dist/types/core/loader/useLoader.d.ts +0 -5
- package/dist/types/core/plugin.d.ts +1 -13
- package/dist/types/document/Body.d.ts +4 -0
- package/dist/types/document/DocumentContext.d.ts +13 -0
- package/dist/types/document/DocumentStructrueContext.d.ts +10 -0
- package/dist/types/document/Head.d.ts +5 -0
- package/dist/types/document/Html.d.ts +4 -0
- package/dist/types/document/Root.d.ts +8 -0
- package/dist/types/document/Scripts.d.ts +2 -0
- package/dist/types/document/cli/index.d.ts +3 -0
- package/dist/types/document/constants.d.ts +14 -0
- package/dist/types/document/index.d.ts +8 -0
- package/dist/types/exports/server.d.ts +3 -3
- package/dist/types/index.d.ts +1 -1
- package/dist/types/router/cli/index.d.ts +0 -2
- package/dist/types/router/runtime/root/index.d.ts +8 -0
- package/dist/types/router/runtime/root/load.d.ts +22 -0
- package/dist/types/router/runtime/types.d.ts +0 -2
- package/dist/types/runtime-context.d.ts +1 -0
- package/dist/types/ssr/cli/index.d.ts +0 -2
- package/dist/types/ssr/prefetch.d.ts +2 -2
- package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +3 -2
- package/dist/types/ssr/serverRender/renderToStream/bulidTemplate.before.d.ts +2 -1
- package/dist/types/ssr/serverRender/renderToStream/renderToPipe.d.ts +3 -3
- package/dist/types/ssr/serverRender/renderToStream/template.d.ts +2 -2
- package/dist/types/ssr/serverRender/types.d.ts +1 -4
- package/dist/types/state/cli/index.d.ts +0 -2
- package/dist/types/state/types.d.ts +0 -1
- package/package.json +19 -11
|
@@ -2,18 +2,15 @@ import { renderToStaticMarkup } from 'react-dom/server';
|
|
|
2
2
|
import { run } from '@modern-js/utils/ssr';
|
|
3
3
|
import { ChunkExtractor } from '@loadable/server';
|
|
4
4
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
|
-
|
|
6
5
|
// todo: SSRContext
|
|
7
6
|
const prefetch = async (App, context) => run(context.ssrContext.request.headers, async () => {
|
|
8
7
|
var _context$store;
|
|
9
|
-
|
|
10
8
|
const {
|
|
11
9
|
ssrContext
|
|
12
10
|
} = context;
|
|
13
11
|
const {
|
|
14
12
|
loadableStats
|
|
15
13
|
} = ssrContext;
|
|
16
|
-
|
|
17
14
|
if (loadableStats) {
|
|
18
15
|
const extractor = new ChunkExtractor({
|
|
19
16
|
stats: loadableStats,
|
|
@@ -27,18 +24,15 @@ const prefetch = async (App, context) => run(context.ssrContext.request.headers,
|
|
|
27
24
|
context: context
|
|
28
25
|
}));
|
|
29
26
|
}
|
|
30
|
-
|
|
31
27
|
if (!context.loaderManager.hasPendingLoaders()) {
|
|
32
28
|
return {
|
|
33
29
|
initialData: context.initialData,
|
|
34
30
|
i18nData: context.__i18nData__
|
|
35
31
|
};
|
|
36
32
|
}
|
|
37
|
-
|
|
38
33
|
const loadersData = await context.loaderManager.awaitPendingLoaders();
|
|
39
34
|
Object.keys(loadersData).forEach(id => {
|
|
40
35
|
const data = loadersData[id];
|
|
41
|
-
|
|
42
36
|
if (data._error) {
|
|
43
37
|
ssrContext.logger.error('App Prefetch Loader', data._error);
|
|
44
38
|
ssrContext.metrics.emitCounter('app.prefetch.loader.error', 1);
|
|
@@ -53,5 +47,4 @@ const prefetch = async (App, context) => run(context.ssrContext.request.headers,
|
|
|
53
47
|
storeState: context === null || context === void 0 ? void 0 : (_context$store = context.store) === null || _context$store === void 0 ? void 0 : _context$store.getState()
|
|
54
48
|
};
|
|
55
49
|
});
|
|
56
|
-
|
|
57
50
|
export default prefetch;
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
|
-
|
|
3
2
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
4
|
-
|
|
5
3
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
6
|
-
|
|
7
4
|
import withSideEffect from 'react-side-effect';
|
|
8
5
|
import React, { createElement } from 'react';
|
|
9
6
|
import { getOutermostProperty, aggKeysFromPropsList, exist, aggMatchesFromPropsList } from "./util";
|
|
@@ -16,10 +13,9 @@ const PROP_NAMES = {
|
|
|
16
13
|
FALLBACK: 'fallback',
|
|
17
14
|
MATCHES: 'matches'
|
|
18
15
|
};
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
const handleClientStateChange = () => {
|
|
17
|
+
// not used
|
|
21
18
|
};
|
|
22
|
-
|
|
23
19
|
const mapStateOnServer = reduceProps => {
|
|
24
20
|
const defaultProps = {
|
|
25
21
|
interval: 10,
|
|
@@ -34,17 +30,14 @@ const mapStateOnServer = reduceProps => {
|
|
|
34
30
|
const propKey = key;
|
|
35
31
|
const reduceProp = reduceProps[propKey];
|
|
36
32
|
let nextProps = props;
|
|
37
|
-
|
|
38
33
|
if (exist(reduceProp)) {
|
|
39
34
|
nextProps = _objectSpread(_objectSpread({}, props), {}, {
|
|
40
35
|
[propKey]: reduceProp
|
|
41
36
|
});
|
|
42
37
|
}
|
|
43
|
-
|
|
44
38
|
return nextProps;
|
|
45
39
|
}, defaultProps);
|
|
46
40
|
};
|
|
47
|
-
|
|
48
41
|
const reducePropsToState = propsList => {
|
|
49
42
|
const reduceProps = {
|
|
50
43
|
interval: getOutermostProperty(propsList, PROP_NAMES.INTERVAL),
|
|
@@ -57,48 +50,34 @@ const reducePropsToState = propsList => {
|
|
|
57
50
|
};
|
|
58
51
|
return reduceProps;
|
|
59
52
|
};
|
|
60
|
-
|
|
61
53
|
function factory(Component) {
|
|
62
54
|
class Spr extends React.Component {
|
|
63
55
|
static set canUseDOM(canUseDOM) {
|
|
64
56
|
Component.canUseDOM = canUseDOM;
|
|
65
57
|
}
|
|
66
|
-
|
|
67
58
|
static get canUseDOM() {
|
|
68
59
|
return Component.canUseDOM;
|
|
69
60
|
}
|
|
70
|
-
|
|
71
61
|
verify() {
|
|
72
62
|
return true;
|
|
73
63
|
}
|
|
74
|
-
|
|
75
64
|
render() {
|
|
76
65
|
const newProps = _objectSpread({}, this.props);
|
|
77
|
-
|
|
78
66
|
const validate = this.verify();
|
|
79
|
-
|
|
80
67
|
if (!validate) {
|
|
81
68
|
throw new Error('invalid props, check usage');
|
|
82
69
|
}
|
|
83
|
-
|
|
84
70
|
return /*#__PURE__*/createElement(Component, _objectSpread({}, newProps));
|
|
85
71
|
}
|
|
86
|
-
|
|
87
72
|
}
|
|
88
|
-
|
|
89
73
|
_defineProperty(Spr, "peek", Component.peek);
|
|
90
|
-
|
|
91
74
|
_defineProperty(Spr, "rewind", Component.rewind);
|
|
92
|
-
|
|
93
75
|
_defineProperty(Spr, "config", () => {
|
|
94
76
|
const mappedState = Component.rewind();
|
|
95
77
|
return mappedState;
|
|
96
78
|
});
|
|
97
|
-
|
|
98
79
|
return Spr;
|
|
99
80
|
}
|
|
100
|
-
|
|
101
81
|
const NullComponent = () => null;
|
|
102
|
-
|
|
103
82
|
const SprSideEffects = withSideEffect(reducePropsToState, handleClientStateChange, mapStateOnServer)(NullComponent);
|
|
104
83
|
export const PreRender = factory(SprSideEffects);
|
|
@@ -2,12 +2,10 @@ const REQUEST_META = ['header', 'query'];
|
|
|
2
2
|
export const getInnermostProperty = function getInnermostProperty(propsList, propName) {
|
|
3
3
|
for (let i = propsList.length - 1; i >= 0; i--) {
|
|
4
4
|
const props = propsList[i];
|
|
5
|
-
|
|
6
5
|
if (props.hasOwnProperty(propName)) {
|
|
7
6
|
return props[propName];
|
|
8
7
|
}
|
|
9
8
|
}
|
|
10
|
-
|
|
11
9
|
return null;
|
|
12
10
|
};
|
|
13
11
|
export const getOutermostProperty = function getOutermostProperty(propsList, propName) {
|
|
@@ -16,7 +14,6 @@ export const getOutermostProperty = function getOutermostProperty(propsList, pro
|
|
|
16
14
|
return props[propName];
|
|
17
15
|
}
|
|
18
16
|
}
|
|
19
|
-
|
|
20
17
|
return null;
|
|
21
18
|
};
|
|
22
19
|
export const aggKeysFromPropsList = function aggKeysFromPropsList(propsList, propName) {
|
|
@@ -28,7 +25,6 @@ export const aggKeysFromPropsList = function aggKeysFromPropsList(propsList, pro
|
|
|
28
25
|
const res = propsList.filter(props => usefulObject(props[propName])).reduce((result, next) => {
|
|
29
26
|
REQUEST_META.forEach(key => {
|
|
30
27
|
const prop = next[propName];
|
|
31
|
-
|
|
32
28
|
if (prop !== null && prop !== void 0 && prop.hasOwnProperty(key) && usefulArray(prop[key])) {
|
|
33
29
|
result[key] = unique(result[key].concat(prop[key]));
|
|
34
30
|
}
|
|
@@ -37,13 +33,10 @@ export const aggKeysFromPropsList = function aggKeysFromPropsList(propsList, pro
|
|
|
37
33
|
}, initResult);
|
|
38
34
|
return REQUEST_META.reduce((result, next) => {
|
|
39
35
|
var _result$key;
|
|
40
|
-
|
|
41
36
|
const key = next;
|
|
42
|
-
|
|
43
37
|
if (result[key] && ((_result$key = result[key]) === null || _result$key === void 0 ? void 0 : _result$key.length) === 0) {
|
|
44
38
|
delete result[key];
|
|
45
39
|
}
|
|
46
|
-
|
|
47
40
|
return result;
|
|
48
41
|
}, res);
|
|
49
42
|
};
|
|
@@ -55,8 +48,8 @@ export const aggMatchesFromPropsList = function aggMatchesFromPropsList(propsLis
|
|
|
55
48
|
}, {});
|
|
56
49
|
const res = propsList.filter(props => usefulObject(props[propName])).reduce((result, next) => {
|
|
57
50
|
REQUEST_META.forEach(key => {
|
|
58
|
-
const prop = next[propName];
|
|
59
|
-
|
|
51
|
+
const prop = next[propName];
|
|
52
|
+
// 这边目前是浅拷贝,越后渲染优先级越高
|
|
60
53
|
if (prop !== null && prop !== void 0 && prop.hasOwnProperty(key) && usefulObject(prop[key])) {
|
|
61
54
|
result[key] = Object.assign(result[key], prop[key]);
|
|
62
55
|
}
|
|
@@ -65,35 +58,27 @@ export const aggMatchesFromPropsList = function aggMatchesFromPropsList(propsLis
|
|
|
65
58
|
}, initResult);
|
|
66
59
|
return REQUEST_META.reduce((result, next) => {
|
|
67
60
|
const key = next;
|
|
68
|
-
|
|
69
61
|
if (result[key] && Object.keys(result[key]).length === 0) {
|
|
70
62
|
delete result[key];
|
|
71
63
|
}
|
|
72
|
-
|
|
73
64
|
return result;
|
|
74
65
|
}, res);
|
|
75
66
|
};
|
|
76
|
-
|
|
77
67
|
function unique(arr) {
|
|
78
68
|
return Array.from(new Set(arr));
|
|
79
69
|
}
|
|
80
|
-
|
|
81
70
|
function usefulObject(target) {
|
|
82
71
|
if (!exist(target)) {
|
|
83
72
|
return false;
|
|
84
73
|
}
|
|
85
|
-
|
|
86
74
|
return target.constructor === Object && Object.keys(target).length > 0;
|
|
87
75
|
}
|
|
88
|
-
|
|
89
76
|
function usefulArray(target) {
|
|
90
77
|
if (!exist(target)) {
|
|
91
78
|
return false;
|
|
92
79
|
}
|
|
93
|
-
|
|
94
80
|
return Array.isArray(target) && target.length > 0;
|
|
95
81
|
}
|
|
96
|
-
|
|
97
82
|
export function exist(target) {
|
|
98
83
|
return target != null;
|
|
99
84
|
}
|
|
@@ -1,46 +1,38 @@
|
|
|
1
1
|
// 用于 react-helmet 正则替换
|
|
2
|
+
import { EOL } from 'os';
|
|
2
3
|
const RE_HTML_ATTR = /<html[^>]*>/;
|
|
3
4
|
const RE_BODY_ATTR = /<body[^>]*>/;
|
|
4
5
|
const RE_LAST_IN_HEAD = /<\/head>/;
|
|
5
6
|
const RE_TITLE = /<title[^>]*>([\s\S\n\r]*?)<\/title>/;
|
|
6
|
-
const TEST_TITLE_CONTENT = /(?<=<title[^>]*>)([\s\S\n\r]*?)([.|\S])([\s\S\n\r]*?)(?=<\/title>)/;
|
|
7
|
+
const 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
|
let result = content;
|
|
10
12
|
const bodyAttributes = helmetData.bodyAttributes.toString();
|
|
11
|
-
|
|
12
13
|
if (bodyAttributes) {
|
|
13
14
|
result = result.replace(RE_BODY_ATTR, `<body ${bodyAttributes}>`);
|
|
14
15
|
}
|
|
15
|
-
|
|
16
16
|
const htmlAttributes = helmetData.htmlAttributes.toString();
|
|
17
|
-
|
|
18
17
|
if (htmlAttributes) {
|
|
19
18
|
result = result.replace(RE_HTML_ATTR, `<html ${htmlAttributes}>`);
|
|
20
19
|
}
|
|
21
|
-
|
|
22
20
|
const base = helmetData.base.toString();
|
|
23
21
|
const link = helmetData.link.toString();
|
|
24
22
|
const meta = helmetData.meta.toString();
|
|
25
23
|
const noscript = helmetData.noscript.toString();
|
|
26
24
|
const script = helmetData.script.toString();
|
|
27
25
|
const style = helmetData.style.toString();
|
|
28
|
-
const title = helmetData.title.toString();
|
|
29
|
-
|
|
30
|
-
const existTitle = RE_TITLE.test(content);
|
|
26
|
+
const title = helmetData.title.toString();
|
|
31
27
|
|
|
32
|
-
|
|
28
|
+
// 如果模板中存在 title,且 helmetData title 有内容则做替换
|
|
29
|
+
const existTitleTag = RE_TITLE.test(content);
|
|
30
|
+
const shouldReplaceTitle = existTitleTag && TEST_TITLE_CONTENT.test(title.trim());
|
|
31
|
+
if (shouldReplaceTitle) {
|
|
33
32
|
result = result.replace(RE_TITLE, title);
|
|
34
33
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
${meta}
|
|
40
|
-
${noscript}
|
|
41
|
-
${script}
|
|
42
|
-
${style}
|
|
43
|
-
${existTitle ? '' : title}
|
|
44
|
-
</head>
|
|
45
|
-
`);
|
|
34
|
+
const helmetStr = [base, link, meta, noscript, script, style, !existTitleTag ? title : ''].reduce((pre, cur) => {
|
|
35
|
+
return pre + (cur.length > 0 ? ` ${cur}${EOL}` : '');
|
|
36
|
+
}, '');
|
|
37
|
+
return result.replace(RE_LAST_IN_HEAD, `${helmetStr}</head>`);
|
|
46
38
|
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/* eslint-disable eslint-comments/disable-enable-pair */
|
|
2
|
-
|
|
3
2
|
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
4
|
-
|
|
5
3
|
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
4
|
+
|
|
6
5
|
import { isReact18 } from "../utils";
|
|
7
6
|
export default async function serverRender(options) {
|
|
8
7
|
if (isReact18() && options.config.mode === 'stream') {
|
|
@@ -3,15 +3,14 @@ import { buildTemplate } from "./buildTemplate.share";
|
|
|
3
3
|
export function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
4
4
|
const callbacks = [injectSSRDataScript];
|
|
5
5
|
return buildTemplate(afterAppTemplate, callbacks);
|
|
6
|
-
|
|
7
6
|
function injectSSRDataScript(template) {
|
|
8
7
|
const ssrDataScript = buildSSRDataScript();
|
|
9
8
|
return template.replace('<!--<?- SSRDataScript ?>-->', ssrDataScript);
|
|
10
|
-
|
|
11
9
|
function buildSSRDataScript() {
|
|
12
10
|
const {
|
|
13
|
-
ssrContext
|
|
14
|
-
|
|
11
|
+
ssrContext,
|
|
12
|
+
renderLevel
|
|
13
|
+
} = options;
|
|
15
14
|
const {
|
|
16
15
|
request
|
|
17
16
|
} = ssrContext;
|
|
@@ -26,7 +25,8 @@ export function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
|
26
25
|
headers: request.headers,
|
|
27
26
|
cookieMap: request.cookieMap
|
|
28
27
|
}
|
|
29
|
-
}
|
|
28
|
+
},
|
|
29
|
+
renderLevel
|
|
30
30
|
};
|
|
31
31
|
return `
|
|
32
32
|
<script>window._SSR_DATA = ${serialize(SSRData, {
|
|
@@ -1,24 +1,58 @@
|
|
|
1
1
|
import ReactHelmet from 'react-helmet';
|
|
2
|
+
import { matchRoutes } from 'react-router-dom';
|
|
2
3
|
import helmetReplace from "../helmet";
|
|
3
|
-
import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
|
|
4
|
+
import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
|
|
5
|
+
const CSS_CHUNKS_PLACEHOLDER = '<!--<?- chunksMap.css ?>-->';
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
// build head template
|
|
8
|
+
function getHeadTemplate(beforeEntryTemplate, context) {
|
|
6
9
|
const callbacks = [headTemplate => {
|
|
7
10
|
const helmetData = ReactHelmet.renderStatic();
|
|
8
11
|
return helmetData ? helmetReplace(headTemplate, helmetData) : headTemplate;
|
|
9
|
-
}
|
|
12
|
+
},
|
|
13
|
+
// @TODO: prefetch scripts of lazy component
|
|
14
|
+
injectCss];
|
|
10
15
|
const [headTemplate = ''] = beforeEntryTemplate.match(HEAD_REG_EXP) || [];
|
|
11
|
-
|
|
12
16
|
if (!headTemplate.length) {
|
|
13
17
|
return '';
|
|
14
18
|
}
|
|
19
|
+
return buildTemplate(headTemplate, callbacks);
|
|
20
|
+
function injectCss(headTemplate) {
|
|
21
|
+
return headTemplate.replace(CSS_CHUNKS_PLACEHOLDER, getCssChunks());
|
|
22
|
+
function getCssChunks() {
|
|
23
|
+
const {
|
|
24
|
+
routeManifest,
|
|
25
|
+
routerContext,
|
|
26
|
+
routes
|
|
27
|
+
} = context;
|
|
28
|
+
if (!routeManifest || !routerContext || !routes) {
|
|
29
|
+
return '';
|
|
30
|
+
}
|
|
31
|
+
const {
|
|
32
|
+
routeAssets
|
|
33
|
+
} = routeManifest;
|
|
34
|
+
const cssChunks = [];
|
|
35
|
+
const matches = matchRoutes(routes, routerContext.location);
|
|
36
|
+
matches === null || matches === void 0 ? void 0 : matches.forEach(match => {
|
|
37
|
+
const routeId = match.route.id;
|
|
38
|
+
if (routeId) {
|
|
39
|
+
const {
|
|
40
|
+
assets = []
|
|
41
|
+
} = routeAssets[routeId];
|
|
42
|
+
const _cssChunks = assets.filter(asset => asset === null || asset === void 0 ? void 0 : asset.endsWith('.css'));
|
|
43
|
+
cssChunks.push(..._cssChunks);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
const styleLinks = cssChunks.map(chunk => {
|
|
47
|
+
return `<link href="${chunk}" rel="stylesheet" />`;
|
|
48
|
+
});
|
|
49
|
+
return `${styleLinks.join('')}`;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
15
53
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export function buildShellBeforeTemplate(beforeAppTemplate) {
|
|
22
|
-
const headTemplate = getHeadTemplate(beforeAppTemplate);
|
|
54
|
+
// build script
|
|
55
|
+
export function buildShellBeforeTemplate(beforeAppTemplate, context) {
|
|
56
|
+
const headTemplate = getHeadTemplate(beforeAppTemplate, context);
|
|
23
57
|
return beforeAppTemplate.replace(HEAD_REG_EXP, headTemplate);
|
|
24
58
|
}
|
|
@@ -2,7 +2,6 @@ import { createElement } from 'react';
|
|
|
2
2
|
import { run } from '@modern-js/utils/ssr';
|
|
3
3
|
import { PreRender } from "../../react/prerender";
|
|
4
4
|
import { time } from "../utils";
|
|
5
|
-
import { createTemplates } from "./template";
|
|
6
5
|
import renderToPipe from "./renderToPipe";
|
|
7
6
|
export const render = ({
|
|
8
7
|
App,
|
|
@@ -11,63 +10,31 @@ export const render = ({
|
|
|
11
10
|
const {
|
|
12
11
|
ssrContext
|
|
13
12
|
} = context;
|
|
14
|
-
|
|
15
13
|
if (!ssrContext) {
|
|
16
14
|
throw new Error('The "ssrContext" must not be undefined, but received undefined');
|
|
17
15
|
}
|
|
18
|
-
|
|
19
16
|
return run(ssrContext.request.headers, async () => {
|
|
20
|
-
const
|
|
17
|
+
const end = time();
|
|
21
18
|
const rootElement = /*#__PURE__*/createElement(App, {
|
|
22
19
|
context: Object.assign(context || {}, {
|
|
23
20
|
ssr: true
|
|
24
21
|
})
|
|
25
22
|
});
|
|
26
|
-
const
|
|
27
|
-
const end = time();
|
|
28
|
-
const pipe = renderToPipe(rootElement, getTemplates, {
|
|
23
|
+
const pipe = renderToPipe(rootElement, context, {
|
|
29
24
|
onShellReady() {
|
|
30
25
|
// set cacheConfig
|
|
31
26
|
const cacheConfig = PreRender.config();
|
|
32
|
-
|
|
33
27
|
if (cacheConfig) {
|
|
34
|
-
|
|
28
|
+
ssrContext.cacheConfig = cacheConfig;
|
|
35
29
|
}
|
|
36
30
|
},
|
|
37
|
-
|
|
38
31
|
onAllReady() {
|
|
39
|
-
//
|
|
32
|
+
// calculate streaming ssr cost
|
|
40
33
|
const cost = end();
|
|
41
34
|
ssrContext.logger.debug('App Render To HTML cost = %d ms', cost);
|
|
42
|
-
ssrContext.metrics.emitTimer('app.render.html.cost', cost);
|
|
43
|
-
|
|
44
|
-
const cost_all = end_all();
|
|
45
|
-
ssrContext.logger.info('App Render Total cost = %d ms', cost_all);
|
|
46
|
-
ssrContext.metrics.emitTimer('app.render.cost', cost_all);
|
|
35
|
+
ssrContext.metrics.emitTimer('app.render.html.cost', cost);
|
|
47
36
|
}
|
|
48
|
-
|
|
49
37
|
});
|
|
50
38
|
return pipe;
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
async function prefetch(App, context) {
|
|
54
|
-
const {
|
|
55
|
-
prefetch
|
|
56
|
-
} = App;
|
|
57
|
-
const ssrContext = context.ssrContext;
|
|
58
|
-
let prefetchData;
|
|
59
|
-
const end = time();
|
|
60
|
-
|
|
61
|
-
try {
|
|
62
|
-
prefetchData = prefetch ? await prefetch(context) : null;
|
|
63
|
-
const prefetchCost = end();
|
|
64
|
-
ssrContext.logger.debug(`App Prefetch cost = %d ms`, prefetchCost);
|
|
65
|
-
ssrContext.metrics.emitTimer('app.prefetch.cost', prefetchCost);
|
|
66
|
-
} catch (e) {
|
|
67
|
-
ssrContext.logger.error('App Prefetch Render', e);
|
|
68
|
-
ssrContext.metrics.emitCounter('app.prefetch.render.error', 1);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return prefetchData || {};
|
|
72
|
-
}
|
|
39
|
+
});
|
|
73
40
|
};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
|
-
|
|
3
2
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
4
|
-
|
|
5
3
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
6
|
-
|
|
7
4
|
import { Transform } from 'stream';
|
|
8
5
|
import { renderToPipeableStream } from 'react-dom/server';
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
import { RenderLevel } from "../types";
|
|
7
|
+
import { getTemplates } from "./template";
|
|
8
|
+
function renderToPipe(rootElement, context, options) {
|
|
11
9
|
let isShellStream = true;
|
|
12
|
-
|
|
10
|
+
const {
|
|
11
|
+
ssrContext
|
|
12
|
+
} = context;
|
|
13
13
|
const forUserPipe = stream => {
|
|
14
14
|
return new Promise(resolve => {
|
|
15
15
|
const {
|
|
@@ -17,12 +17,11 @@ function renderToPipe(rootElement, getTemplates, options) {
|
|
|
17
17
|
} = renderToPipeableStream(rootElement, _objectSpread(_objectSpread({}, options), {}, {
|
|
18
18
|
onShellReady() {
|
|
19
19
|
var _options$onShellReady;
|
|
20
|
-
|
|
21
|
-
options === null || options === void 0 ? void 0 : (_options$onShellReady = options.onShellReady) === null || _options$onShellReady === void 0 ? void 0 : _options$onShellReady.call(options);
|
|
22
20
|
const {
|
|
23
21
|
shellAfter,
|
|
24
22
|
shellBefore
|
|
25
|
-
} = getTemplates();
|
|
23
|
+
} = getTemplates(context, RenderLevel.SERVER_RENDER);
|
|
24
|
+
options === null || options === void 0 ? void 0 : (_options$onShellReady = options.onShellReady) === null || _options$onShellReady === void 0 ? void 0 : _options$onShellReady.call(options);
|
|
26
25
|
const injectableTransform = new Transform({
|
|
27
26
|
transform(chunk, _encoding, callback) {
|
|
28
27
|
try {
|
|
@@ -32,7 +31,6 @@ function renderToPipe(rootElement, getTemplates, options) {
|
|
|
32
31
|
} else {
|
|
33
32
|
this.push(chunk);
|
|
34
33
|
}
|
|
35
|
-
|
|
36
34
|
callback();
|
|
37
35
|
} catch (e) {
|
|
38
36
|
if (e instanceof Error) {
|
|
@@ -42,20 +40,33 @@ function renderToPipe(rootElement, getTemplates, options) {
|
|
|
42
40
|
}
|
|
43
41
|
}
|
|
44
42
|
}
|
|
45
|
-
|
|
46
43
|
});
|
|
47
44
|
resolve(pipe(injectableTransform).pipe(stream));
|
|
45
|
+
},
|
|
46
|
+
onShellError(error) {
|
|
47
|
+
var _options$onShellError;
|
|
48
|
+
// Don't log error in `onShellError` callback, since it has been logged in `onError` callback
|
|
49
|
+
ssrContext.metrics.emitCounter('app.render.streaming.shell.error', 1);
|
|
50
|
+
const {
|
|
51
|
+
shellAfter,
|
|
52
|
+
shellBefore
|
|
53
|
+
} = getTemplates(context, RenderLevel.CLIENT_RENDER);
|
|
54
|
+
const fallbackHtml = `${shellBefore}${shellAfter}`;
|
|
55
|
+
resolve(fallbackHtml);
|
|
56
|
+
options === null || options === void 0 ? void 0 : (_options$onShellError = options.onShellError) === null || _options$onShellError === void 0 ? void 0 : _options$onShellError.call(options, error);
|
|
57
|
+
},
|
|
58
|
+
onError(error) {
|
|
59
|
+
var _options$onError;
|
|
60
|
+
ssrContext.logger.error('An error occurs during streaming SSR', error);
|
|
61
|
+
ssrContext.metrics.emitCounter('app.render.streaming.error', 1);
|
|
62
|
+
options === null || options === void 0 ? void 0 : (_options$onError = options.onError) === null || _options$onError === void 0 ? void 0 : _options$onError.call(options, error);
|
|
48
63
|
}
|
|
49
|
-
|
|
50
64
|
}));
|
|
51
65
|
});
|
|
52
66
|
};
|
|
53
|
-
|
|
54
67
|
return forUserPipe;
|
|
55
|
-
|
|
56
68
|
function joinChunk(before = '', chunk, after = '') {
|
|
57
69
|
return `${before}${chunk.toString()}${after}`;
|
|
58
70
|
}
|
|
59
71
|
}
|
|
60
|
-
|
|
61
72
|
export default renderToPipe;
|
|
@@ -1,22 +1,18 @@
|
|
|
1
1
|
import { buildShellAfterTemplate } from "./buildTemplate.after";
|
|
2
2
|
import { buildShellBeforeTemplate } from "./bulidTemplate.before";
|
|
3
3
|
const HTML_SEPARATOR = '<!--<?- html ?>-->';
|
|
4
|
-
export
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
shellAfter: builtAfterTemplate
|
|
18
|
-
};
|
|
4
|
+
export const getTemplates = (context, renderLevel) => {
|
|
5
|
+
const {
|
|
6
|
+
ssrContext
|
|
7
|
+
} = context;
|
|
8
|
+
const [beforeAppTemplate = '', afterAppHtmlTemplate = ''] = ssrContext.template.split(HTML_SEPARATOR) || [];
|
|
9
|
+
const builtBeforeTemplate = buildShellBeforeTemplate(beforeAppTemplate, context);
|
|
10
|
+
const builtAfterTemplate = buildShellAfterTemplate(afterAppHtmlTemplate, {
|
|
11
|
+
ssrContext: ssrContext,
|
|
12
|
+
renderLevel
|
|
13
|
+
});
|
|
14
|
+
return {
|
|
15
|
+
shellBefore: builtBeforeTemplate,
|
|
16
|
+
shellAfter: builtAfterTemplate
|
|
19
17
|
};
|
|
20
|
-
|
|
21
|
-
return getTemplates;
|
|
22
|
-
}
|
|
18
|
+
};
|