nodejs 中 package.json
中的依赖必须每个项目都有自己的 node_modules
文件夹,而无法在多个项目之间共用一套 node_modules
(不像 Java 中的 Maven 那样共享一个全居仓库)。
依赖管理是每个现代语言的标配。在 Java 中,maven 同时兼具 依赖管理 和 打包 两大功能,而前段领域这两个功能是两种不同的工具分别提供:
- npm 负责依赖管理
- webpack 负责打包
依赖管理最难解决的问题就是版本问题。库A依赖库B,库C也依赖库B,但是库A跟库C所依赖的库B不是同一版本,如果库B的这两个版本兼容还好,如果不兼容就坑大发了,这是无解的问题。
- Java 中的 Maven 仓库在开发者电脑上是全局的,所有项目的依赖都集中存放在本地仓库中。每个项目都有 pom.xml 指明依赖本地仓库中的哪些库,如果本地仓库没有会从局域网仓库或网络仓库下载至本地仓库。
Node 中的依赖如果你不写package.json
,那么依赖的就是全局的库;如果写了package.json
,就会把所有依赖下载到node_modules
文件夹
Node这种node_modules文件夹的方式有利有弊。
最明显的坏处是:
- 每次都需要安装依赖,费流量,网速慢时很费时间
- 浪费磁盘空间,每个
node_modules
中包含的工具很多,动辄20M
最明显的好处是:
- 使用
package.json
安装好之后,node_modules
文件夹中没有版本信息,从而package.json
可以删掉了。 - 移动/复制/打包项目比较简单,对于开发、部署都有好处
- 对于设计 npm 的人来说,这是最省事的包依赖方法。这就好比 maven 安装依赖之后自动将 jar 包安装到项目的 lib 里面。
- 随意改代码。安装在
node_modules
里面的东西,你可以随便改,无需担心对其它项目的影响。在Java 中使用 maven 管理项目时,如果想要定制某个库,就需要更改这个库的源代码,这时就需要把这个库的源代码复制到项目中,跟node_modules
是一个道理。npm 的设计者大概认为:前端都是经常修改库的源代码的。
在 npm install
时,实在嫌慢(比如因为防火墙的原因),可以把 node_modules
一起提交到 git 里去。
网友评论