捆绑为 UMD 的 React 组件在通过另一个 React 应用程序中的脚本标签导入时无法加载依赖项

Posted

技术标签:

【中文标题】捆绑为 UMD 的 React 组件在通过另一个 React 应用程序中的脚本标签导入时无法加载依赖项【英文标题】:React component bundled as an UMD can't load a dependency when imported via script tag in another react app 【发布时间】:2020-08-14 11:47:57 【问题描述】:

我创建了一个简单的反应组件,我想有条件地将它导入另一个反应应用程序。 我设法通过 html 脚本标记导入它,然后从 window 变量中获取它。 只要 react 被捆绑在模块中,整个想法就可以工作。 我想使用父应用程序的外部反应实例,所以我已经像这样配置了 webpack:

const path = require('path');
module.exports = 
    entry: './index.js',
    output: 
        path: path.resolve(__dirname, 'dist'),
        filename: 'module.js',
        library: 'test',
        libraryTarget: 'umd',
    ,
    externals: 
        'react': 
            'commonjs': 'react',
            'commonjs2': 'react',
            'amd': 'react',
            'root': 'React'
        
    
;

编辑: 我已将外部更改为 react: 'React' ,并在父应用程序中将反应分配给window.React 变量。

const Test = (window as any).test.default
console.log(window.React)
console.log(Test)
return <Test />

上面的代码导致同样的错误。

Children: …, Fragment: Symbol(react.fragment), Profiler: Symbol(react.profiler), Component: ƒ, PureComponent: ƒ, …

ƒ ()return o.default.createElement("p",style:color:"green",fontWeight:"bold","Hello, I come from an external module!")

module.js:1 Uncaught TypeError: Cannot read property 'createElement' of undefined

已解决! 我发现 React 实例必须在 window.React 中可用 加载 UMD 脚本时的变量。起初,我设法通过在加载脚本之前从 CDN 加载 React 来运行它。最后,在确保 window.React 可用之后,我决定动态加载外部组件。它按预期工作。

【问题讨论】:

【参考方案1】:

尝试使用一次

externals:  react: 'window.React' 

【讨论】:

【参考方案2】:

像这样配置你的外部对象:

外部: 反应:'反应' ,

这不会在你的包中包含 React。 确保您将包含此捆绑包的应用程序在其窗口对象中导出 React。 通常在任何 React 项目中,React 实例都在窗口本身中可用。

【讨论】:

我按照你的指示将 React 添加到了 window 变量中,就像在后期编辑中一样。不幸的是,它导致了同样的错误。 您是否在 console.log 中获得了 window.React 的值? 另外,您的父应用程序中的 react 和 react-dom 版本是否与您在其他模块中使用的相同 我得到了 window.React 的值,就像在添加的 sn-p 中一样。我使用相同版本的反应。我没有使用 react-dom,我只导出一个段落。

以上是关于捆绑为 UMD 的 React 组件在通过另一个 React 应用程序中的脚本标签导入时无法加载依赖项的主要内容,如果未能解决你的问题,请参考以下文章

使用 webpack 捆绑一个 React 组件以由另一个 React 组件导入

当它是另一个项目的依赖项时,捆绑我的汇总项目是什么

为 React 组件库使用 Rollup

将 React 组件从自定义组件库导入 HTML

是否可以使用webpack单独导入捆绑的webpack和库?

Rollup.js 没有捆绑我的 React 组件库字体