<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Npm</id>
	<title>Npm - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Npm"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Npm&amp;action=history"/>
	<updated>2026-07-16T12:01:02Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Npm&amp;diff=1792573&amp;oldid=prev</id>
		<title>imported&gt;AromaTake：​/* 意外 */ 增加內部連結</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Npm&amp;diff=1792573&amp;oldid=prev"/>
		<updated>2025-01-16T01:37:30Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;意外：​&lt;/span&gt; 增加內部連結&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{lowercase}}&lt;br /&gt;
&lt;br /&gt;
{{NoteTA&lt;br /&gt;
|G1 = IT&lt;br /&gt;
|G2 = FL&lt;br /&gt;
|1=zh-cn:元文件;zh-tw:中繼檔案;&lt;br /&gt;
|2=zh-cn:本地;zh-tw:本機;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Infobox software&lt;br /&gt;
| name                   = npm&lt;br /&gt;
| title                  = npm&lt;br /&gt;
| logo                   = Npm-logo.svg&lt;br /&gt;
| logo caption           = &lt;br /&gt;
| screenshot             = &amp;lt;!-- [[File: ]] --&amp;gt;&lt;br /&gt;
| caption                = &lt;br /&gt;
| collapsible            = &lt;br /&gt;
| author                 = &lt;br /&gt;
| developer              = 艾萨克·施吕特、福里斯特·诺维尔、罗伯特·科瓦尔斯基、多梅尼克·德尼科拉、蒂姆·奥克斯利、埃文·马尔等&lt;br /&gt;
| released               = &amp;lt;!-- {{Start date|YYYY|MM|DD|df=yes/no}} --&amp;gt;&lt;br /&gt;
| programming language   = [[JavaScript]]&lt;br /&gt;
| operating system       = &lt;br /&gt;
| platform               = [[Linux]]&amp;lt;br&amp;gt;[[macOS]]&amp;lt;br&amp;gt;[[Windows]]&lt;br /&gt;
| size                   = &lt;br /&gt;
| language               = &lt;br /&gt;
| genre                  = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;npm&amp;#039;&amp;#039;&amp;#039;（全称 Node Package Manager，即“node-{zh-cn:包;zh-tw:套件}-管理器”）是[[Node.js]]預設的、用[[JavaScript]]編寫的[[軟體套件管理系統]]。&lt;br /&gt;
&lt;br /&gt;
== 历史 ==&lt;br /&gt;
npm完全用[[JavaScript]]写成，最初由艾萨克·施吕特（Isaac Z. Schlueter）开发。艾萨克表示自己意识到“模块管理很糟糕”的问题，并看到了[[PHP]]的[[PEAR]]与[[Perl]]的[[CPAN]]等软件的缺点，于是编写了npm。&amp;lt;ref&amp;gt;{{cite web|last1=Schlueter|first1=Isaac Z.|title=Forget CommonJS. It&amp;#039;s dead. **We are server side JavaScript.**|url=https://github.com/joyent/node/issues/5132#issuecomment-15432598|website=GitHub|date=25 March 2013|accessdate=2015-01-05|archive-date=2015-05-08|archive-url=https://web.archive.org/web/20150508201803/https://github.com/joyent/node/issues/5132#issuecomment-15432598|dead-url=no}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2020年3月16日，[[GitHub]] CEO [[Nat Friedman]] 宣布 GitHub 已签署收购 NPM（npm 背后的公司）的协议，并表示 npm 加入 [[GitHub]] 后会继续免费提供公共软件注册中心服务。&lt;br /&gt;
&lt;br /&gt;
== 说明 ==&lt;br /&gt;
npm会随着[[Node.js]]自动安装&amp;lt;ref name=&amp;quot;dierx16&amp;quot;&amp;gt;{{cite web|last1=Dierx|first1=Peter|title=A Beginner&amp;#039;s Guide to npm — the Node Package Manager|url=https://www.sitepoint.com/beginners-guide-node-package-manager/|website=sitepoint|accessdate=22 July 2016|date=30 March 2016|archive-date=2017-02-04|archive-url=https://web.archive.org/web/20170204070119/https://www.sitepoint.com/beginners-guide-node-package-manager/|dead-url=no}}&amp;lt;/ref&amp;gt;。npm模块-{zh-cn:仓库;zh-tw:儲存庫}-提供了一个名为“registry”的查询服务，用户可通过本地的npm命令下载并安装指定模块。此外用户也可以通过npm把自己设计的模块分发到registry上面&amp;lt;ref name=&amp;quot;ampersandjs&amp;quot;&amp;gt;{{cite web|last1=Ampersand.js|title=Ampersand.js - Learn|url=https://ampersandjs.com/learn/npm-browserify-and-modules/|website=ampersandjs.com|accessdate=22 July 2016|archive-date=2016-10-04|archive-url=https://web.archive.org/web/20161004160210/https://ampersandjs.com/learn/npm-browserify-and-modules/|dead-url=no}}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
registry上面的模块通常采用[[CommonJS]]格式，而且都包含一个[[JSON]]格式的元文件&amp;lt;ref name=&amp;quot;OjamaaDuuna12&amp;quot;&amp;gt;{{cite journal|last1=Ojamaa|first1=Andres|last2=Duuna|first2=Karl|title=Assessing the Security of Node.js Platform|journal=IEEE Xplore|date=2012|url=http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&amp;amp;arnumber=6470829|accessdate=22 July 2016|archive-date=2019-10-18|archive-url=https://web.archive.org/web/20191018232752/https://ieeexplore.ieee.org/document/6470829/|dead-url=no}}&amp;lt;/ref&amp;gt;。截至2016年7月，npm的registry上面已经注册了超过280,000个模块&amp;lt;ref name=&amp;quot;KennedyDevay16&amp;quot;&amp;gt;{{cite web|last1=Kennedy|first1=Hugh|last2=DeVay|first2=Paul|title=Understanding npm|url=https://unpm.nodesource.com/|website=Nsight|accessdate=22 July 2016|deadurl=yes|archiveurl=https://web.archive.org/web/20160708000406/https://unpm.nodesource.com/|archivedate=2016年7月8日}}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
npm的模块以“-{zh-cn:先到先得;zh-tw:先搶先贏}-”的原则注册，各模块作者不会发生混乱。然而一旦有人撤回自己发布的模块，那么不仅会使-{zh-cn:依赖;zh-tw:依附}-那个模块的项目出现问题，还会带来安全风险&amp;lt;ref name=&amp;quot;Yegulalp16&amp;quot;&amp;gt;{{cite web|last1=Yegulalp|first1=Serdar|title=How one yanked JavaScript package wreaked havoc|url=http://www.infoworld.com/article/3047177/javascript/how-one-yanked-javascript-package-wreaked-havoc.html|website=InfoWorld|accessdate=22 July 2016|date=23 March 2016|archive-date=2016-12-05|archive-url=https://web.archive.org/web/20161205041532/http://www.infoworld.com/article/3047177/javascript/how-one-yanked-javascript-package-wreaked-havoc.html|dead-url=no}}&amp;lt;/ref&amp;gt;。例如有一個模組叫做「left-pad」，其中只有一個字串對齊的功能。但是，當作者把它從registry裡面移除之後，許多模組便無法正確組建&amp;lt;ref&amp;gt;{{cite news|last1=Williams|first1=Chris|title=How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript|url=http://www.theregister.co.uk/2016/03/23/npm_left_pad_chaos/|accessdate=17 April 2016|work=The Register|archive-date=2016-03-24|archive-url=https://web.archive.org/web/20160324055738/http://www.theregister.co.uk/2016/03/23/npm_left_pad_chaos/|dead-url=no}}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
npm的registry没有审核机制，因此会存在一些低质量、不安全甚至有害的模块&amp;lt;ref name=&amp;quot;OjamaaDuuna12&amp;quot;/&amp;gt;，然而npm服务器的管理员也可以删除有害模块并阻止不怀好意的用户&amp;lt;ref name=&amp;quot;npm22-10-16&amp;quot;&amp;gt;{{cite web|last1=npm, Inc|title=npm|url=https://www.npmjs.com/package/npm|website=npm|accessdate=22 October 2016|archive-date=2016-10-22|archive-url=https://web.archive.org/web/20161022092738/https://www.npmjs.com/package/npm|dead-url=no}}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
另外也有人为npm制作了统计功能，这样可以让开发者了解各模块的使用情况，帮助他们选择合适的模块。&amp;lt;ref&amp;gt;{{cite web|url=https://npm-stat.com/|title=npm-stat: download statistics for NPM packages|accessdate=2016-12-07|archive-date=2016-08-11|archive-url=https://web.archive.org/web/20160811014953/https://npm-stat.com/|dead-url=no}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 使用 ==&lt;br /&gt;
npm可以管理本地项目的所需模块并自动维护-{zh-cn:依赖情况;zh-tw:相依性}-，也可以管理全局安装的JavaScript工具&amp;lt;ref name=&amp;quot;Ellingwood16&amp;quot;&amp;gt;{{cite web|last1= Ellingwood|first1= Justin|title= How To Use npm to Manage Node.js Packages on a Linux Server|url= https://www.digitalocean.com/community/tutorials/how-to-use-npm-to-manage-node-js-packages-on-a-linux-server|website= DigitalOcean|accessdate= 22 October 2016|archive-date= 2016-10-22|archive-url= https://web.archive.org/web/20161022152940/https://www.digitalocean.com/community/tutorials/how-to-use-npm-to-manage-node-js-packages-on-a-linux-server|dead-url= no}}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
如果一个项目中存在&amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt;文件，那么用户可以直接使用&amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;命令自动安装和维护当前项目所需的所有模块&amp;lt;ref name=&amp;quot;npm-install-docs&amp;quot;&amp;gt;{{cite web|title= npm-install|url= https://docs.npmjs.com/cli/install|website= docs.npmjs|accessdate= 22 October 2016|archive-date= 2016-12-03|archive-url= https://web.archive.org/web/20161203063741/https://docs.npmjs.com/cli/install|dead-url= no}}&amp;lt;/ref&amp;gt;。在&amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt;文件中，开发者可以指定每个-{zh-cn:依赖项;zh-tw:相依項}-的[[軟件版本號|版本]]范围，这样既可以保证模块自动更新，又不会因为所需模块功能大幅变化导致项目出现问题&amp;lt;ref name=&amp;quot;npm-semver-docs&amp;quot;&amp;gt;{{cite web|title= semver|url= https://docs.npmjs.com/misc/semver|website= docs.npmjs|accessdate= 22 October 2016|archive-date= 2016-12-03|archive-url= https://web.archive.org/web/20161203095427/https://docs.npmjs.com/misc/semver|dead-url= no}}&amp;lt;/ref&amp;gt;。开发者也可以选择将模块固定在某个版本之上&amp;lt;ref name=&amp;quot;npm-version-dcs&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
|title = npm-version&lt;br /&gt;
|url = https://docs.npmjs.com/cli/version&lt;br /&gt;
|website = docs.npm&lt;br /&gt;
|accessdate = 29 October 2016&lt;br /&gt;
|archive-date = 2016-12-03&lt;br /&gt;
|archive-url = https://web.archive.org/web/20161203095339/https://docs.npmjs.com/cli/version&lt;br /&gt;
|dead-url = no&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在中国大陆，由于[[防火长城]]的干扰，开发者可能需要更换软件源才能正常下载和安装模块。&lt;br /&gt;
&lt;br /&gt;
== 意外 ==&lt;br /&gt;
{{Main|npm left-pad事件|Peacenotwar}}&lt;br /&gt;
2016年3月，Azer Koçulu移除了他受歡迎的 &amp;lt;code&amp;gt;left-pad&amp;lt;/code&amp;gt; 套件。儘管 &amp;lt;code&amp;gt;left-pad&amp;lt;/code&amp;gt; 在三小時後重新發布，但它造成了廣泛的破壞。&amp;lt;ref&amp;gt;{{Cite web|last=Williams|first=Chris|last2=Chief|first2=Editor in|title=How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript|url=https://www.theregister.com/2016/03/23/npm_left_pad_chaos/|access-date=2023-09-10|website=www.theregister.com|language=en|archive-date=2023-10-16|archive-url=https://web.archive.org/web/20231016134656/https://www.theregister.com/2016/03/23/npm_left_pad_chaos/|dead-url=no}}&amp;lt;/ref&amp;gt;npm之後修改了有關政策，以防止將來發生類似事件。&amp;lt;ref&amp;gt;{{Cite web|title=npm Blog Archive: changes to npm’s unpublish policy|url=https://blog.npmjs.org/post/141905368000/changes-to-npms-unpublish-policy|access-date=2023-09-10|website=blog.npmjs.org|archive-date=2023-06-23|archive-url=https://web.archive.org/web/20230623061946/https://blog.npmjs.org/post/141905368000/changes-to-npms-unpublish-policy|dead-url=no}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2022年3月，[[布蘭登·野崎·米勒]]發布了包含惡意代碼的 &amp;lt;code&amp;gt;node-ipc&amp;lt;/code&amp;gt; 套件版本。使用 &amp;lt;code&amp;gt;node-ipc&amp;lt;/code&amp;gt; 的 [[Vue.js]] 沒有將其套件固定到安全版本，這意味著 Vue.js 的部分用戶可能會受到惡意代碼的影響。&amp;lt;ref&amp;gt;{{Cite web|title=BIG sabotage: Famous npm package deletes files to protest Ukraine war|url=https://www.bleepingcomputer.com/news/security/big-sabotage-famous-npm-package-deletes-files-to-protest-ukraine-war/|access-date=2023-09-10|website=BleepingComputer|language=en-us|archive-date=2022-03-17|archive-url=https://web.archive.org/web/20220317095413/https://www.bleepingcomputer.com/news/security/big-sabotage-famous-npm-package-deletes-files-to-protest-ukraine-war/|dead-url=no}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;br /&gt;
{{Reflist|30em}}&lt;br /&gt;
&lt;br /&gt;
== 外部連結 ==&lt;br /&gt;
* {{official website|https://www.npmjs.com/}}&lt;br /&gt;
&lt;br /&gt;
== 参见 ==&lt;br /&gt;
{{Portal|自由软件}}&lt;br /&gt;
* [[JavaScript]]&lt;br /&gt;
* [[V8 (JavaScript引擎)]]&lt;br /&gt;
* [[Node.js]]&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
{{Node.js}}&lt;br /&gt;
{{JavaScript}}&lt;br /&gt;
&lt;br /&gt;
[[Category:自由软件包管理系统]]&lt;br /&gt;
[[Category:JavaScript]]&lt;br /&gt;
[[Category:微软]]&lt;/div&gt;</summary>
		<author><name>imported&gt;AromaTake</name></author>
	</entry>
</feed>