npm做为Javascript项目标包治理工具,因为其与Node.js的严密配合(npm和Node.js出自一人之手),如今已基础没有竞争对手。
包治理工具要处置惩罚的重要题目就是依靠包的装置,在Javascript项目中,包的依靠关联是由package.json给出的,这篇文件将引见package.json中形貌的依靠信息。
依靠治理
在package.json中,有以下几项涉及到依靠包的形貌:
dependencies
项目中运用到的包,但不包含测试所运用的包
devDependencies
重假如在测试时运用的包,也包含一些代码编译的包,比方将coffee-script编译为javascript。也就是说在仅仅运用该项目标时刻(而不举行测试等环节),不须要装置的包可以放在devDependencies中
peerDependencies
假如改项目须要指明一些有协作关联的包的版本时,运用peerDependencies。这里运用了协作,而不是依靠,是我个人的明白。peerDependencies并非必需装置的包,但假如一旦要装置,就要符合要求。比方react-dom的package.json中有以下的形貌:
"peerDependencies": { "react": "^15.6.1" },
peerDependencies最少打消了一些挂念,比方react生态中用到的一些包在晋级的时刻会不会不婚配?
optionalDependencies
假如有一些依靠包纵然装置失利,项目依然可以运转或许愿望npm继承运转,就可以运用optionalDependencies。别的optionalDependencies会掩盖dependencies中的同名依靠包,所以不要在两个处所都写。
bundledDependencies/bundleDependencies
假如在打包宣布的运用愿望一些依靠包也出如今终究的包里,那末可以将包的名字放在bundledDependencies,bundledDependencies的值是一个字符串数组,如:
"name": "awesome-web-framework", "version": "1.0.0", "bundledDependencies": [ 'renderized', 'super-streams' ]
npm pack
会将renderized
和super-streams
放入天生的包awesome-web-framework-1.0.0.tgz中,并且在npm install awesome-web-framework-1.0.0.tgz
时,renderized
和super-streams
也会被一同装置。
这些项的内容情势都是一样的(除了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可以有多种情势
version,遵照semver
一个tarball的url
一个git url
当地途径
关于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 v3中,尝试着同享雷同版本的库,但照样比较弱),致使终究打包的时刻有同一个库的多个版本的代码出如今终究包中。
潜伏的运转时争执。以上面的例子为例,能够有些时刻,mod-b的两个版本没法同时运转,而这只要在运转或许测试的时刻才被发明。
愿望以上的引见可以协助你更好的明白npm的依靠治理。