为啥在创建包时必须在 webpack 配置中将 peerDependencies 列为外部项?

Posted

技术标签:

【中文标题】为啥在创建包时必须在 webpack 配置中将 peerDependencies 列为外部项?【英文标题】:Why do I have to list my peerDependencies as externals in the webpack config when creating a package?为什么在创建包时必须在 webpack 配置中将 peerDependencies 列为外部项? 【发布时间】:2019-12-06 21:39:36 【问题描述】:

我正在使用 create-react-app 在 React 中创建一个 npm 包。因为reactreact-dom 被假定在宿主项目中,所以我在我的package.json 中将它们列为peerDependencies 和devDependencies。

我了解到,这样两者仍然捆绑在一起,为了防止我必须在 webpack 配置的外部列出它们,我成功地做到了:

externals:         
  react:           
      commonjs: 'react',          
      commonjs2: 'react',          
      amd: 'React',          
      root: 'React',      
  ,      
  'react-dom':           
      commonjs: 'react-dom',          
      commonjs2: 'react-dom',          
      amd: 'ReactDOM',          
      root: 'ReactDOM',      
  ,  
,

我的问题是:为什么我必须经过这第二步?不应该将它们列为 peerDependencies 就足够了吗?如果不是,那么在这种情况下,peerDependencies 与常规依赖项有何不同?

【问题讨论】:

【参考方案1】:

对等依赖由 npm 理解,外部依赖由 webpack 理解。两者的含义相同,但由完全不同的软件处理。

虽然运行 npm install 不会安装任何对等依赖项,但 webpack 仍会尝试遍历依赖项树以尝试找到它们(如果它们在代码中被引用)。将它们标记为外部告诉 webpack 显式忽略它们并且不要尝试遍历该依赖项分支,即使已安装了这些对等依赖项。

【讨论】:

所以为了正确理解它,webpack 捆绑了 node-modules 对吧?但是 react 和 react-dom 首先不应该在节点模块中,因为它们是对等依赖项。那么在我将它们添加到外部之前,它们怎么会在捆绑包中呢? @syberen 我已经在我的回答中澄清了。

以上是关于为啥在创建包时必须在 webpack 配置中将 peerDependencies 列为外部项?的主要内容,如果未能解决你的问题,请参考以下文章

在 CPack 中将文件标记为配置文件

如何在 Webpack 配置文件中将 CSS 名称设置为不是哈希?

如何在升级过程中运行捆绑包时,如何在WIX(Windows安装程序xml)引导程序项目中将按钮文本更改为“升级”?

Angular 2 的 JSPM 与 WebPack

JSPM 与 Angular 2 的 WebPack

为啥打开wireshark抓包时没有发送ICMP ping请求?