javascript - webpack、rollup 等模块打包器如何处理相同依赖项的两个不同版本?

标签 javascript reactjs webpack rollup

如果,module1 依赖于 button-component@1.0.2
并且 module2 依赖于 button-component@1.5.0
最终捆绑包中加载了哪个版本的按钮组件?
我们可以采取哪些步骤来避免最终构建中的重复模块?

最佳答案

TL;DR: It is not the bundler. It is Mostly the package manager (NPM, etc.) that is responsible for providing dependencies which bundlers simply follow.


在这里工作的并不是捆绑器本身。对于第三方依赖,我们通常使用 NPM,因此 node_modules一般来说。
现在 NPM 的工作是保持依赖树尽可能平坦。想象一下下面的图表,其中 your-code取决于 module1module2 .并且,module1本身在内部依赖于 module2 .
your-code <-- module1@1.0.0 <--- module2@1.0.5
          <-- module2@1.0.5
如果 your-codemodule1使用相同的依赖,然后 npm将在顶层 node_modules 下保持平稳文件夹,因此捆绑器(Webpack/Rollup)将选择 module 的单个版本
现在想象另一种情况:
your-code <-- module1@1.0.0 <--- module2@1.0.5
          <-- module2@2.0.0
这里your-code正在使用 module2使用版本 2.0.0 但 module1正在使用不同的版本。这是一个突破性的变化。在这种情况下,npm 不会让它保持平坦并安装 module2@2.0.0在你node_modules文件夹同时 module2@1.0.5将安装在 node_modules module1 的文件夹. Bundler 在捆绑代码时会选择这两个版本。
但这并不是所有的脚本。通常,如果依赖项仅在 patch 处有所不同版本,即 的最后一位数字semver ,然后 npm只会选择一个而忽略另一个。此外,这种依赖关系的解决还取决于 NPM 版本控制模型。您可以使用 ^1.0.5 指定宽松的依赖版本。或 ~1.0.5 .这也会影响 NPM will install modules separately or keep it flat .
您可以使用bundler analyzer或等效于检测重复依赖项。当 NPM 第一次发布时,它无法处理这个问题,因此 Bower 的诞生是为了帮助开发人员处理平面依赖项,以便打包器只选择一个版本的依赖项。但是最新的 NPM 对于大多数情况来说已经足够好了,并且不再使用 bower。

最后我说主要是 因为它通常是包管理器。但是,如果是 导入,您可以教/覆盖捆绑器以专门解决一个且只有一个版本。例如,考虑下面的 Webpack 解析配置:
resolve: {
  // see below for an explanation
  alias: {
    preact: path.resolve('node_modules', 'preact')
  }
}
所以,如果你不小心有 preact在你的依赖关系图中不止一次,那么你可以强制 Webpack 总是使用特定的 preact从一个特定文件夹导入。

关于javascript - webpack、rollup 等模块打包器如何处理相同依赖项的两个不同版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67263693/

相关文章:

javascript - 将我的 Javascript、JQuery 和 CSS 集成到现有网站中

json - React-Three-Fiber (R3F) : GLTF loader loading issue. 为什么我看不到我的模型?

javascript - react native : Check if component is returned to

http - Vue 代理设置不起作用

javascript - 自动完成不起作用

javascript - CSS 未应用于页面

c# - 如何捆绑.Net Core API + Angular 前端

nginx - 如何部署我的 Angular 2 + Typescript + Webpack 应用程序

javascript - jquery/javascript if else 语句不起作用,检测到空文本框

reactjs - react-native-vector-icon 显示 "wrong"图标