< titlesplit >在node项目中很常见。它们在开发过程中总是会遇到,但我们一直没有完全了解它们之间的异同。今天就简单深入的了解一下,记录下来。.先看下图,project-main的依赖是package-a,package-a的devDependency是package-a-1。另外project-main还有一个package-b的devDependency:├──project-main├──package-a(dependency)│└──package-a-1(devDependency)└──package-b(devDependency)//package.json{"name":"project-main","dependencies":{"package-a":"^1.0.0"},"devDependencies":{"package-b":"^1.0.0"}}在project-main下执行npminstall后,package-a和package-b都会安装,但是package-a-1不会安装,所以在project-中找不到package-cmain的node_modules文件夹。dependency和devDependency的异同这是dependency和devDependency的区别之一。项目依赖的包的devDependency不会安装,但是会安装它自己的devDependency,所有的依赖都会安装。如果你不想安装自己的devDependency,使用npminstall--production命令,这样对于project-main,它的devDependency就不会被安装。所以在开发node包的时候,要注意区分什么时候使用dependencies,什么时候使用devDependencies。一般依赖测试、打包、ES6转ES5工作的库使用devDependencies,而普通函数依赖包。使用依赖项声明。>npminstallreact--save//作为依赖安装>npminstalleslint--save-dev//安装peerDependencies作为devDependencies还是拿上面的例子来说,如果project-main依赖package-a的package.json就可以了声明peerDependency为package-apeer@^1.0.0,但是project-main中没有package-apeer配置。此时使用npm3在project-main下执行npminstall,控制台会提示UNMETPEERDEPENDENCYpackage-apeer@^1.0.0,也就是说必须安装使用package-a的项目和package-apeer@^1.0.0必须同时安装,否则程序可能会出现异常,而在npm@1和npm@2下,只是不会报错而是自动安装package-apeer@^1.0.0,因为很多用户对此感到困惑,我没有声明这个包,你为什么要给我安装?所以在npm@3中,如果没有安装这个peerDependencies,就会变成控制台告警。其他依赖其实node还有两个其他的依赖配置。bundleDependencies还有一个别名bundledDependencies。此配置的工作方式如下:对于以下包package-a{"name":"package-a","dependencies":{"react":"^15.0.0","core-js":"^2.0.0","lodash":"^4.0.0"},"bundleDependencies":["react","core-js"]}安装在你的项目中使用npm@3package-a后,项目的文件结构node_modules:├──node_modules├──package-a│└──react│└──core-js└──loadshbundleDependencies的作用是用户安装package-a后,汇总package-a声明的依赖包放到package-a本身的node_modules中,方便用户管理。如果package-a中没有配置bundleDependencies,在安装package-a的项目下node_modules会是这样的:├──node_modules├──package-a├──react├──core-js└──loadshoptionalDependencies如果你的node项目依赖一个包package-optional,如果没有安装这个package-optional,你还是希望程序能正常执行,这时候optionalDependencies就很适合你的需求。OptionalDependencies的声明方式与dependencies完全相同,如果在dependencies和optionalDependencies中都声明了依赖项,option也会覆盖依赖项的声明。如果package-optional包是可选的,那么在代码中可以这样写:;Conclusionnode包的依赖管理在当今前端工程时代的背景下变得尤为重要。构建一个优雅且可维护的node_modules结构是一个值得讨论的话题。希望今天的这篇文章能对您有所帮助和启发。
