Npm

npm（全称 Node Package Manager，即“node-{zh-cn:包;zh-tw:套件}-管理器”）是Node.js預設的、用JavaScript編寫的軟體套件管理系統。

历史 
npm完全用JavaScript写成，最初由艾萨克·施吕特（Isaac Z. Schlueter）开发。艾萨克表示自己意识到“模块管理很糟糕”的问题，并看到了PHP的PEAR与Perl的CPAN等软件的缺点，于是编写了npm。

2020年3月16日，GitHub CEO Nat Friedman 宣布 GitHub 已签署收购 NPM（npm 背后的公司）的协议，并表示 npm 加入 GitHub 后会继续免费提供公共软件注册中心服务。

说明 
npm会随着Node.js自动安装。npm模块-{zh-cn:仓库;zh-tw:儲存庫}-提供了一个名为“registry”的查询服务，用户可通过本地的npm命令下载并安装指定模块。此外用户也可以通过npm把自己设计的模块分发到registry上面。

registry上面的模块通常采用CommonJS格式，而且都包含一个JSON格式的元文件。截至2016年7月，npm的registry上面已经注册了超过280,000个模块。

npm的模块以“-{zh-cn:先到先得;zh-tw:先搶先贏}-”的原则注册，各模块作者不会发生混乱。然而一旦有人撤回自己发布的模块，那么不仅会使-{zh-cn:依赖;zh-tw:依附}-那个模块的项目出现问题，还会带来安全风险。例如有一個模組叫做「left-pad」，其中只有一個字串對齊的功能。但是，當作者把它從registry裡面移除之後，許多模組便無法正確組建。

npm的registry没有审核机制，因此会存在一些低质量、不安全甚至有害的模块，然而npm服务器的管理员也可以删除有害模块并阻止不怀好意的用户。

另外也有人为npm制作了统计功能，这样可以让开发者了解各模块的使用情况，帮助他们选择合适的模块。

使用 
npm可以管理本地项目的所需模块并自动维护-{zh-cn:依赖情况;zh-tw:相依性}-，也可以管理全局安装的JavaScript工具。

如果一个项目中存在package.json文件，那么用户可以直接使用npm install命令自动安装和维护当前项目所需的所有模块。在package.json文件中，开发者可以指定每个-{zh-cn:依赖项;zh-tw:相依項}-的版本范围，这样既可以保证模块自动更新，又不会因为所需模块功能大幅变化导致项目出现问题。开发者也可以选择将模块固定在某个版本之上。

在中国大陆，由于防火长城的干扰，开发者可能需要更换软件源才能正常下载和安装模块。

意外 
2016年3月，Azer Koçulu移除了他受歡迎的 left-pad 套件。儘管 left-pad 在三小時後重新發布，但它造成了廣泛的破壞。npm之後修改了有關政策，以防止將來發生類似事件。

2022年3月，Brandon Nozaki Miller發布了包含惡意代碼的 node-ipc 套件版本。使用 node-ipc 的 Vue.js 沒有將其套件固定到安全版本，這意味著 Vue.js 的部分用戶可能會受到惡意代碼的影響。

参考文献

外部連結

参见 

 JavaScript
 V8 (JavaScript引擎)
 Node.js

自由软件包管理系统
JavaScript
微软