@modern-js/runtime 1.21.5 → 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 +117 -18
- 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 +47 -48
- package/dist/js/modern/core/index.js +4 -3
- 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 +2 -1
- package/dist/js/modern/router/cli/index.js +20 -20
- package/dist/js/modern/router/runtime/index.js +1 -1
- package/dist/js/modern/router/runtime/plugin.js +25 -52
- package/dist/js/modern/router/runtime/plugin.node.js +137 -0
- 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/types.js +1 -0
- package/dist/js/modern/router/runtime/utils.js +99 -58
- package/dist/js/modern/router/runtime/withRouter.js +20 -0
- package/dist/js/modern/runtime-context.js +2 -1
- package/dist/js/modern/ssr/cli/index.js +35 -17
- package/dist/js/modern/ssr/index.js +64 -51
- package/dist/js/modern/ssr/index.node.js +6 -15
- 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 +12 -27
- package/dist/js/modern/ssr/serverRender/renderToStream/buildTemplate.after.js +38 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/buildTemplate.share.js +5 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/bulidTemplate.before.js +58 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/index.js +40 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/loadable.js +24 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/renderToPipe.js +72 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/styledComponent.js +11 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/template.js +18 -0
- package/dist/js/modern/ssr/serverRender/renderToStream/type.js +0 -0
- package/dist/js/modern/ssr/serverRender/{entry.js → renderToString/entry.js} +6 -40
- package/dist/js/modern/ssr/serverRender/renderToString/index.js +29 -0
- package/dist/js/modern/ssr/serverRender/{loadable.js → renderToString/loadable.js} +2 -24
- package/dist/js/modern/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -2
- package/dist/js/modern/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -0
- package/dist/js/modern/ssr/serverRender/{template.js → renderToString/template.js} +0 -15
- package/dist/js/modern/ssr/serverRender/{type.js → renderToString/type.js} +0 -2
- package/dist/js/modern/ssr/serverRender/types.js +2 -0
- package/dist/js/modern/ssr/serverRender/utils.js +20 -0
- package/dist/js/modern/ssr/utils.js +8 -13
- 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 +47 -66
- package/dist/js/node/core/index.js +8 -17
- 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 +5 -5
- package/dist/js/node/router/cli/index.js +20 -24
- 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 +4 -9
- package/dist/js/node/router/runtime/plugin.js +23 -65
- package/dist/js/node/router/runtime/plugin.node.js +147 -0
- 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/types.js +5 -0
- package/dist/js/node/router/runtime/utils.js +101 -67
- package/dist/js/node/router/runtime/withRouter.js +26 -0
- package/dist/js/node/runtime-context.js +4 -4
- package/dist/js/node/ssr/cli/index.js +35 -21
- package/dist/js/node/ssr/index.js +63 -62
- package/dist/js/node/ssr/index.node.js +6 -25
- 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 +14 -39
- package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.after.js +45 -0
- package/dist/js/node/ssr/serverRender/renderToStream/buildTemplate.share.js +13 -0
- package/dist/js/node/ssr/serverRender/renderToStream/bulidTemplate.before.js +65 -0
- package/dist/js/node/ssr/serverRender/renderToStream/index.js +48 -0
- package/dist/js/node/ssr/serverRender/renderToStream/loadable.js +30 -0
- package/dist/js/node/ssr/serverRender/renderToStream/renderToPipe.js +79 -0
- package/dist/js/node/ssr/serverRender/renderToStream/styledComponent.js +17 -0
- package/dist/js/node/ssr/serverRender/renderToStream/template.js +25 -0
- package/dist/js/node/ssr/serverRender/renderToStream/type.js +0 -0
- package/dist/js/node/ssr/serverRender/{entry.js → renderToString/entry.js} +13 -64
- package/dist/js/node/ssr/serverRender/renderToString/index.js +37 -0
- package/dist/js/node/ssr/serverRender/{loadable.js → renderToString/loadable.js} +3 -28
- package/dist/js/node/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -3
- package/dist/js/node/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -3
- package/dist/js/node/ssr/serverRender/{template.js → renderToString/template.js} +0 -18
- package/dist/js/node/ssr/serverRender/{type.js → renderToString/type.js} +0 -2
- package/dist/js/node/ssr/serverRender/types.js +12 -0
- package/dist/js/node/ssr/serverRender/utils.js +28 -0
- package/dist/js/node/ssr/utils.js +10 -21
- 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 +50 -65
- package/dist/js/treeshaking/core/index.js +4 -3
- 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 +2 -1
- package/dist/js/treeshaking/router/cli/index.js +26 -22
- package/dist/js/treeshaking/router/runtime/index.js +1 -1
- package/dist/js/treeshaking/router/runtime/plugin.js +28 -54
- package/dist/js/treeshaking/router/runtime/plugin.node.js +161 -0
- 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/types.js +1 -0
- package/dist/js/treeshaking/router/runtime/utils.js +104 -58
- package/dist/js/treeshaking/router/runtime/withRouter.js +18 -0
- package/dist/js/treeshaking/runtime-context.js +2 -1
- package/dist/js/treeshaking/ssr/cli/index.js +43 -23
- package/dist/js/treeshaking/ssr/index.js +74 -59
- package/dist/js/treeshaking/ssr/index.node.js +18 -31
- 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 +33 -55
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/buildTemplate.after.js +32 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/buildTemplate.share.js +7 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/bulidTemplate.before.js +60 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/index.js +50 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/loadable.js +22 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/renderToPipe.js +68 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/styledComponent.js +10 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/template.js +22 -0
- package/dist/js/treeshaking/ssr/serverRender/renderToStream/type.js +0 -0
- package/dist/js/treeshaking/ssr/serverRender/{entry.js → renderToString/entry.js} +23 -76
- package/dist/js/treeshaking/ssr/serverRender/renderToString/index.js +44 -0
- package/dist/js/treeshaking/ssr/serverRender/{loadable.js → renderToString/loadable.js} +7 -34
- package/dist/js/treeshaking/ssr/serverRender/{reduce.js → renderToString/reduce.js} +0 -2
- package/dist/js/treeshaking/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js} +0 -0
- package/dist/js/treeshaking/ssr/serverRender/{template.js → renderToString/template.js} +2 -18
- package/dist/js/treeshaking/ssr/serverRender/{type.js → renderToString/type.js} +0 -2
- package/dist/js/treeshaking/ssr/serverRender/types.js +2 -0
- package/dist/js/treeshaking/ssr/serverRender/utils.js +28 -0
- package/dist/js/treeshaking/ssr/utils.js +20 -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/common.d.ts +0 -2
- package/dist/types/core/compatible.d.ts +2 -2
- package/dist/types/core/index.d.ts +2 -2
- 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 +2 -14
- 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 +21 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/router/cli/index.d.ts +0 -2
- package/dist/types/router/runtime/DefaultNotFound.d.ts +1 -0
- package/dist/types/router/runtime/index.d.ts +3 -3
- package/dist/types/router/runtime/plugin.d.ts +2 -45
- package/dist/types/router/runtime/plugin.node.d.ts +8 -0
- package/dist/types/router/runtime/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 +36 -0
- package/dist/types/router/runtime/utils.d.ts +5 -2
- package/dist/types/router/runtime/withRouter.d.ts +8 -0
- package/dist/types/runtime-context.d.ts +3 -1
- package/dist/types/ssr/cli/index.d.ts +0 -2
- package/dist/types/ssr/index.d.ts +2 -2
- package/dist/types/ssr/index.node.d.ts +1 -1
- package/dist/types/ssr/prefetch.d.ts +2 -2
- package/dist/types/ssr/react/nossr/index.d.ts +3 -1
- package/dist/types/ssr/serverRender/index.d.ts +2 -3
- package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +7 -0
- package/dist/types/ssr/serverRender/renderToStream/buildTemplate.share.d.ts +3 -0
- package/dist/types/ssr/serverRender/renderToStream/bulidTemplate.before.d.ts +2 -0
- package/dist/types/ssr/serverRender/renderToStream/index.d.ts +6 -0
- package/dist/types/ssr/serverRender/renderToStream/loadable.d.ts +16 -0
- package/dist/types/ssr/serverRender/renderToStream/renderToPipe.d.ts +8 -0
- package/dist/types/ssr/serverRender/renderToStream/styledComponent.d.ts +12 -0
- package/dist/types/ssr/serverRender/renderToStream/template.d.ts +3 -0
- package/dist/types/ssr/serverRender/renderToStream/type.d.ts +4 -0
- package/dist/types/ssr/serverRender/{entry.d.ts → renderToString/entry.d.ts} +2 -2
- package/dist/types/ssr/serverRender/renderToString/index.d.ts +6 -0
- package/dist/types/ssr/serverRender/{loadable.d.ts → renderToString/loadable.d.ts} +0 -0
- package/dist/types/ssr/serverRender/{reduce.d.ts → renderToString/reduce.d.ts} +0 -0
- package/dist/types/ssr/serverRender/{styledComponent.d.ts → renderToString/styledComponent.d.ts} +0 -0
- package/dist/types/ssr/serverRender/{template.d.ts → renderToString/template.d.ts} +0 -0
- package/dist/types/ssr/serverRender/{type.d.ts → renderToString/type.d.ts} +1 -8
- package/dist/types/ssr/serverRender/types.d.ts +15 -0
- package/dist/types/ssr/serverRender/utils.d.ts +3 -0
- package/dist/types/ssr/utils.d.ts +4 -2
- package/dist/types/state/cli/index.d.ts +0 -2
- package/dist/types/state/runtime/plugin.d.ts +1 -1
- package/dist/types/state/types.d.ts +0 -1
- package/package.json +63 -71
- package/types/index.d.ts +13 -0
- package/types/router.d.ts +14 -0
- package/dist/js/modern/ssr/serverRender/measure.js +0 -11
- package/dist/js/node/ssr/serverRender/measure.js +0 -20
- package/dist/js/treeshaking/ssr/serverRender/measure.js +0 -17
- package/dist/types/ssr/serverRender/measure.d.ts +0 -1
- package/lib/types.d.ts +0 -10
- package/type.d.ts +0 -5
|
@@ -1,29 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { time } from "./measure";
|
|
5
|
-
export const render = async (ctx, config, App) => {
|
|
6
|
-
const {
|
|
7
|
-
ssrContext
|
|
8
|
-
} = ctx;
|
|
9
|
-
return run(ssrContext.request.headers, async () => {
|
|
10
|
-
const entry = new SSREntry({
|
|
11
|
-
ctx: ssrContext,
|
|
12
|
-
App,
|
|
13
|
-
config
|
|
14
|
-
});
|
|
15
|
-
entry.metrics.emitCounter('app.visit.count', 1);
|
|
16
|
-
const end = time();
|
|
17
|
-
const html = await entry.renderToHtml(ctx);
|
|
18
|
-
const cost = end();
|
|
19
|
-
entry.logger.info('App Render Total cost = %d ms', cost);
|
|
20
|
-
entry.metrics.emitTimer('app.render.cost', cost);
|
|
21
|
-
const cacheConfig = PreRender.config();
|
|
22
|
-
|
|
23
|
-
if (cacheConfig) {
|
|
24
|
-
ctx.ssrContext.cacheConfig = cacheConfig;
|
|
25
|
-
}
|
|
1
|
+
/* eslint-disable eslint-comments/disable-enable-pair */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
26
4
|
|
|
5
|
+
import { isReact18 } from "../utils";
|
|
6
|
+
export default async function serverRender(options) {
|
|
7
|
+
if (isReact18() && options.config.mode === 'stream') {
|
|
8
|
+
const pipe = await require("./renderToStream").render(options);
|
|
9
|
+
return pipe;
|
|
10
|
+
} else {
|
|
11
|
+
const html = await require("./renderToString").render(options);
|
|
27
12
|
return html;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import serialize from 'serialize-javascript';
|
|
2
|
+
import { buildTemplate } from "./buildTemplate.share";
|
|
3
|
+
export function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
4
|
+
const callbacks = [injectSSRDataScript];
|
|
5
|
+
return buildTemplate(afterAppTemplate, callbacks);
|
|
6
|
+
function injectSSRDataScript(template) {
|
|
7
|
+
const ssrDataScript = buildSSRDataScript();
|
|
8
|
+
return template.replace('<!--<?- SSRDataScript ?>-->', ssrDataScript);
|
|
9
|
+
function buildSSRDataScript() {
|
|
10
|
+
const {
|
|
11
|
+
ssrContext,
|
|
12
|
+
renderLevel
|
|
13
|
+
} = options;
|
|
14
|
+
const {
|
|
15
|
+
request
|
|
16
|
+
} = ssrContext;
|
|
17
|
+
const SSRData = {
|
|
18
|
+
context: {
|
|
19
|
+
request: {
|
|
20
|
+
params: request.params,
|
|
21
|
+
query: request.query,
|
|
22
|
+
pathname: request.pathname,
|
|
23
|
+
host: request.host,
|
|
24
|
+
url: request.url,
|
|
25
|
+
headers: request.headers,
|
|
26
|
+
cookieMap: request.cookieMap
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
renderLevel
|
|
30
|
+
};
|
|
31
|
+
return `
|
|
32
|
+
<script>window._SSR_DATA = ${serialize(SSRData, {
|
|
33
|
+
isJSON: true
|
|
34
|
+
})}</script>
|
|
35
|
+
`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import ReactHelmet from 'react-helmet';
|
|
2
|
+
import { matchRoutes } from 'react-router-dom';
|
|
3
|
+
import helmetReplace from "../helmet";
|
|
4
|
+
import { HEAD_REG_EXP, buildTemplate } from "./buildTemplate.share";
|
|
5
|
+
const CSS_CHUNKS_PLACEHOLDER = '<!--<?- chunksMap.css ?>-->';
|
|
6
|
+
|
|
7
|
+
// build head template
|
|
8
|
+
function getHeadTemplate(beforeEntryTemplate, context) {
|
|
9
|
+
const callbacks = [headTemplate => {
|
|
10
|
+
const helmetData = ReactHelmet.renderStatic();
|
|
11
|
+
return helmetData ? helmetReplace(headTemplate, helmetData) : headTemplate;
|
|
12
|
+
},
|
|
13
|
+
// @TODO: prefetch scripts of lazy component
|
|
14
|
+
injectCss];
|
|
15
|
+
const [headTemplate = ''] = beforeEntryTemplate.match(HEAD_REG_EXP) || [];
|
|
16
|
+
if (!headTemplate.length) {
|
|
17
|
+
return '';
|
|
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
|
+
}
|
|
53
|
+
|
|
54
|
+
// build script
|
|
55
|
+
export function buildShellBeforeTemplate(beforeAppTemplate, context) {
|
|
56
|
+
const headTemplate = getHeadTemplate(beforeAppTemplate, context);
|
|
57
|
+
return beforeAppTemplate.replace(HEAD_REG_EXP, headTemplate);
|
|
58
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createElement } from 'react';
|
|
2
|
+
import { run } from '@modern-js/utils/ssr';
|
|
3
|
+
import { PreRender } from "../../react/prerender";
|
|
4
|
+
import { time } from "../utils";
|
|
5
|
+
import renderToPipe from "./renderToPipe";
|
|
6
|
+
export const render = ({
|
|
7
|
+
App,
|
|
8
|
+
context
|
|
9
|
+
}) => {
|
|
10
|
+
const {
|
|
11
|
+
ssrContext
|
|
12
|
+
} = context;
|
|
13
|
+
if (!ssrContext) {
|
|
14
|
+
throw new Error('The "ssrContext" must not be undefined, but received undefined');
|
|
15
|
+
}
|
|
16
|
+
return run(ssrContext.request.headers, async () => {
|
|
17
|
+
const end = time();
|
|
18
|
+
const rootElement = /*#__PURE__*/createElement(App, {
|
|
19
|
+
context: Object.assign(context || {}, {
|
|
20
|
+
ssr: true
|
|
21
|
+
})
|
|
22
|
+
});
|
|
23
|
+
const pipe = renderToPipe(rootElement, context, {
|
|
24
|
+
onShellReady() {
|
|
25
|
+
// set cacheConfig
|
|
26
|
+
const cacheConfig = PreRender.config();
|
|
27
|
+
if (cacheConfig) {
|
|
28
|
+
ssrContext.cacheConfig = cacheConfig;
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
onAllReady() {
|
|
32
|
+
// calculate streaming ssr cost
|
|
33
|
+
const cost = end();
|
|
34
|
+
ssrContext.logger.debug('App Render To HTML cost = %d ms', cost);
|
|
35
|
+
ssrContext.metrics.emitTimer('app.render.html.cost', cost);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
return pipe;
|
|
39
|
+
});
|
|
40
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ChunkExtractor } from '@loadable/server';
|
|
2
|
+
export function getLoadableChunks({
|
|
3
|
+
context,
|
|
4
|
+
jsx
|
|
5
|
+
}) {
|
|
6
|
+
const {
|
|
7
|
+
loadableStats,
|
|
8
|
+
entryName
|
|
9
|
+
} = context.ssrContext;
|
|
10
|
+
if (!loadableStats) {
|
|
11
|
+
return {
|
|
12
|
+
jsx
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const extractor = new ChunkExtractor({
|
|
16
|
+
stats: loadableStats,
|
|
17
|
+
entrypoints: [entryName]
|
|
18
|
+
});
|
|
19
|
+
const collectedJsx = extractor.collectChunks(jsx);
|
|
20
|
+
return {
|
|
21
|
+
jsx: collectedJsx,
|
|
22
|
+
chunkExtractor: extractor
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
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
|
+
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; }
|
|
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; }
|
|
4
|
+
import { Transform } from 'stream';
|
|
5
|
+
import { renderToPipeableStream } from 'react-dom/server';
|
|
6
|
+
import { RenderLevel } from "../types";
|
|
7
|
+
import { getTemplates } from "./template";
|
|
8
|
+
function renderToPipe(rootElement, context, options) {
|
|
9
|
+
let isShellStream = true;
|
|
10
|
+
const {
|
|
11
|
+
ssrContext
|
|
12
|
+
} = context;
|
|
13
|
+
const forUserPipe = stream => {
|
|
14
|
+
return new Promise(resolve => {
|
|
15
|
+
const {
|
|
16
|
+
pipe
|
|
17
|
+
} = renderToPipeableStream(rootElement, _objectSpread(_objectSpread({}, options), {}, {
|
|
18
|
+
onShellReady() {
|
|
19
|
+
var _options$onShellReady;
|
|
20
|
+
const {
|
|
21
|
+
shellAfter,
|
|
22
|
+
shellBefore
|
|
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);
|
|
25
|
+
const injectableTransform = new Transform({
|
|
26
|
+
transform(chunk, _encoding, callback) {
|
|
27
|
+
try {
|
|
28
|
+
if (isShellStream) {
|
|
29
|
+
this.push(joinChunk(shellBefore, chunk, shellAfter));
|
|
30
|
+
isShellStream = false;
|
|
31
|
+
} else {
|
|
32
|
+
this.push(chunk);
|
|
33
|
+
}
|
|
34
|
+
callback();
|
|
35
|
+
} catch (e) {
|
|
36
|
+
if (e instanceof Error) {
|
|
37
|
+
callback(e);
|
|
38
|
+
} else {
|
|
39
|
+
callback(new Error('Received unkown error when streaming'));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
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);
|
|
63
|
+
}
|
|
64
|
+
}));
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
return forUserPipe;
|
|
68
|
+
function joinChunk(before = '', chunk, after = '') {
|
|
69
|
+
return `${before}${chunk.toString()}${after}`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export default renderToPipe;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ServerStyleSheet } from 'styled-components';
|
|
2
|
+
export function getStyledComponentCss({
|
|
3
|
+
jsx
|
|
4
|
+
}) {
|
|
5
|
+
const sheet = new ServerStyleSheet();
|
|
6
|
+
const collectedJsx = sheet.collectStyles(jsx);
|
|
7
|
+
return {
|
|
8
|
+
styleSheet: sheet,
|
|
9
|
+
jsx: collectedJsx
|
|
10
|
+
};
|
|
11
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { buildShellAfterTemplate } from "./buildTemplate.after";
|
|
2
|
+
import { buildShellBeforeTemplate } from "./bulidTemplate.before";
|
|
3
|
+
const HTML_SEPARATOR = '<!--<?- html ?>-->';
|
|
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
|
|
17
|
+
};
|
|
18
|
+
};
|
|
File without changes
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
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; }
|
|
2
|
-
|
|
3
2
|
import React from 'react';
|
|
4
3
|
import ReactDomServer from 'react-dom/server';
|
|
5
4
|
import serialize from 'serialize-javascript';
|
|
6
5
|
import ReactHelmet from 'react-helmet';
|
|
6
|
+
import helmetReplace from "../helmet";
|
|
7
|
+
import { RenderLevel } from "../types";
|
|
8
|
+
import { time } from "../utils";
|
|
9
|
+
import prefetch from "../../prefetch";
|
|
7
10
|
import { toFragments } from "./template";
|
|
8
|
-
import { RenderLevel } from "./type";
|
|
9
|
-
import helmetReplace from "./helmet";
|
|
10
11
|
import { reduce } from "./reduce";
|
|
11
12
|
import * as loadableRenderer from "./loadable";
|
|
12
13
|
import * as styledComponentRenderer from "./styledComponent";
|
|
13
|
-
import { time } from "./measure";
|
|
14
|
-
|
|
15
14
|
const buildTemplateData = (context, data, renderLevel) => {
|
|
16
15
|
const {
|
|
17
16
|
request
|
|
@@ -32,25 +31,16 @@ const buildTemplateData = (context, data, renderLevel) => {
|
|
|
32
31
|
renderLevel
|
|
33
32
|
};
|
|
34
33
|
};
|
|
35
|
-
|
|
36
34
|
export default class Entry {
|
|
37
35
|
constructor(options) {
|
|
38
36
|
_defineProperty(this, "entryName", void 0);
|
|
39
|
-
|
|
40
37
|
_defineProperty(this, "result", void 0);
|
|
41
|
-
|
|
42
38
|
_defineProperty(this, "metrics", void 0);
|
|
43
|
-
|
|
44
39
|
_defineProperty(this, "logger", void 0);
|
|
45
|
-
|
|
46
40
|
_defineProperty(this, "App", void 0);
|
|
47
|
-
|
|
48
41
|
_defineProperty(this, "fragments", void 0);
|
|
49
|
-
|
|
50
42
|
_defineProperty(this, "pluginConfig", void 0);
|
|
51
|
-
|
|
52
43
|
_defineProperty(this, "host", void 0);
|
|
53
|
-
|
|
54
44
|
const {
|
|
55
45
|
ctx,
|
|
56
46
|
config
|
|
@@ -78,34 +68,24 @@ export default class Entry {
|
|
|
78
68
|
}
|
|
79
69
|
};
|
|
80
70
|
}
|
|
81
|
-
|
|
82
71
|
async renderToHtml(context) {
|
|
83
|
-
const
|
|
84
|
-
ssrContext
|
|
85
|
-
} = context;
|
|
86
|
-
|
|
72
|
+
const ssrContext = context.ssrContext;
|
|
87
73
|
if (ssrContext.redirection.url) {
|
|
88
74
|
return '';
|
|
89
75
|
}
|
|
90
|
-
|
|
91
76
|
const prefetchData = await this.prefetch(context);
|
|
92
|
-
|
|
93
77
|
if (ssrContext.redirection.url) {
|
|
94
78
|
return '';
|
|
95
79
|
}
|
|
96
|
-
|
|
97
80
|
if (this.result.renderLevel >= RenderLevel.SERVER_PREFETCH) {
|
|
98
81
|
this.result.html = this.renderToString(context);
|
|
99
82
|
}
|
|
100
|
-
|
|
101
83
|
if (ssrContext.redirection.url) {
|
|
102
84
|
return '';
|
|
103
85
|
}
|
|
104
|
-
|
|
105
86
|
let html = '';
|
|
106
87
|
const templateData = buildTemplateData(ssrContext, prefetchData, this.result.renderLevel);
|
|
107
88
|
const SSRData = this.getSSRDataScript(templateData);
|
|
108
|
-
|
|
109
89
|
for (const fragment of this.fragments) {
|
|
110
90
|
if (fragment.isVariable && fragment.content === 'SSRDataScript') {
|
|
111
91
|
html += fragment.getValue(SSRData);
|
|
@@ -113,22 +93,14 @@ export default class Entry {
|
|
|
113
93
|
html += fragment.getValue(this.result);
|
|
114
94
|
}
|
|
115
95
|
}
|
|
116
|
-
|
|
117
96
|
const helmetData = ReactHelmet.renderStatic();
|
|
118
97
|
return helmetData ? helmetReplace(html, helmetData) : html;
|
|
119
98
|
}
|
|
120
|
-
|
|
121
99
|
async prefetch(context) {
|
|
122
|
-
const {
|
|
123
|
-
App: {
|
|
124
|
-
prefetch
|
|
125
|
-
}
|
|
126
|
-
} = this;
|
|
127
100
|
let prefetchData;
|
|
128
101
|
const end = time();
|
|
129
|
-
|
|
130
102
|
try {
|
|
131
|
-
prefetchData =
|
|
103
|
+
prefetchData = await prefetch(this.App, context);
|
|
132
104
|
this.result.renderLevel = RenderLevel.SERVER_PREFETCH;
|
|
133
105
|
const prefetchCost = end();
|
|
134
106
|
this.logger.debug(`App Prefetch cost = %d ms`, prefetchCost);
|
|
@@ -138,17 +110,14 @@ export default class Entry {
|
|
|
138
110
|
this.logger.error('App Prefetch Render', e);
|
|
139
111
|
this.metrics.emitCounter('app.prefetch.render.error', 1);
|
|
140
112
|
}
|
|
141
|
-
|
|
142
113
|
return prefetchData || {};
|
|
143
114
|
}
|
|
144
|
-
|
|
145
115
|
renderToString(context) {
|
|
146
116
|
let html = '';
|
|
147
117
|
const end = time();
|
|
148
118
|
const {
|
|
149
119
|
ssrContext
|
|
150
120
|
} = context;
|
|
151
|
-
|
|
152
121
|
try {
|
|
153
122
|
const App = /*#__PURE__*/React.createElement(this.App, {
|
|
154
123
|
context: Object.assign(context, {
|
|
@@ -171,10 +140,8 @@ export default class Entry {
|
|
|
171
140
|
this.logger.error('App Render To HTML', e);
|
|
172
141
|
this.metrics.emitCounter('app.render.html.error', 1);
|
|
173
142
|
}
|
|
174
|
-
|
|
175
143
|
return html;
|
|
176
144
|
}
|
|
177
|
-
|
|
178
145
|
getSSRDataScript(templateData) {
|
|
179
146
|
return {
|
|
180
147
|
SSRDataScript: `
|
|
@@ -184,5 +151,4 @@ export default class Entry {
|
|
|
184
151
|
`
|
|
185
152
|
};
|
|
186
153
|
}
|
|
187
|
-
|
|
188
154
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { run } from '@modern-js/utils/ssr';
|
|
2
|
+
import { PreRender } from "../../react/prerender";
|
|
3
|
+
import { time } from "../utils";
|
|
4
|
+
import SSREntry from "./entry";
|
|
5
|
+
export const render = ({
|
|
6
|
+
App,
|
|
7
|
+
context,
|
|
8
|
+
config
|
|
9
|
+
}) => {
|
|
10
|
+
const ssrContext = context.ssrContext;
|
|
11
|
+
return run(ssrContext.request.headers, async () => {
|
|
12
|
+
const entry = new SSREntry({
|
|
13
|
+
ctx: ssrContext,
|
|
14
|
+
App,
|
|
15
|
+
config
|
|
16
|
+
});
|
|
17
|
+
entry.metrics.emitCounter('app.visit.count', 1);
|
|
18
|
+
const end = time();
|
|
19
|
+
const html = await entry.renderToHtml(context);
|
|
20
|
+
const cost = end();
|
|
21
|
+
entry.logger.info('App Render Total cost = %d ms', cost);
|
|
22
|
+
entry.metrics.emitTimer('app.render.cost', cost);
|
|
23
|
+
const cacheConfig = PreRender.config();
|
|
24
|
+
if (cacheConfig) {
|
|
25
|
+
context.ssrContext.cacheConfig = cacheConfig;
|
|
26
|
+
}
|
|
27
|
+
return html;
|
|
28
|
+
});
|
|
29
|
+
};
|
|
@@ -1,27 +1,12 @@
|
|
|
1
1
|
import { ChunkExtractor } from '@loadable/server';
|
|
2
|
-
import { isCrossOrigin } from "
|
|
3
|
-
|
|
2
|
+
import { isCrossOrigin } from "../../utils";
|
|
3
|
+
import { getLoadableScripts } from "../utils";
|
|
4
4
|
const extname = uri => {
|
|
5
5
|
if (typeof uri !== 'string' || !uri.includes('.')) {
|
|
6
6
|
return '';
|
|
7
7
|
}
|
|
8
|
-
|
|
9
8
|
return `.${uri === null || uri === void 0 ? void 0 : uri.split('.').pop()}` || '';
|
|
10
9
|
};
|
|
11
|
-
|
|
12
|
-
function getLoadableScripts(extractor) {
|
|
13
|
-
const check = scripts => (scripts || '').includes('__LOADABLE_REQUIRED_CHUNKS___ext');
|
|
14
|
-
|
|
15
|
-
const scripts = extractor.getScriptTags();
|
|
16
|
-
|
|
17
|
-
if (!check(scripts)) {
|
|
18
|
-
return '';
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return scripts.split('</script>') // 前两个 script为 loadable 必须的 script
|
|
22
|
-
.slice(0, 2).map(i => `${i}</script>`).join('');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
10
|
export const toHtml = (jsx, renderer, next) => {
|
|
26
11
|
const {
|
|
27
12
|
stats,
|
|
@@ -31,11 +16,9 @@ export const toHtml = (jsx, renderer, next) => {
|
|
|
31
16
|
host,
|
|
32
17
|
config = {}
|
|
33
18
|
} = renderer;
|
|
34
|
-
|
|
35
19
|
if (!stats || chunksMap.js) {
|
|
36
20
|
return next(jsx);
|
|
37
21
|
}
|
|
38
|
-
|
|
39
22
|
const extractor = new ChunkExtractor({
|
|
40
23
|
stats,
|
|
41
24
|
entrypoints: [renderer.entryName]
|
|
@@ -43,25 +26,20 @@ export const toHtml = (jsx, renderer, next) => {
|
|
|
43
26
|
const html = next(extractor.collectChunks(jsx));
|
|
44
27
|
const chunks = extractor.getChunkAssets(extractor.chunks);
|
|
45
28
|
chunksMap.js = (chunksMap.js || '') + getLoadableScripts(extractor);
|
|
46
|
-
|
|
47
29
|
for (const v of chunks) {
|
|
48
30
|
const fileType = extname(v.url).slice(1);
|
|
49
|
-
|
|
50
31
|
if (fileType === 'js') {
|
|
51
32
|
const props = [];
|
|
52
33
|
const {
|
|
53
34
|
crossorigin
|
|
54
35
|
} = config;
|
|
55
|
-
|
|
56
36
|
if (crossorigin && isCrossOrigin(v.url, host)) {
|
|
57
37
|
props.push(`crossorigin="${crossorigin === true ? 'anonymous' : crossorigin}"`);
|
|
58
38
|
}
|
|
59
|
-
|
|
60
39
|
chunksMap[fileType] += `<script src="${v.url}" ${props.join(' ')}></script>`;
|
|
61
40
|
} else if (fileType === 'css') {
|
|
62
41
|
chunksMap[fileType] += `<link href="${v.url}" rel="stylesheet" />`;
|
|
63
42
|
}
|
|
64
43
|
}
|
|
65
|
-
|
|
66
44
|
return html;
|
|
67
45
|
};
|
package/dist/js/modern/ssr/serverRender/{styledComponent.js → renderToString/styledComponent.js}
RENAMED
|
File without changes
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
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; }
|
|
2
|
-
|
|
3
2
|
const VARIABLE_REG_EXP = /<!--<\?([-=+])\s*(.*?)\s*\?>-->/;
|
|
4
3
|
const VARIABLE_SPLITTER = /(<!--<\?.*?\?>-->)/;
|
|
5
4
|
const ENCODE_HTML_RULES = {
|
|
@@ -10,27 +9,19 @@ const ENCODE_HTML_RULES = {
|
|
|
10
9
|
"'": '''
|
|
11
10
|
};
|
|
12
11
|
const MATCH_HTML = /[&<>'"]/g;
|
|
13
|
-
|
|
14
12
|
function encodeChar(c) {
|
|
15
13
|
return ENCODE_HTML_RULES[c] || c;
|
|
16
14
|
}
|
|
17
|
-
|
|
18
15
|
function escape(str) {
|
|
19
16
|
return str.replace(MATCH_HTML, encodeChar);
|
|
20
17
|
}
|
|
21
|
-
|
|
22
18
|
export class Fragment {
|
|
23
19
|
constructor(template) {
|
|
24
20
|
_defineProperty(this, "isVariable", void 0);
|
|
25
|
-
|
|
26
21
|
_defineProperty(this, "content", void 0);
|
|
27
|
-
|
|
28
22
|
_defineProperty(this, "filters", void 0);
|
|
29
|
-
|
|
30
23
|
_defineProperty(this, "path", void 0);
|
|
31
|
-
|
|
32
24
|
const match = VARIABLE_REG_EXP.exec(template);
|
|
33
|
-
|
|
34
25
|
if (match) {
|
|
35
26
|
const [, filterFlag, content] = match;
|
|
36
27
|
this.isVariable = true;
|
|
@@ -44,29 +35,23 @@ export class Fragment {
|
|
|
44
35
|
this.path = [];
|
|
45
36
|
}
|
|
46
37
|
}
|
|
47
|
-
|
|
48
38
|
getValue(data) {
|
|
49
39
|
if (this.isVariable) {
|
|
50
40
|
const value = this.path.reduce((p, n) => p != null ? p[n] : p, data);
|
|
51
41
|
return this.filters.reduce((p, n) => n(p), value != null ? value : '');
|
|
52
42
|
}
|
|
53
|
-
|
|
54
43
|
return this.content;
|
|
55
44
|
}
|
|
56
|
-
|
|
57
45
|
}
|
|
58
|
-
|
|
59
46
|
_defineProperty(Fragment, "filterMap", {
|
|
60
47
|
'=': escape,
|
|
61
48
|
'-': v => v
|
|
62
49
|
});
|
|
63
|
-
|
|
64
50
|
const fragmentListMap = {};
|
|
65
51
|
export function toFragments(template, entryName) {
|
|
66
52
|
if (fragmentListMap[entryName]) {
|
|
67
53
|
return fragmentListMap[entryName];
|
|
68
54
|
}
|
|
69
|
-
|
|
70
55
|
const fragmentList = template.split(VARIABLE_SPLITTER).filter(v => Boolean(v)).map(v => new Fragment(v));
|
|
71
56
|
fragmentListMap[entryName] = fragmentList;
|
|
72
57
|
return fragmentList;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function getLoadableScripts(extractor) {
|
|
2
|
+
const check = scripts => (scripts || '').includes('__LOADABLE_REQUIRED_CHUNKS___ext');
|
|
3
|
+
const scripts = extractor.getScriptTags();
|
|
4
|
+
if (!check(scripts)) {
|
|
5
|
+
return '';
|
|
6
|
+
}
|
|
7
|
+
return scripts.split('</script>')
|
|
8
|
+
// 前两个 script为 loadable 必须的 script
|
|
9
|
+
.slice(0, 2).map(i => `${i}</script>`).join('');
|
|
10
|
+
}
|
|
11
|
+
const getLatency = hrtime => {
|
|
12
|
+
const [s, ns] = process.hrtime(hrtime);
|
|
13
|
+
return s * 1e3 + ns / 1e6;
|
|
14
|
+
};
|
|
15
|
+
export const time = () => {
|
|
16
|
+
const hrtime = process.hrtime();
|
|
17
|
+
return () => {
|
|
18
|
+
return getLatency(hrtime);
|
|
19
|
+
};
|
|
20
|
+
};
|