对NodeJs系列感兴趣的朋友请关注微信公众号:前端神盾局日常开发中。或者githubNodeJs系列文章,我们经常会看到各种依赖,今天有空整理一下dependency和devDependency,几乎每个应用都会看到dependency和devDependency。Dependency定义了代码所需要的依赖包,devDependency指定了编译/测试等开发所需要的依赖包。例如:{"name":"project","script":{//代码打包"build":"./node_modules/.bin/webpack..."},"dependency":{"react":"^16.6.3",...},"devDependency":{"webpack":"4.19.1","url-loader":"1.1.1",...}}理想情况下,当运行npmrun之后build,它应该只包含react相关的代码,而不是devDependency中无用的代码。当然dependency和devDependency在这里只是一个规范,最终生成的代码取决于你引入什么。例如,import'url-loader'会将url-loader包含到您的生产代码中,无论它是否在依赖项中定义。现在考虑另一种场景,我们开发了一个npm(package-a)包,希望所有依赖package-a的应用都能有效运行。这时候dependency和devDependency就不仅仅是我们可以随意遵循的规范了,因为项目依赖的devDependency是不会安装的。例如:├──project├──package-a(dependency)│└──package-a-1(devDependency)└──package-b(devDependency)在project下执行npminstall后,package-a和package-会安装b,但是不会安装package-a-1,所以在项目的node_modules文件夹下是找不到package-c的。综上所述,在开发应用时,我们应该将生产所需的依赖放在dependencies中,将单元测试/编译/打包等与生产无关的依赖放在devDependencies中peerDependencies我们以babel-loader为例,运行npm在安装babel-loader-D时,控制台会出现两个警告:npmWARNbabel-loader@8.0.4requiresapeerof@babel/core@^7.0.0butnoneisinstalled。您必须自己安装对等依赖项。npmWARNbabel-loader@8.0.4需要webpack@>=2的对等体,但没有安装。您必须自己安装对等依赖项。提示babel-loader需要依赖@babel/core@^7.0.0和webpack@>=2。这是因为peerDependencies指定了当前包需要安装的依赖:"peerDependencies":{"@babel/core":"^7.0.0","webpack":">=2"}那么应该在什么情况下使用呢??一般如果我们需要针对某个库开发插件,而不需要在代码中引用该库。比如babel-loader是webpack的一个插件,但是代码中不需要引用webpack。为了保证插件能够在webpack环境下运行,使用了peerDependencies。BundledDependencies也可以叫作:bundleDependencies然后举例说明:{"name":"project","dependencies":{"react":"^16.6.3","react-dom":"^16.6.3"},"bundleDependencies":["react","react-dom"],"version":"1.0.0"}当我们需要使用npmpack打包这个应用时,最终生成的文件结构如下:project-1.0.0.tgz├──node_modules|└──反应|└──react-dom└──package.json如果不使用bundleDependencies,文件结构如下:project-1.0.0.tgz├──project-1.0.0.tgz|└──节点模块|└──反应|└──react-dom└──package.jsonso,bundleDependencies的作用是将指定的依赖放到当前项目下,方便你快速运行你的package项目。optionalDependencies如果你的应用程序依赖optional-a,而这个依赖是可有可无的,也就是说,如果找不到optional-a或者安装失败,你希望程序仍然运行。这时候optionalDependencies就可以很好的满足你的要求了。注意:optionalDependencies会覆盖dependencies中同名的包.json文件?PeerDependenciesPackage.json
