在 npm 的官方文档中,对 npm 的介绍是这样的
npm is the world's largest software registry. Open source developers from every continent use npm to share and borrow packages, and many organizations use npm to manage private development as well.
registry是注册表的意思,这句话直意过来的意思是,npm 是世界上最大的软件注册表。
然而,当我第一眼看到这句话时,我不禁疑惑:“注册表是什么?软件注册表又是什么意思?”这些概念在文档中并没有进一步解释。
为了弄清楚“软件注册表”的含义,我查阅了 npm 中文文档,但发现它只是对英文文档的直译,并未提供更多细节:
npm 是世界上最大的软件注册表。来自各大洲的开源开发者使用 npm 来共享和借用包,许多组织也使用 npm 来管理私有开发。
看了中文文档,我更困惑了,npm 文档关于 npm 的介绍却让我无法理解 npm 是什么。
在我看来,学习一个知识中对其核心概念的清晰理解是很重要的,就比如说注册表这个概念就太抽象了,我完全无法想象和理解注册表是个什么东西,如果连“软件注册表”是什么都没搞明白,又如何深入理解 npm 呢?
本文将尝试用通俗易懂的方式,结合我的理解,回答“什么是 npm”的问题。
什么是软件注册表
软件注册表(Software Registry)是操作系统中的一个集中式数据库,用于存储软件、硬件和用户配置等信息。
这是软件注册表的定义,也就是说软件注册表本是操作系统中的一个概念,它是用来管理(存储)操作系统的一些列行为的数据库。
很显然 npm 是一个软件注册表的定义,并不是指 npm 是运作在操作系统中的数据库,那么 npm 所谓的软件注册表是什么?
npm 语境下的软件注册表是什么?
我想官方文档所说的“npm 是世界上最大的软件注册表”只是想引用在操作系统中的软件注册表本是一个数据库的这样一个概念。
官方是想突出 npm 的核心功能是一个数据库, 才引用了注册表这一概念。一个什么数据库?很简单,一个 存储JavaScript 包(packages)的数据库。 而且 npm 不是本地的数据库,它是一个云端存储包的在线数据库。
换句话说,npm 的“注册表”其实就是一个中心化的代码仓库,是一个存储和分发 JavaScript 包的云(在线)数据库。
npm 还是什么?
以上是最小意义上的 npm 作为注册表的含义,即一个在线的包存储数据库,不过 npm 的注册表的含义远不止如此,它延伸了或者说扩大了原本的注册表的概念。
因为就我们的使用中会发现,npm 有一个自己的官方网站https://www.npmjs.com/,我们可以在这上面搜索别的用户发布的包,也可以创建自己的账户去管理自己发布的包。
同时在本地的终端中,一旦我们安装了 Node 环境,其内置好的 npm 命令,可以使得我们通过命令行的方式去访问 npm,诸如执行npm login、npm publish 这样的命令去在本地登录我们的npm账号,去将我们本地的代码(符合 npm 包规范)发布到 npm 官网上成为互联网公开可访问的包。
所以我们会发现npm不仅仅只是一个中心化的远程包存储数据库, 实质上它有一整套的生态,它是一个平台,包数据存储库只是其中的一个组成部分。
npm 是一个平台
在我看来,npm 的本质就是一个包管理平台,主要用于分发和管理JavaScript 代码包,所谓的 npm 是世界上最大的软件注册表,其正确的解释是 npm 是全世界最大的 JavaScript 代码包管理平台,它通过提供命令行工具(CLI)、在线存储(注册表)和可视化界面(网站),实现了包的发布、管理和安装的全流程覆盖。
类似于微信这个平台,它不仅管理着无数的小程序,还支持用户发布、查找和使用小程序。当然微信是一个更大的平台,微信小程序只是它的一部分。
我们可以在小程序管理后台执行小程序的发布,也可以通过小程序提供的 api 接口来在本地通过命令行发布。
所以我们再来看 npm 官方介绍的 npm 组成部分就一目了然了。
npm 由三个不同的组件组成:
- 网站
- 命令行接口 (CLI)
- 注册表
从 npm 是一个平台的角度来理解官方文档所说的 npm 的三个组成部分
- 网站:npm 平台内所有包的可视化管理
- 命令行接口 (CLI):npm平台内所有包的命令行方式管理
- 注册表:npm 平台内所有包的数据库
其中注册表(在线包存储数据库)是 npm 的核心,它管理了 npm 生态下用户所上传的所有代码包,而另外两部分组成,网站和命令行接口则是 npm 官方开放出的不同通道给用户来访问注册表,即给用户访问在线包数据库的不同方式,一个是可视化的,一个是命令行式的。
综上, npm 是一个综合性的 JavaScript 包管理平台,它不仅存储和分发代码包,还为开发者提供工具链支持,提升开发效率。通过 npm,开发者可以轻松解决包依赖问题,快速搭建现代化的 JavaScript 项目。
总结
以上就是我对 npm 的理解,希望这篇文章能为你解答疑惑,帮助更深入地认识 npm。