在package.json
中有dependencies
和devDependencies
。
{
"devDependencies": {
"webpack": "^4.42.1"
},
"dependencies": {
"react": "^16.13.1"
}
}
我知道:
dependencies
是应用程序需要运行的depdevDependencies
是您只在开发过程中需要的dep
但是,为什么他们需要这样分开?有什么好处?
如果我这样做会发生什么?
{
"dependencies": {
"react": "^16.13.1",
"webpack": "^4.42.1"
}
}
有什么精彩的表演吗?如果我想发布一个模块,那么拆分deps会很重要吗?
这个问题与什么无关:;npm package.json文件中的dependencies、devDependencies和peerDependencie之间有什么区别?
这个问题是问dependencies
和devDependencies
是什么。我清楚地说明了上面的内容。
这个问题是关于为什么你想这样拆分deps。似乎有些人在他们的产品服务器中构建了他们的应用程序。我通常离线构建,只交付index.html
和main.js
工件。因此,其中一些观点不适用于我目前的情况。
此外,经过更多的测试,您的devDependencies
似乎实际上并没有出现在main.js
捆绑文件中。至少在我设置项目的方式上,我没有看到拆分dep和将它们全部放在dependencies
下之间有任何大小差异。因为我只是运送构建工件,所以这根本不会影响我的生产体验。
拥有这两个类别很有帮助,因为你不希望在发布代码时将开发时的东西打包。例如,你可能有一些用于开发目的的npm包(如jest
、linting工具或prettier
(,但不希望将它们添加到其他人安装包时获得的代码中。它会使你的包裹比它需要的更大。
如果您将使您的代码可供其他人执行的npm install
,那么这一点非常重要。那些安装软件包的人不需要所有的开发时间模块,因为它们与实际代码无关或不被实际代码使用。
"npm"是节点包管理器,要完成打包节点模块的工作,它需要知道构建代码需要什么,以及在运行时使用代码需要什么。如果您转到项目的git存储库并克隆它,则可以执行npm install
并获得开发环境。这将把所有依赖模块加载到node_modules/
中。但是,当使用模块时,您并不需要所有这些。使用该模块时,您只需要dependencies
,而不需要devDependencies
。npm
需要知道其中的区别,因为它的工作是处理模块的封装。
当您将模块发布在npm
(或本地管理的npm存储库(上,并且其他开发人员开始使用您的模块时,他们不想拖入开发模块时只需要的各种东西。他们想要最精简的模块来完成它的工作。
在其他语言中,您可能有一个makefile来进行构建,并且知道排除测试文件夹、源文件夹等,只打包运行时需要的内容。例如,使用Java
,您可以构建一个.jar
文件,该文件排除了仅用于开发的内容,如单元测试。将package.json
视为makefile,将devDependencies
部分视为构建器在构建运行时组件时要排除的内容的提示。
我想你的npm项目可能只是前端web项目,例如vue/react/angular相关项目。如果您从未编写过nodejs应用程序,那么您可能会感到困惑。
对于这些前端web项目,dependencies
和devDependencies
之间似乎没有区别。因为您只是将所有依赖项捆绑到最终的输出js文件中。实际上,在node_modules
下安装了所有相关的依赖项后,您甚至可以在package.json文件中删除dependencies
中的项,然后可以像往常一样构建项目。
发布的前端项目通常只是部署在web服务器上的一个捆绑的js文件,不需要构建项目或安装任何dependencies。但是,假设您正在开发一个nodejs项目。发布的nodejs应用程序是package.json文件所在目录中的全部内容。在运行nodejs应用程序时,必须运行npm install --production
才能安装所有dependencies
,然后才能运行包的主js文件。devDependencies
不是必须运行的,但构建和测试阶段需要它