返回
踩坑经验分享:Webpack构建library时需要避免的雷区
前端
2023-09-19 03:22:31
随着组件化、模块化意识的不断增强,越来越多的程序员开始构建 npm 包来供业务复用了。但构建出来的 package 在使用时,常常会出现 ReactDOM 找不到的异常。后续经过一番探索,结合 webpack 打包原理,终于找到了解决方案。
案发现场
首先,让我们回顾一下案发现场的惨状。
…
你会看到错误提示:
Uncaught ReferenceError: ReactDOM is not defined
这表明 ReactDOM 这个变量在当前环境中不存在,导致程序无法正常运行。
问题分析
为了解决这个问题,我们必须先找出问题的根源。
首先,我们查看构建出的源码,发现了一个问题:在构建过程中,ReactDOM 这个变量被 webpack 的 ProvidePlugin
插件替换成了一个空对象。这就意味着,在构建后的代码中,ReactDOM 这个变量实际上是不存在的。
这是因为,ProvidePlugin
插件默认情况下会将所有在 node_modules
目录下的模块都替换成一个空对象。这样做是为了避免在打包时出现循环依赖的问题。
然而,在我们的案例中,ReactDOM 这个变量并不是在 node_modules
目录下的模块,而是属于 react-dom
这个包。所以,ProvidePlugin
插件不应该替换掉 ReactDOM 这个变量。
解决方案
既然我们已经找到了问题所在,那就可以着手解决问题了。
我们可以通过以下两种方式来解决这个问题:
- 将
ProvidePlugin
插件的include
选项设置为一个空数组,这样就可以让ProvidePlugin
插件不再替换任何模块。 - 将 ReactDOM 这个变量添加到
ProvidePlugin
插件的include
选项中,这样就可以让ProvidePlugin
插件只替换 ReactDOM 这个变量。
我们选择第二种方式来解决这个问题,因为这样可以避免在构建时出现循环依赖的问题。
在修改了 ProvidePlugin
插件的配置之后,重新构建项目,问题就解决了。
总结
通过这次踩坑经历,我们总结出了以下经验:
- 在使用 webpack 构建 npm 包时,一定要注意
ProvidePlugin
插件的配置。 ProvidePlugin
插件默认情况下会将所有在node_modules
目录下的模块都替换成一个空对象。- 如果你的代码中使用了在
node_modules
目录下的模块,但又不想让ProvidePlugin
插件替换掉这些模块,那么你可以在ProvidePlugin
插件的include
选项中指定这些模块。
我希望这篇博客文章能够帮助你避免在构建 npm 包时遇到同样的问题。