@modern-js/runtime 1.3.4-alpha.0 → 1.4.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 +77 -19
- package/dist/js/modern/cli/index.js +4 -4
- package/dist/js/modern/common.js +1 -0
- package/dist/js/modern/exports/model.js +2 -1
- package/dist/js/modern/exports/router.js +2 -1
- package/dist/js/modern/exports/server.js +0 -1
- package/dist/js/modern/exports/ssr.js +2 -1
- package/dist/js/modern/router/cli/index.js +106 -0
- package/dist/js/modern/router/index.js +2 -0
- package/dist/js/modern/router/runtime/DefaultNotFound.js +13 -0
- package/dist/js/modern/router/runtime/index.js +4 -0
- package/dist/js/modern/router/runtime/plugin.js +88 -0
- package/dist/js/modern/router/runtime/utils.js +108 -0
- package/dist/js/modern/ssr/cli/index.js +120 -0
- package/dist/js/modern/ssr/index.js +109 -0
- package/dist/js/modern/ssr/index.node.js +78 -0
- package/dist/js/modern/ssr/prefetch.js +58 -0
- package/dist/js/modern/ssr/react/index.js +2 -0
- package/dist/js/modern/ssr/react/nossr/index.js +13 -0
- package/dist/js/modern/ssr/react/prerender/index.js +104 -0
- package/dist/js/modern/ssr/react/prerender/type.js +0 -0
- package/dist/js/modern/ssr/react/prerender/util.js +99 -0
- package/dist/js/modern/ssr/serverRender/entry.js +179 -0
- package/dist/js/modern/ssr/serverRender/helmet.js +46 -0
- package/dist/js/modern/ssr/serverRender/index.js +29 -0
- package/dist/js/modern/ssr/serverRender/loadable.js +48 -0
- package/dist/js/modern/ssr/serverRender/measure.js +11 -0
- package/dist/js/modern/ssr/serverRender/reduce.js +7 -0
- package/dist/js/modern/ssr/serverRender/styledComponent.js +8 -0
- package/dist/js/modern/ssr/serverRender/template.js +90 -0
- package/dist/js/modern/ssr/serverRender/type.js +8 -0
- package/dist/js/modern/ssr/utils.js +51 -0
- package/dist/js/modern/state/cli/index.js +110 -0
- package/dist/js/modern/state/index.js +2 -0
- package/dist/js/modern/state/plugins.js +7 -0
- package/dist/js/modern/state/runtime/index.js +4 -0
- package/dist/js/modern/state/runtime/plugin.js +71 -0
- package/dist/js/modern/state/types.js +1 -0
- package/dist/js/node/cli/index.js +5 -5
- package/dist/js/node/common.js +10 -0
- package/dist/js/node/exports/model.js +19 -5
- package/dist/js/node/exports/router.js +19 -5
- package/dist/js/node/exports/server.js +0 -17
- package/dist/js/node/exports/ssr.js +19 -5
- package/dist/js/node/router/cli/index.js +122 -0
- package/dist/js/node/router/index.js +30 -0
- package/dist/js/node/router/runtime/DefaultNotFound.js +26 -0
- package/dist/js/node/router/runtime/index.js +39 -0
- package/dist/js/node/router/runtime/plugin.js +111 -0
- package/dist/js/node/router/runtime/utils.js +128 -0
- package/dist/js/node/ssr/cli/index.js +136 -0
- package/dist/js/node/ssr/index.js +138 -0
- package/dist/js/node/ssr/index.node.js +105 -0
- package/dist/js/node/ssr/prefetch.js +75 -0
- package/dist/js/node/ssr/react/index.js +21 -0
- package/dist/js/node/ssr/react/nossr/index.js +28 -0
- package/dist/js/node/ssr/react/prerender/index.js +121 -0
- package/dist/js/node/ssr/react/prerender/type.js +0 -0
- package/dist/js/node/ssr/react/prerender/util.js +119 -0
- package/dist/js/node/ssr/serverRender/entry.js +208 -0
- package/dist/js/node/ssr/serverRender/helmet.js +52 -0
- package/dist/js/node/ssr/serverRender/index.js +46 -0
- package/dist/js/node/ssr/serverRender/loadable.js +60 -0
- package/dist/js/node/ssr/serverRender/measure.js +20 -0
- package/dist/js/node/ssr/serverRender/reduce.js +14 -0
- package/dist/js/node/ssr/serverRender/styledComponent.js +18 -0
- package/dist/js/node/ssr/serverRender/template.js +103 -0
- package/dist/js/node/ssr/serverRender/type.js +15 -0
- package/dist/js/node/ssr/utils.js +65 -0
- package/dist/js/node/state/cli/index.js +127 -0
- package/dist/js/node/state/index.js +30 -0
- package/dist/js/node/state/plugins.js +35 -0
- package/dist/js/node/state/runtime/index.js +61 -0
- package/dist/js/node/state/runtime/plugin.js +101 -0
- package/dist/js/node/state/types.js +5 -0
- package/dist/js/treeshaking/cli/index.js +4 -4
- package/dist/js/treeshaking/common.js +3 -0
- package/dist/js/treeshaking/exports/model.js +2 -1
- package/dist/js/treeshaking/exports/router.js +2 -1
- package/dist/js/treeshaking/exports/server.js +0 -1
- package/dist/js/treeshaking/exports/ssr.js +2 -1
- package/dist/js/treeshaking/router/cli/index.js +100 -0
- package/dist/js/treeshaking/router/index.js +2 -0
- package/dist/js/treeshaking/router/runtime/DefaultNotFound.js +15 -0
- package/dist/js/treeshaking/router/runtime/index.js +4 -0
- package/dist/js/treeshaking/router/runtime/plugin.js +89 -0
- package/dist/js/treeshaking/router/runtime/utils.js +106 -0
- package/dist/js/treeshaking/ssr/cli/index.js +113 -0
- package/dist/js/treeshaking/ssr/index.js +129 -0
- package/dist/js/treeshaking/ssr/index.node.js +100 -0
- package/dist/js/treeshaking/ssr/prefetch.js +97 -0
- package/dist/js/treeshaking/ssr/react/index.js +2 -0
- package/dist/js/treeshaking/ssr/react/nossr/index.js +16 -0
- package/dist/js/treeshaking/ssr/react/prerender/index.js +119 -0
- package/dist/js/treeshaking/ssr/react/prerender/type.js +0 -0
- package/dist/js/treeshaking/ssr/react/prerender/util.js +115 -0
- package/dist/js/treeshaking/ssr/serverRender/entry.js +267 -0
- package/dist/js/treeshaking/ssr/serverRender/helmet.js +37 -0
- package/dist/js/treeshaking/ssr/serverRender/index.js +69 -0
- package/dist/js/treeshaking/ssr/serverRender/loadable.js +59 -0
- package/dist/js/treeshaking/ssr/serverRender/measure.js +17 -0
- package/dist/js/treeshaking/ssr/serverRender/reduce.js +11 -0
- package/dist/js/treeshaking/ssr/serverRender/styledComponent.js +8 -0
- package/dist/js/treeshaking/ssr/serverRender/template.js +111 -0
- package/dist/js/treeshaking/ssr/serverRender/type.js +8 -0
- package/dist/js/treeshaking/ssr/utils.js +53 -0
- package/dist/js/treeshaking/state/cli/index.js +100 -0
- package/dist/js/treeshaking/state/index.js +2 -0
- package/dist/js/treeshaking/state/plugins.js +13 -0
- package/dist/js/treeshaking/state/runtime/index.js +4 -0
- package/dist/js/treeshaking/state/runtime/plugin.js +63 -0
- package/dist/js/treeshaking/state/types.js +1 -0
- package/dist/types/common.d.ts +1 -0
- package/dist/types/exports/model.d.ts +2 -1
- package/dist/types/exports/router.d.ts +2 -1
- package/dist/types/exports/server.d.ts +0 -1
- package/dist/types/exports/ssr.d.ts +2 -1
- package/dist/types/index.d.ts +8 -2
- package/dist/types/router/cli/index.d.ts +5 -0
- package/dist/types/router/index.d.ts +2 -0
- package/dist/types/router/runtime/DefaultNotFound.d.ts +2 -0
- package/dist/types/router/runtime/index.d.ts +6 -0
- package/dist/types/router/runtime/plugin.d.ts +51 -0
- package/dist/types/router/runtime/utils.d.ts +6 -0
- package/dist/types/ssr/cli/index.d.ts +5 -0
- package/dist/types/ssr/index.d.ts +18 -0
- package/dist/types/ssr/index.node.d.ts +4 -0
- package/dist/types/ssr/prefetch.d.ts +13 -0
- package/dist/types/ssr/react/index.d.ts +2 -0
- package/dist/types/ssr/react/nossr/index.d.ts +2 -0
- package/dist/types/ssr/react/prerender/index.d.ts +1 -0
- package/dist/types/ssr/react/prerender/type.d.ts +29 -0
- package/dist/types/ssr/react/prerender/util.d.ts +6 -0
- package/dist/types/ssr/serverRender/entry.d.ts +20 -0
- package/dist/types/ssr/serverRender/helmet.d.ts +2 -0
- package/dist/types/ssr/serverRender/index.d.ts +8 -0
- package/dist/types/ssr/serverRender/loadable.d.ts +2 -0
- package/dist/types/ssr/serverRender/measure.d.ts +1 -0
- package/dist/types/ssr/serverRender/reduce.d.ts +3 -0
- package/dist/types/ssr/serverRender/styledComponent.d.ts +2 -0
- package/dist/types/ssr/serverRender/template.d.ts +14 -0
- package/dist/types/ssr/serverRender/type.d.ts +32 -0
- package/dist/types/ssr/utils.d.ts +8 -0
- package/dist/types/state/cli/index.d.ts +5 -0
- package/dist/types/state/index.d.ts +2 -0
- package/dist/types/state/plugins.d.ts +4 -0
- package/dist/types/state/runtime/index.d.ts +4 -0
- package/dist/types/state/runtime/plugin.d.ts +17 -0
- package/dist/types/state/types.d.ts +17 -0
- package/package.json +37 -20
- package/types/model.d.ts +1 -1
- package/types/state.d.ts +4 -0
- package/dist/js/modern/exports/request.js +0 -1
- package/dist/js/node/exports/request.js +0 -13
- package/dist/js/treeshaking/exports/request.js +0 -1
- package/dist/types/exports/request.d.ts +0 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
|
|
3
|
+
var _excluded = ["Component"];
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { Route, matchPath } from 'react-router-dom';
|
|
7
|
+
import { DefaultNotFound } from "./DefaultNotFound";
|
|
8
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
|
+
export function renderRoutes(routesConfig) {
|
|
10
|
+
var extraProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
11
|
+
|
|
12
|
+
var Layout = function Layout(_ref) {
|
|
13
|
+
var Component = _ref.Component,
|
|
14
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
15
|
+
|
|
16
|
+
var GlobalLayout = routesConfig === null || routesConfig === void 0 ? void 0 : routesConfig.globalApp;
|
|
17
|
+
|
|
18
|
+
if (!GlobalLayout) {
|
|
19
|
+
return /*#__PURE__*/_jsx(Component, _objectSpread({}, props));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return /*#__PURE__*/_jsx(GlobalLayout, _objectSpread({
|
|
23
|
+
Component: Component
|
|
24
|
+
}, props));
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
var findMatchedRoute = function findMatchedRoute(pathname) {
|
|
28
|
+
var _routesConfig$routes;
|
|
29
|
+
|
|
30
|
+
return routesConfig === null || routesConfig === void 0 ? void 0 : (_routesConfig$routes = routesConfig.routes) === null || _routesConfig$routes === void 0 ? void 0 : _routesConfig$routes.find(function (route) {
|
|
31
|
+
var info = matchPath(pathname, {
|
|
32
|
+
path: route.path,
|
|
33
|
+
exact: route.exact,
|
|
34
|
+
sensitive: route.sensitive
|
|
35
|
+
});
|
|
36
|
+
return Boolean(info);
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
return /*#__PURE__*/_jsx(Route, {
|
|
41
|
+
path: "/",
|
|
42
|
+
render: function render(props) {
|
|
43
|
+
var matchedRoute = findMatchedRoute(props.location.pathname);
|
|
44
|
+
|
|
45
|
+
if (!matchedRoute) {
|
|
46
|
+
return /*#__PURE__*/_jsx(DefaultNotFound, {});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return /*#__PURE__*/_jsx(Route, {
|
|
50
|
+
path: matchedRoute.path,
|
|
51
|
+
exact: matchedRoute.exact,
|
|
52
|
+
sensitive: matchedRoute.sensitive,
|
|
53
|
+
render: function render(routeProps) {
|
|
54
|
+
return /*#__PURE__*/_jsx(Layout, _objectSpread(_objectSpread({
|
|
55
|
+
Component: matchedRoute.component
|
|
56
|
+
}, routeProps), extraProps));
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
export function getLocation(serverContext) {
|
|
63
|
+
var _ref2 = (serverContext === null || serverContext === void 0 ? void 0 : serverContext.request) || {},
|
|
64
|
+
pathname = _ref2.pathname,
|
|
65
|
+
url = _ref2.url;
|
|
66
|
+
|
|
67
|
+
var cleanUrl = url.replace('http://', '').replace('https://', '');
|
|
68
|
+
var index = (cleanUrl || '').indexOf(pathname);
|
|
69
|
+
|
|
70
|
+
if (index === -1) {
|
|
71
|
+
return pathname;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return cleanUrl.substring(index);
|
|
75
|
+
}
|
|
76
|
+
export var urlJoin = function urlJoin() {
|
|
77
|
+
var separator = '/';
|
|
78
|
+
var replace = new RegExp("".concat(separator, "{1,}"), 'g');
|
|
79
|
+
|
|
80
|
+
for (var _len = arguments.length, parts = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
81
|
+
parts[_key] = arguments[_key];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return standardSlash(parts.join(separator).replace(replace, separator));
|
|
85
|
+
};
|
|
86
|
+
export function standardSlash(str) {
|
|
87
|
+
var addr = str;
|
|
88
|
+
|
|
89
|
+
if (!addr || typeof addr !== 'string') {
|
|
90
|
+
return addr;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (addr.startsWith('.')) {
|
|
94
|
+
addr = addr.slice(1);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (!addr.startsWith('/')) {
|
|
98
|
+
addr = "/".concat(addr);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (addr.endsWith('/') && addr !== '/') {
|
|
102
|
+
addr = addr.slice(0, addr.length - 1);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return addr;
|
|
106
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { getEntryOptions, SERVER_RENDER_FUNCTION_NAME, LOADABLE_STATS_FILE, isUseSSRBundle, createRuntimeExportsUtils, isSingleEntry } from '@modern-js/utils';
|
|
3
|
+
var PLUGIN_IDENTIFIER = 'ssr';
|
|
4
|
+
export default (function () {
|
|
5
|
+
return {
|
|
6
|
+
name: '@modern-js/plugin-ssr',
|
|
7
|
+
required: ['@modern-js/runtime'],
|
|
8
|
+
setup: function setup(api) {
|
|
9
|
+
var ssrConfigMap = new Map();
|
|
10
|
+
var pluginsExportsUtils;
|
|
11
|
+
var ssrModulePath = path.resolve(__dirname, '../');
|
|
12
|
+
return {
|
|
13
|
+
config: function config() {
|
|
14
|
+
var appContext = api.useAppContext();
|
|
15
|
+
pluginsExportsUtils = createRuntimeExportsUtils(appContext.internalDirectory, 'plugins');
|
|
16
|
+
return {
|
|
17
|
+
source: {
|
|
18
|
+
alias: {
|
|
19
|
+
'@modern-js/runtime/plugins': pluginsExportsUtils.getPath()
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
tools: {
|
|
23
|
+
webpackChain: function webpackChain(chain, _ref) {
|
|
24
|
+
var name = _ref.name,
|
|
25
|
+
CHAIN_ID = _ref.CHAIN_ID;
|
|
26
|
+
var userConfig = api.useResolvedConfigContext();
|
|
27
|
+
|
|
28
|
+
if (isUseSSRBundle(userConfig) && name !== 'server') {
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
|
|
30
|
+
var LoadableWebpackPlugin = require('@modern-js/webpack/@loadable/webpack-plugin');
|
|
31
|
+
|
|
32
|
+
chain.plugin(CHAIN_ID.PLUGIN.LOADABLE).use(LoadableWebpackPlugin, [{
|
|
33
|
+
filename: LOADABLE_STATS_FILE
|
|
34
|
+
}]);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
babel: function babel(config) {
|
|
38
|
+
var userConfig = api.useResolvedConfigContext();
|
|
39
|
+
|
|
40
|
+
if (isUseSSRBundle(userConfig)) {
|
|
41
|
+
config.plugins.push(require.resolve('@loadable/babel-plugin'));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
modifyEntryImports: function modifyEntryImports(_ref2) {
|
|
48
|
+
var entrypoint = _ref2.entrypoint,
|
|
49
|
+
imports = _ref2.imports;
|
|
50
|
+
var entryName = entrypoint.entryName;
|
|
51
|
+
var userConfig = api.useResolvedConfigContext();
|
|
52
|
+
|
|
53
|
+
var _api$useAppContext = api.useAppContext(),
|
|
54
|
+
packageName = _api$useAppContext.packageName,
|
|
55
|
+
entrypoints = _api$useAppContext.entrypoints;
|
|
56
|
+
|
|
57
|
+
pluginsExportsUtils.addExport("export { default as ssr } from '".concat(ssrModulePath, "'")); // if use ssg then set ssr config to true
|
|
58
|
+
|
|
59
|
+
var ssrConfig = getEntryOptions(entryName, userConfig.server.ssr, userConfig.server.ssrByEntries, packageName);
|
|
60
|
+
var ssgConfig = userConfig.output.ssg;
|
|
61
|
+
var useSSG = isSingleEntry(entrypoints) ? Boolean(ssgConfig) : ssgConfig === true || typeof (ssgConfig === null || ssgConfig === void 0 ? void 0 : ssgConfig[0]) === 'function' || Boolean(ssgConfig === null || ssgConfig === void 0 ? void 0 : ssgConfig[entryName]);
|
|
62
|
+
ssrConfigMap.set(entryName, ssrConfig || useSSG);
|
|
63
|
+
|
|
64
|
+
if (ssrConfig || useSSG) {
|
|
65
|
+
imports.push({
|
|
66
|
+
value: '@modern-js/runtime/plugins',
|
|
67
|
+
specifiers: [{
|
|
68
|
+
imported: PLUGIN_IDENTIFIER
|
|
69
|
+
}]
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
entrypoint: entrypoint,
|
|
75
|
+
imports: imports
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
modifyEntryRuntimePlugins: function modifyEntryRuntimePlugins(_ref3) {
|
|
79
|
+
var entrypoint = _ref3.entrypoint,
|
|
80
|
+
plugins = _ref3.plugins;
|
|
81
|
+
|
|
82
|
+
if (ssrConfigMap.get(entrypoint.entryName)) {
|
|
83
|
+
plugins.push({
|
|
84
|
+
name: PLUGIN_IDENTIFIER,
|
|
85
|
+
options: ssrConfigMap.get(entrypoint.entryName)
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
entrypoint: entrypoint,
|
|
91
|
+
plugins: plugins
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
modifyEntryExport: function modifyEntryExport(_ref4) {
|
|
95
|
+
var entrypoint = _ref4.entrypoint,
|
|
96
|
+
exportStatement = _ref4.exportStatement;
|
|
97
|
+
|
|
98
|
+
if (ssrConfigMap.get(entrypoint.entryName)) {
|
|
99
|
+
return {
|
|
100
|
+
entrypoint: entrypoint,
|
|
101
|
+
exportStatement: ["export function ".concat(SERVER_RENDER_FUNCTION_NAME, "(context) {\n return bootstrap(AppWrapper, context)\n }"), exportStatement].join('\n')
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return {
|
|
106
|
+
entrypoint: entrypoint,
|
|
107
|
+
exportStatement: exportStatement
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
});
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
|
2
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
3
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
4
|
+
import ReactDOM from 'react-dom';
|
|
5
|
+
import { loadableReady } from '@loadable/component';
|
|
6
|
+
import { RenderLevel } from "./serverRender/type";
|
|
7
|
+
import { formatClient, mockResponse } from "./utils";
|
|
8
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
|
+
|
|
10
|
+
var ssr = function ssr() {
|
|
11
|
+
return {
|
|
12
|
+
name: '@modern-js/plugin-ssr',
|
|
13
|
+
setup: function setup() {
|
|
14
|
+
var mockResp = mockResponse();
|
|
15
|
+
return {
|
|
16
|
+
client: function () {
|
|
17
|
+
var _client = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
|
|
18
|
+
var _window, _window$_SSR_DATA;
|
|
19
|
+
|
|
20
|
+
var App, context, rootElement, renderLevel, _prefetch, _ref2;
|
|
21
|
+
|
|
22
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
23
|
+
while (1) {
|
|
24
|
+
switch (_context.prev = _context.next) {
|
|
25
|
+
case 0:
|
|
26
|
+
App = _ref.App, context = _ref.context, rootElement = _ref.rootElement;
|
|
27
|
+
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;
|
|
28
|
+
|
|
29
|
+
if (!(renderLevel === RenderLevel.CLIENT_RENDER)) {
|
|
30
|
+
_context.next = 8;
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
_context.next = 5;
|
|
35
|
+
return App === null || App === void 0 ? void 0 : (_prefetch = (_ref2 = App).prefetch) === null || _prefetch === void 0 ? void 0 : _prefetch.call(_ref2, context);
|
|
36
|
+
|
|
37
|
+
case 5:
|
|
38
|
+
ReactDOM.render( /*#__PURE__*/_jsx(App, {
|
|
39
|
+
context: context
|
|
40
|
+
}), rootElement);
|
|
41
|
+
_context.next = 9;
|
|
42
|
+
break;
|
|
43
|
+
|
|
44
|
+
case 8:
|
|
45
|
+
if (renderLevel === RenderLevel.SERVER_RENDER) {
|
|
46
|
+
loadableReady(function () {
|
|
47
|
+
var hydrateContext = _objectSpread(_objectSpread({}, context), {}, {
|
|
48
|
+
_hydration: true
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
ReactDOM.hydrate( /*#__PURE__*/_jsx(App, {
|
|
52
|
+
context: hydrateContext
|
|
53
|
+
}), rootElement, function () {
|
|
54
|
+
// won't cause component re-render because context's reference identity doesn't change
|
|
55
|
+
delete hydrateContext._hydration;
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
} else {
|
|
59
|
+
// unknown renderlevel or renderlevel is server prefetch.
|
|
60
|
+
ReactDOM.render( /*#__PURE__*/_jsx(App, {
|
|
61
|
+
context: context
|
|
62
|
+
}), rootElement);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
case 9:
|
|
66
|
+
case "end":
|
|
67
|
+
return _context.stop();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}, _callee);
|
|
71
|
+
}));
|
|
72
|
+
|
|
73
|
+
function client(_x) {
|
|
74
|
+
return _client.apply(this, arguments);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return client;
|
|
78
|
+
}(),
|
|
79
|
+
init: function init(_ref3, next) {
|
|
80
|
+
var _window2, _window2$_SSR_DATA, _window2$_SSR_DATA$co;
|
|
81
|
+
|
|
82
|
+
var context = _ref3.context;
|
|
83
|
+
var request = (_window2 = window) === null || _window2 === void 0 ? void 0 : (_window2$_SSR_DATA = _window2._SSR_DATA) === null || _window2$_SSR_DATA === void 0 ? void 0 : (_window2$_SSR_DATA$co = _window2$_SSR_DATA.context) === null || _window2$_SSR_DATA$co === void 0 ? void 0 : _window2$_SSR_DATA$co.request;
|
|
84
|
+
|
|
85
|
+
if (!request) {
|
|
86
|
+
return next({
|
|
87
|
+
context: context
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
context.ssrContext.response = mockResp;
|
|
92
|
+
context.ssrContext.request = formatClient(request);
|
|
93
|
+
return next({
|
|
94
|
+
context: context
|
|
95
|
+
});
|
|
96
|
+
},
|
|
97
|
+
pickContext: function pickContext(_ref4, next) {
|
|
98
|
+
var _window3, _window3$_SSR_DATA, _window3$_SSR_DATA$co;
|
|
99
|
+
|
|
100
|
+
var context = _ref4.context,
|
|
101
|
+
pickedContext = _ref4.pickedContext;
|
|
102
|
+
var request = (_window3 = window) === null || _window3 === void 0 ? void 0 : (_window3$_SSR_DATA = _window3._SSR_DATA) === null || _window3$_SSR_DATA === void 0 ? void 0 : (_window3$_SSR_DATA$co = _window3$_SSR_DATA.context) === null || _window3$_SSR_DATA$co === void 0 ? void 0 : _window3$_SSR_DATA$co.request;
|
|
103
|
+
var initialData = context.initialData;
|
|
104
|
+
|
|
105
|
+
if (!request) {
|
|
106
|
+
return next({
|
|
107
|
+
context: context,
|
|
108
|
+
pickedContext: _objectSpread(_objectSpread({}, pickedContext), {}, {
|
|
109
|
+
initialData: initialData
|
|
110
|
+
})
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return next({
|
|
115
|
+
context: context,
|
|
116
|
+
pickedContext: _objectSpread(_objectSpread({}, pickedContext), {}, {
|
|
117
|
+
initialData: initialData,
|
|
118
|
+
request: request,
|
|
119
|
+
response: mockResp
|
|
120
|
+
})
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export default ssr;
|
|
129
|
+
export * from "./react";
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
|
+
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
|
3
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
4
|
+
|
|
5
|
+
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
6
|
+
|
|
7
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import { registerPrefetch } from '@modern-js/runtime-core';
|
|
10
|
+
import { isBrowser } from "../common";
|
|
11
|
+
import prefetch from "./prefetch";
|
|
12
|
+
import { formatServer } from "./utils";
|
|
13
|
+
var registeredApps = new WeakSet();
|
|
14
|
+
|
|
15
|
+
var plugin = function plugin() {
|
|
16
|
+
return {
|
|
17
|
+
name: '@modern-js/plugin-ssr',
|
|
18
|
+
setup: function setup() {
|
|
19
|
+
return {
|
|
20
|
+
server: function () {
|
|
21
|
+
var _server = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
|
|
22
|
+
var App, context, html;
|
|
23
|
+
return _regeneratorRuntime().wrap(function _callee$(_context2) {
|
|
24
|
+
while (1) {
|
|
25
|
+
switch (_context2.prev = _context2.next) {
|
|
26
|
+
case 0:
|
|
27
|
+
App = _ref.App, context = _ref.context;
|
|
28
|
+
|
|
29
|
+
if (!registeredApps.has(App)) {
|
|
30
|
+
registerPrefetch(App, function (_context) {
|
|
31
|
+
return prefetch(App, _context);
|
|
32
|
+
});
|
|
33
|
+
registeredApps.add(App);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (isBrowser()) {
|
|
37
|
+
_context2.next = 7;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
_context2.next = 5;
|
|
42
|
+
return require("./serverRender").render(context, (context === null || context === void 0 ? void 0 : context.ssrContext.distDir) || path.join(process.cwd(), 'dist'), App);
|
|
43
|
+
|
|
44
|
+
case 5:
|
|
45
|
+
html = _context2.sent;
|
|
46
|
+
return _context2.abrupt("return", html);
|
|
47
|
+
|
|
48
|
+
case 7:
|
|
49
|
+
return _context2.abrupt("return", null);
|
|
50
|
+
|
|
51
|
+
case 8:
|
|
52
|
+
case "end":
|
|
53
|
+
return _context2.stop();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}, _callee);
|
|
57
|
+
}));
|
|
58
|
+
|
|
59
|
+
function server(_x) {
|
|
60
|
+
return _server.apply(this, arguments);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return server;
|
|
64
|
+
}(),
|
|
65
|
+
init: function init(_ref2, next) {
|
|
66
|
+
var context = _ref2.context;
|
|
67
|
+
var request = context.ssrContext.request;
|
|
68
|
+
context.ssrContext.request = formatServer(request);
|
|
69
|
+
return next({
|
|
70
|
+
context: context
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
pickContext: function pickContext(_ref3, next) {
|
|
74
|
+
var context = _ref3.context,
|
|
75
|
+
pickedContext = _ref3.pickedContext;
|
|
76
|
+
|
|
77
|
+
var _context$ssrContext = context === null || context === void 0 ? void 0 : context.ssrContext,
|
|
78
|
+
request = _context$ssrContext.request,
|
|
79
|
+
response = _context$ssrContext.response;
|
|
80
|
+
|
|
81
|
+
var initialData = context.initialData;
|
|
82
|
+
return next({
|
|
83
|
+
context: context,
|
|
84
|
+
pickedContext: _objectSpread(_objectSpread({}, pickedContext), {}, {
|
|
85
|
+
initialData: initialData,
|
|
86
|
+
request: request,
|
|
87
|
+
response: response
|
|
88
|
+
})
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export default plugin;
|
|
97
|
+
export * from "./react";
|
|
98
|
+
/* eslint-enable @typescript-eslint/no-require-imports */
|
|
99
|
+
|
|
100
|
+
/* eslint-enable @typescript-eslint/no-var-requires */
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
|
2
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import { renderToStaticMarkup } from 'react-dom/server';
|
|
6
|
+
import { run } from '@modern-js/utils/ssr';
|
|
7
|
+
import { LOADABLE_STATS_FILE } from '@modern-js/utils/constants';
|
|
8
|
+
import { ChunkExtractor } from '@loadable/server'; // todo: SSRContext
|
|
9
|
+
|
|
10
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
|
+
|
|
12
|
+
var prefetch = /*#__PURE__*/function () {
|
|
13
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(App, context) {
|
|
14
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
15
|
+
while (1) {
|
|
16
|
+
switch (_context2.prev = _context2.next) {
|
|
17
|
+
case 0:
|
|
18
|
+
return _context2.abrupt("return", run(context.ssrContext.request.headers, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
19
|
+
var _context$store;
|
|
20
|
+
|
|
21
|
+
var ssrContext, loadablefile, extractor, loadersData;
|
|
22
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
23
|
+
while (1) {
|
|
24
|
+
switch (_context.prev = _context.next) {
|
|
25
|
+
case 0:
|
|
26
|
+
ssrContext = context.ssrContext;
|
|
27
|
+
loadablefile = path.resolve(ssrContext.distDir, LOADABLE_STATS_FILE);
|
|
28
|
+
|
|
29
|
+
if (fs.existsSync(loadablefile)) {
|
|
30
|
+
extractor = new ChunkExtractor({
|
|
31
|
+
statsFile: path.resolve(ssrContext.distDir, LOADABLE_STATS_FILE),
|
|
32
|
+
entrypoints: [ssrContext.entryName].filter(Boolean)
|
|
33
|
+
});
|
|
34
|
+
renderToStaticMarkup(extractor.collectChunks( /*#__PURE__*/_jsx(App, {
|
|
35
|
+
context: context
|
|
36
|
+
})));
|
|
37
|
+
} else {
|
|
38
|
+
renderToStaticMarkup( /*#__PURE__*/_jsx(App, {
|
|
39
|
+
context: context
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (context.loaderManager.hasPendingLoaders()) {
|
|
44
|
+
_context.next = 5;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return _context.abrupt("return", {
|
|
49
|
+
initialData: context.initialData,
|
|
50
|
+
i18nData: context.__i18nData__
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
case 5:
|
|
54
|
+
_context.next = 7;
|
|
55
|
+
return context.loaderManager.awaitPendingLoaders();
|
|
56
|
+
|
|
57
|
+
case 7:
|
|
58
|
+
loadersData = _context.sent;
|
|
59
|
+
Object.keys(loadersData).forEach(function (id) {
|
|
60
|
+
var data = loadersData[id];
|
|
61
|
+
|
|
62
|
+
if (data._error) {
|
|
63
|
+
ssrContext.logger.error('App Prefetch Loader', data._error);
|
|
64
|
+
ssrContext.metrics.emitCounter('app.prefetch.loader.error', 1);
|
|
65
|
+
delete data._error;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
return _context.abrupt("return", {
|
|
69
|
+
loadersData: loadersData,
|
|
70
|
+
initialData: context.initialData,
|
|
71
|
+
i18nData: context.__i18nData__,
|
|
72
|
+
// todo: move to plugin state
|
|
73
|
+
storeState: context === null || context === void 0 ? void 0 : (_context$store = context.store) === null || _context$store === void 0 ? void 0 : _context$store.getState()
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
case 10:
|
|
77
|
+
case "end":
|
|
78
|
+
return _context.stop();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}, _callee);
|
|
82
|
+
}))));
|
|
83
|
+
|
|
84
|
+
case 1:
|
|
85
|
+
case "end":
|
|
86
|
+
return _context2.stop();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}, _callee2);
|
|
90
|
+
}));
|
|
91
|
+
|
|
92
|
+
return function prefetch(_x, _x2) {
|
|
93
|
+
return _ref.apply(this, arguments);
|
|
94
|
+
};
|
|
95
|
+
}();
|
|
96
|
+
|
|
97
|
+
export default prefetch;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import React, { useEffect, useState } from 'react';
|
|
3
|
+
var csr = false;
|
|
4
|
+
export var NoSSR = function NoSSR(props) {
|
|
5
|
+
var _useState = useState(csr),
|
|
6
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
7
|
+
isMounted = _useState2[0],
|
|
8
|
+
setMounted = _useState2[1];
|
|
9
|
+
|
|
10
|
+
useEffect(function () {
|
|
11
|
+
csr = true;
|
|
12
|
+
setMounted(true);
|
|
13
|
+
});
|
|
14
|
+
var children = props.children;
|
|
15
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, isMounted ? children : null);
|
|
16
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
2
|
+
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
3
|
+
import _inherits from "@babel/runtime/helpers/esm/inherits";
|
|
4
|
+
import _createSuper from "@babel/runtime/helpers/esm/createSuper";
|
|
5
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
6
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
7
|
+
import withSideEffect from 'react-side-effect';
|
|
8
|
+
import React, { createElement } from 'react';
|
|
9
|
+
import { getOutermostProperty, aggKeysFromPropsList, exist, aggMatchesFromPropsList } from "./util";
|
|
10
|
+
var PROP_NAMES = {
|
|
11
|
+
INTERVAL: 'interval',
|
|
12
|
+
STALE_LIMIT: 'staleLimit',
|
|
13
|
+
LEVEL: 'level',
|
|
14
|
+
INCLUDES: 'includes',
|
|
15
|
+
EXCLUDES: 'excludes',
|
|
16
|
+
FALLBACK: 'fallback',
|
|
17
|
+
MATCHES: 'matches'
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
var handleClientStateChange = function handleClientStateChange() {// not used
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
var mapStateOnServer = function mapStateOnServer(reduceProps) {
|
|
24
|
+
var defaultProps = {
|
|
25
|
+
interval: 10,
|
|
26
|
+
staleLimit: false,
|
|
27
|
+
level: 0,
|
|
28
|
+
includes: null,
|
|
29
|
+
excludes: null,
|
|
30
|
+
fallback: false,
|
|
31
|
+
matches: null
|
|
32
|
+
};
|
|
33
|
+
return Object.keys(defaultProps).reduce(function (props, key) {
|
|
34
|
+
var propKey = key;
|
|
35
|
+
var reduceProp = reduceProps[propKey];
|
|
36
|
+
var nextProps = props;
|
|
37
|
+
|
|
38
|
+
if (exist(reduceProp)) {
|
|
39
|
+
nextProps = _objectSpread(_objectSpread({}, props), {}, _defineProperty({}, propKey, reduceProp));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return nextProps;
|
|
43
|
+
}, defaultProps);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
var reducePropsToState = function reducePropsToState(propsList) {
|
|
47
|
+
var reduceProps = {
|
|
48
|
+
interval: getOutermostProperty(propsList, PROP_NAMES.INTERVAL),
|
|
49
|
+
staleLimit: getOutermostProperty(propsList, PROP_NAMES.STALE_LIMIT),
|
|
50
|
+
level: getOutermostProperty(propsList, PROP_NAMES.LEVEL),
|
|
51
|
+
includes: aggKeysFromPropsList(propsList, PROP_NAMES.INCLUDES),
|
|
52
|
+
excludes: aggKeysFromPropsList(propsList, PROP_NAMES.EXCLUDES),
|
|
53
|
+
fallback: getOutermostProperty(propsList, PROP_NAMES.FALLBACK),
|
|
54
|
+
matches: aggMatchesFromPropsList(propsList, PROP_NAMES.MATCHES)
|
|
55
|
+
};
|
|
56
|
+
return reduceProps;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
function factory(Component) {
|
|
60
|
+
var Spr = /*#__PURE__*/function (_React$Component) {
|
|
61
|
+
_inherits(Spr, _React$Component);
|
|
62
|
+
|
|
63
|
+
var _super = _createSuper(Spr);
|
|
64
|
+
|
|
65
|
+
function Spr() {
|
|
66
|
+
_classCallCheck(this, Spr);
|
|
67
|
+
|
|
68
|
+
return _super.apply(this, arguments);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
_createClass(Spr, [{
|
|
72
|
+
key: "verify",
|
|
73
|
+
value: function verify() {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
}, {
|
|
77
|
+
key: "render",
|
|
78
|
+
value: function render() {
|
|
79
|
+
var newProps = _objectSpread({}, this.props);
|
|
80
|
+
|
|
81
|
+
var validate = this.verify();
|
|
82
|
+
|
|
83
|
+
if (!validate) {
|
|
84
|
+
throw new Error('invalid props, check usage');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return /*#__PURE__*/createElement(Component, _objectSpread({}, newProps));
|
|
88
|
+
}
|
|
89
|
+
}], [{
|
|
90
|
+
key: "canUseDOM",
|
|
91
|
+
get: function get() {
|
|
92
|
+
return Component.canUseDOM;
|
|
93
|
+
},
|
|
94
|
+
set: function set(canUseDOM) {
|
|
95
|
+
Component.canUseDOM = canUseDOM;
|
|
96
|
+
}
|
|
97
|
+
}]);
|
|
98
|
+
|
|
99
|
+
return Spr;
|
|
100
|
+
}(React.Component);
|
|
101
|
+
|
|
102
|
+
_defineProperty(Spr, "peek", Component.peek);
|
|
103
|
+
|
|
104
|
+
_defineProperty(Spr, "rewind", Component.rewind);
|
|
105
|
+
|
|
106
|
+
_defineProperty(Spr, "config", function () {
|
|
107
|
+
var mappedState = Component.rewind();
|
|
108
|
+
return mappedState;
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
return Spr;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
var NullComponent = function NullComponent() {
|
|
115
|
+
return null;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
var SprSideEffects = withSideEffect(reducePropsToState, handleClientStateChange, mapStateOnServer)(NullComponent);
|
|
119
|
+
export var PreRender = factory(SprSideEffects);
|
|
File without changes
|