@modern-js/runtime 2.54.6 → 2.56.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/dist/cjs/{ssr/serverRender/renderToString/index.js → cli/alias.js} +29 -18
- package/dist/cjs/cli/code.js +124 -0
- package/dist/cjs/cli/constants.js +23 -2
- package/dist/cjs/cli/index.js +91 -17
- package/dist/cjs/cli/ssr/index.js +137 -0
- package/dist/cjs/cli/template.js +101 -0
- package/dist/cjs/cli/template.server.js +71 -0
- package/dist/cjs/core/browser/hydrate.js +116 -0
- package/dist/cjs/core/browser/index.js +142 -0
- package/dist/cjs/core/compatible.js +39 -74
- package/dist/cjs/{ssr/serverRender/types.js → core/constants.js} +3 -3
- package/dist/cjs/core/context/index.js +39 -2
- package/dist/cjs/core/context/runtime.js +3 -3
- package/dist/cjs/core/loader/useLoader.js +2 -2
- package/dist/cjs/core/plugin/base.js +0 -4
- package/dist/cjs/core/plugin/index.js +6 -0
- package/dist/cjs/core/react/index.js +51 -0
- package/dist/cjs/{ssr/serverRender → core/server}/helmet.js +11 -2
- package/dist/cjs/core/server/index.js +38 -0
- package/dist/cjs/core/server/requestHandler.js +156 -0
- package/dist/cjs/core/server/server.js +34 -0
- package/dist/cjs/{ssr/serverRender/renderToStream/buildTemplate.share.js → core/server/shared.js} +7 -10
- package/dist/cjs/core/server/stream/afterTemplate.js +80 -0
- package/dist/cjs/{ssr/serverRender/renderToStream/bulidTemplate.before.js → core/server/stream/beforeTemplate.js} +11 -12
- package/dist/cjs/core/server/stream/createReadableStream.js +124 -0
- package/dist/cjs/core/server/stream/createReadableStream.worker.js +105 -0
- package/dist/cjs/core/server/stream/index.js +30 -0
- package/dist/cjs/core/server/stream/shared.js +112 -0
- package/dist/cjs/{ssr/serverRender/renderToStream → core/server/stream}/template.js +6 -10
- package/dist/cjs/core/server/string/index.js +152 -0
- package/dist/cjs/{ssr/serverRender/renderToString → core/server/string}/loadable.js +9 -12
- package/dist/cjs/core/server/string/prefetch.js +112 -0
- package/dist/cjs/core/server/string/ssrData.js +100 -0
- package/dist/cjs/core/server/string/styledComponent.js +53 -0
- package/dist/cjs/core/server/string/types.js +16 -0
- package/dist/cjs/core/server/tracer.js +60 -0
- package/dist/cjs/{ssr/serverRender → core/server}/utils.js +48 -2
- package/dist/cjs/{ssr/serverRender/renderToString/styledComponent.js → core/utils/merge.js} +28 -19
- package/dist/cjs/router/cli/code/index.js +12 -8
- package/dist/cjs/router/cli/code/templates.js +58 -3
- package/dist/cjs/router/cli/constants.js +6 -0
- package/dist/cjs/router/cli/entry.js +16 -17
- package/dist/cjs/router/cli/handler.js +22 -5
- package/dist/cjs/router/cli/index.js +29 -56
- package/dist/cjs/router/runtime/PrefetchLink.js +1 -1
- package/dist/cjs/router/runtime/index.js +2 -0
- package/dist/cjs/router/runtime/plugin.js +13 -40
- package/dist/cjs/router/runtime/plugin.node.js +24 -46
- package/dist/cjs/state/cli/index.js +7 -35
- package/dist/cjs/state/runtime/plugin.js +6 -15
- package/dist/esm/cli/alias.js +30 -0
- package/dist/esm/cli/code.js +131 -0
- package/dist/esm/cli/constants.js +15 -1
- package/dist/esm/cli/index.js +110 -18
- package/dist/esm/{ssr/cli → cli/ssr}/babel-plugin-ssr-loader-id.js +1 -1
- package/dist/esm/cli/ssr/index.js +127 -0
- package/dist/esm/{ssr/cli → cli/ssr}/loadable-bundler-plugin.js +1 -1
- package/dist/esm/cli/template.js +53 -0
- package/dist/esm/cli/template.server.js +26 -0
- package/dist/esm/core/browser/hydrate.js +88 -0
- package/dist/esm/core/browser/index.js +242 -0
- package/dist/esm/core/compatible.js +48 -90
- package/dist/esm/core/context/index.js +32 -1
- package/dist/esm/core/context/runtime.js +3 -2
- package/dist/esm/core/loader/useLoader.js +2 -2
- package/dist/esm/core/plugin/base.js +0 -4
- package/dist/esm/core/plugin/index.js +10 -0
- package/dist/esm/core/react/index.js +31 -0
- package/dist/esm/{ssr/serverRender → core/server}/helmet.js +10 -2
- package/dist/esm/core/server/index.js +16 -0
- package/dist/esm/core/server/react/prerender/type.js +0 -0
- package/dist/esm/core/server/requestHandler.js +181 -0
- package/dist/esm/core/server/server.js +8 -0
- package/dist/esm/core/server/shared.js +10 -0
- package/dist/esm/core/server/stream/afterTemplate.js +60 -0
- package/dist/esm/{ssr/serverRender/renderToStream/bulidTemplate.before.js → core/server/stream/beforeTemplate.js} +10 -11
- package/dist/esm/{ssr/serverRender/renderToStream/renderToPipe.js → core/server/stream/createReadableStream.js} +43 -38
- package/dist/esm/core/server/stream/createReadableStream.worker.js +142 -0
- package/dist/esm/core/server/stream/index.js +6 -0
- package/dist/esm/core/server/stream/shared.js +102 -0
- package/dist/esm/core/server/stream/template.js +42 -0
- package/dist/esm/core/server/string/index.js +219 -0
- package/dist/esm/{ssr/serverRender/renderToString → core/server/string}/loadable.js +10 -13
- package/dist/esm/{ssr → core/server/string}/prefetch.js +28 -22
- package/dist/esm/core/server/string/ssrData.js +83 -0
- package/dist/esm/core/server/string/styledComponent.js +34 -0
- package/dist/esm/core/server/string/types.js +0 -0
- package/dist/esm/core/server/tracer.js +34 -0
- package/dist/esm/core/server/utils.js +83 -0
- package/dist/esm/core/utils/merge.js +32 -0
- package/dist/esm/router/cli/code/index.js +13 -10
- package/dist/esm/router/cli/code/templates.js +100 -7
- package/dist/esm/router/cli/constants.js +4 -0
- package/dist/esm/router/cli/entry.js +19 -19
- package/dist/esm/router/cli/handler.js +70 -8
- package/dist/esm/router/cli/index.js +52 -65
- package/dist/esm/router/runtime/PrefetchLink.js +1 -1
- package/dist/esm/router/runtime/index.js +1 -0
- package/dist/esm/router/runtime/plugin.js +12 -20
- package/dist/esm/router/runtime/plugin.node.js +26 -82
- package/dist/esm/state/cli/index.js +9 -38
- package/dist/esm/state/runtime/plugin.js +5 -5
- package/dist/esm-node/cli/alias.js +28 -0
- package/dist/esm-node/cli/code.js +90 -0
- package/dist/esm-node/cli/constants.js +15 -1
- package/dist/esm-node/cli/index.js +83 -13
- package/dist/esm-node/{ssr/cli → cli/ssr}/babel-plugin-ssr-loader-id.js +1 -1
- package/dist/esm-node/cli/ssr/index.js +103 -0
- package/dist/esm-node/{ssr/cli → cli/ssr}/loadable-bundler-plugin.js +1 -1
- package/dist/esm-node/cli/template.js +64 -0
- package/dist/esm-node/cli/template.server.js +47 -0
- package/dist/esm-node/core/browser/hydrate.js +81 -0
- package/dist/esm-node/core/browser/index.js +108 -0
- package/dist/esm-node/core/compatible.js +39 -74
- package/dist/esm-node/core/context/index.js +32 -1
- package/dist/esm-node/core/context/runtime.js +3 -3
- package/dist/esm-node/core/loader/useLoader.js +2 -2
- package/dist/esm-node/core/plugin/base.js +0 -4
- package/dist/esm-node/core/plugin/index.js +5 -0
- package/dist/esm-node/core/react/index.js +27 -0
- package/dist/esm-node/{ssr/serverRender → core/server}/helmet.js +6 -2
- package/dist/esm-node/core/server/index.js +12 -0
- package/dist/esm-node/core/server/requestHandler.js +132 -0
- package/dist/esm-node/core/server/server.js +8 -0
- package/dist/esm-node/core/server/shared.js +6 -0
- package/dist/esm-node/core/server/stream/afterTemplate.js +56 -0
- package/dist/esm-node/{ssr/serverRender/renderToStream/bulidTemplate.before.js → core/server/stream/beforeTemplate.js} +8 -9
- package/dist/esm-node/{ssr/serverRender/renderToStream/renderToPipe.js → core/server/stream/createReadableStream.js} +41 -35
- package/dist/esm-node/core/server/stream/createReadableStream.worker.js +71 -0
- package/dist/esm-node/core/server/stream/index.js +6 -0
- package/dist/esm-node/core/server/stream/shared.js +75 -0
- package/dist/esm-node/core/server/stream/template.js +15 -0
- package/dist/esm-node/core/server/string/index.js +118 -0
- package/dist/esm-node/{ssr/serverRender/renderToString → core/server/string}/loadable.js +8 -11
- package/dist/esm-node/core/server/string/prefetch.js +78 -0
- package/dist/esm-node/core/server/string/ssrData.js +76 -0
- package/dist/esm-node/core/server/string/styledComponent.js +29 -0
- package/dist/esm-node/core/server/tracer.js +33 -0
- package/dist/esm-node/core/server/utils.js +60 -0
- package/dist/esm-node/core/utils/merge.js +29 -0
- package/dist/esm-node/router/cli/code/index.js +10 -7
- package/dist/esm-node/router/cli/code/templates.js +60 -6
- package/dist/esm-node/router/cli/constants.js +4 -0
- package/dist/esm-node/router/cli/entry.js +16 -17
- package/dist/esm-node/router/cli/handler.js +21 -5
- package/dist/esm-node/router/cli/index.js +31 -58
- package/dist/esm-node/router/runtime/PrefetchLink.js +1 -1
- package/dist/esm-node/router/runtime/index.js +1 -0
- package/dist/esm-node/router/runtime/plugin.js +13 -30
- package/dist/esm-node/router/runtime/plugin.node.js +25 -46
- package/dist/esm-node/state/cli/index.js +8 -36
- package/dist/esm-node/state/runtime/plugin.js +5 -5
- package/dist/types/cli/alias.d.ts +7 -0
- package/dist/types/cli/code.d.ts +10 -0
- package/dist/types/cli/constants.d.ts +7 -0
- package/dist/types/cli/index.d.ts +8 -1
- package/dist/types/cli/template.d.ts +27 -0
- package/dist/types/cli/template.server.d.ts +15 -0
- package/dist/types/common.d.ts +9 -0
- package/dist/types/core/browser/hydrate.d.ts +5 -0
- package/dist/types/core/browser/index.d.ts +3 -0
- package/dist/types/core/config.d.ts +5 -6
- package/dist/types/core/constants.d.ts +5 -0
- package/dist/types/core/context/index.d.ts +34 -1
- package/dist/types/core/context/runtime.d.ts +2 -2
- package/dist/types/core/plugin/base.d.ts +3 -33
- package/dist/types/core/plugin/index.d.ts +2 -11
- package/dist/types/core/plugin/runner.d.ts +1 -11
- package/dist/types/core/react/index.d.ts +6 -0
- package/dist/types/core/server/helmet.d.ts +3 -0
- package/dist/types/core/server/index.d.ts +4 -0
- package/dist/types/core/server/requestHandler.d.ts +11 -0
- package/dist/types/core/server/server.d.ts +4 -0
- package/dist/types/core/server/shared.d.ts +9 -0
- package/dist/types/core/server/stream/afterTemplate.d.ts +12 -0
- package/dist/types/core/server/stream/beforeTemplate.d.ts +8 -0
- package/dist/types/core/server/stream/createReadableStream.d.ts +2 -0
- package/dist/types/core/server/stream/createReadableStream.worker.d.ts +2 -0
- package/dist/types/core/server/stream/index.d.ts +1 -0
- package/dist/types/core/server/stream/shared.d.ts +22 -0
- package/dist/types/core/server/stream/template.d.ts +9 -0
- package/dist/types/core/server/string/index.d.ts +2 -0
- package/dist/types/core/server/string/loadable.d.ts +35 -0
- package/dist/types/core/server/string/prefetch.d.ts +16 -0
- package/dist/types/core/server/string/ssrData.d.ts +18 -0
- package/dist/types/core/server/string/styledComponent.d.ts +11 -0
- package/dist/types/core/server/string/types.d.ts +12 -0
- package/dist/types/core/server/tracer.d.ts +21 -0
- package/dist/types/core/server/utils.d.ts +19 -0
- package/dist/types/core/types.d.ts +35 -1
- package/dist/types/core/utils/merge.d.ts +6 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/router/cli/code/index.d.ts +3 -4
- package/dist/types/router/cli/code/templates.d.ts +9 -1
- package/dist/types/router/cli/constants.d.ts +2 -0
- package/dist/types/router/cli/handler.d.ts +1 -0
- package/dist/types/router/runtime/index.d.ts +1 -0
- package/dist/types/router/runtime/plugin.d.ts +1 -1
- package/dist/types/router/runtime/plugin.node.d.ts +1 -3
- package/dist/types/router/runtime/types.d.ts +1 -2
- package/dist/types/state/runtime/plugin.d.ts +2 -2
- package/package.json +52 -45
- package/types/router.d.ts +7 -2
- package/dist/cjs/ssr/cli/index.js +0 -200
- package/dist/cjs/ssr/index.js +0 -183
- package/dist/cjs/ssr/index.node.js +0 -86
- package/dist/cjs/ssr/prefetch.js +0 -92
- package/dist/cjs/ssr/serverRender/index.js +0 -39
- package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +0 -74
- package/dist/cjs/ssr/serverRender/renderToStream/index.js +0 -74
- package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.js +0 -104
- package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.worker.js +0 -108
- package/dist/cjs/ssr/serverRender/renderToString/buildHtml.js +0 -52
- package/dist/cjs/ssr/serverRender/renderToString/entry.js +0 -179
- package/dist/cjs/ssr/serverRender/renderToString/render.js +0 -61
- package/dist/cjs/ssr/serverRender/tracker.js +0 -113
- package/dist/cjs/ssr/utils.js +0 -94
- package/dist/esm/ssr/cli/index.js +0 -194
- package/dist/esm/ssr/index.js +0 -169
- package/dist/esm/ssr/index.node.js +0 -78
- package/dist/esm/ssr/serverRender/index.js +0 -55
- package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.js +0 -48
- package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.share.js +0 -12
- package/dist/esm/ssr/serverRender/renderToStream/index.js +0 -49
- package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.worker.js +0 -164
- package/dist/esm/ssr/serverRender/renderToStream/template.js +0 -46
- package/dist/esm/ssr/serverRender/renderToString/buildHtml.js +0 -34
- package/dist/esm/ssr/serverRender/renderToString/entry.js +0 -257
- package/dist/esm/ssr/serverRender/renderToString/index.js +0 -34
- package/dist/esm/ssr/serverRender/renderToString/render.js +0 -55
- package/dist/esm/ssr/serverRender/renderToString/styledComponent.js +0 -25
- package/dist/esm/ssr/serverRender/tracker.js +0 -82
- package/dist/esm/ssr/serverRender/utils.js +0 -21
- package/dist/esm/ssr/utils.js +0 -59
- package/dist/esm-node/ssr/cli/index.js +0 -166
- package/dist/esm-node/ssr/index.js +0 -147
- package/dist/esm-node/ssr/index.node.js +0 -50
- package/dist/esm-node/ssr/prefetch.js +0 -72
- package/dist/esm-node/ssr/serverRender/index.js +0 -19
- package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.js +0 -50
- package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.share.js +0 -8
- package/dist/esm-node/ssr/serverRender/renderToStream/index.js +0 -40
- package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.worker.js +0 -88
- package/dist/esm-node/ssr/serverRender/renderToStream/template.js +0 -19
- package/dist/esm-node/ssr/serverRender/renderToString/buildHtml.js +0 -24
- package/dist/esm-node/ssr/serverRender/renderToString/entry.js +0 -149
- package/dist/esm-node/ssr/serverRender/renderToString/index.js +0 -17
- package/dist/esm-node/ssr/serverRender/renderToString/render.js +0 -27
- package/dist/esm-node/ssr/serverRender/renderToString/styledComponent.js +0 -20
- package/dist/esm-node/ssr/serverRender/tracker.js +0 -87
- package/dist/esm-node/ssr/serverRender/utils.js +0 -17
- package/dist/esm-node/ssr/utils.js +0 -57
- package/dist/types/ssr/index.d.ts +0 -11
- package/dist/types/ssr/index.node.d.ts +0 -5
- package/dist/types/ssr/prefetch.d.ts +0 -16
- package/dist/types/ssr/serverRender/helmet.d.ts +0 -2
- package/dist/types/ssr/serverRender/index.d.ts +0 -2
- package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +0 -7
- package/dist/types/ssr/serverRender/renderToStream/buildTemplate.share.d.ts +0 -3
- package/dist/types/ssr/serverRender/renderToStream/bulidTemplate.before.d.ts +0 -2
- package/dist/types/ssr/serverRender/renderToStream/index.d.ts +0 -3
- package/dist/types/ssr/serverRender/renderToStream/renderToPipe.d.ts +0 -7
- package/dist/types/ssr/serverRender/renderToStream/renderToPipe.worker.d.ts +0 -12
- package/dist/types/ssr/serverRender/renderToStream/template.d.ts +0 -6
- package/dist/types/ssr/serverRender/renderToString/buildHtml.d.ts +0 -6
- package/dist/types/ssr/serverRender/renderToString/entry.d.ts +0 -24
- package/dist/types/ssr/serverRender/renderToString/index.d.ts +0 -2
- package/dist/types/ssr/serverRender/renderToString/loadable.d.ts +0 -26
- package/dist/types/ssr/serverRender/renderToString/render.d.ts +0 -16
- package/dist/types/ssr/serverRender/renderToString/styledComponent.d.ts +0 -15
- package/dist/types/ssr/serverRender/tracker.d.ts +0 -20
- package/dist/types/ssr/serverRender/types.d.ts +0 -49
- package/dist/types/ssr/serverRender/utils.d.ts +0 -9
- package/dist/types/ssr/utils.d.ts +0 -10
- /package/dist/cjs/{ssr/cli → cli/ssr}/babel-plugin-ssr-loader-id.js +0 -0
- /package/dist/cjs/{ssr/cli → cli/ssr}/loadable-bundler-plugin.js +0 -0
- /package/dist/cjs/{ssr/react/withCallback/index.js → core/browser/withCallback.js} +0 -0
- /package/dist/cjs/{ssr/serverRender → core/server}/constants.js +0 -0
- /package/dist/cjs/{ssr → core/server}/react/index.js +0 -0
- /package/dist/cjs/{ssr → core/server}/react/nossr/index.js +0 -0
- /package/dist/cjs/{ssr → core/server}/react/prerender/index.js +0 -0
- /package/dist/cjs/{ssr → core/server}/react/prerender/type.js +0 -0
- /package/dist/cjs/{ssr → core/server}/react/prerender/util.js +0 -0
- /package/dist/esm/{ssr/react/withCallback/index.js → core/browser/withCallback.js} +0 -0
- /package/dist/esm/{ssr/serverRender/types.js → core/constants.js} +0 -0
- /package/dist/esm/{ssr/serverRender → core/server}/constants.js +0 -0
- /package/dist/esm/{ssr → core/server}/react/index.js +0 -0
- /package/dist/esm/{ssr → core/server}/react/nossr/index.js +0 -0
- /package/dist/esm/{ssr → core/server}/react/prerender/index.js +0 -0
- /package/dist/esm/{ssr → core/server}/react/prerender/util.js +0 -0
- /package/dist/esm-node/{ssr/react/withCallback/index.js → core/browser/withCallback.js} +0 -0
- /package/dist/esm-node/{ssr/serverRender/types.js → core/constants.js} +0 -0
- /package/dist/esm-node/{ssr/serverRender → core/server}/constants.js +0 -0
- /package/dist/esm-node/{ssr → core/server}/react/index.js +0 -0
- /package/dist/esm-node/{ssr → core/server}/react/nossr/index.js +0 -0
- /package/dist/esm-node/{ssr → core/server}/react/prerender/index.js +0 -0
- /package/dist/esm-node/{ssr → core/server}/react/prerender/type.js +0 -0
- /package/dist/esm-node/{ssr → core/server}/react/prerender/util.js +0 -0
- /package/dist/{esm/ssr/react/prerender/type.js → esm-node/core/server/string/types.js} +0 -0
- /package/dist/types/{ssr/cli → cli/ssr}/babel-plugin-ssr-loader-id.d.ts +0 -0
- /package/dist/types/{ssr/cli → cli/ssr}/index.d.ts +0 -0
- /package/dist/types/{ssr/cli → cli/ssr}/loadable-bundler-plugin.d.ts +0 -0
- /package/dist/types/{ssr/react/withCallback/index.d.ts → core/browser/withCallback.d.ts} +0 -0
- /package/dist/types/{ssr/serverRender → core/server}/constants.d.ts +0 -0
- /package/dist/types/{ssr → core/server}/react/index.d.ts +0 -0
- /package/dist/types/{ssr → core/server}/react/nossr/index.d.ts +0 -0
- /package/dist/types/{ssr → core/server}/react/prerender/index.d.ts +0 -0
- /package/dist/types/{ssr → core/server}/react/prerender/type.d.ts +0 -0
- /package/dist/types/{ssr → core/server}/react/prerender/util.d.ts +0 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { MAIN_ENTRY_NAME, fs } from "@modern-js/utils";
|
|
3
|
+
import { INDEX_FILE_NAME, ENTRY_BOOTSTRAP_FILE_NAME, ENTRY_POINT_FILE_NAME, ENTRY_POINT_REGISTER_FILE_NAME, ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME, ENTRY_POINT_RUNTIME_REGISTER_FILE_NAME, SERVER_ENTRY_POINT_FILE_NAME } from "./constants";
|
|
4
|
+
import * as template from "./template";
|
|
5
|
+
import * as serverTemplate from "./template.server";
|
|
6
|
+
function getSSRMode(entry = MAIN_ENTRY_NAME, config) {
|
|
7
|
+
const { ssr, ssrByEntries } = config.server;
|
|
8
|
+
if (config.output.ssg) {
|
|
9
|
+
return "string";
|
|
10
|
+
}
|
|
11
|
+
return checkSSRMode((ssrByEntries === null || ssrByEntries === void 0 ? void 0 : ssrByEntries[entry]) || ssr);
|
|
12
|
+
function checkSSRMode(ssr2) {
|
|
13
|
+
if (!ssr2) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
if (typeof ssr2 === "boolean") {
|
|
17
|
+
return ssr2 ? "string" : false;
|
|
18
|
+
}
|
|
19
|
+
return ssr2.mode === "stream" ? "stream" : "string";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const generateCode = async (entrypoints, appContext, config, onCollectRuntimePlugins) => {
|
|
23
|
+
const { mountId } = config.html;
|
|
24
|
+
const { enableAsyncEntry } = config.source;
|
|
25
|
+
const { runtimeConfigFile, internalDirectory, internalSrcAlias, metaName, srcDirectory } = appContext;
|
|
26
|
+
await Promise.all(entrypoints.map(async (entrypoint) => {
|
|
27
|
+
const { entryName, isAutoMount, entry, customEntry, customBootstrap, customServerEntry } = entrypoint;
|
|
28
|
+
const { plugins: runtimePlugins } = await onCollectRuntimePlugins({
|
|
29
|
+
entrypoint,
|
|
30
|
+
plugins: []
|
|
31
|
+
});
|
|
32
|
+
if (isAutoMount) {
|
|
33
|
+
const indexCode = template.index({
|
|
34
|
+
srcDirectory,
|
|
35
|
+
internalSrcAlias,
|
|
36
|
+
metaName,
|
|
37
|
+
entry,
|
|
38
|
+
entryName,
|
|
39
|
+
customEntry,
|
|
40
|
+
customBootstrap,
|
|
41
|
+
mountId
|
|
42
|
+
});
|
|
43
|
+
const indexFile = path.resolve(internalDirectory, `./${entryName}/${ENTRY_POINT_FILE_NAME}`);
|
|
44
|
+
fs.outputFileSync(indexFile, indexCode, "utf8");
|
|
45
|
+
if (enableAsyncEntry) {
|
|
46
|
+
const bootstrapFile = path.resolve(internalDirectory, `./${entryName}/${ENTRY_BOOTSTRAP_FILE_NAME}`);
|
|
47
|
+
fs.outputFileSync(bootstrapFile, `import('./${INDEX_FILE_NAME}');`, "utf8");
|
|
48
|
+
}
|
|
49
|
+
const ssrMode = getSSRMode(entryName, config);
|
|
50
|
+
if (ssrMode) {
|
|
51
|
+
const indexServerCode = serverTemplate.serverIndex({
|
|
52
|
+
entry,
|
|
53
|
+
entryName,
|
|
54
|
+
internalSrcAlias,
|
|
55
|
+
metaName,
|
|
56
|
+
mode: ssrMode,
|
|
57
|
+
customServerEntry,
|
|
58
|
+
srcDirectory
|
|
59
|
+
});
|
|
60
|
+
const indexServerFile = path.resolve(internalDirectory, `./${entryName}/${SERVER_ENTRY_POINT_FILE_NAME}`);
|
|
61
|
+
fs.outputFileSync(indexServerFile, indexServerCode, "utf8");
|
|
62
|
+
}
|
|
63
|
+
const registerCode = template.register();
|
|
64
|
+
const registerFile = path.resolve(internalDirectory, `./${entryName}/${ENTRY_POINT_REGISTER_FILE_NAME}`);
|
|
65
|
+
fs.outputFileSync(registerFile, registerCode, "utf8");
|
|
66
|
+
const registerRuntimeCode = template.runtimeRegister({
|
|
67
|
+
entryName,
|
|
68
|
+
srcDirectory,
|
|
69
|
+
internalSrcAlias,
|
|
70
|
+
metaName,
|
|
71
|
+
runtimeConfigFile,
|
|
72
|
+
runtimePlugins
|
|
73
|
+
});
|
|
74
|
+
const registerRuntimeFile = path.resolve(internalDirectory, `./${entryName}/${ENTRY_POINT_RUNTIME_REGISTER_FILE_NAME}`);
|
|
75
|
+
fs.outputFileSync(registerRuntimeFile, registerRuntimeCode, "utf8");
|
|
76
|
+
const contextCode = template.runtimeGlobalContext({
|
|
77
|
+
srcDirectory,
|
|
78
|
+
internalSrcAlias,
|
|
79
|
+
metaName,
|
|
80
|
+
entry,
|
|
81
|
+
customEntry
|
|
82
|
+
});
|
|
83
|
+
const contextFile = path.resolve(internalDirectory, `./${entryName}/${ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME}`);
|
|
84
|
+
fs.outputFileSync(contextFile, contextCode, "utf8");
|
|
85
|
+
}
|
|
86
|
+
}));
|
|
87
|
+
};
|
|
88
|
+
export {
|
|
89
|
+
generateCode
|
|
90
|
+
};
|
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
const APP_FILE_NAME = "App";
|
|
2
|
+
const ENTRY_POINT_FILE_NAME = "index.jsx";
|
|
3
|
+
const SERVER_ENTRY_POINT_FILE_NAME = "index.server.jsx";
|
|
4
|
+
const INDEX_FILE_NAME = "index";
|
|
5
|
+
const ENTRY_BOOTSTRAP_FILE_NAME = "bootstrap.jsx";
|
|
6
|
+
const ENTRY_POINT_RUNTIME_REGISTER_FILE_NAME = "runtime-register.js";
|
|
7
|
+
const ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME = "runtime-global-context.js";
|
|
8
|
+
const ENTRY_POINT_REGISTER_FILE_NAME = "register.js";
|
|
2
9
|
export {
|
|
3
|
-
APP_FILE_NAME
|
|
10
|
+
APP_FILE_NAME,
|
|
11
|
+
ENTRY_BOOTSTRAP_FILE_NAME,
|
|
12
|
+
ENTRY_POINT_FILE_NAME,
|
|
13
|
+
ENTRY_POINT_REGISTER_FILE_NAME,
|
|
14
|
+
ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME,
|
|
15
|
+
ENTRY_POINT_RUNTIME_REGISTER_FILE_NAME,
|
|
16
|
+
INDEX_FILE_NAME,
|
|
17
|
+
SERVER_ENTRY_POINT_FILE_NAME
|
|
4
18
|
};
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { isReact18 as checkIsReact18, cleanRequireCache, createRuntimeExportsUtils } from "@modern-js/utils";
|
|
2
3
|
import { statePlugin } from "../state/cli";
|
|
3
|
-
import { ssrPlugin } from "../ssr/cli";
|
|
4
4
|
import { routerPlugin } from "../router/cli";
|
|
5
5
|
import { documentPlugin } from "../document/cli";
|
|
6
|
+
import { ssrPlugin } from "./ssr";
|
|
6
7
|
import { isRuntimeEntry } from "./entry";
|
|
8
|
+
import { ENTRY_BOOTSTRAP_FILE_NAME, ENTRY_POINT_FILE_NAME } from "./constants";
|
|
9
|
+
import { generateCode } from "./code";
|
|
10
|
+
import { builderPluginAlias } from "./alias";
|
|
7
11
|
import { isRuntimeEntry as isRuntimeEntry2 } from "./entry";
|
|
8
|
-
const runtimePlugin = () => ({
|
|
12
|
+
const runtimePlugin = (params) => ({
|
|
9
13
|
name: "@modern-js/runtime",
|
|
10
14
|
post: [
|
|
11
15
|
"@modern-js/plugin-ssr",
|
|
@@ -15,23 +19,58 @@ const runtimePlugin = () => ({
|
|
|
15
19
|
"@modern-js/plugin-design-token"
|
|
16
20
|
],
|
|
17
21
|
// the order of runtime plugins is affected by runtime hooks, mainly `init` and `hoc` hooks
|
|
18
|
-
usePlugins: [
|
|
22
|
+
usePlugins: (params === null || params === void 0 ? void 0 : params.plugins) || [
|
|
19
23
|
ssrPlugin(),
|
|
20
|
-
statePlugin(),
|
|
21
24
|
routerPlugin(),
|
|
25
|
+
statePlugin(),
|
|
22
26
|
documentPlugin()
|
|
23
27
|
],
|
|
24
28
|
setup: (api) => {
|
|
25
29
|
return {
|
|
26
|
-
checkEntryPoint({ path, entry }) {
|
|
30
|
+
checkEntryPoint({ path: path2, entry }) {
|
|
27
31
|
return {
|
|
28
|
-
path,
|
|
29
|
-
entry: entry || isRuntimeEntry(
|
|
32
|
+
path: path2,
|
|
33
|
+
entry: entry || isRuntimeEntry(path2)
|
|
30
34
|
};
|
|
31
35
|
},
|
|
36
|
+
modifyEntrypoints({ entrypoints }) {
|
|
37
|
+
const { internalDirectory } = api.useAppContext();
|
|
38
|
+
const { source: { enableAsyncEntry } } = api.useResolvedConfigContext();
|
|
39
|
+
const newEntryPoints = entrypoints.map((entrypoint) => {
|
|
40
|
+
if (entrypoint.isAutoMount) {
|
|
41
|
+
entrypoint.internalEntry = path.resolve(internalDirectory, `./${entrypoint.entryName}/${enableAsyncEntry ? ENTRY_BOOTSTRAP_FILE_NAME : ENTRY_POINT_FILE_NAME}`);
|
|
42
|
+
}
|
|
43
|
+
return entrypoint;
|
|
44
|
+
});
|
|
45
|
+
return {
|
|
46
|
+
entrypoints: newEntryPoints
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
async generateEntryCode({ entrypoints }) {
|
|
50
|
+
const appContext = api.useAppContext();
|
|
51
|
+
const resolvedConfig = api.useResolvedConfigContext();
|
|
52
|
+
const runners = api.useHookRunners();
|
|
53
|
+
await generateCode(entrypoints, appContext, resolvedConfig, runners._internalRuntimePlugins);
|
|
54
|
+
},
|
|
55
|
+
/* Note that the execution time of the config hook is before prepare.
|
|
56
|
+
/* This means that the entry information cannot be obtained in the config hook.
|
|
57
|
+
/* Therefore, aliases cannot be set directly in the config.
|
|
58
|
+
*/
|
|
59
|
+
prepare() {
|
|
60
|
+
const { builder, entrypoints, internalDirectory, metaName } = api.useAppContext();
|
|
61
|
+
builder === null || builder === void 0 ? void 0 : builder.addPlugins([
|
|
62
|
+
builderPluginAlias({
|
|
63
|
+
entrypoints,
|
|
64
|
+
internalDirectory,
|
|
65
|
+
metaName
|
|
66
|
+
})
|
|
67
|
+
]);
|
|
68
|
+
},
|
|
32
69
|
config() {
|
|
33
|
-
const
|
|
34
|
-
|
|
70
|
+
const { appDirectory, metaName, internalDirectory } = api.useAppContext();
|
|
71
|
+
const isReact18 = checkIsReact18(appDirectory);
|
|
72
|
+
process.env.IS_REACT18 = isReact18.toString();
|
|
73
|
+
const pluginsExportsUtils = createRuntimeExportsUtils(internalDirectory, "plugins");
|
|
35
74
|
return {
|
|
36
75
|
runtime: {},
|
|
37
76
|
runtimeByEntries: {},
|
|
@@ -42,7 +81,11 @@ const runtimePlugin = () => ({
|
|
|
42
81
|
* But it will not be installed under the user project.
|
|
43
82
|
* So need to add alias
|
|
44
83
|
*/
|
|
45
|
-
"styled-components": require.resolve("styled-components")
|
|
84
|
+
"styled-components": require.resolve("styled-components"),
|
|
85
|
+
/**
|
|
86
|
+
* Compatible with the reference path of the old version of the plugin.
|
|
87
|
+
*/
|
|
88
|
+
[`@${metaName}/runtime/plugins`]: pluginsExportsUtils.getPath()
|
|
46
89
|
},
|
|
47
90
|
globalVars: {
|
|
48
91
|
"process.env.IS_REACT18": process.env.IS_REACT18
|
|
@@ -54,6 +97,29 @@ const runtimePlugin = () => ({
|
|
|
54
97
|
topLevelImportPaths: [
|
|
55
98
|
"@modern-js/runtime/styled"
|
|
56
99
|
]
|
|
100
|
+
},
|
|
101
|
+
/**
|
|
102
|
+
* Add IgnorePlugin to fix react-dom/client import error when use react17
|
|
103
|
+
*/
|
|
104
|
+
webpackChain: (chain, { webpack }) => {
|
|
105
|
+
if (!isReact18) {
|
|
106
|
+
chain.plugin("ignore-plugin").use(webpack.IgnorePlugin, [
|
|
107
|
+
{
|
|
108
|
+
resourceRegExp: /^react-dom\/client$/,
|
|
109
|
+
contextRegExp: /./
|
|
110
|
+
}
|
|
111
|
+
]);
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
rspack: (_config, { appendPlugins, rspack }) => {
|
|
115
|
+
if (!isReact18) {
|
|
116
|
+
appendPlugins([
|
|
117
|
+
new rspack.IgnorePlugin({
|
|
118
|
+
resourceRegExp: /^react-dom\/client$/,
|
|
119
|
+
contextRegExp: /./
|
|
120
|
+
})
|
|
121
|
+
]);
|
|
122
|
+
}
|
|
57
123
|
}
|
|
58
124
|
}
|
|
59
125
|
};
|
|
@@ -62,7 +128,7 @@ const runtimePlugin = () => ({
|
|
|
62
128
|
cleanRequireCache([
|
|
63
129
|
require.resolve("../state/cli"),
|
|
64
130
|
require.resolve("../router/cli"),
|
|
65
|
-
require.resolve("
|
|
131
|
+
require.resolve("./ssr")
|
|
66
132
|
]);
|
|
67
133
|
}
|
|
68
134
|
};
|
|
@@ -71,6 +137,10 @@ const runtimePlugin = () => ({
|
|
|
71
137
|
var cli_default = runtimePlugin;
|
|
72
138
|
export {
|
|
73
139
|
cli_default as default,
|
|
140
|
+
documentPlugin,
|
|
74
141
|
isRuntimeEntry2 as isRuntimeEntry,
|
|
75
|
-
|
|
142
|
+
routerPlugin,
|
|
143
|
+
runtimePlugin,
|
|
144
|
+
ssrPlugin,
|
|
145
|
+
statePlugin
|
|
76
146
|
};
|
|
@@ -7,7 +7,7 @@ import { Buffer as Buffer2 } from "buffer";
|
|
|
7
7
|
import * as t from "@babel/types";
|
|
8
8
|
import { get } from "@modern-js/utils/lodash";
|
|
9
9
|
var require_babel_plugin_ssr_loader_id = __commonJS({
|
|
10
|
-
"src/ssr/
|
|
10
|
+
"src/cli/ssr/babel-plugin-ssr-loader-id.ts"(exports, module) {
|
|
11
11
|
const RUNTIME_PACKAGE_NAMES = [
|
|
12
12
|
"@modern-js/runtime"
|
|
13
13
|
];
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { LOADABLE_STATS_FILE, isUseSSRBundle } from "@modern-js/utils";
|
|
3
|
+
const hasStringSSREntry = (userConfig) => {
|
|
4
|
+
const isStreaming = (ssr) => ssr && typeof ssr === "object" && ssr.mode === "stream";
|
|
5
|
+
const { server, output } = userConfig;
|
|
6
|
+
if (((server === null || server === void 0 ? void 0 : server.ssr) || output.ssg) && !isStreaming(server.ssr)) {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
if ((server === null || server === void 0 ? void 0 : server.ssrByEntries) && typeof server.ssrByEntries === "object") {
|
|
10
|
+
for (const name of Object.keys(server.ssrByEntries)) {
|
|
11
|
+
if (server.ssrByEntries[name] && !isStreaming(server.ssrByEntries[name])) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return false;
|
|
17
|
+
};
|
|
18
|
+
const checkUseStringSSR = (config) => {
|
|
19
|
+
const { output } = config;
|
|
20
|
+
return Boolean(output === null || output === void 0 ? void 0 : output.ssg) || hasStringSSREntry(config);
|
|
21
|
+
};
|
|
22
|
+
const ssrBuilderPlugin = (modernAPI) => ({
|
|
23
|
+
name: "@modern-js/builder-plugin-ssr",
|
|
24
|
+
setup(api) {
|
|
25
|
+
api.modifyEnvironmentConfig((config, { name, mergeEnvironmentConfig }) => {
|
|
26
|
+
const isServerEnvironment = config.output.target === "node" || name === "serviceWorker";
|
|
27
|
+
const userConfig = modernAPI.useResolvedConfigContext();
|
|
28
|
+
const useLoadablePlugin = isUseSSRBundle(userConfig) && !isServerEnvironment && checkUseStringSSR(userConfig);
|
|
29
|
+
return mergeEnvironmentConfig(config, {
|
|
30
|
+
source: {
|
|
31
|
+
define: {
|
|
32
|
+
"process.env.MODERN_TARGET": isServerEnvironment ? JSON.stringify("node") : JSON.stringify("browser")
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
tools: {
|
|
36
|
+
bundlerChain: useLoadablePlugin ? (chain) => {
|
|
37
|
+
const LoadableBundlerPlugin = require("./loadable-bundler-plugin.js");
|
|
38
|
+
chain.plugin("loadable").use(LoadableBundlerPlugin, [
|
|
39
|
+
{
|
|
40
|
+
filename: LOADABLE_STATS_FILE
|
|
41
|
+
}
|
|
42
|
+
]);
|
|
43
|
+
} : void 0
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
const ssrPlugin = () => ({
|
|
50
|
+
name: "@modern-js/plugin-ssr",
|
|
51
|
+
required: [
|
|
52
|
+
"@modern-js/runtime"
|
|
53
|
+
],
|
|
54
|
+
setup: (api) => {
|
|
55
|
+
return {
|
|
56
|
+
// for bundle
|
|
57
|
+
config() {
|
|
58
|
+
const { bundlerType = "webpack" } = api.useAppContext();
|
|
59
|
+
const babelHandler = (() => {
|
|
60
|
+
if (bundlerType === "webpack") {
|
|
61
|
+
return (config) => {
|
|
62
|
+
var _config_plugins;
|
|
63
|
+
const userConfig = api.useResolvedConfigContext();
|
|
64
|
+
(_config_plugins = config.plugins) === null || _config_plugins === void 0 ? void 0 : _config_plugins.push(path.join(__dirname, "./babel-plugin-ssr-loader-id"));
|
|
65
|
+
if (isUseSSRBundle(userConfig) && checkUseStringSSR(userConfig)) {
|
|
66
|
+
var _config_plugins1;
|
|
67
|
+
(_config_plugins1 = config.plugins) === null || _config_plugins1 === void 0 ? void 0 : _config_plugins1.push(require.resolve("@loadable/babel-plugin"));
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
} else if (bundlerType === "rspack") {
|
|
71
|
+
return (config) => {
|
|
72
|
+
const userConfig = api.useResolvedConfigContext();
|
|
73
|
+
if (isUseSSRBundle(userConfig) && checkUseStringSSR(userConfig)) {
|
|
74
|
+
var _config_plugins, _config_plugins1;
|
|
75
|
+
(_config_plugins = config.plugins) === null || _config_plugins === void 0 ? void 0 : _config_plugins.push(path.join(__dirname, "./babel-plugin-ssr-loader-id"));
|
|
76
|
+
(_config_plugins1 = config.plugins) === null || _config_plugins1 === void 0 ? void 0 : _config_plugins1.push(require.resolve("@loadable/babel-plugin"));
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
})();
|
|
81
|
+
return {
|
|
82
|
+
builderPlugins: [
|
|
83
|
+
ssrBuilderPlugin(api)
|
|
84
|
+
],
|
|
85
|
+
source: {
|
|
86
|
+
alias: {
|
|
87
|
+
// ensure that all packages use the same storage in @modern-js/runtime-utils/node
|
|
88
|
+
"@modern-js/runtime-utils/node$": require.resolve("@modern-js/runtime-utils/node")
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
tools: {
|
|
92
|
+
babel: babelHandler
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
var ssr_default = ssrPlugin;
|
|
100
|
+
export {
|
|
101
|
+
ssr_default as default,
|
|
102
|
+
ssrPlugin
|
|
103
|
+
};
|
|
@@ -5,7 +5,7 @@ var __commonJS = (cb, mod) => function __require() {
|
|
|
5
5
|
import path from "path";
|
|
6
6
|
import { fs } from "@modern-js/utils";
|
|
7
7
|
var require_loadable_bundler_plugin = __commonJS({
|
|
8
|
-
"src/ssr/
|
|
8
|
+
"src/cli/ssr/loadable-bundler-plugin.ts"(exports, module) {
|
|
9
9
|
class LoadablePlugin {
|
|
10
10
|
apply(compiler) {
|
|
11
11
|
this.compiler = compiler;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { JS_EXTENSIONS, findExists, formatImportPath } from "@modern-js/utils";
|
|
3
|
+
import { ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME, ENTRY_POINT_RUNTIME_REGISTER_FILE_NAME } from "./constants";
|
|
4
|
+
const genRenderCode = ({ srcDirectory, internalSrcAlias, metaName, entry, customEntry, customBootstrap, mountId }) => {
|
|
5
|
+
if (customEntry) {
|
|
6
|
+
return `import '${formatImportPath(entry.replace(srcDirectory, internalSrcAlias))}'`;
|
|
7
|
+
}
|
|
8
|
+
return `import { createRoot } from '@${metaName}/runtime/react';
|
|
9
|
+
import { render } from '@${metaName}/runtime/browser';
|
|
10
|
+
${customBootstrap ? `import customBootstrap from '${formatImportPath(customBootstrap.replace(srcDirectory, internalSrcAlias))}';` : ""}
|
|
11
|
+
|
|
12
|
+
const ModernRoot = createRoot();
|
|
13
|
+
|
|
14
|
+
${customBootstrap ? `customBootstrap(ModernRoot, () => render(<ModernRoot />, '${mountId || "root"}'));` : `render(<ModernRoot />, '${mountId || "root"}');`}`;
|
|
15
|
+
};
|
|
16
|
+
const index = ({ srcDirectory, internalSrcAlias, metaName, entry, entryName, customEntry, customBootstrap, mountId }) => `import '@${metaName}/runtime/registry/${entryName}';
|
|
17
|
+
${genRenderCode({
|
|
18
|
+
srcDirectory,
|
|
19
|
+
internalSrcAlias,
|
|
20
|
+
metaName,
|
|
21
|
+
entry,
|
|
22
|
+
customEntry,
|
|
23
|
+
customBootstrap,
|
|
24
|
+
mountId
|
|
25
|
+
})}
|
|
26
|
+
`;
|
|
27
|
+
const register = () => `import './${ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME}';
|
|
28
|
+
import './${ENTRY_POINT_RUNTIME_REGISTER_FILE_NAME}';
|
|
29
|
+
`;
|
|
30
|
+
const getImportRuntimeConfigCode = (srcDirectory, internalSrcAlias, runtimeConfigFile) => {
|
|
31
|
+
if (runtimeConfigFile && findExists(JS_EXTENSIONS.map((ext) => path.resolve(srcDirectory, `${runtimeConfigFile}${ext}`)))) {
|
|
32
|
+
return `import runtimeConfig from '${internalSrcAlias}/${runtimeConfigFile}';`;
|
|
33
|
+
}
|
|
34
|
+
return `let runtimeConfig;`;
|
|
35
|
+
};
|
|
36
|
+
const getRegisterRuntimePluginCode = (entryName, name, config) => `plugins.push(${name}Plugin(mergeConfig(${JSON.stringify(config)}, (runtimeConfig || {})['${name}'], ((runtimeConfig || {})['${name}ByEntries'] || {})['${entryName}'], (getGlobalAppConfig() || {})['${name}'])));`;
|
|
37
|
+
const runtimeRegister = ({ entryName, srcDirectory, internalSrcAlias, metaName, runtimeConfigFile, runtimePlugins }) => `import { registerPlugin, mergeConfig } from '@${metaName}/runtime/plugin';
|
|
38
|
+
import { getGlobalAppConfig, getGlobalLayoutApp } from '@${metaName}/runtime/context';
|
|
39
|
+
${getImportRuntimeConfigCode(srcDirectory, internalSrcAlias, runtimeConfigFile)}
|
|
40
|
+
|
|
41
|
+
const plugins = [];
|
|
42
|
+
|
|
43
|
+
${runtimePlugins.map(({ name, path: path2, config }) => `import { ${name}Plugin } from '${path2}';
|
|
44
|
+
|
|
45
|
+
${getRegisterRuntimePluginCode(entryName, name, config)}
|
|
46
|
+
`).join("\n")}
|
|
47
|
+
registerPlugin(plugins, runtimeConfig);
|
|
48
|
+
`;
|
|
49
|
+
const runtimeGlobalContext = ({ srcDirectory, internalSrcAlias, metaName, entry, customEntry }) => {
|
|
50
|
+
return `import { setGlobalContext } from '@${metaName}/runtime/context'
|
|
51
|
+
|
|
52
|
+
import App from '${// We need to get the path of App.tsx here, but the entry is `src/entry.tsx`
|
|
53
|
+
formatImportPath(customEntry ? entry.replace("entry.tsx", "App.tsx").replace(srcDirectory, internalSrcAlias) : entry.replace(srcDirectory, internalSrcAlias))}';
|
|
54
|
+
|
|
55
|
+
setGlobalContext({
|
|
56
|
+
App,
|
|
57
|
+
});`;
|
|
58
|
+
};
|
|
59
|
+
export {
|
|
60
|
+
index,
|
|
61
|
+
register,
|
|
62
|
+
runtimeGlobalContext,
|
|
63
|
+
runtimeRegister
|
|
64
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { formatImportPath } from "@modern-js/utils";
|
|
2
|
+
const SERVER_ENTRY = `
|
|
3
|
+
import {
|
|
4
|
+
#render,
|
|
5
|
+
createRequestHandler,
|
|
6
|
+
} from '@#metaName/runtime/ssr/server';
|
|
7
|
+
|
|
8
|
+
const handleRequest = async (request, ServerRoot, options) => {
|
|
9
|
+
|
|
10
|
+
const body = await #render(request, <ServerRoot />, options);
|
|
11
|
+
|
|
12
|
+
return new Response(body, {
|
|
13
|
+
headers: {
|
|
14
|
+
'content-type': 'text/html; charset=utf-8',
|
|
15
|
+
#headers
|
|
16
|
+
},
|
|
17
|
+
})
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const requestHandler = createRequestHandler(handleRequest);
|
|
21
|
+
`;
|
|
22
|
+
const serverIndex = (options) => {
|
|
23
|
+
const { metaName = "modern-js", entryName } = options;
|
|
24
|
+
return `
|
|
25
|
+
import '@${metaName}/runtime/registry/${entryName}';
|
|
26
|
+
${genHandlerCode(options)}
|
|
27
|
+
`;
|
|
28
|
+
};
|
|
29
|
+
function genHandlerCode({ mode, metaName, customServerEntry, srcDirectory, internalSrcAlias }) {
|
|
30
|
+
if (customServerEntry) {
|
|
31
|
+
return `export { default as requestHandler } from '${formatImportPath(customServerEntry.replace(srcDirectory, internalSrcAlias))}'`;
|
|
32
|
+
} else {
|
|
33
|
+
const serverEntry = transformServerEntry(SERVER_ENTRY, {
|
|
34
|
+
metaName: metaName || "modern-js",
|
|
35
|
+
mode
|
|
36
|
+
});
|
|
37
|
+
return serverEntry;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function transformServerEntry(source, options) {
|
|
41
|
+
const { metaName = "modern-js", mode } = options;
|
|
42
|
+
const output = source.replace(/#metaName/g, metaName).replace(/#render/g, mode === "string" ? "renderString" : "renderStreaming").replace(/#headers/g, mode === "string" ? "" : `'transfer-encoding': 'chunked',`);
|
|
43
|
+
return output;
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
serverIndex
|
|
47
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { normalizePathname } from "@modern-js/runtime-utils/url";
|
|
3
|
+
import { loadableReady } from "@loadable/component";
|
|
4
|
+
import React from "react";
|
|
5
|
+
import { RenderLevel } from "../constants";
|
|
6
|
+
import { WithCallback } from "./withCallback";
|
|
7
|
+
const isReact18 = () => process.env.IS_REACT18 === "true";
|
|
8
|
+
function hydrateRoot(App, context, ModernRender, ModernHydrate) {
|
|
9
|
+
var _window__SSR_DATA, _window, _window__SSR_DATA1, _window1;
|
|
10
|
+
const hydrateContext = {
|
|
11
|
+
...context,
|
|
12
|
+
get routes() {
|
|
13
|
+
return context.routes;
|
|
14
|
+
},
|
|
15
|
+
_hydration: true
|
|
16
|
+
};
|
|
17
|
+
const { ssrContext } = hydrateContext;
|
|
18
|
+
const currentPathname = normalizePathname(window.location.pathname);
|
|
19
|
+
const initialPathname = normalizePathname(ssrContext.request.pathname);
|
|
20
|
+
if (initialPathname !== currentPathname && context.router) {
|
|
21
|
+
const errorMsg = `The initial URL ${initialPathname} and the URL ${currentPathname} to be hydrated do not match, reload.`;
|
|
22
|
+
console.error(errorMsg);
|
|
23
|
+
window.location.reload();
|
|
24
|
+
}
|
|
25
|
+
const callback = () => {
|
|
26
|
+
delete hydrateContext._hydration;
|
|
27
|
+
};
|
|
28
|
+
const renderLevel = ((_window = window) === null || _window === void 0 ? void 0 : (_window__SSR_DATA = _window._SSR_DATA) === null || _window__SSR_DATA === void 0 ? void 0 : _window__SSR_DATA.renderLevel) || RenderLevel.CLIENT_RENDER;
|
|
29
|
+
const renderMode = ((_window1 = window) === null || _window1 === void 0 ? void 0 : (_window__SSR_DATA1 = _window1._SSR_DATA) === null || _window__SSR_DATA1 === void 0 ? void 0 : _window__SSR_DATA1.mode) || "string";
|
|
30
|
+
if (isReact18() && renderMode === "stream") {
|
|
31
|
+
return streamSSRHydrate();
|
|
32
|
+
}
|
|
33
|
+
function streamSSRHydrate() {
|
|
34
|
+
if (renderLevel === RenderLevel.SERVER_RENDER) {
|
|
35
|
+
const SSRApp = () => /* @__PURE__ */ _jsx(WithCallback, {
|
|
36
|
+
callback,
|
|
37
|
+
children: /* @__PURE__ */ React.cloneElement(App, {
|
|
38
|
+
_internal_context: hydrateContext
|
|
39
|
+
})
|
|
40
|
+
});
|
|
41
|
+
return ModernHydrate(/* @__PURE__ */ _jsx(SSRApp, {}));
|
|
42
|
+
} else {
|
|
43
|
+
return ModernRender(App);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return stringSSRHydrate();
|
|
47
|
+
function stringSSRHydrate() {
|
|
48
|
+
if (renderLevel === RenderLevel.CLIENT_RENDER || renderLevel === RenderLevel.SERVER_PREFETCH) {
|
|
49
|
+
return ModernRender(App);
|
|
50
|
+
} else if (renderLevel === RenderLevel.SERVER_RENDER) {
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
if (isReact18()) {
|
|
53
|
+
loadableReady(() => {
|
|
54
|
+
const SSRApp = () => /* @__PURE__ */ _jsx(WithCallback, {
|
|
55
|
+
callback,
|
|
56
|
+
children: /* @__PURE__ */ React.cloneElement(App, {
|
|
57
|
+
_internal_context: hydrateContext
|
|
58
|
+
})
|
|
59
|
+
});
|
|
60
|
+
ModernHydrate(/* @__PURE__ */ _jsx(SSRApp, {})).then((root) => {
|
|
61
|
+
resolve(root);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
} else {
|
|
65
|
+
loadableReady(() => {
|
|
66
|
+
ModernHydrate(App, callback).then((root) => {
|
|
67
|
+
resolve(root);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
} else {
|
|
73
|
+
console.warn(`unknow render level: ${renderLevel}, execute render()`);
|
|
74
|
+
return ModernRender(App);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export {
|
|
79
|
+
hydrateRoot,
|
|
80
|
+
isReact18
|
|
81
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import cookieTool from "cookie";
|
|
3
|
+
import { getGlobalAppInit } from "../context";
|
|
4
|
+
import { getInitialContext } from "../context/runtime";
|
|
5
|
+
import { createLoaderManager } from "../loader/loaderManager";
|
|
6
|
+
import { getGlobalRunner } from "../plugin/runner";
|
|
7
|
+
import { hydrateRoot } from "./hydrate";
|
|
8
|
+
const IS_REACT18 = process.env.IS_REACT18 === "true";
|
|
9
|
+
function getSSRData() {
|
|
10
|
+
const ssrData = window._SSR_DATA;
|
|
11
|
+
if (ssrData) {
|
|
12
|
+
const finalSSRData = {
|
|
13
|
+
...ssrData,
|
|
14
|
+
context: {
|
|
15
|
+
...ssrData.context,
|
|
16
|
+
request: {
|
|
17
|
+
...ssrData.context.request,
|
|
18
|
+
cookieMap: cookieTool.parse(document.cookie || "") || {},
|
|
19
|
+
cookie: document.cookie || "",
|
|
20
|
+
userAgent: navigator.userAgent,
|
|
21
|
+
referer: document.referrer
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return finalSSRData;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function isClientArgs(id) {
|
|
29
|
+
return typeof id === "undefined" || typeof id === "string" || typeof HTMLElement !== "undefined" && id instanceof HTMLElement;
|
|
30
|
+
}
|
|
31
|
+
async function render(App, id) {
|
|
32
|
+
const runner = getGlobalRunner();
|
|
33
|
+
const context = getInitialContext(runner);
|
|
34
|
+
const runInit = (_context) => runner.init({
|
|
35
|
+
context: _context
|
|
36
|
+
}, {
|
|
37
|
+
onLast: ({ context: context1 }) => {
|
|
38
|
+
const init = getGlobalAppInit();
|
|
39
|
+
return init === null || init === void 0 ? void 0 : init(context1);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
if (isClientArgs(id)) {
|
|
43
|
+
var _ssrData_data, _ssrData_data1;
|
|
44
|
+
const ssrData = getSSRData();
|
|
45
|
+
const loadersData = (ssrData === null || ssrData === void 0 ? void 0 : (_ssrData_data = ssrData.data) === null || _ssrData_data === void 0 ? void 0 : _ssrData_data.loadersData) || {};
|
|
46
|
+
const initialLoadersState = Object.keys(loadersData).reduce((res, key) => {
|
|
47
|
+
const loaderData = loadersData[key];
|
|
48
|
+
if ((loaderData === null || loaderData === void 0 ? void 0 : loaderData.loading) !== false) {
|
|
49
|
+
return res;
|
|
50
|
+
}
|
|
51
|
+
res[key] = loaderData;
|
|
52
|
+
return res;
|
|
53
|
+
}, {});
|
|
54
|
+
Object.assign(context, {
|
|
55
|
+
loaderManager: createLoaderManager(initialLoadersState, {
|
|
56
|
+
skipStatic: true
|
|
57
|
+
}),
|
|
58
|
+
...ssrData ? {
|
|
59
|
+
ssrContext: ssrData === null || ssrData === void 0 ? void 0 : ssrData.context
|
|
60
|
+
} : {}
|
|
61
|
+
});
|
|
62
|
+
context.initialData = ssrData === null || ssrData === void 0 ? void 0 : (_ssrData_data1 = ssrData.data) === null || _ssrData_data1 === void 0 ? void 0 : _ssrData_data1.initialData;
|
|
63
|
+
const initialData = await runInit(context);
|
|
64
|
+
if (initialData) {
|
|
65
|
+
context.initialData = initialData;
|
|
66
|
+
}
|
|
67
|
+
const rootElement = id && typeof id !== "string" ? id : document.getElementById(id || "root");
|
|
68
|
+
async function ModernRender(App2) {
|
|
69
|
+
const renderFunc = IS_REACT18 ? renderWithReact18 : renderWithReact17;
|
|
70
|
+
return renderFunc(/* @__PURE__ */ React.cloneElement(App2, {
|
|
71
|
+
_internal_context: context
|
|
72
|
+
}), rootElement);
|
|
73
|
+
}
|
|
74
|
+
async function ModernHydrate(App2, callback) {
|
|
75
|
+
const hydrateFunc = IS_REACT18 ? hydrateWithReact18 : hydrateWithReact17;
|
|
76
|
+
return hydrateFunc(App2, rootElement, callback);
|
|
77
|
+
}
|
|
78
|
+
if (ssrData) {
|
|
79
|
+
return hydrateRoot(App, context, ModernRender, ModernHydrate);
|
|
80
|
+
}
|
|
81
|
+
return ModernRender(App);
|
|
82
|
+
}
|
|
83
|
+
throw Error("`render` function needs id in browser environment, it needs to be string or element");
|
|
84
|
+
}
|
|
85
|
+
async function renderWithReact18(App, rootElement) {
|
|
86
|
+
const ReactDOM = await import("react-dom/client");
|
|
87
|
+
const root = ReactDOM.createRoot(rootElement);
|
|
88
|
+
root.render(App);
|
|
89
|
+
return root;
|
|
90
|
+
}
|
|
91
|
+
async function renderWithReact17(App, rootElement) {
|
|
92
|
+
const ReactDOM = await import("react-dom");
|
|
93
|
+
ReactDOM.render(App, rootElement);
|
|
94
|
+
return rootElement;
|
|
95
|
+
}
|
|
96
|
+
async function hydrateWithReact18(App, rootElement) {
|
|
97
|
+
const ReactDOM = await import("react-dom/client");
|
|
98
|
+
const root = ReactDOM.hydrateRoot(rootElement, App);
|
|
99
|
+
return root;
|
|
100
|
+
}
|
|
101
|
+
async function hydrateWithReact17(App, rootElement, callback) {
|
|
102
|
+
const ReactDOM = await import("react-dom");
|
|
103
|
+
const root = ReactDOM.hydrate(App, rootElement, callback);
|
|
104
|
+
return root;
|
|
105
|
+
}
|
|
106
|
+
export {
|
|
107
|
+
render
|
|
108
|
+
};
|