npm dependences devDependencies peerDependencies

409 阅读2分钟

NPM (node package manager) 包管理器

{
    "name": "my-app",
    // 这里是通过-s也就是生产过程中的需要的
    "dependences": {
        "package-a": "^1.0.0"
    },
    // 他就是-D下的包, 是在开发过程中使用的
    "devDependencies": {
        "package-b": "^1.2.2"
    }
}

image.png

// 有一种不常用的, 指定
"peerDependencies": {
    "a": "^1.0.0"
}

peerDependencies

假设我们当前的项目是MyProject,项目中有一些依赖,比方其中有一个依赖包PackageA,该包的package.json文件指定了对PackageB的依赖:

{
    "dependencies": {
        "PackageB": "1.0.0"
    }
}

如果我们在我们的MyProject项目中执行npm install PackageA, 我们会发现我们项目的目录结构会是如下形式:

MyProject
|- node_modules
   |- PackageA
      |- node_modules
         |- PackageB
         ```
那么在我们的项目中,我们能通过下面语句引入"PackageA"

var packageA = require('PackageA')

但是,如果你想在项目中直接引用PackageB:

var packageA = require('PackageA') var packageB = require('PackageB')

这是不行的,即使PackageB被安装过;因为Node只会在“MyProject/node_modules”目录下查找PackageB,它不会在进入PackageA模块下的node_modules下查找。

所以,为了解决这个问题,在MyProject项目package.json中我们必须直接声明对PackageB的依赖并安装。

peerDependencies的引入
例如上面PackageA的package.json文件如果是下面这样:

{ "peerDependencies": { "PackageB": "1.0.0" } }

那么,它会告诉npm:如果某个package把我列为依赖的话,那么那个package也必需应该有对PackageB的依赖。

也就是说,如果你npm install PackageA,你将会得到下面的如下的目录结构:

MyProject |- node_modules |- PackageA |- PackageB

即:
在npm2中,即使当前项目MyProject中没有直接依赖PackageB,该PackageB包依然会安装到当前项目的node_modules文件夹中。

总结:
peerDependencies的具体作用:
peerDependencies的目的是提示宿主环境去安装满足插件peerDependencies所指定依赖的包,然后在插件import或者require所依赖的包的时候,永远都是引用宿主环境统一安装的npm包,最终解决插件与所依赖包不一致的问题。

这对于写npm包非常重要。
当你写的包a里面依赖另一个包b,而这个包b是引用这个包a的业务的常用的包的时候,建议写在peerDependencies里,避免重复下载/多个版本共存