最近一直在研究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
对象中。
总结:
dependencies
和 devDependencies
相同的地方就是在你或者别人 clone
这个库进行开发调试的时候,可以通过 npm install
一键安装这两个目录下所有的依赖,而不用去一行行找你到底在文件中引用了那些依赖。
不同的地方在于:
- 当某个项目依赖了你的
mylib
,那么在安装的时候会链式地安装mylib
这个项目中dependencies
配置声明的依赖,因为根据约定,npm
认为这是项目运行时需要的依赖。而devDependencies
则是开发时需要的依赖。 - 如果你输入
npm install --production
指令,就只会安装dependencies
目录下的依赖,在一些服务端自动构建的过程中或者在一些特殊的需求下,可能会用到这个指令。