在项目中,package.json文件中列出了一些依赖包(npm install [some-name] --保存),但未在源代码中的任何ES6模块文件中导入。此包是否将包含在最终构建版本中(例如,汇总输出)?
据我了解,没有导入的es6模块甚至不能提供任何副作用,所以bundler(例如,rollup,webpack)在依赖关系图中没有它。正因为如此,bundler甚至不知道它的存在。所以,如果我是正确的,这样的包不包括在bundle中。但是,在这种情况下,为什么要在package.json中将“dependencies”和“dev-dependencies”分开呢?对于使用任何bundler的项目,bundler是否使用自己的逻辑(当它遵循“导入/导出”语句时)决定输出中包含什么?
2条答案
按热度按时间7cjasjjr1#
我认为你是对的,捆绑包不会包括它,当你捆绑。代码是死代码,应该删除。
但是我认为(如果我错了请纠正我),当库的使用者使用
npm install
时,他们必须下载package.json
中的所有内容来解决它的依赖关系,至少这是我的理由。o7jaxewo2#
根据
Webpack
文档,Webpack从entry point开始生成一个dependency graph,通常是index.js
,如果你使用像create-react-app
这样的东西,它会生成一个包json,如下所示:您可以看到没有
devDependencies
!这意味着并非您刚刚放在dependencies
上的所有内容都将包含在您的最终构建中。最后,我已经测试了一个新的
CRA
我的应用程序:1.在已安装的裸计算机上按
npm run build
:1.通过
npm i axios
安装axios,但从未导入。运行npm run build
后的输出:什么都没有改变!
1.从"axios"中导入axios,但不要在代码中使用它:
以下是输出:
同样没有任何变化!但是你也可以看到
eslint
警告!1.使用其函数之一,例如get method only:
输出:
如果我们不在应用中使用软件包,它就不会进入最终构建版本。
虽然额外的包不会影响生产,但不要忘记不时地卸载未使用的包。运行npm install仍然会安装package.json中定义的每个包,无论它们是否被使用。因此,加载未使用的包会减慢部署速度,并影响您的队友(他们也需要运行npm install!!)。
Reference