程序员开源工具技巧首页投稿(暂停使用,暂停投稿)

读懂package.json -- 依赖管理

2017-06-26  本文已影响0人  CodeLoam

npm做为Javascript项目的包管理工具,由于其与Node.js的紧密配合(npm和Node.js出自一人之手),目前已经基本没有竞争对手。

包管理工具要解决的主要问题就是依赖包的安装,在Javascript项目中,包的依赖关系是由package.json给出的,这篇文件将介绍package.json中描述的依赖信息。

依赖管理

在package.json中,有如下几项涉及到依赖包的描述:

这些项的内容形式都是一样的(除了bundledDependencies),只是作用不同,如:

  "dependencies": {
    "base62": "~0.1.1",
    "commoner": "~0.7.0",
    "esprima": "https://github.com/facebook/esprima/tarball/ca28795124d45968e62a7b4b336d23a053ac3a84",
    "recast": "~0.4.8",
    "source-map": "~0.1.22"
  }

key就是项目的名词,而value可以有多种形式

关于semver会在另一篇文章中介绍(先挖个坑)。

依赖树

不同于很多语言的依赖管理,npm使用的是依赖树。也就是说每个依赖包会有一套自己指定的(在package.json中说明的)依赖包,而不会和其他包共享。
例如,mod-a依赖mod-b@1.0.0,mod-c依赖mod-b@2.0.0,而现在有一个项目依赖mod-a和mod-c,那么最终安装的依赖包如下:

├─┬ node_modules
│ ├─┬ mod-a
│ │ ├── mod-b@1.0.0
│ ├─┬ mod-c
│ │ ├── mod-b@2.0.0

而Node.js在加载依赖包的时候会处理这个问题。之所以文章最开始说npm和Node.js的紧密合作也是这个原因。

使用依赖树来管理包带来了一个明显的好处,不用处理依赖冲突的问题。这个问题在早期的Java项目中比较常见,而在使用了Maven和Gradle之后,情况有所缓解,但只能减轻同一个包多个版本被放入发布的包中这种情况,仍然无法解决依赖冲突这个根本问题。

依赖树也有一些缺点:

希望以上的介绍能够帮助你更好的理解npm的依赖管理。

上一篇下一篇

猜你喜欢

热点阅读