@modern-js/runtime 3.4.0 → 3.6.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.
@@ -101,12 +101,10 @@ const runtimePlugin = (params)=>({
101
101
  });
102
102
  api.config(()=>{
103
103
  const { appDirectory, metaName } = api.getAppContext();
104
- const isReact18 = (0, utils_namespaceObject.isReact18)(appDirectory);
105
- process.env.IS_REACT18 = isReact18.toString();
106
104
  return {
107
105
  source: {
108
106
  globalVars: {
109
- 'process.env.IS_REACT18': process.env.IS_REACT18
107
+ 'process.env.IS_REACT18': 'true'
110
108
  },
111
109
  include: [
112
110
  new RegExp(`[\\\\/]node_modules[\\\\/]@${metaName}[\\\\/]runtime[\\\\/].*[\\\\/]head\\.`)
@@ -115,14 +113,6 @@ const runtimePlugin = (params)=>({
115
113
  tools: {
116
114
  bundlerChain: (chain)=>{
117
115
  chain.module.rule('modern-entry').test(/\.jsx?$/).include.add(external_path_default().resolve(appDirectory, 'node_modules', `.${metaName}`)).end().sideEffects(true);
118
- },
119
- rspack: (_config, { appendPlugins, rspack })=>{
120
- if (!isReact18) appendPlugins([
121
- new rspack.IgnorePlugin({
122
- resourceRegExp: /^react-dom\/client$/,
123
- contextRegExp: /@modern-js\/runtime/
124
- })
125
- ]);
126
116
  }
127
117
  }
128
118
  };
@@ -28,15 +28,13 @@ var __webpack_require__ = {};
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
- hydrateRoot: ()=>hydrateRoot,
32
- isReact18: ()=>isReact18
31
+ hydrateRoot: ()=>hydrateRoot
33
32
  });
34
33
  const jsx_runtime_namespaceObject = require("react/jsx-runtime");
35
34
  const component_namespaceObject = require("@loadable/component");
36
35
  const external_constants_js_namespaceObject = require("../constants.js");
37
36
  const wrapper_js_namespaceObject = require("../react/wrapper.js");
38
37
  const external_withCallback_js_namespaceObject = require("./withCallback.js");
39
- const isReact18 = ()=>'true' === process.env.IS_REACT18;
40
38
  function hydrateRoot(App, context, ModernRender, ModernHydrate) {
41
39
  const hydrateContext = {
42
40
  ...context,
@@ -50,7 +48,7 @@ function hydrateRoot(App, context, ModernRender, ModernHydrate) {
50
48
  };
51
49
  const renderLevel = window?._SSR_DATA?.renderLevel || external_constants_js_namespaceObject.RenderLevel.CLIENT_RENDER;
52
50
  const renderMode = window?._SSR_DATA?.mode || 'string';
53
- if (isReact18() && 'stream' === renderMode) return streamSSRHydrate();
51
+ if ('stream' === renderMode) return streamSSRHydrate();
54
52
  function streamSSRHydrate() {
55
53
  if (renderLevel !== external_constants_js_namespaceObject.RenderLevel.SERVER_RENDER) return ModernRender((0, wrapper_js_namespaceObject.wrapRuntimeContextProvider)(App, context));
56
54
  {
@@ -65,7 +63,7 @@ function hydrateRoot(App, context, ModernRender, ModernHydrate) {
65
63
  function stringSSRHydrate() {
66
64
  if (renderLevel === external_constants_js_namespaceObject.RenderLevel.CLIENT_RENDER) return ModernRender((0, wrapper_js_namespaceObject.wrapRuntimeContextProvider)(App, context));
67
65
  if (renderLevel === external_constants_js_namespaceObject.RenderLevel.SERVER_RENDER) return new Promise((resolve)=>{
68
- if (isReact18()) (0, component_namespaceObject.loadableReady)(()=>{
66
+ (0, component_namespaceObject.loadableReady)(()=>{
69
67
  const SSRApp = ()=>/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_withCallback_js_namespaceObject.WithCallback, {
70
68
  callback: callback,
71
69
  children: App
@@ -74,21 +72,14 @@ function hydrateRoot(App, context, ModernRender, ModernHydrate) {
74
72
  resolve(root);
75
73
  });
76
74
  });
77
- else (0, component_namespaceObject.loadableReady)(()=>{
78
- ModernHydrate((0, wrapper_js_namespaceObject.wrapRuntimeContextProvider)(App, hydrateContext), callback).then((root)=>{
79
- resolve(root);
80
- });
81
- });
82
75
  });
83
76
  console.warn(`unknow render level: ${renderLevel}, execute render()`);
84
77
  return ModernRender((0, wrapper_js_namespaceObject.wrapRuntimeContextProvider)(App, context));
85
78
  }
86
79
  }
87
80
  exports.hydrateRoot = __webpack_exports__.hydrateRoot;
88
- exports.isReact18 = __webpack_exports__.isReact18;
89
81
  for(var __rspack_i in __webpack_exports__)if (-1 === [
90
- "hydrateRoot",
91
- "isReact18"
82
+ "hydrateRoot"
92
83
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
93
84
  Object.defineProperty(exports, '__esModule', {
94
85
  value: true
@@ -37,20 +37,18 @@ var __webpack_require__ = {};
37
37
  var __webpack_exports__ = {};
38
38
  __webpack_require__.r(__webpack_exports__);
39
39
  __webpack_require__.d(__webpack_exports__, {
40
- hydrateWithReact17: ()=>hydrateWithReact17,
41
- hydrateWithReact18: ()=>hydrateWithReact18,
40
+ hydrateWithReact: ()=>hydrateWithReact,
42
41
  render: ()=>render,
43
- renderWithReact17: ()=>renderWithReact17,
44
- renderWithReact18: ()=>renderWithReact18
42
+ renderWithReact: ()=>renderWithReact
45
43
  });
46
44
  const constants_namespaceObject = require("@modern-js/utils/universal/constants");
47
45
  const external_cookie_namespaceObject = require("cookie");
48
46
  var external_cookie_default = /*#__PURE__*/ __webpack_require__.n(external_cookie_namespaceObject);
47
+ const client_namespaceObject = require("react-dom/client");
49
48
  const index_js_namespaceObject = require("../context/index.js");
50
49
  const runtime_js_namespaceObject = require("../context/runtime.js");
51
50
  const wrapper_js_namespaceObject = require("../react/wrapper.js");
52
51
  const external_hydrate_js_namespaceObject = require("./hydrate.js");
53
- const IS_REACT18 = 'true' === process.env.IS_REACT18;
54
52
  const getQuery = ()=>window.location.search.substring(1).split('&').reduce((res, item)=>{
55
53
  const [key, value] = item.split('=');
56
54
  if (key) res[key] = value;
@@ -108,52 +106,34 @@ async function render(App, id) {
108
106
  await runBeforeRender(context);
109
107
  const rootElement = id && 'string' != typeof id ? id : document.getElementById(id || 'root');
110
108
  async function ModernRender(App) {
111
- const renderFunc = IS_REACT18 ? renderWithReact18 : renderWithReact17;
112
- return renderFunc(App, rootElement);
109
+ return renderWithReact(App, rootElement);
113
110
  }
114
- async function ModernHydrate(App, callback) {
115
- const hydrateFunc = IS_REACT18 ? hydrateWithReact18 : hydrateWithReact17;
116
- return hydrateFunc(App, rootElement, callback);
111
+ async function ModernHydrate(App) {
112
+ return hydrateWithReact(App, rootElement);
117
113
  }
118
114
  if (window._SSR_DATA) return (0, external_hydrate_js_namespaceObject.hydrateRoot)(App, context, ModernRender, ModernHydrate);
119
115
  return ModernRender((0, wrapper_js_namespaceObject.wrapRuntimeContextProvider)(App, context));
120
116
  }
121
117
  throw Error('`render` function needs id in browser environment, it needs to be string or element');
122
118
  }
123
- async function renderWithReact18(App, rootElement) {
124
- const ReactDOM = await import("react-dom/client");
125
- const root = ReactDOM.createRoot(rootElement);
119
+ async function renderWithReact(App, rootElement) {
120
+ const root = (0, client_namespaceObject.createRoot)(rootElement);
126
121
  root.render(App);
127
122
  return root;
128
123
  }
129
- async function renderWithReact17(App, rootElement) {
130
- const ReactDOM = await import("react-dom");
131
- ReactDOM.render(App, rootElement);
132
- return rootElement;
133
- }
134
- async function hydrateWithReact18(App, rootElement) {
135
- const ReactDOM = await import("react-dom/client");
136
- const root = ReactDOM.hydrateRoot(rootElement, App, {
124
+ async function hydrateWithReact(App, rootElement) {
125
+ const root = (0, client_namespaceObject.hydrateRoot)(rootElement, App, {
137
126
  identifierPrefix: constants_namespaceObject.SSR_HYDRATION_ID_PREFIX
138
127
  });
139
128
  return root;
140
129
  }
141
- async function hydrateWithReact17(App, rootElement, callback) {
142
- const ReactDOM = await import("react-dom");
143
- const root = ReactDOM.hydrate(App, rootElement, callback);
144
- return root;
145
- }
146
- exports.hydrateWithReact17 = __webpack_exports__.hydrateWithReact17;
147
- exports.hydrateWithReact18 = __webpack_exports__.hydrateWithReact18;
130
+ exports.hydrateWithReact = __webpack_exports__.hydrateWithReact;
148
131
  exports.render = __webpack_exports__.render;
149
- exports.renderWithReact17 = __webpack_exports__.renderWithReact17;
150
- exports.renderWithReact18 = __webpack_exports__.renderWithReact18;
132
+ exports.renderWithReact = __webpack_exports__.renderWithReact;
151
133
  for(var __rspack_i in __webpack_exports__)if (-1 === [
152
- "hydrateWithReact17",
153
- "hydrateWithReact18",
134
+ "hydrateWithReact",
154
135
  "render",
155
- "renderWithReact17",
156
- "renderWithReact18"
136
+ "renderWithReact"
157
137
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
158
138
  Object.defineProperty(exports, '__esModule', {
159
139
  value: true
@@ -340,12 +340,13 @@ const documentPlugin = ()=>({
340
340
  processedHtml = processCommentPlaceholders(processedHtml);
341
341
  return `<!DOCTYPE html>${processedHtml}`.replace(external_constants_js_namespaceObject.DOCUMENT_META_PLACEHOLDER, ()=>metas).replace(external_constants_js_namespaceObject.DOCUMENT_SSR_PLACEHOLDER, ()=>external_constants_js_namespaceObject.HTML_SEPARATOR).replace(external_constants_js_namespaceObject.DOCUMENT_SCRIPTS_PLACEHOLDER, ()=>scripts).replace(external_constants_js_namespaceObject.DOCUMENT_LINKS_PLACEHOLDER, ()=>links).replace(external_constants_js_namespaceObject.DOCUMENT_CHUNKSMAP_PLACEHOLDER, ()=>external_constants_js_namespaceObject.PLACEHOLDER_REPLACER_MAP[external_constants_js_namespaceObject.DOCUMENT_CHUNKSMAP_PLACEHOLDER]).replace(external_constants_js_namespaceObject.DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, ()=>external_constants_js_namespaceObject.PLACEHOLDER_REPLACER_MAP[external_constants_js_namespaceObject.DOCUMENT_SSRDATASCRIPT_PLACEHOLDER]).replace(external_constants_js_namespaceObject.DOCUMENT_TITLE_PLACEHOLDER, ()=>titles);
342
342
  };
343
- const documentEntry = (entryName, templateParameters)=>{
343
+ const documentEntry = (entryName)=>{
344
344
  const { entrypoints, internalDirectory, appDirectory } = api.getAppContext();
345
345
  const documentFilePath = getDocumentByEntryName(entrypoints, entryName, appDirectory);
346
346
  if (!documentFilePath) return null;
347
347
  return async (templateData)=>{
348
348
  const config = api.getNormalizedConfig();
349
+ const { compilation: _compilation, htmlPlugin, rspackConfig: _rspackConfig, ...templateParameters } = templateData;
349
350
  const documentParams = getDocParams({
350
351
  config: config,
351
352
  entryName,
@@ -363,7 +364,6 @@ const documentPlugin = ()=>({
363
364
  debug("entry %s's document jsx rendered html: %o", entryName, html);
364
365
  const { partialsByEntrypoint } = api.getAppContext();
365
366
  html = processPartials(html, entryName, partialsByEntrypoint || {});
366
- const htmlPlugin = templateData.htmlPlugin || templateData.htmlWebpackPlugin || templateData.htmlRspackPlugin;
367
367
  if (!htmlPlugin) throw new Error('Failed to get HTML plugin tags from template parameters.');
368
368
  const { scripts, links, metas, titles } = extractHtmlTags(htmlPlugin, templateParameters);
369
369
  return processPlaceholders(html, config, scripts, links, metas, titles);
@@ -375,10 +375,7 @@ const documentPlugin = ()=>({
375
375
  return {
376
376
  tools: {
377
377
  htmlPlugin: (options, entry)=>{
378
- const hackParameters = 'function' == typeof options?.templateParameters ? options?.templateParameters({}, {}, {}, {}) : {
379
- ...options?.templateParameters
380
- };
381
- const templateContent = documentEntry(entry.entryName, hackParameters);
378
+ const templateContent = documentEntry(entry.entryName);
382
379
  const documentHtmlOptions = templateContent ? {
383
380
  templateContent,
384
381
  inject: false
@@ -1,5 +1,5 @@
1
1
  import path_0 from "path";
2
- import { cleanRequireCache, isReact18 as utils_isReact18 } from "@modern-js/utils";
2
+ import { cleanRequireCache } from "@modern-js/utils";
3
3
  import { documentPlugin } from "../document/cli/index.mjs";
4
4
  import { routerPlugin } from "../router/cli/index.mjs";
5
5
  import { builderPluginAlias } from "./alias.mjs";
@@ -54,12 +54,10 @@ const runtimePlugin = (params)=>({
54
54
  });
55
55
  api.config(()=>{
56
56
  const { appDirectory, metaName } = api.getAppContext();
57
- const isReact18 = utils_isReact18(appDirectory);
58
- process.env.IS_REACT18 = isReact18.toString();
59
57
  return {
60
58
  source: {
61
59
  globalVars: {
62
- 'process.env.IS_REACT18': process.env.IS_REACT18
60
+ 'process.env.IS_REACT18': 'true'
63
61
  },
64
62
  include: [
65
63
  new RegExp(`[\\\\/]node_modules[\\\\/]@${metaName}[\\\\/]runtime[\\\\/].*[\\\\/]head\\.`)
@@ -68,14 +66,6 @@ const runtimePlugin = (params)=>({
68
66
  tools: {
69
67
  bundlerChain: (chain)=>{
70
68
  chain.module.rule('modern-entry').test(/\.jsx?$/).include.add(path_0.resolve(appDirectory, 'node_modules', `.${metaName}`)).end().sideEffects(true);
71
- },
72
- rspack: (_config, { appendPlugins, rspack })=>{
73
- if (!isReact18) appendPlugins([
74
- new rspack.IgnorePlugin({
75
- resourceRegExp: /^react-dom\/client$/,
76
- contextRegExp: /@modern-js\/runtime/
77
- })
78
- ]);
79
69
  }
80
70
  }
81
71
  };
@@ -3,7 +3,6 @@ import { loadableReady } from "@loadable/component";
3
3
  import { RenderLevel } from "../constants.mjs";
4
4
  import { wrapRuntimeContextProvider } from "../react/wrapper.mjs";
5
5
  import { WithCallback } from "./withCallback.mjs";
6
- const isReact18 = ()=>'true' === process.env.IS_REACT18;
7
6
  function hydrateRoot(App, context, ModernRender, ModernHydrate) {
8
7
  const hydrateContext = {
9
8
  ...context,
@@ -17,7 +16,7 @@ function hydrateRoot(App, context, ModernRender, ModernHydrate) {
17
16
  };
18
17
  const renderLevel = window?._SSR_DATA?.renderLevel || RenderLevel.CLIENT_RENDER;
19
18
  const renderMode = window?._SSR_DATA?.mode || 'string';
20
- if (isReact18() && 'stream' === renderMode) return streamSSRHydrate();
19
+ if ('stream' === renderMode) return streamSSRHydrate();
21
20
  function streamSSRHydrate() {
22
21
  if (renderLevel !== RenderLevel.SERVER_RENDER) return ModernRender(wrapRuntimeContextProvider(App, context));
23
22
  {
@@ -32,7 +31,7 @@ function hydrateRoot(App, context, ModernRender, ModernHydrate) {
32
31
  function stringSSRHydrate() {
33
32
  if (renderLevel === RenderLevel.CLIENT_RENDER) return ModernRender(wrapRuntimeContextProvider(App, context));
34
33
  if (renderLevel === RenderLevel.SERVER_RENDER) return new Promise((resolve)=>{
35
- isReact18() ? loadableReady(()=>{
34
+ loadableReady(()=>{
36
35
  const SSRApp = ()=>/*#__PURE__*/ jsx(WithCallback, {
37
36
  callback: callback,
38
37
  children: App
@@ -40,14 +39,10 @@ function hydrateRoot(App, context, ModernRender, ModernHydrate) {
40
39
  ModernHydrate(wrapRuntimeContextProvider(/*#__PURE__*/ jsx(SSRApp, {}), hydrateContext)).then((root)=>{
41
40
  resolve(root);
42
41
  });
43
- }) : loadableReady(()=>{
44
- ModernHydrate(wrapRuntimeContextProvider(App, hydrateContext), callback).then((root)=>{
45
- resolve(root);
46
- });
47
42
  });
48
43
  });
49
44
  console.warn(`unknow render level: ${renderLevel}, execute render()`);
50
45
  return ModernRender(wrapRuntimeContextProvider(App, context));
51
46
  }
52
47
  }
53
- export { hydrateRoot, isReact18 };
48
+ export { hydrateRoot };
@@ -1,10 +1,10 @@
1
1
  import { SSR_HYDRATION_ID_PREFIX } from "@modern-js/utils/universal/constants";
2
2
  import cookie from "cookie";
3
+ import { createRoot, hydrateRoot } from "react-dom/client";
3
4
  import { getGlobalInternalRuntimeContext } from "../context/index.mjs";
4
5
  import { getInitialContext } from "../context/runtime.mjs";
5
6
  import { wrapRuntimeContextProvider } from "../react/wrapper.mjs";
6
- import { hydrateRoot } from "./hydrate.mjs";
7
- const IS_REACT18 = 'true' === process.env.IS_REACT18;
7
+ import { hydrateRoot as external_hydrate_mjs_hydrateRoot } from "./hydrate.mjs";
8
8
  const getQuery = ()=>window.location.search.substring(1).split('&').reduce((res, item)=>{
9
9
  const [key, value] = item.split('=');
10
10
  if (key) res[key] = value;
@@ -62,39 +62,25 @@ async function render(App, id) {
62
62
  await runBeforeRender(context);
63
63
  const rootElement = id && 'string' != typeof id ? id : document.getElementById(id || 'root');
64
64
  async function ModernRender(App) {
65
- const renderFunc = IS_REACT18 ? renderWithReact18 : renderWithReact17;
66
- return renderFunc(App, rootElement);
65
+ return renderWithReact(App, rootElement);
67
66
  }
68
- async function ModernHydrate(App, callback) {
69
- const hydrateFunc = IS_REACT18 ? hydrateWithReact18 : hydrateWithReact17;
70
- return hydrateFunc(App, rootElement, callback);
67
+ async function ModernHydrate(App) {
68
+ return hydrateWithReact(App, rootElement);
71
69
  }
72
- if (window._SSR_DATA) return hydrateRoot(App, context, ModernRender, ModernHydrate);
70
+ if (window._SSR_DATA) return external_hydrate_mjs_hydrateRoot(App, context, ModernRender, ModernHydrate);
73
71
  return ModernRender(wrapRuntimeContextProvider(App, context));
74
72
  }
75
73
  throw Error('`render` function needs id in browser environment, it needs to be string or element');
76
74
  }
77
- async function renderWithReact18(App, rootElement) {
78
- const ReactDOM = await import("react-dom/client");
79
- const root = ReactDOM.createRoot(rootElement);
75
+ async function renderWithReact(App, rootElement) {
76
+ const root = createRoot(rootElement);
80
77
  root.render(App);
81
78
  return root;
82
79
  }
83
- async function renderWithReact17(App, rootElement) {
84
- const ReactDOM = await import("react-dom");
85
- ReactDOM.render(App, rootElement);
86
- return rootElement;
87
- }
88
- async function hydrateWithReact18(App, rootElement) {
89
- const ReactDOM = await import("react-dom/client");
90
- const root = ReactDOM.hydrateRoot(rootElement, App, {
80
+ async function hydrateWithReact(App, rootElement) {
81
+ const root = hydrateRoot(rootElement, App, {
91
82
  identifierPrefix: SSR_HYDRATION_ID_PREFIX
92
83
  });
93
84
  return root;
94
85
  }
95
- async function hydrateWithReact17(App, rootElement, callback) {
96
- const ReactDOM = await import("react-dom");
97
- const root = ReactDOM.hydrate(App, rootElement, callback);
98
- return root;
99
- }
100
- export { hydrateWithReact17, hydrateWithReact18, render, renderWithReact17, renderWithReact18 };
86
+ export { hydrateWithReact, render, renderWithReact };
@@ -295,12 +295,13 @@ const documentPlugin = ()=>({
295
295
  processedHtml = processCommentPlaceholders(processedHtml);
296
296
  return `<!DOCTYPE html>${processedHtml}`.replace(DOCUMENT_META_PLACEHOLDER, ()=>metas).replace(DOCUMENT_SSR_PLACEHOLDER, ()=>HTML_SEPARATOR).replace(DOCUMENT_SCRIPTS_PLACEHOLDER, ()=>scripts).replace(DOCUMENT_LINKS_PLACEHOLDER, ()=>links).replace(DOCUMENT_CHUNKSMAP_PLACEHOLDER, ()=>PLACEHOLDER_REPLACER_MAP[DOCUMENT_CHUNKSMAP_PLACEHOLDER]).replace(DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, ()=>PLACEHOLDER_REPLACER_MAP[DOCUMENT_SSRDATASCRIPT_PLACEHOLDER]).replace(DOCUMENT_TITLE_PLACEHOLDER, ()=>titles);
297
297
  };
298
- const documentEntry = (entryName, templateParameters)=>{
298
+ const documentEntry = (entryName)=>{
299
299
  const { entrypoints, internalDirectory, appDirectory } = api.getAppContext();
300
300
  const documentFilePath = getDocumentByEntryName(entrypoints, entryName, appDirectory);
301
301
  if (!documentFilePath) return null;
302
302
  return async (templateData)=>{
303
303
  const config = api.getNormalizedConfig();
304
+ const { compilation: _compilation, htmlPlugin, rspackConfig: _rspackConfig, ...templateParameters } = templateData;
304
305
  const documentParams = getDocParams({
305
306
  config: config,
306
307
  entryName,
@@ -318,7 +319,6 @@ const documentPlugin = ()=>({
318
319
  debug("entry %s's document jsx rendered html: %o", entryName, html);
319
320
  const { partialsByEntrypoint } = api.getAppContext();
320
321
  html = processPartials(html, entryName, partialsByEntrypoint || {});
321
- const htmlPlugin = templateData.htmlPlugin || templateData.htmlWebpackPlugin || templateData.htmlRspackPlugin;
322
322
  if (!htmlPlugin) throw new Error('Failed to get HTML plugin tags from template parameters.');
323
323
  const { scripts, links, metas, titles } = extractHtmlTags(htmlPlugin, templateParameters);
324
324
  return processPlaceholders(html, config, scripts, links, metas, titles);
@@ -330,10 +330,7 @@ const documentPlugin = ()=>({
330
330
  return {
331
331
  tools: {
332
332
  htmlPlugin: (options, entry)=>{
333
- const hackParameters = 'function' == typeof options?.templateParameters ? options?.templateParameters({}, {}, {}, {}) : {
334
- ...options?.templateParameters
335
- };
336
- const templateContent = documentEntry(entry.entryName, hackParameters);
333
+ const templateContent = documentEntry(entry.entryName);
337
334
  const documentHtmlOptions = templateContent ? {
338
335
  templateContent,
339
336
  inject: false
@@ -1,7 +1,7 @@
1
1
  import __rslib_shim_module__ from "node:module";
2
2
  const require = /*#__PURE__*/ __rslib_shim_module__.createRequire(/*#__PURE__*/ (()=>import.meta.url)());
3
3
  import path_0 from "path";
4
- import { cleanRequireCache, isReact18 as utils_isReact18 } from "@modern-js/utils";
4
+ import { cleanRequireCache } from "@modern-js/utils";
5
5
  import { documentPlugin } from "../document/cli/index.mjs";
6
6
  import { routerPlugin } from "../router/cli/index.mjs";
7
7
  import { builderPluginAlias } from "./alias.mjs";
@@ -56,12 +56,10 @@ const runtimePlugin = (params)=>({
56
56
  });
57
57
  api.config(()=>{
58
58
  const { appDirectory, metaName } = api.getAppContext();
59
- const isReact18 = utils_isReact18(appDirectory);
60
- process.env.IS_REACT18 = isReact18.toString();
61
59
  return {
62
60
  source: {
63
61
  globalVars: {
64
- 'process.env.IS_REACT18': process.env.IS_REACT18
62
+ 'process.env.IS_REACT18': 'true'
65
63
  },
66
64
  include: [
67
65
  new RegExp(`[\\\\/]node_modules[\\\\/]@${metaName}[\\\\/]runtime[\\\\/].*[\\\\/]head\\.`)
@@ -70,14 +68,6 @@ const runtimePlugin = (params)=>({
70
68
  tools: {
71
69
  bundlerChain: (chain)=>{
72
70
  chain.module.rule('modern-entry').test(/\.jsx?$/).include.add(path_0.resolve(appDirectory, 'node_modules', `.${metaName}`)).end().sideEffects(true);
73
- },
74
- rspack: (_config, { appendPlugins, rspack })=>{
75
- if (!isReact18) appendPlugins([
76
- new rspack.IgnorePlugin({
77
- resourceRegExp: /^react-dom\/client$/,
78
- contextRegExp: /@modern-js\/runtime/
79
- })
80
- ]);
81
71
  }
82
72
  }
83
73
  };
@@ -4,7 +4,6 @@ import { loadableReady } from "@loadable/component";
4
4
  import { RenderLevel } from "../constants.mjs";
5
5
  import { wrapRuntimeContextProvider } from "../react/wrapper.mjs";
6
6
  import { WithCallback } from "./withCallback.mjs";
7
- const isReact18 = ()=>'true' === process.env.IS_REACT18;
8
7
  function hydrateRoot(App, context, ModernRender, ModernHydrate) {
9
8
  const hydrateContext = {
10
9
  ...context,
@@ -18,7 +17,7 @@ function hydrateRoot(App, context, ModernRender, ModernHydrate) {
18
17
  };
19
18
  const renderLevel = window?._SSR_DATA?.renderLevel || RenderLevel.CLIENT_RENDER;
20
19
  const renderMode = window?._SSR_DATA?.mode || 'string';
21
- if (isReact18() && 'stream' === renderMode) return streamSSRHydrate();
20
+ if ('stream' === renderMode) return streamSSRHydrate();
22
21
  function streamSSRHydrate() {
23
22
  if (renderLevel !== RenderLevel.SERVER_RENDER) return ModernRender(wrapRuntimeContextProvider(App, context));
24
23
  {
@@ -33,7 +32,7 @@ function hydrateRoot(App, context, ModernRender, ModernHydrate) {
33
32
  function stringSSRHydrate() {
34
33
  if (renderLevel === RenderLevel.CLIENT_RENDER) return ModernRender(wrapRuntimeContextProvider(App, context));
35
34
  if (renderLevel === RenderLevel.SERVER_RENDER) return new Promise((resolve)=>{
36
- isReact18() ? loadableReady(()=>{
35
+ loadableReady(()=>{
37
36
  const SSRApp = ()=>/*#__PURE__*/ jsx(WithCallback, {
38
37
  callback: callback,
39
38
  children: App
@@ -41,14 +40,10 @@ function hydrateRoot(App, context, ModernRender, ModernHydrate) {
41
40
  ModernHydrate(wrapRuntimeContextProvider(/*#__PURE__*/ jsx(SSRApp, {}), hydrateContext)).then((root)=>{
42
41
  resolve(root);
43
42
  });
44
- }) : loadableReady(()=>{
45
- ModernHydrate(wrapRuntimeContextProvider(App, hydrateContext), callback).then((root)=>{
46
- resolve(root);
47
- });
48
43
  });
49
44
  });
50
45
  console.warn(`unknow render level: ${renderLevel}, execute render()`);
51
46
  return ModernRender(wrapRuntimeContextProvider(App, context));
52
47
  }
53
48
  }
54
- export { hydrateRoot, isReact18 };
49
+ export { hydrateRoot };
@@ -1,11 +1,11 @@
1
1
  import "node:module";
2
2
  import { SSR_HYDRATION_ID_PREFIX } from "@modern-js/utils/universal/constants";
3
3
  import cookie from "cookie";
4
+ import { createRoot, hydrateRoot } from "react-dom/client";
4
5
  import { getGlobalInternalRuntimeContext } from "../context/index.mjs";
5
6
  import { getInitialContext } from "../context/runtime.mjs";
6
7
  import { wrapRuntimeContextProvider } from "../react/wrapper.mjs";
7
- import { hydrateRoot } from "./hydrate.mjs";
8
- const IS_REACT18 = 'true' === process.env.IS_REACT18;
8
+ import { hydrateRoot as external_hydrate_mjs_hydrateRoot } from "./hydrate.mjs";
9
9
  const getQuery = ()=>window.location.search.substring(1).split('&').reduce((res, item)=>{
10
10
  const [key, value] = item.split('=');
11
11
  if (key) res[key] = value;
@@ -63,39 +63,25 @@ async function render(App, id) {
63
63
  await runBeforeRender(context);
64
64
  const rootElement = id && 'string' != typeof id ? id : document.getElementById(id || 'root');
65
65
  async function ModernRender(App) {
66
- const renderFunc = IS_REACT18 ? renderWithReact18 : renderWithReact17;
67
- return renderFunc(App, rootElement);
66
+ return renderWithReact(App, rootElement);
68
67
  }
69
- async function ModernHydrate(App, callback) {
70
- const hydrateFunc = IS_REACT18 ? hydrateWithReact18 : hydrateWithReact17;
71
- return hydrateFunc(App, rootElement, callback);
68
+ async function ModernHydrate(App) {
69
+ return hydrateWithReact(App, rootElement);
72
70
  }
73
- if (window._SSR_DATA) return hydrateRoot(App, context, ModernRender, ModernHydrate);
71
+ if (window._SSR_DATA) return external_hydrate_mjs_hydrateRoot(App, context, ModernRender, ModernHydrate);
74
72
  return ModernRender(wrapRuntimeContextProvider(App, context));
75
73
  }
76
74
  throw Error('`render` function needs id in browser environment, it needs to be string or element');
77
75
  }
78
- async function renderWithReact18(App, rootElement) {
79
- const ReactDOM = await import("react-dom/client");
80
- const root = ReactDOM.createRoot(rootElement);
76
+ async function renderWithReact(App, rootElement) {
77
+ const root = createRoot(rootElement);
81
78
  root.render(App);
82
79
  return root;
83
80
  }
84
- async function renderWithReact17(App, rootElement) {
85
- const ReactDOM = await import("react-dom");
86
- ReactDOM.render(App, rootElement);
87
- return rootElement;
88
- }
89
- async function hydrateWithReact18(App, rootElement) {
90
- const ReactDOM = await import("react-dom/client");
91
- const root = ReactDOM.hydrateRoot(rootElement, App, {
81
+ async function hydrateWithReact(App, rootElement) {
82
+ const root = hydrateRoot(rootElement, App, {
92
83
  identifierPrefix: SSR_HYDRATION_ID_PREFIX
93
84
  });
94
85
  return root;
95
86
  }
96
- async function hydrateWithReact17(App, rootElement, callback) {
97
- const ReactDOM = await import("react-dom");
98
- const root = ReactDOM.hydrate(App, rootElement, callback);
99
- return root;
100
- }
101
- export { hydrateWithReact17, hydrateWithReact18, render, renderWithReact17, renderWithReact18 };
87
+ export { hydrateWithReact, render, renderWithReact };
@@ -7,11 +7,11 @@ import { buildHtml } from "../shared.mjs";
7
7
  import { checkIsNode, hasStylesheetLink, safeReplace } from "../utils.mjs";
8
8
  import { fileURLToPath as __rspack_fileURLToPath } from "node:url";
9
9
  import { dirname as __rspack_dirname } from "node:path";
10
- var beforeTemplate_dirname = __rspack_dirname(__rspack_fileURLToPath(import.meta.url));
10
+ var __rspack_import_meta_dirname__ = __rspack_dirname(__rspack_fileURLToPath(import.meta.url));
11
11
  const readAsset = async (chunk)=>{
12
12
  const fs = await import("fs/promises");
13
13
  const path = await import("path");
14
- const filepath = path.join(beforeTemplate_dirname, chunk);
14
+ const filepath = path.join(__rspack_import_meta_dirname__, chunk);
15
15
  return fs.readFile(filepath, 'utf-8');
16
16
  };
17
17
  const checkIsInline = (chunk, enableInline)=>{
@@ -3,7 +3,7 @@ import { ChunkExtractor } from "@loadable/server";
3
3
  import { attributesToString, checkIsNode, hasStylesheetLink } from "../utils.mjs";
4
4
  import { fileURLToPath as __rspack_fileURLToPath } from "node:url";
5
5
  import { dirname as __rspack_dirname } from "node:path";
6
- var loadable_dirname = __rspack_dirname(__rspack_fileURLToPath(import.meta.url));
6
+ var __rspack_import_meta_dirname__ = __rspack_dirname(__rspack_fileURLToPath(import.meta.url));
7
7
  const extname = (uri)=>{
8
8
  if ('string' != typeof uri || !uri.includes('.')) return '';
9
9
  return `.${uri?.split('.').pop()}` || '';
@@ -17,7 +17,7 @@ const checkIsInline = (chunk, enableInline)=>{
17
17
  const readAsset = async (chunk)=>{
18
18
  const fs = await import("fs/promises");
19
19
  const path = await import("path");
20
- const filepath = path.resolve(loadable_dirname, chunk.filename);
20
+ const filepath = path.resolve(__rspack_import_meta_dirname__, chunk.filename);
21
21
  return fs.readFile(filepath, 'utf-8');
22
22
  };
23
23
  class LoadableCollector {
@@ -297,12 +297,13 @@ const documentPlugin = ()=>({
297
297
  processedHtml = processCommentPlaceholders(processedHtml);
298
298
  return `<!DOCTYPE html>${processedHtml}`.replace(DOCUMENT_META_PLACEHOLDER, ()=>metas).replace(DOCUMENT_SSR_PLACEHOLDER, ()=>HTML_SEPARATOR).replace(DOCUMENT_SCRIPTS_PLACEHOLDER, ()=>scripts).replace(DOCUMENT_LINKS_PLACEHOLDER, ()=>links).replace(DOCUMENT_CHUNKSMAP_PLACEHOLDER, ()=>PLACEHOLDER_REPLACER_MAP[DOCUMENT_CHUNKSMAP_PLACEHOLDER]).replace(DOCUMENT_SSRDATASCRIPT_PLACEHOLDER, ()=>PLACEHOLDER_REPLACER_MAP[DOCUMENT_SSRDATASCRIPT_PLACEHOLDER]).replace(DOCUMENT_TITLE_PLACEHOLDER, ()=>titles);
299
299
  };
300
- const documentEntry = (entryName, templateParameters)=>{
300
+ const documentEntry = (entryName)=>{
301
301
  const { entrypoints, internalDirectory, appDirectory } = api.getAppContext();
302
302
  const documentFilePath = getDocumentByEntryName(entrypoints, entryName, appDirectory);
303
303
  if (!documentFilePath) return null;
304
304
  return async (templateData)=>{
305
305
  const config = api.getNormalizedConfig();
306
+ const { compilation: _compilation, htmlPlugin, rspackConfig: _rspackConfig, ...templateParameters } = templateData;
306
307
  const documentParams = getDocParams({
307
308
  config: config,
308
309
  entryName,
@@ -320,7 +321,6 @@ const documentPlugin = ()=>({
320
321
  debug("entry %s's document jsx rendered html: %o", entryName, html);
321
322
  const { partialsByEntrypoint } = api.getAppContext();
322
323
  html = processPartials(html, entryName, partialsByEntrypoint || {});
323
- const htmlPlugin = templateData.htmlPlugin || templateData.htmlWebpackPlugin || templateData.htmlRspackPlugin;
324
324
  if (!htmlPlugin) throw new Error('Failed to get HTML plugin tags from template parameters.');
325
325
  const { scripts, links, metas, titles } = extractHtmlTags(htmlPlugin, templateParameters);
326
326
  return processPlaceholders(html, config, scripts, links, metas, titles);
@@ -332,10 +332,7 @@ const documentPlugin = ()=>({
332
332
  return {
333
333
  tools: {
334
334
  htmlPlugin: (options, entry)=>{
335
- const hackParameters = 'function' == typeof options?.templateParameters ? options?.templateParameters({}, {}, {}, {}) : {
336
- ...options?.templateParameters
337
- };
338
- const templateContent = documentEntry(entry.entryName, hackParameters);
335
+ const templateContent = documentEntry(entry.entryName);
339
336
  const documentHtmlOptions = templateContent ? {
340
337
  templateContent,
341
338
  inject: false
@@ -5,7 +5,7 @@ import { isRouteEntry } from "./entry.mjs";
5
5
  import { handleFileChange, handleGeneratorEntryCode, handleModifyEntrypoints } from "./handler.mjs";
6
6
  import { fileURLToPath as __rspack_fileURLToPath } from "node:url";
7
7
  import { dirname as __rspack_dirname } from "node:path";
8
- var cli_dirname = __rspack_dirname(__rspack_fileURLToPath(import.meta.url));
8
+ var __rspack_import_meta_dirname__ = __rspack_dirname(__rspack_fileURLToPath(import.meta.url));
9
9
  const routerPlugin = ()=>({
10
10
  name: '@modern-js/plugin-router',
11
11
  required: [
@@ -46,7 +46,7 @@ const routerPlugin = ()=>({
46
46
  include: [
47
47
  /[\\/]node_modules[\\/]react-router[\\/]/,
48
48
  /[\\/]node_modules[\\/]react-router-dom[\\/]/,
49
- node_path.resolve(cli_dirname, '../runtime').replace('cjs', 'esm')
49
+ node_path.resolve(__rspack_import_meta_dirname__, '../runtime').replace('cjs', 'esm')
50
50
  ]
51
51
  }
52
52
  }));
@@ -1,5 +1,4 @@
1
1
  import type React from 'react';
2
2
  import type { Root } from 'react-dom/client';
3
3
  import type { TRuntimeContext } from '../context/runtime';
4
- export declare const isReact18: () => boolean;
5
- export declare function hydrateRoot(App: React.ReactElement, context: TRuntimeContext, ModernRender: (App: React.ReactElement) => Promise<HTMLElement | Root>, ModernHydrate: (App: React.ReactElement, callback?: () => void) => Promise<HTMLElement | Root>): Promise<HTMLElement | Root>;
4
+ export declare function hydrateRoot(App: React.ReactElement, context: TRuntimeContext, ModernRender: (App: React.ReactElement) => Promise<HTMLElement | Root>, ModernHydrate: (App: React.ReactElement) => Promise<HTMLElement | Root>): Promise<HTMLElement | Root>;
@@ -3,7 +3,5 @@ export type RenderFunc = typeof render;
3
3
  export declare function render(App: React.ReactElement<{
4
4
  basename: string;
5
5
  }>, id?: HTMLElement | string): Promise<HTMLElement | import("react-dom/client").Root>;
6
- export declare function renderWithReact18(App: React.ReactElement, rootElement: HTMLElement): Promise<import("react-dom/client").Root>;
7
- export declare function renderWithReact17(App: React.ReactElement, rootElement: HTMLElement): Promise<HTMLElement>;
8
- export declare function hydrateWithReact18(App: React.ReactElement, rootElement: HTMLElement): Promise<import("react-dom/client").Root>;
9
- export declare function hydrateWithReact17(App: React.ReactElement, rootElement: HTMLElement, callback?: () => void): Promise<any>;
6
+ export declare function renderWithReact(App: React.ReactElement, rootElement: HTMLElement): Promise<import("react-dom/client").Root>;
7
+ export declare function hydrateWithReact(App: React.ReactElement, rootElement: HTMLElement): Promise<import("react-dom/client").Root>;
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "modern",
16
16
  "modern.js"
17
17
  ],
18
- "version": "3.4.0",
18
+ "version": "3.6.0",
19
19
  "engines": {
20
20
  "node": ">=20"
21
21
  },
@@ -215,21 +215,21 @@
215
215
  "isbot": "3.8.0",
216
216
  "react-helmet": "^6.1.0",
217
217
  "react-is": "^18.3.1",
218
- "@modern-js/plugin": "3.4.0",
219
- "@modern-js/plugin-data-loader": "3.4.0",
220
- "@modern-js/runtime-utils": "3.4.0",
221
- "@modern-js/render": "3.4.0",
222
- "@modern-js/types": "3.4.0",
223
- "@modern-js/utils": "3.4.0"
218
+ "@modern-js/plugin": "3.6.0",
219
+ "@modern-js/plugin-data-loader": "3.6.0",
220
+ "@modern-js/render": "3.6.0",
221
+ "@modern-js/runtime-utils": "3.6.0",
222
+ "@modern-js/types": "3.6.0",
223
+ "@modern-js/utils": "3.6.0"
224
224
  },
225
225
  "peerDependencies": {
226
- "react": ">=17.0.2",
227
- "react-dom": ">=17.0.2"
226
+ "react": ">=18.0.0",
227
+ "react-dom": ">=18.0.0"
228
228
  },
229
229
  "devDependencies": {
230
230
  "@remix-run/web-fetch": "^4.1.3",
231
- "@rsbuild/core": "2.0.10",
232
- "@rslib/core": "0.22.1",
231
+ "@rsbuild/core": "2.1.0",
232
+ "@rslib/core": "0.23.2",
233
233
  "@testing-library/dom": "^10.4.1",
234
234
  "@testing-library/react": "^16.3.2",
235
235
  "@types/cookie": "0.6.0",
@@ -240,7 +240,7 @@
240
240
  "react-dom": "^19.2.7",
241
241
  "ts-node": "^10.9.2",
242
242
  "typescript": "^5",
243
- "@modern-js/app-tools": "3.4.0",
243
+ "@modern-js/app-tools": "3.6.0",
244
244
  "@modern-js/rslib": "2.68.10",
245
245
  "@scripts/rstest-config": "2.66.0"
246
246
  },