@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
|
@@ -16,10 +16,9 @@ var PROP_NAMES = {
|
|
|
16
16
|
FALLBACK: 'fallback',
|
|
17
17
|
MATCHES: 'matches'
|
|
18
18
|
};
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
var handleClientStateChange = function handleClientStateChange() {
|
|
20
|
+
// not used
|
|
21
21
|
};
|
|
22
|
-
|
|
23
22
|
var mapStateOnServer = function mapStateOnServer(reduceProps) {
|
|
24
23
|
var defaultProps = {
|
|
25
24
|
interval: 10,
|
|
@@ -34,15 +33,12 @@ var mapStateOnServer = function mapStateOnServer(reduceProps) {
|
|
|
34
33
|
var propKey = key;
|
|
35
34
|
var reduceProp = reduceProps[propKey];
|
|
36
35
|
var nextProps = props;
|
|
37
|
-
|
|
38
36
|
if (exist(reduceProp)) {
|
|
39
37
|
nextProps = _objectSpread(_objectSpread({}, props), {}, _defineProperty({}, propKey, reduceProp));
|
|
40
38
|
}
|
|
41
|
-
|
|
42
39
|
return nextProps;
|
|
43
40
|
}, defaultProps);
|
|
44
41
|
};
|
|
45
|
-
|
|
46
42
|
var reducePropsToState = function reducePropsToState(propsList) {
|
|
47
43
|
var reduceProps = {
|
|
48
44
|
interval: getOutermostProperty(propsList, PROP_NAMES.INTERVAL),
|
|
@@ -55,19 +51,14 @@ var reducePropsToState = function reducePropsToState(propsList) {
|
|
|
55
51
|
};
|
|
56
52
|
return reduceProps;
|
|
57
53
|
};
|
|
58
|
-
|
|
59
54
|
function factory(Component) {
|
|
60
55
|
var Spr = /*#__PURE__*/function (_React$Component) {
|
|
61
56
|
_inherits(Spr, _React$Component);
|
|
62
|
-
|
|
63
57
|
var _super = _createSuper(Spr);
|
|
64
|
-
|
|
65
58
|
function Spr() {
|
|
66
59
|
_classCallCheck(this, Spr);
|
|
67
|
-
|
|
68
60
|
return _super.apply(this, arguments);
|
|
69
61
|
}
|
|
70
|
-
|
|
71
62
|
_createClass(Spr, [{
|
|
72
63
|
key: "verify",
|
|
73
64
|
value: function verify() {
|
|
@@ -77,13 +68,10 @@ function factory(Component) {
|
|
|
77
68
|
key: "render",
|
|
78
69
|
value: function render() {
|
|
79
70
|
var newProps = _objectSpread({}, this.props);
|
|
80
|
-
|
|
81
71
|
var validate = this.verify();
|
|
82
|
-
|
|
83
72
|
if (!validate) {
|
|
84
73
|
throw new Error('invalid props, check usage');
|
|
85
74
|
}
|
|
86
|
-
|
|
87
75
|
return /*#__PURE__*/createElement(Component, _objectSpread({}, newProps));
|
|
88
76
|
}
|
|
89
77
|
}], [{
|
|
@@ -95,25 +83,18 @@ function factory(Component) {
|
|
|
95
83
|
Component.canUseDOM = canUseDOM;
|
|
96
84
|
}
|
|
97
85
|
}]);
|
|
98
|
-
|
|
99
86
|
return Spr;
|
|
100
87
|
}(React.Component);
|
|
101
|
-
|
|
102
88
|
_defineProperty(Spr, "peek", Component.peek);
|
|
103
|
-
|
|
104
89
|
_defineProperty(Spr, "rewind", Component.rewind);
|
|
105
|
-
|
|
106
90
|
_defineProperty(Spr, "config", function () {
|
|
107
91
|
var mappedState = Component.rewind();
|
|
108
92
|
return mappedState;
|
|
109
93
|
});
|
|
110
|
-
|
|
111
94
|
return Spr;
|
|
112
95
|
}
|
|
113
|
-
|
|
114
96
|
var NullComponent = function NullComponent() {
|
|
115
97
|
return null;
|
|
116
98
|
};
|
|
117
|
-
|
|
118
99
|
var SprSideEffects = withSideEffect(reducePropsToState, handleClientStateChange, mapStateOnServer)(NullComponent);
|
|
119
100
|
export var PreRender = factory(SprSideEffects);
|
|
@@ -3,22 +3,18 @@ var REQUEST_META = ['header', 'query'];
|
|
|
3
3
|
export var getInnermostProperty = function getInnermostProperty(propsList, propName) {
|
|
4
4
|
for (var i = propsList.length - 1; i >= 0; i--) {
|
|
5
5
|
var props = propsList[i];
|
|
6
|
-
|
|
7
6
|
if (props.hasOwnProperty(propName)) {
|
|
8
7
|
return props[propName];
|
|
9
8
|
}
|
|
10
9
|
}
|
|
11
|
-
|
|
12
10
|
return null;
|
|
13
11
|
};
|
|
14
12
|
export var getOutermostProperty = function getOutermostProperty(propsList, propName) {
|
|
15
13
|
var _iterator = _createForOfIteratorHelper(propsList),
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
_step;
|
|
18
15
|
try {
|
|
19
16
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
20
17
|
var props = _step.value;
|
|
21
|
-
|
|
22
18
|
if (props.hasOwnProperty(propName)) {
|
|
23
19
|
return props[propName];
|
|
24
20
|
}
|
|
@@ -28,7 +24,6 @@ export var getOutermostProperty = function getOutermostProperty(propsList, propN
|
|
|
28
24
|
} finally {
|
|
29
25
|
_iterator.f();
|
|
30
26
|
}
|
|
31
|
-
|
|
32
27
|
return null;
|
|
33
28
|
};
|
|
34
29
|
export var aggKeysFromPropsList = function aggKeysFromPropsList(propsList, propName) {
|
|
@@ -42,7 +37,6 @@ export var aggKeysFromPropsList = function aggKeysFromPropsList(propsList, propN
|
|
|
42
37
|
}).reduce(function (result, next) {
|
|
43
38
|
REQUEST_META.forEach(function (key) {
|
|
44
39
|
var prop = next[propName];
|
|
45
|
-
|
|
46
40
|
if (prop !== null && prop !== void 0 && prop.hasOwnProperty(key) && usefulArray(prop[key])) {
|
|
47
41
|
result[key] = unique(result[key].concat(prop[key]));
|
|
48
42
|
}
|
|
@@ -51,13 +45,10 @@ export var aggKeysFromPropsList = function aggKeysFromPropsList(propsList, propN
|
|
|
51
45
|
}, initResult);
|
|
52
46
|
return REQUEST_META.reduce(function (result, next) {
|
|
53
47
|
var _result$key;
|
|
54
|
-
|
|
55
48
|
var key = next;
|
|
56
|
-
|
|
57
49
|
if (result[key] && ((_result$key = result[key]) === null || _result$key === void 0 ? void 0 : _result$key.length) === 0) {
|
|
58
50
|
delete result[key];
|
|
59
51
|
}
|
|
60
|
-
|
|
61
52
|
return result;
|
|
62
53
|
}, res);
|
|
63
54
|
};
|
|
@@ -71,8 +62,8 @@ export var aggMatchesFromPropsList = function aggMatchesFromPropsList(propsList,
|
|
|
71
62
|
return usefulObject(props[propName]);
|
|
72
63
|
}).reduce(function (result, next) {
|
|
73
64
|
REQUEST_META.forEach(function (key) {
|
|
74
|
-
var prop = next[propName];
|
|
75
|
-
|
|
65
|
+
var prop = next[propName];
|
|
66
|
+
// 这边目前是浅拷贝,越后渲染优先级越高
|
|
76
67
|
if (prop !== null && prop !== void 0 && prop.hasOwnProperty(key) && usefulObject(prop[key])) {
|
|
77
68
|
result[key] = Object.assign(result[key], prop[key]);
|
|
78
69
|
}
|
|
@@ -81,35 +72,27 @@ export var aggMatchesFromPropsList = function aggMatchesFromPropsList(propsList,
|
|
|
81
72
|
}, initResult);
|
|
82
73
|
return REQUEST_META.reduce(function (result, next) {
|
|
83
74
|
var key = next;
|
|
84
|
-
|
|
85
75
|
if (result[key] && Object.keys(result[key]).length === 0) {
|
|
86
76
|
delete result[key];
|
|
87
77
|
}
|
|
88
|
-
|
|
89
78
|
return result;
|
|
90
79
|
}, res);
|
|
91
80
|
};
|
|
92
|
-
|
|
93
81
|
function unique(arr) {
|
|
94
82
|
return Array.from(new Set(arr));
|
|
95
83
|
}
|
|
96
|
-
|
|
97
84
|
function usefulObject(target) {
|
|
98
85
|
if (!exist(target)) {
|
|
99
86
|
return false;
|
|
100
87
|
}
|
|
101
|
-
|
|
102
88
|
return target.constructor === Object && Object.keys(target).length > 0;
|
|
103
89
|
}
|
|
104
|
-
|
|
105
90
|
function usefulArray(target) {
|
|
106
91
|
if (!exist(target)) {
|
|
107
92
|
return false;
|
|
108
93
|
}
|
|
109
|
-
|
|
110
94
|
return Array.isArray(target) && target.length > 0;
|
|
111
95
|
}
|
|
112
|
-
|
|
113
96
|
export function exist(target) {
|
|
114
97
|
return target != null;
|
|
115
98
|
}
|
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
import { useRef, useLayoutEffect } from 'react';
|
|
3
3
|
export var WithCallback = function WithCallback(_ref) {
|
|
4
4
|
var callback = _ref.callback,
|
|
5
|
-
|
|
5
|
+
children = _ref.children;
|
|
6
6
|
var once = useRef(false);
|
|
7
7
|
useLayoutEffect(function () {
|
|
8
8
|
if (once.current) {
|
|
9
9
|
return;
|
|
10
10
|
}
|
|
11
|
-
|
|
12
11
|
once.current = true;
|
|
13
12
|
callback();
|
|
14
13
|
}, [callback]);
|
|
@@ -1,37 +1,38 @@
|
|
|
1
1
|
// 用于 react-helmet 正则替换
|
|
2
|
+
import { EOL } from 'os';
|
|
2
3
|
var RE_HTML_ATTR = /<html[^>]*>/;
|
|
3
4
|
var RE_BODY_ATTR = /<body[^>]*>/;
|
|
4
5
|
var RE_LAST_IN_HEAD = /<\/head>/;
|
|
5
6
|
var RE_TITLE = /<title[^>]*>([\s\S\n\r]*?)<\/title>/;
|
|
6
|
-
var TEST_TITLE_CONTENT = /(?<=<title[^>]*>)([\s\S\n\r]*?)([.|\S])([\s\S\n\r]*?)(?=<\/title>)/;
|
|
7
|
+
var TEST_TITLE_CONTENT = /(?<=<title[^>]*>)([\s\S\n\r]*?)([.|\S])([\s\S\n\r]*?)(?=<\/title>)/;
|
|
7
8
|
|
|
9
|
+
// 通过 react-helmet 修改模板
|
|
8
10
|
export default function helmet(content, helmetData) {
|
|
9
11
|
var result = content;
|
|
10
12
|
var bodyAttributes = helmetData.bodyAttributes.toString();
|
|
11
|
-
|
|
12
13
|
if (bodyAttributes) {
|
|
13
14
|
result = result.replace(RE_BODY_ATTR, "<body ".concat(bodyAttributes, ">"));
|
|
14
15
|
}
|
|
15
|
-
|
|
16
16
|
var htmlAttributes = helmetData.htmlAttributes.toString();
|
|
17
|
-
|
|
18
17
|
if (htmlAttributes) {
|
|
19
18
|
result = result.replace(RE_HTML_ATTR, "<html ".concat(htmlAttributes, ">"));
|
|
20
19
|
}
|
|
21
|
-
|
|
22
20
|
var base = helmetData.base.toString();
|
|
23
21
|
var link = helmetData.link.toString();
|
|
24
22
|
var meta = helmetData.meta.toString();
|
|
25
23
|
var noscript = helmetData.noscript.toString();
|
|
26
24
|
var script = helmetData.script.toString();
|
|
27
25
|
var style = helmetData.style.toString();
|
|
28
|
-
var title = helmetData.title.toString();
|
|
29
|
-
|
|
30
|
-
var existTitle = RE_TITLE.test(content);
|
|
26
|
+
var title = helmetData.title.toString();
|
|
31
27
|
|
|
32
|
-
|
|
28
|
+
// 如果模板中存在 title,且 helmetData title 有内容则做替换
|
|
29
|
+
var existTitleTag = RE_TITLE.test(content);
|
|
30
|
+
var shouldReplaceTitle = existTitleTag && TEST_TITLE_CONTENT.test(title.trim());
|
|
31
|
+
if (shouldReplaceTitle) {
|
|
33
32
|
result = result.replace(RE_TITLE, title);
|
|
34
33
|
}
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
var helmetStr = [base, link, meta, noscript, script, style, !existTitleTag ? title : ''].reduce(function (pre, cur) {
|
|
35
|
+
return pre + (cur.length > 0 ? " ".concat(cur).concat(EOL) : '');
|
|
36
|
+
}, '');
|
|
37
|
+
return result.replace(RE_LAST_IN_HEAD, "".concat(helmetStr, "</head>"));
|
|
37
38
|
}
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
|
2
2
|
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
3
|
-
|
|
4
3
|
/* eslint-disable eslint-comments/disable-enable-pair */
|
|
5
|
-
|
|
6
4
|
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
7
|
-
|
|
8
5
|
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
6
|
+
|
|
9
7
|
import { isReact18 } from "../utils";
|
|
10
8
|
export default function serverRender(_x) {
|
|
11
9
|
return _serverRender.apply(this, arguments);
|
|
12
10
|
}
|
|
13
|
-
|
|
14
11
|
function _serverRender() {
|
|
15
12
|
_serverRender = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
|
|
16
13
|
var pipe, html;
|
|
@@ -22,22 +19,17 @@ function _serverRender() {
|
|
|
22
19
|
_context.next = 7;
|
|
23
20
|
break;
|
|
24
21
|
}
|
|
25
|
-
|
|
26
22
|
_context.next = 3;
|
|
27
23
|
return require("./renderToStream").render(options);
|
|
28
|
-
|
|
29
24
|
case 3:
|
|
30
25
|
pipe = _context.sent;
|
|
31
26
|
return _context.abrupt("return", pipe);
|
|
32
|
-
|
|
33
27
|
case 7:
|
|
34
28
|
_context.next = 9;
|
|
35
29
|
return require("./renderToString").render(options);
|
|
36
|
-
|
|
37
30
|
case 9:
|
|
38
31
|
html = _context.sent;
|
|
39
32
|
return _context.abrupt("return", html);
|
|
40
|
-
|
|
41
33
|
case 11:
|
|
42
34
|
case "end":
|
|
43
35
|
return _context.stop();
|
|
@@ -3,15 +3,13 @@ import { buildTemplate } from "./buildTemplate.share";
|
|
|
3
3
|
export function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
4
4
|
var callbacks = [injectSSRDataScript];
|
|
5
5
|
return buildTemplate(afterAppTemplate, callbacks);
|
|
6
|
-
|
|
7
6
|
function injectSSRDataScript(template) {
|
|
8
7
|
var ssrDataScript = buildSSRDataScript();
|
|
9
8
|
return template.replace('<!--<?- SSRDataScript ?>-->', ssrDataScript);
|
|
10
|
-
|
|
11
9
|
function buildSSRDataScript() {
|
|
12
|
-
var ssrContext = options.
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
var ssrContext = options.ssrContext,
|
|
11
|
+
renderLevel = options.renderLevel;
|
|
12
|
+
var request = ssrContext.request;
|
|
15
13
|
var SSRData = {
|
|
16
14
|
context: {
|
|
17
15
|
request: {
|
|
@@ -23,7 +21,8 @@ export function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
|
23
21
|
headers: request.headers,
|
|
24
22
|
cookieMap: request.cookieMap
|
|
25
23
|
}
|
|
26
|
-
}
|
|
24
|
+
},
|
|
25
|
+
renderLevel: renderLevel
|
|
27
26
|
};
|
|
28
27
|
return "\n <script>window._SSR_DATA = ".concat(serialize(SSRData, {
|
|
29
28
|
isJSON: true
|
|
@@ -1,29 +1,60 @@
|
|
|
1
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
1
2
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
3
|
import ReactHelmet from 'react-helmet';
|
|
4
|
+
import { matchRoutes } from 'react-router-dom';
|
|
3
5
|
import helmetReplace from "../helmet";
|
|
4
|
-
import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
|
|
6
|
+
import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
|
|
7
|
+
var CSS_CHUNKS_PLACEHOLDER = '<!--<?- chunksMap.css ?>-->';
|
|
5
8
|
|
|
6
|
-
|
|
9
|
+
// build head template
|
|
10
|
+
function getHeadTemplate(beforeEntryTemplate, context) {
|
|
7
11
|
var callbacks = [function (headTemplate) {
|
|
8
12
|
var helmetData = ReactHelmet.renderStatic();
|
|
9
13
|
return helmetData ? helmetReplace(headTemplate, helmetData) : headTemplate;
|
|
10
|
-
}
|
|
11
|
-
|
|
14
|
+
},
|
|
15
|
+
// @TODO: prefetch scripts of lazy component
|
|
16
|
+
injectCss];
|
|
12
17
|
var _ref = beforeEntryTemplate.match(HEAD_REG_EXP) || [],
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
18
|
+
_ref2 = _slicedToArray(_ref, 1),
|
|
19
|
+
_ref2$ = _ref2[0],
|
|
20
|
+
headTemplate = _ref2$ === void 0 ? '' : _ref2$;
|
|
17
21
|
if (!headTemplate.length) {
|
|
18
22
|
return '';
|
|
19
23
|
}
|
|
24
|
+
return buildTemplate(headTemplate, callbacks);
|
|
25
|
+
function injectCss(headTemplate) {
|
|
26
|
+
return headTemplate.replace(CSS_CHUNKS_PLACEHOLDER, getCssChunks());
|
|
27
|
+
function getCssChunks() {
|
|
28
|
+
var routeManifest = context.routeManifest,
|
|
29
|
+
routerContext = context.routerContext,
|
|
30
|
+
routes = context.routes;
|
|
31
|
+
if (!routeManifest || !routerContext || !routes) {
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
var routeAssets = routeManifest.routeAssets;
|
|
35
|
+
var cssChunks = [];
|
|
36
|
+
var matches = matchRoutes(routes, routerContext.location);
|
|
37
|
+
matches === null || matches === void 0 ? void 0 : matches.forEach(function (match) {
|
|
38
|
+
var routeId = match.route.id;
|
|
39
|
+
if (routeId) {
|
|
40
|
+
var _routeAssets$routeId$ = routeAssets[routeId].assets,
|
|
41
|
+
assets = _routeAssets$routeId$ === void 0 ? [] : _routeAssets$routeId$;
|
|
42
|
+
var _cssChunks = assets.filter(function (asset) {
|
|
43
|
+
return asset === null || asset === void 0 ? void 0 : asset.endsWith('.css');
|
|
44
|
+
});
|
|
45
|
+
cssChunks.push.apply(cssChunks, _toConsumableArray(_cssChunks));
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
var styleLinks = cssChunks.map(function (chunk) {
|
|
49
|
+
return "<link href=\"".concat(chunk, "\" rel=\"stylesheet\" />");
|
|
50
|
+
});
|
|
51
|
+
return "".concat(styleLinks.join(''));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
20
55
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
export function buildShellBeforeTemplate(beforeAppTemplate) {
|
|
27
|
-
var headTemplate = getHeadTemplate(beforeAppTemplate);
|
|
56
|
+
// build script
|
|
57
|
+
export function buildShellBeforeTemplate(beforeAppTemplate, context) {
|
|
58
|
+
var headTemplate = getHeadTemplate(beforeAppTemplate, context);
|
|
28
59
|
return beforeAppTemplate.replace(HEAD_REG_EXP, headTemplate);
|
|
29
60
|
}
|
|
@@ -4,117 +4,47 @@ import { createElement } from 'react';
|
|
|
4
4
|
import { run } from '@modern-js/utils/ssr';
|
|
5
5
|
import { PreRender } from "../../react/prerender";
|
|
6
6
|
import { time } from "../utils";
|
|
7
|
-
import { createTemplates } from "./template";
|
|
8
7
|
import renderToPipe from "./renderToPipe";
|
|
9
8
|
export var render = function render(_ref) {
|
|
10
9
|
var App = _ref.App,
|
|
11
|
-
|
|
10
|
+
context = _ref.context;
|
|
12
11
|
var ssrContext = context.ssrContext;
|
|
13
|
-
|
|
14
12
|
if (!ssrContext) {
|
|
15
13
|
throw new Error('The "ssrContext" must not be undefined, but received undefined');
|
|
16
14
|
}
|
|
17
|
-
|
|
18
15
|
return run(ssrContext.request.headers, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
19
|
-
var
|
|
16
|
+
var end, rootElement, pipe;
|
|
20
17
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
21
18
|
while (1) {
|
|
22
19
|
switch (_context.prev = _context.next) {
|
|
23
20
|
case 0:
|
|
24
|
-
|
|
21
|
+
end = time();
|
|
25
22
|
rootElement = /*#__PURE__*/createElement(App, {
|
|
26
23
|
context: Object.assign(context || {}, {
|
|
27
24
|
ssr: true
|
|
28
25
|
})
|
|
29
26
|
});
|
|
30
|
-
|
|
31
|
-
end = time();
|
|
32
|
-
pipe = renderToPipe(rootElement, getTemplates, {
|
|
27
|
+
pipe = renderToPipe(rootElement, context, {
|
|
33
28
|
onShellReady: function onShellReady() {
|
|
34
29
|
// set cacheConfig
|
|
35
30
|
var cacheConfig = PreRender.config();
|
|
36
|
-
|
|
37
31
|
if (cacheConfig) {
|
|
38
|
-
|
|
32
|
+
ssrContext.cacheConfig = cacheConfig;
|
|
39
33
|
}
|
|
40
34
|
},
|
|
41
35
|
onAllReady: function onAllReady() {
|
|
42
|
-
//
|
|
36
|
+
// calculate streaming ssr cost
|
|
43
37
|
var cost = end();
|
|
44
38
|
ssrContext.logger.debug('App Render To HTML cost = %d ms', cost);
|
|
45
|
-
ssrContext.metrics.emitTimer('app.render.html.cost', cost);
|
|
46
|
-
|
|
47
|
-
var cost_all = end_all();
|
|
48
|
-
ssrContext.logger.info('App Render Total cost = %d ms', cost_all);
|
|
49
|
-
ssrContext.metrics.emitTimer('app.render.cost', cost_all);
|
|
39
|
+
ssrContext.metrics.emitTimer('app.render.html.cost', cost);
|
|
50
40
|
}
|
|
51
41
|
});
|
|
52
42
|
return _context.abrupt("return", pipe);
|
|
53
|
-
|
|
54
|
-
case 6:
|
|
43
|
+
case 4:
|
|
55
44
|
case "end":
|
|
56
45
|
return _context.stop();
|
|
57
46
|
}
|
|
58
47
|
}
|
|
59
48
|
}, _callee);
|
|
60
|
-
})));
|
|
61
|
-
|
|
62
|
-
function prefetch(_x, _x2) {
|
|
63
|
-
return _prefetch.apply(this, arguments);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function _prefetch() {
|
|
67
|
-
_prefetch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(App, context) {
|
|
68
|
-
var prefetch, ssrContext, prefetchData, end, prefetchCost;
|
|
69
|
-
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
70
|
-
while (1) {
|
|
71
|
-
switch (_context2.prev = _context2.next) {
|
|
72
|
-
case 0:
|
|
73
|
-
prefetch = App.prefetch;
|
|
74
|
-
ssrContext = context.ssrContext;
|
|
75
|
-
end = time();
|
|
76
|
-
_context2.prev = 3;
|
|
77
|
-
|
|
78
|
-
if (!prefetch) {
|
|
79
|
-
_context2.next = 10;
|
|
80
|
-
break;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
_context2.next = 7;
|
|
84
|
-
return prefetch(context);
|
|
85
|
-
|
|
86
|
-
case 7:
|
|
87
|
-
_context2.t0 = _context2.sent;
|
|
88
|
-
_context2.next = 11;
|
|
89
|
-
break;
|
|
90
|
-
|
|
91
|
-
case 10:
|
|
92
|
-
_context2.t0 = null;
|
|
93
|
-
|
|
94
|
-
case 11:
|
|
95
|
-
prefetchData = _context2.t0;
|
|
96
|
-
prefetchCost = end();
|
|
97
|
-
ssrContext.logger.debug("App Prefetch cost = %d ms", prefetchCost);
|
|
98
|
-
ssrContext.metrics.emitTimer('app.prefetch.cost', prefetchCost);
|
|
99
|
-
_context2.next = 21;
|
|
100
|
-
break;
|
|
101
|
-
|
|
102
|
-
case 17:
|
|
103
|
-
_context2.prev = 17;
|
|
104
|
-
_context2.t1 = _context2["catch"](3);
|
|
105
|
-
ssrContext.logger.error('App Prefetch Render', _context2.t1);
|
|
106
|
-
ssrContext.metrics.emitCounter('app.prefetch.render.error', 1);
|
|
107
|
-
|
|
108
|
-
case 21:
|
|
109
|
-
return _context2.abrupt("return", prefetchData || {});
|
|
110
|
-
|
|
111
|
-
case 22:
|
|
112
|
-
case "end":
|
|
113
|
-
return _context2.stop();
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}, _callee2, null, [[3, 17]]);
|
|
117
|
-
}));
|
|
118
|
-
return _prefetch.apply(this, arguments);
|
|
119
|
-
}
|
|
49
|
+
})));
|
|
120
50
|
};
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import { ChunkExtractor } from '@loadable/server';
|
|
2
2
|
export function getLoadableChunks(_ref) {
|
|
3
3
|
var context = _ref.context,
|
|
4
|
-
|
|
4
|
+
jsx = _ref.jsx;
|
|
5
5
|
var _ref2 = context.ssrContext,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
loadableStats = _ref2.loadableStats,
|
|
7
|
+
entryName = _ref2.entryName;
|
|
9
8
|
if (!loadableStats) {
|
|
10
9
|
return {
|
|
11
10
|
jsx: jsx
|
|
12
11
|
};
|
|
13
12
|
}
|
|
14
|
-
|
|
15
13
|
var extractor = new ChunkExtractor({
|
|
16
14
|
stats: loadableStats,
|
|
17
15
|
entrypoints: [entryName]
|
|
@@ -1,51 +1,63 @@
|
|
|
1
1
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
2
|
import { Transform } from 'stream';
|
|
3
3
|
import { renderToPipeableStream } from 'react-dom/server';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import { RenderLevel } from "../types";
|
|
5
|
+
import { getTemplates } from "./template";
|
|
6
|
+
function renderToPipe(rootElement, context, options) {
|
|
6
7
|
var isShellStream = true;
|
|
7
|
-
|
|
8
|
+
var ssrContext = context.ssrContext;
|
|
8
9
|
var forUserPipe = function forUserPipe(stream) {
|
|
9
10
|
return new Promise(function (resolve) {
|
|
10
11
|
var _renderToPipeableStre = renderToPipeableStream(rootElement, _objectSpread(_objectSpread({}, options), {}, {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
options === null || options === void 0 ? void 0 : (_options$onShellReady = options.onShellReady) === null || _options$onShellReady === void 0 ? void 0 : _options$onShellReady.call(options);
|
|
15
|
-
|
|
16
|
-
var _getTemplates = getTemplates(),
|
|
12
|
+
onShellReady: function onShellReady() {
|
|
13
|
+
var _options$onShellReady;
|
|
14
|
+
var _getTemplates = getTemplates(context, RenderLevel.SERVER_RENDER),
|
|
17
15
|
shellAfter = _getTemplates.shellAfter,
|
|
18
16
|
shellBefore = _getTemplates.shellBefore;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
17
|
+
options === null || options === void 0 ? void 0 : (_options$onShellReady = options.onShellReady) === null || _options$onShellReady === void 0 ? void 0 : _options$onShellReady.call(options);
|
|
18
|
+
var injectableTransform = new Transform({
|
|
19
|
+
transform: function transform(chunk, _encoding, callback) {
|
|
20
|
+
try {
|
|
21
|
+
if (isShellStream) {
|
|
22
|
+
this.push(joinChunk(shellBefore, chunk, shellAfter));
|
|
23
|
+
isShellStream = false;
|
|
24
|
+
} else {
|
|
25
|
+
this.push(chunk);
|
|
26
|
+
}
|
|
27
|
+
callback();
|
|
28
|
+
} catch (e) {
|
|
29
|
+
if (e instanceof Error) {
|
|
30
|
+
callback(e);
|
|
31
|
+
} else {
|
|
32
|
+
callback(new Error('Received unkown error when streaming'));
|
|
33
|
+
}
|
|
36
34
|
}
|
|
37
35
|
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
});
|
|
37
|
+
resolve(pipe(injectableTransform).pipe(stream));
|
|
38
|
+
},
|
|
39
|
+
onShellError: function onShellError(error) {
|
|
40
|
+
var _options$onShellError;
|
|
41
|
+
// Don't log error in `onShellError` callback, since it has been logged in `onError` callback
|
|
42
|
+
ssrContext.metrics.emitCounter('app.render.streaming.shell.error', 1);
|
|
43
|
+
var _getTemplates2 = getTemplates(context, RenderLevel.CLIENT_RENDER),
|
|
44
|
+
shellAfter = _getTemplates2.shellAfter,
|
|
45
|
+
shellBefore = _getTemplates2.shellBefore;
|
|
46
|
+
var fallbackHtml = "".concat(shellBefore).concat(shellAfter);
|
|
47
|
+
resolve(fallbackHtml);
|
|
48
|
+
options === null || options === void 0 ? void 0 : (_options$onShellError = options.onShellError) === null || _options$onShellError === void 0 ? void 0 : _options$onShellError.call(options, error);
|
|
49
|
+
},
|
|
50
|
+
onError: function onError(error) {
|
|
51
|
+
var _options$onError;
|
|
52
|
+
ssrContext.logger.error('An error occurs during streaming SSR', error);
|
|
53
|
+
ssrContext.metrics.emitCounter('app.render.streaming.error', 1);
|
|
54
|
+
options === null || options === void 0 ? void 0 : (_options$onError = options.onError) === null || _options$onError === void 0 ? void 0 : _options$onError.call(options, error);
|
|
55
|
+
}
|
|
56
|
+
})),
|
|
57
|
+
pipe = _renderToPipeableStre.pipe;
|
|
44
58
|
});
|
|
45
59
|
};
|
|
46
|
-
|
|
47
60
|
return forUserPipe;
|
|
48
|
-
|
|
49
61
|
function joinChunk() {
|
|
50
62
|
var before = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
|
51
63
|
var chunk = arguments.length > 1 ? arguments[1] : undefined;
|
|
@@ -53,5 +65,4 @@ function renderToPipe(rootElement, getTemplates, options) {
|
|
|
53
65
|
return "".concat(before).concat(chunk.toString()).concat(after);
|
|
54
66
|
}
|
|
55
67
|
}
|
|
56
|
-
|
|
57
68
|
export default renderToPipe;
|