关于dependencies 与devDependencies的误区

4,137 阅读2分钟

我感觉这个问题真的能看出许多浑水摸鱼的,包括之前的我。。。不了解咱们可以学,不会不可耻,但是有些文章真的是误人子弟了

大部分人的直观理解我觉得是打包用到的叫生产,没用到的叫开发,这个界限我认为存疑

我的理解,打不打包和dependencies、devDependencies没有任何关系,需要打包的肯定是你自己写的代码引用了,打包工具都有自己的判断,没听说过哪款打包工具不通过引入判断直接全量打包的,这样还需要commjs,esm干嘛。

区别

dependencies和devDependencies主要区别,一是在你安装一个外部模块时,不会自动安装这个模块下packagejson里边devDependencies的依赖(因为你只是要使用这个模块,而不是要开发这个模块,这个模块的正常功能不需要devDependencies的依赖);二是在运行npm install时加入--production有区别,加入这个参数不会下载devDependencies的依赖(前提是保证这里边的依赖不影响项目打包部署,也只有eslint、prettier这种才是完全不影响的了)。

如果只是用npm install,放哪个目录都无所谓,该打包就得打包,这是打包工具的事。想想也是,npm只是一个依赖管理工具,它怎么能决定项目打包需不需要呢。

反驳

所以如果有文章上来就提什么vue放dependencies,webpack放devDependencies,然后生产环境就不打包webpack了,都是扯淡,二者没有任何关系。

想想也是,npm自己出的东西肯定是为了方便处理依赖关系,打包都是下游干的事。

用是否打包来区分依赖类型还可以理解,但是这种以依赖类型来判定是否打包就不合适了。

总结

对于自己要发布上线的项目,eslint、prettier以及ts的type等等这些发布完全用不到的可以放到devDependencies下,然后上线打包部署的时候可以用npm install --production可以减少一些依赖安装时间吧,前提一定是不参与打包的;不过大部分人不用这个命令,那这时候就随便了,反正两种依赖都要安装。

然后对于要发布到npm仓库的第三方模块,不影响本模块功能的都可以放到devDependencies下,这样别人在引用的模块时也不会安装这些模块,减少冲突。例如这时候被引入模块的webpack、babel依赖这时候对于引入方可能就不是必须的。

说的有些乱,,欢迎大佬批评指正

参考文章[1](npm install 你很明白吗? - SegmentFault 思否)