纠结,dependencies
和 devDependencies
有什么区别?我使用的包应该放到什么地方?上网找资料,大神群咨询。获得的答案是:前端
dependencies
中;devDependencies
中;Emmm...大神就是喜欢说一些菜逼听不懂的话。但我就是想知道:若是我不遵照,会怎么样? node
提出这个问题的朋友应该都发现:不管放到dependencies
中,仍是devDependencies
,运行 npm install
时都会安装,没有差异,团队合做也OK,照玩不误啊。什么叫只能本身玩?把koa
放到devDependencies
中有没有问题?把webpack
放到dependencies
又会怎么样? webpack
直到我要把本身的开源项目发布到 npm
时,才明白了大神的意思。git
先来看个问题:小明使用 webpack
开发 web项目
的环境,是什么环境? github
答案是开发环境,但同时也是生产环境。 web
相对于 小明的项目
是 开发环境,但相对 webpack
,就是生产环境。chrome
用开源项目 debug 项目举例。它的 package.json
相关内容以下:shell
{ "dependencies": { "ms": "^2.1.1" }, "devDependencies": { "brfs": "^2.0.1", "browserify": "^16.2.3", "coveralls": "^3.0.2", "istanbul": "^0.4.5", "karma": "^3.1.4", "karma-browserify": "^6.0.0", "karma-chrome-launcher": "^2.2.0", "karma-mocha": "^1.3.0", "mocha": "^5.2.0", "mocha-lcov-reporter": "^1.2.0", "xo": "^0.23.0" } }
咱们在使用debug
时,须要这样用(大部分用户的使用方式) express
手动建立一个项目npm
npm init npm install debug --save
查看 node_modules
目录中的内容
-- node_modules -- debug -- ms
能够看出, npm
只安装了 debug
和 ms(debug的dependencies包含的package)
。
由于如今的环境相对于 debug
来讲,是生产环境,因此 npm
只安装了 debug
的生产依赖。
做为 debug
项目的 开发者 或 二次开发者 ,才会这样用。
git clone https://github.com/visionmedia/debug.git cd debug npm install
查看node_modules
-- node_modules -- ms -- brfs -- xo -- connect -- date-format -- ...... 共653个package
能够看出, npm
安装了 dependencies
、devDependencies
以及 它们的dependencies
。
由于如今的环境相对于debug
来讲,是开发环境,因此npm
安装了debug
的全部依赖,以及它们的生产依赖。
对比以上结果,能够看出,通常状况下开发环境所须要安装的依赖远多于生产环境。
根据以上的实践分析,总结出一些玩法:
npm
让别人使用(如webpack
打包完成后发布dist
的前端项目),由于生产环境再也不须要依赖这些包(甚至都不须要nodejs
),这时你把依赖放到哪里,彻底随你开心。但为了不有人说闲话,应该放到devDependencies
中。npm
让别人使用。如web项目经常使用的express
和koa
,是生产环境运行必须的包,你也能够随便放 (惊不惊喜意不意外),在生产环境中,部署生产环境时使用npm install
,同样会把全部包安装下来,不影响生产环境的运行。为了不有人说闲话,仍是要放到dependencies
中。npm
让别人使用。你仍是能够随便放。npm install
会安装全部包。但就会产生问题,生产环境安装了开发环境的包,这个问题会死人吗?不太清楚,但项目是能够运行的。要避免这些额外的消耗,就要区分两种包的位置。在生产环境中使用npm install --production
,则只会安装dependencies
中的依赖。外翻篇:若是你开心,也能够把开发依赖包放到devDependencies
,生产依赖包放到dependencies
,生产环境就用npm install --only=dev
,这样只会安装devDependencies
中的npm
的项目,生产依赖就必定要放在dependencies
中(缺失会致使运行出错);开发依赖应该放在devDependencies
中,这样能够不浪费用户资源,若是放到dependencies
中,用户端就会安装不少多余的依赖,浪费大量资源,增长版本冲突几率。简单总结,当生产依赖和开发依赖分别放到不一样位置时,会致使的问题:
玩法 | dependencies | devDependencies | 内部项目 | 做为npm包发布 |
---|---|---|---|---|
规范 | 生产依赖 | 开发依赖 | - | - |
开发依赖放在dependencies中 | 生产依赖、开发依赖 | - | 浪费生产环境资源 | 浪费大量用户资源 |
生产依赖放在devDependencies中 | - | 生产依赖、开发依赖 | 浪费生产环境资源、部署方式怪异 | 用户没法正常运行 |
反着放 | 开发依赖 | 生产依赖 | 部署方式怪异 | 浪费大量用户资源、用户没法正常运行 |
能够看出,在内部项目中,只要团队能玩得转(也不关心生产环境的资源浪费),能够不用太在乎规范。但若是是要发布到npm的项目,甚至是开源项目,就要特别注意。本身能够乱来,但给用户的,应该是最好的。