我们知道 Node.js (NPM) 使用语义化的版本号来指定依赖版本或者版本范围,并且默认情况下是使用 ^
这个版本范围,即只要是同一个 major version 并且版本号大于等于指定版本都行。在这种情况下,假如我们有 2 个依赖 A 和 B,A 和 B 都依赖 lodash,A 的 package.json 里面写的是 "lodash": "^4.0.0"
,B 的 package.json 里面写的是 "lodash": "^4.1.2"
,那么最终 NPM 安装的 lodash 可能就是 lodash 满足 4.x.x 的最新版,然后 A 和 B 会共用这一份 lodash。
而在 Deno 这边,由于不存在指定版本范围这一概念,所以很可能 A 用的是 "https://deno.land/x/lodash@4.0.0/lodash.js"
B 用的是 "https://deno.land/x/lodash@4.1.2/lodash.js"
,这样就会导致我们最终的依赖里面有 2 个不同版本的 lodash。而且由于 Deno 不存在唯一的中心化仓库,甚至可能出现 A 和 B 虽然用的是同一个版本的 lodash,但 A 用的是 "http://foo/lodash@4.0.0/lodash.js"
,B 用的是 "http://bar/lodash@4.0.0/lodash.js"
,这样我们的依赖里就出现了 2 个同一版本的 lodash 了。
如果是 lodash 这样的工具函数库还好,似乎只会带来依赖代码体积膨胀的问题,但如果是 React.js 这种要求全局只能有同一个实例的库,依赖里出现 2 个不同版本的 React.js 就直接 GG 了。