为什么npm有两类依赖关系



package.json中有dependenciesdevDependencies

{
"devDependencies": {
"webpack": "^4.42.1"
},
"dependencies": {
"react": "^16.13.1"
}
}

我知道:

  • dependencies是应用程序需要运行的dep
  • devDependencies是您只在开发过程中需要的dep

但是,为什么他们需要这样分开?有什么好处?

如果我这样做会发生什么?

{
"dependencies": {
"react": "^16.13.1",
"webpack": "^4.42.1"
}
}

有什么精彩的表演吗?如果我想发布一个模块,那么拆分deps会很重要吗?


这个问题与什么无关:;npm package.json文件中的dependencies、devDependencies和peerDependencie之间有什么区别?

这个问题是问dependenciesdevDependencies是什么。我清楚地说明了上面的内容。

这个问题是关于为什么你想这样拆分deps。似乎有些人在他们的产品服务器中构建了他们的应用程序。我通常离线构建,只交付index.htmlmain.js工件。因此,其中一些观点不适用于我目前的情况。

此外,经过更多的测试,您的devDependencies似乎实际上并没有出现在main.js捆绑文件中。至少在我设置项目的方式上,我没有看到拆分dep和将它们全部放在dependencies下之间有任何大小差异。因为我只是运送构建工件,所以这根本不会影响我的生产体验。

拥有这两个类别很有帮助,因为你不希望在发布代码时将开发时的东西打包。例如,你可能有一些用于开发目的的npm包(如jest、linting工具或prettier(,但不希望将它们添加到其他人安装包时获得的代码中。它会使你的包裹比它需要的更大。

如果您将使您的代码可供其他人执行的npm install,那么这一点非常重要。那些安装软件包的人不需要所有的开发时间模块,因为它们与实际代码无关或不被实际代码使用。

"npm"是节点包管理器,要完成打包节点模块的工作,它需要知道构建代码需要什么,以及在运行时使用代码需要什么。如果您转到项目的git存储库并克隆它,则可以执行npm install并获得开发环境。这将把所有依赖模块加载到node_modules/中。但是,当使用模块时,您并不需要所有这些。使用该模块时,您只需要dependencies,而不需要devDependenciesnpm需要知道其中的区别,因为它的工作是处理模块的封装。

当您将模块发布在npm(或本地管理的npm存储库(上,并且其他开发人员开始使用您的模块时,他们不想拖入开发模块时只需要的各种东西。他们想要最精简的模块来完成它的工作。

在其他语言中,您可能有一个makefile来进行构建,并且知道排除测试文件夹、源文件夹等,只打包运行时需要的内容。例如,使用Java,您可以构建一个.jar文件,该文件排除了仅用于开发的内容,如单元测试。将package.json视为makefile,将devDependencies部分视为构建器在构建运行时组件时要排除的内容的提示。

我想你的npm项目可能只是前端web项目,例如vue/react/angular相关项目。如果您从未编写过nodejs应用程序,那么您可能会感到困惑。

对于这些前端web项目dependenciesdevDependencies之间似乎没有区别。因为您只是将所有依赖项捆绑到最终的输出js文件中。实际上,在node_modules下安装了所有相关的依赖项后,您甚至可以在package.json文件中删除dependencies中的项,然后可以像往常一样构建项目。

发布的前端项目通常只是部署在web服务器上的一个捆绑的js文件,不需要构建项目或安装任何dependencies。但是,假设您正在开发一个nodejs项目。发布的nodejs应用程序是package.json文件所在目录中的全部内容。在运行nodejs应用程序时,必须运行npm install --production才能安装所有dependencies,然后才能运行包的主js文件。devDependencies不是必须运行的,但构建和测试阶段需要它

最新更新