读懂package.json -- 依靠治理

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的依靠治理。

    原文作者:CodeLoam
    原文地址: https://segmentfault.com/a/1190000009927946
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞