首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有在Webpack包存在的情况下,我才能将“react/client”包含在内(即react dom 18+)?

只有在Webpack包存在的情况下,我才能将“react/client”包含在内(即react dom 18+)?
EN

Stack Overflow用户
提问于 2022-06-24 12:14:03
回答 1查看 150关注 0票数 0

我试图在一个库中编写代码,它可以同时使用Reactive18和以前的版本,所以基本上

代码语言:javascript
复制
const reactMajorVersion = parseInt(ReactDOM.version.split('.')[0], 10);

if (reactMajorVersion >= 18) {
  const ReactDOMClient = require('react-dom/client');
  // use ReactDOMClient.createRoot
} else {
  // use ReactDOM.render
}

问题是,图书馆需要与Webpack合作(5,以防这件事)。因此,如果代码中有require('react-dom/client'),Webpack解析器会尝试将它包含在包中,而在以前的React版本中,它会失败。

我试着解决这个问题

代码语言:javascript
复制
const reactDOMContext = require.context('react-dom', false, /client\.js$/);
const ReactDOMClient = reactDomContext('react-dom/client.js');

但是这似乎没有像预期的那样包含文件:如果我使用npx webpack --stats verbose运行,我看到

代码语言:javascript
复制
      modules by path ./node_modules/react-dom/*.js 1.97 KiB
        ./node_modules/react-dom/index.js 1.33 KiB {vendors-node_modules_core-js_modules_es_aggregate-error_js-node_modules_core-js_modules_es_pr-0459f6} [depth 2] [dependent] [built] [code generated]
          [exports: __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, createPortal, createRoot, findDOMNode, flushSync, hydrate, hydrateRoot, render, unmountComponentAtNode, unstable_batchedUpdates, unstable_renderSubtreeIntoContainer, version]
          [used exports unknown]
          from origin ./client/app/startup/ClientReduxApp.jsx
            harmony side effect evaluation react-dom [./client/app/startup/ClientReduxApp.jsx] 11:0-33
            harmony import specifier react-dom [./client/app/startup/ClientReduxApp.jsx] 23:33-49
            harmony import specifier react-dom [./client/app/startup/ClientReduxApp.jsx] 23:52-67
          from origin ./client/app/startup/ClientReduxSharedStoreApp.jsx
            harmony side effect evaluation react-dom [./client/app/startup/ClientReduxSharedStoreApp.jsx] 9:0-33
            harmony import specifier react-dom [./client/app/startup/ClientReduxSharedStoreApp.jsx] 18:33-49
            harmony import specifier react-dom [./client/app/startup/ClientReduxSharedStoreApp.jsx] 18:52-67
          from origin ./client/app/startup/ManualRenderAppRenderer.jsx
            harmony side effect evaluation react-dom [./client/app/startup/ManualRenderAppRenderer.jsx] 5:0-33
            harmony import specifier react-dom [./client/app/startup/ManualRenderAppRenderer.jsx] 7:33-49
            harmony import specifier react-dom [./client/app/startup/ManualRenderAppRenderer.jsx] 7:52-67
          from origin ./node_modules/react-redux/es/utils/reactBatchedUpdates.js
            harmony side effect evaluation react-dom [./node_modules/react-redux/es/utils/reactBatchedUpdates.js] 2:0-52
            harmony export imported specifier react-dom [./node_modules/react-redux/es/utils/reactBatchedUpdates.js] 2:0-52
          cjs require react-dom [./node_modules/react-on-rails/node_package/lib/clientStartup.js] 12:34-54
          cjs require react-dom [./node_modules/react-on-rails/node_package/lib/reactHydrateOrRender.js] 7:34-54
        ./node_modules/react-dom/server.browser.js 658 bytes {vendors-node_modules_core-js_modules_es_aggregate-error_js-node_modules_core-js_modules_es_pr-0459f6} [depth 3] [dependent] [built] [code generated]
          [exports: renderToNodeStream, renderToReadableStream, renderToStaticMarkup, renderToStaticNodeStream, renderToString, version]
          [used exports unknown]
          cjs require react-dom/server [./node_modules/react-on-rails/node_package/lib/handleError.js] 7:31-58
          cjs require react-dom/server [./node_modules/react-on-rails/node_package/lib/serverRenderReactComponent.js] 42:31-58

代码语言:javascript
复制
  ../../node_modules/react-dom/ sync nonrecursive client\.js$ [../../node_modules/react-dom sync client\.js$] 160 bytes {server-bundle} [depth 3] [dependent] [built] [code generated]
    [no exports]
    [used exports unknown]
    require.context [./node_modules/react-on-rails/node_package/lib/reactHydrateOrRender.js] 18:30-80

(为什么它使用的是../../node_modules而不是./node_modules?)

EN

回答 1

Stack Overflow用户

发布于 2022-06-25 10:42:50

代码语言:javascript
复制
try {
  ReactDOMClient = require('react-dom/client');
} catch (e) {
  // do nothing
}

只对缺少模块发出警告在反应下16,而不是错误。最好是避免警告,但我可以接受。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72743919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档