当前位置: 首页 > 后端技术 > Node.js

你需要知道的几类npm依赖包管理

时间:2023-04-03 10:17:21 Node.js

npm依赖包管理你需要知道的几种package,也是npm命令的入口文件。npm目前支持以下几种依赖包管理:dependenciesdevDependenciespeerDependenciesoptionalDependenciesbundledDependencies/bundleDependencies如果你想使用哪种依赖管理,那么你可以把它放在package.json中对应的依赖对象中,例如:“^0.3.2”,"grunt":"^1.0.1","webpack":"^3.6.0"},"dependencies":{"gulp":"^3.9.1","hello-else":"^1.0.0"},"peerDependencies":{},"optionalDependencies":{},"bundledDependencies":[]下面我们一一了解一下:dependencies应用依赖,或者说业务依赖,是我们最常用的依赖包管理对象!它用于指定应用程序所依赖的外部包。这些依赖是应用发布后正常执行所必需的,但不包括测试或本地打包时使用的包。您可以使用以下命令进行安装:npminstallpackageName--savedependencies是一个简单的JSON对象,包含包名称和包版本,其中包版本可以是版本号或URL地址。例如:{"dependencies":{"foo":"1.0.0-2.9999.9999",//指定版本范围"bar":">=1.0.2<2.1.2","baz":">1.0.2<=2.3.4","boo":"2.0.1",//指定版本"qux":"<1.0.0||>=2.3.1<2.4.5||>=2.5.2<3.0.0","asd":"http://asdf.com/asdf.tar.gz",//指定包地址"til":"~1.2",//最新可用版本"elf":"~1.2.3","elf":"^1.2.3",//兼容版本"two":"2.x",//2.1,2.2,...,2.9都可用"thr":"*",//任何版本"thr2":"",//任何版本"lat":"latest",//当前最新的"dyl":"file:../dyl",//本地地址"xyz":"git+ssh://git@github.com:npm/npm.git#v1.0.27",//git地址"fir":"git+ssh://git@github.com:npm/npm#semver:^5.0","wdy":"git+https://isaacs@github.com/npm/npm.git","xxy":"git://github.com/npm/npm.git#v1.0.27",}}devDependencies开发环境依赖,使用频率仅次于依赖!它的对象定义和dependencies一样,只是里面的包只在开发环境使用,生产环境不使用。这些包通常是单元测试或者打包工具,比如gulp、grunt、webpack、moca、coffee等,可以使用如下命令安装:npminstallpackageName--save-dev举个栗子:{"name":"ethopia-waza","description":"一种令人愉快的果味咖啡品种","version":"1.2.3","devDependencies":{"coffee-script":"~1.6.3"},"scripts":{"prepare":"coffee-olib/-csrc/waza.coffee"},"main":"lib/waza.js"}准备脚本会在发布前运行,所以用户可以编译项目时不需要依赖它。在开发模式下,运行npminstall,同时执行prepare脚本,开发时可以方便的测试。至此,你明白--save和--save-dev的区别了吗?peerDependencies等价依赖,或称对等依赖,用于指定当前包(即你写的包)的兼容主机版本。怎么理解呢?试想一下,我们写了一个gulp插件,但是gulp有多个大版本,我们只想兼容最新的版本,这时候我们可以使用相同的依赖(peerDependencies)来指定:{"name":"gulp-my-plugin","version":"0.0.1","peerDependencies":{"gulp":"3.x"}}当别人使用我们的插件时,peerDependencies会明确告诉用户你需要安装插件的哪个托管版本。通常,我们在一个项目中会用到一个主机的很多插件(比如gulp)。如果主机之间不兼容,当执行npminstall时,cli会抛出错误信息告诉我们,例如:npmERR!peerinvalid包gulp不满足其兄弟姐妹的peerDependencies要求!错误!peerinvalidPeergulp-cli-config@0.1.3wantsgulp@~3.1.9npm错误!peerinvalidPeergulp-cli-users@0.1.4wantsgulp@~2.3.0运行命令npminstallgulp-my-plugin--save-dev安装我们的插件,让我们看看依赖关系图:├──gulp-my-plugin@0.0.1└──gulp@3.9.1OK,不错!注意npm1和npm2会自动安装相同的依赖,而npm3将不再自动安装并会产生警告!在package.json文件中手动添加依赖即可解决。optionalDependencies可选依赖,如果有一些依赖包即使安装失败,项目仍然可以运行或者你想让npm继续运行,可以使用optionalDependencies。另外optionalDependencies会覆盖dependencies中同名的依赖,所以不要两处都写。例如,一个可选的依赖包就像一个程序插件。如果存在,则执行现有的逻辑,如果不存在,则执行另一个逻辑。try{varfoo=require('foo')varfooVersion=require('foo/package.json').version}catch(er){foo=null}if(notGoodFooVersion(fooVersion)){foo=null}//..然后后面在你的程序中..if(foo){foo.doFooThings()}bundledDependencies/bundleDependencies包依赖,bundledDependencies是一个包含依赖包名的数组对象,这个对象中的包在发布的时候会被打包到最终的包中在发布包中。例如:{"name":"fe-weekly","description":"ELSEWeekly","version":"1.0.0","main":"index.js","devDependencies":{"fw2":"^0.3.2","grunt":"^1.0.1","webpack":"^3.6.0"},"dependencies":{"gulp":"^3.9.1","hello-else":"^1.0.0"},"bundledDependencies":["fw2","hello-else"]}执行打包命令npmpack,在生成的fe-weekly-1.0.0.tgz包中,将包含fw2和hello-else。但值得注意的是,这两个包必须先在devDependencies或dependencies中声明,否则包会报错。综上所述,以上就是npm目前支持的依赖管理。如有不明白或错误之处,欢迎在评论区留言。欢迎关注我们的专栏:ELSE更多参考资料:https://docs.npmjs.com/files/...https://blog.domenic.me/peer-...