其他

dependencies与devDependencies貌似一点区别都没有,姿势不对还是理解有误??

最近一直在研究webpack打包技术的内容,但是对于dependencies与devDependencies的区别却有些难以理解,还请知道这一块细节的人多指点一二

首先我了解大多数人说的区别都是:

  • dependencies是产生环境下的依赖(只包含正式运行是必须依赖的插件,比如vue、react、jquery等)
  • devDependencies是开发环境下的依赖(比如webpack、babel、eslint等辅助打包插件)

对于以上理解我自然非常认同也非常好理解嘛,但是我还不是很满意,我觉得不应该仅仅就是这么点区别,而且,实际使用的时候也发现很多疑点。下面是我的实验过后的两点疑问,还望高手解惑:

对于以上理解我自然非常认同也非常好理解嘛,但是我还不是很满意,我觉得不应该仅仅就是这么点区别,而且,实际使用的时候也发现很多疑点。下面是我的实验过后的两点疑问,还望高手解惑:

问题一:

为何一个依赖(比如jquery)不管是放到dependencies还是devDependencies下,在打包的时候(NODE_ENV两种情况下都试过)都会把jquery打进去(这跟上面的大多数人解释的貌似不符呀,按照上面的理解如果是放到devDependencies里面并且在production环境下,jquery不应该被打进去的呀???)

问题二:

当我把这个npm包当做lib包发布到npm库中后,再去require/import使用这个库的时候,不管是npm install mylib –save-dev 还是npm install mylib –save 还是直接npm insatll mylib 最终下载到node_modules下面的依赖都一模一样(都只有mylib包和mylib包自身package.dependencies中唯一指定的jquery包,一共2个包被下载下来)

两个问题放到一起,就更加令我丈二的和尚摸不着头脑了,貌似devDependencies和dependencies并没有卵用呀????这是为毛啊,还请明眼人给解释下,感激不尽!

回答:


问题一:为何一个依赖(比如jquery)不管是放到dependencies还是devDependencies下,在打包的时候(NODE_ENV两种情况下都试过)都会把jquery打进去(这跟上面的大多数人解释的貌似不符呀,按照上面的理解如果是放到devDependencies里面并且在production环境下,jquery不应该被打进去的呀???)

答:webpack 构建项目是根据入口文件的引用树来构建的,跟你放在哪个 dependency 里面没有关系,就算你没有放在 dependency 里面,只要你文件中引用了这个库并且 webpack 能在 node_modules 文件夹中找到这个库,就会打包进去。很简单的道理,不打包进去,你使用jQuery的代码不就报错了?所以引用到的库肯定会打包进去。

问题二:当我把这个npm包当做lib包发布到npm库中后,再去require/import使用这个库的时候,不管是npm install mylib --save-dev 还是npm install mylib --save 还是直接npm insatll mylib 最终下载到node_modules下面的依赖都一模一样(都只有mylib包和mylib包自身package.dependencies中唯一指定的jquery包,一共2个包被下载下来)

答:npm install mylib --save-dev 还是 npm install mylib --save 还是直接 npm insatll mylib,这三条指令都会把依赖下载到 node_modules 文件夹。不同的是 --save-dev 还会修改 devDependencies 对象,把 mylib 添加进去;同理,--save 或者不加参数则是把 mylib 添加到 dependencies 对象中。

总结:


dependenciesdevDependencies 相同的地方就是在你或者别人 clone 这个库进行开发调试的时候,可以通过 npm install 一键安装这两个目录下所有的依赖,而不用去一行行找你到底在文件中引用了那些依赖。

不同的地方在于:

  • 当某个项目依赖了你的 mylib,那么在安装的时候会链式地安装 mylib 这个项目中 dependencies 配置声明的依赖,因为根据约定,npm 认为这是项目运行时需要的依赖。而 devDependencies 则是开发时需要的依赖。
  • 如果你输入 npm install --production 指令,就只会安装 dependencies 目录下的依赖,在一些服务端自动构建的过程中或者在一些特殊的需求下,可能会用到这个指令。