跳转到内容

Npm:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
Luisleee留言 | 贡献
top:​ 维护清理
InternetArchiveBot留言 | 贡献
补救3个来源,并将0个来源标记为失效。) #IABot (v2.0.9.5
 
(未显示9个用户的13个中间版本)
第4行: 第4行:
|G1 = IT
|G1 = IT
|G2 = FL
|G2 = FL
|1=zh-cn:元文件;zh-tw:中繼檔案;
|2=zh-cn:本地;zh-tw:本機;
}}
}}


第9行: 第11行:
| name = npm
| name = npm
| title = npm
| title = npm
| logo = File:Npm-logo.svg
| logo = Npm-logo.svg
| logo caption =
| logo caption =
| screenshot = <!-- [[File: ]] -->
| screenshot = <!-- [[File: ]] -->
第17行: 第19行:
| developer = 艾萨克·施吕特、福里斯特·诺维尔、罗伯特·科瓦尔斯基、多梅尼克·德尼科拉、蒂姆·奥克斯利、埃文·马尔等
| developer = 艾萨克·施吕特、福里斯特·诺维尔、罗伯特·科瓦尔斯基、多梅尼克·德尼科拉、蒂姆·奥克斯利、埃文·马尔等
| released = <!-- {{Start date|YYYY|MM|DD|df=yes/no}} -->
| released = <!-- {{Start date|YYYY|MM|DD|df=yes/no}} -->
| discontinued =
| latest release version = 6.14.4
| latest release date = {{Start date and age|2020|3|25|df=yes}}<ref>{{cite web | url = https://github.com/npm/cli/releases/tag/v6.14.4 | title = Release 6.14.4 · npm/cli | date = 2020-3-25 | publisher = GitHub}}</ref>
| frequently updated = no
| programming language = [[JavaScript]]
| programming language = [[JavaScript]]
| operating system =
| operating system =
第27行: 第25行:
| language =
| language =
| genre =
| genre =
| license = [[艺术许可协议]] 2.0
| alexa =
| website = {{URL|https://www.npmjs.com/}}
}}
}}


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


== 历史 ==
== 历史 ==
npm完全用[[JavaScript]]写成,最初由艾萨克·施吕特(Isaac Z. Schlueter)开发。艾萨克表示自己意识到“模块管理很糟糕”的问题,并看到了[[PHP]]的[[PEAR]]与[[Perl]]的[[CPAN]]等软件的缺点,于是编写了npm。<ref>{{cite web|last1=Schlueter|first1=Isaac Z.|title=Forget CommonJS. It's dead. **We are server side JavaScript.**|url=https://github.com/joyent/node/issues/5132#issuecomment-15432598|website=GitHub|date=25 March 2013}}</ref>
npm完全用[[JavaScript]]写成,最初由艾萨克·施吕特(Isaac Z. Schlueter)开发。艾萨克表示自己意识到“模块管理很糟糕”的问题,并看到了[[PHP]]的[[PEAR]]与[[Perl]]的[[CPAN]]等软件的缺点,于是编写了npm。<ref>{{cite web|last1=Schlueter|first1=Isaac Z.|title=Forget CommonJS. It'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}}</ref>


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


== 说明 ==
== 说明 ==
npm会随着Node.js自动安装<ref name="dierx16">{{cite web|last1=Dierx|first1=Peter|title=A Beginner'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}}</ref>。npm模块仓库提供了一个名为“registry”的查询服务,用户可通过本地的npm命令下载并安装指定模块。此外用户也可以通过npm把自己设计的模块分发到registry上面<ref name="ampersandjs">{{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}}</ref>。
npm会随着[[Node.js]]自动安装<ref name="dierx16">{{cite web|last1=Dierx|first1=Peter|title=A Beginner'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}}</ref>。npm模块-{zh-cn:仓库;zh-tw:儲存庫}-提供了一个名为“registry”的查询服务,用户可通过本地的npm命令下载并安装指定模块。此外用户也可以通过npm把自己设计的模块分发到registry上面<ref name="ampersandjs">{{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}}</ref>。


registry上面的模块通常采用[[CommonJS]]格式,而且都包含一个[[JSON]]格式的元文件<ref name="OjamaaDuuna12">{{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=&arnumber=6470829|accessdate=22 July 2016}}</ref>。截止到2016年7月,npm的registry上面已经注册了超过280,000个模块<ref name="KennedyDevay16">{{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日}}</ref>。
registry上面的模块通常采用[[CommonJS]]格式,而且都包含一个[[JSON]]格式的元文件<ref name="OjamaaDuuna12">{{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=&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}}</ref>。截2016年7月,npm的registry上面已经注册了超过280,000个模块<ref name="KennedyDevay16">{{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日}}</ref>。


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


npm的registry没有审核机制,因此会存在一些低质量、不安全甚至有害的模块<ref name="OjamaaDuuna12"/>,不过npm服务器的管理员也可以删除有害模块并阻止不怀好意的用户<ref name="npm22-10-16">{{cite web|last1=npm, Inc|title=npm|url=https://www.npmjs.com/package/npm|website=npm|accessdate=22 October 2016}}</ref>。
npm的registry没有审核机制,因此会存在一些低质量、不安全甚至有害的模块<ref name="OjamaaDuuna12"/>,然而npm服务器的管理员也可以删除有害模块并阻止不怀好意的用户<ref name="npm22-10-16">{{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}}</ref>。


另外也有人为npm制作了统计功能,这样可以让开发者了解各模块的使用情况,帮助他们选择合适的模块。<ref>{{cite web|url=https://npm-stat.com/|title=npm-stat: download statistics for NPM packages}}</ref>
另外也有人为npm制作了统计功能,这样可以让开发者了解各模块的使用情况,帮助他们选择合适的模块。<ref>{{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}}</ref>


== 使用 ==
== 使用 ==
npm可以管理本地项目的所需模块并自动维护依赖情况,也可以管理全局安装的JavaScript工具<ref name="Ellingwood16">{{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}}</ref>。
npm可以管理本地项目的所需模块并自动维护-{zh-cn:依赖情况;zh-tw:相依性}-,也可以管理全局安装的JavaScript工具<ref name="Ellingwood16">{{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}}</ref>。


如果一个项目中存在<code>package.json</code>文件,那么用户可以直接使用<code>npm install</code>命令自动安装和维护当前项目所需的所有模块<ref name="npm-install-docs">{{cite web|title= npm-install|url= https://docs.npmjs.com/cli/install|website= docs.npmjs|accessdate= 22 October 2016}}</ref>。在<code>package.json</code>文件中,开发者可以指定每个依赖项的[[軟件版本號|版本]]范围,这样既可以保证模块自动更新,又不会因为所需模块功能大幅变化导致项目出现问题<ref name="npm-semver-docs">{{cite web |title = semver |url = https://docs.npmjs.com/misc/semver|website= docs.npmjs|accessdate= 22 October 2016}}</ref>。开发者也可以选择将模块固定在某个版本之上<ref name="npm-version-dcs">
如果一个项目中存在<code>package.json</code>文件,那么用户可以直接使用<code>npm install</code>命令自动安装和维护当前项目所需的所有模块<ref name="npm-install-docs">{{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}}</ref>。在<code>package.json</code>文件中,开发者可以指定每个-{zh-cn:依赖项;zh-tw:相依項}-的[[軟件版本號|版本]]范围,这样既可以保证模块自动更新,又不会因为所需模块功能大幅变化导致项目出现问题<ref name="npm-semver-docs">{{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}}</ref>。开发者也可以选择将模块固定在某个版本之上<ref name="npm-version-dcs">{{cite web
{{cite web
|title = npm-version
|title = npm-version
|url = https://docs.npmjs.com/cli/version
|url = https://docs.npmjs.com/cli/version
|website = docs.npm
|website = docs.npm
|accessdate = 29 October 2016
|accessdate = 29 October 2016
|archive-date = 2016-12-03
}}
|archive-url = https://web.archive.org/web/20161203095339/https://docs.npmjs.com/cli/version
</ref>。<!-- {{fact|在中国大陆,由于[[防火长城]]的干扰,开发者可能需要更换软件源才能正常下载和安装模块。}} -->
|dead-url = no
}}</ref>。

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

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

2022年3月,Brandon Nozaki Miller發布了包含惡意代碼的 <code>node-ipc</code> 套件版本。使用 <code>node-ipc</code> 的 [[Vue.js]] 沒有將其套件固定到安全版本,這意味著 Vue.js 的部分用戶可能會受到惡意代碼的影響。<ref>{{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}}</ref>


== 参考文献 ==
== 参考文献 ==

2023年11月13日 (一) 08:48的最新版本

npm
開發者艾萨克·施吕特、福里斯特·诺维尔、罗伯特·科瓦尔斯基、多梅尼克·德尼科拉、蒂姆·奥克斯利、埃文·马尔等
当前版本
  • 11.0.0(2024年12月16日;穩定版本)[1]
編輯維基數據鏈接
源代码库 編輯維基數據鏈接
编程语言JavaScript
平台Linux
macOS
Windows
许可协议 編輯維基數據鏈接
网站www.npmjs.com/ 编辑维基数据

npm(全称 Node Package Manager,即“node包管理器”)是Node.js預設的、用JavaScript編寫的軟體套件管理系統

历史

[编辑]

npm完全用JavaScript写成,最初由艾萨克·施吕特(Isaac Z. Schlueter)开发。艾萨克表示自己意识到“模块管理很糟糕”的问题,并看到了PHPPEARPerlCPAN等软件的缺点,于是编写了npm。[2]

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

说明

[编辑]

npm会随着Node.js自动安装[3]。npm模块仓库提供了一个名为“registry”的查询服务,用户可通过本地的npm命令下载并安装指定模块。此外用户也可以通过npm把自己设计的模块分发到registry上面[4]

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

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

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

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

使用

[编辑]

npm可以管理本地项目的所需模块并自动维护依赖情况,也可以管理全局安装的JavaScript工具[11]

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

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

意外

[编辑]

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

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

参考文献

[编辑]
  1. ^ Release 11.0.0. 2024年12月16日 [2024年12月26日]. 
  2. ^ Schlueter, Isaac Z. Forget CommonJS. It's dead. **We are server side JavaScript.**. GitHub. 25 March 2013 [2015-01-05]. (原始内容存档于2015-05-08). 
  3. ^ Dierx, Peter. A Beginner's Guide to npm — the Node Package Manager. sitepoint. 30 March 2016 [22 July 2016]. (原始内容存档于2017-02-04). 
  4. ^ Ampersand.js. Ampersand.js - Learn. ampersandjs.com. [22 July 2016]. (原始内容存档于2016-10-04). 
  5. ^ 5.0 5.1 Ojamaa, Andres; Duuna, Karl. Assessing the Security of Node.js Platform. IEEE Xplore. 2012 [22 July 2016]. (原始内容存档于2019-10-18). 
  6. ^ Kennedy, Hugh; DeVay, Paul. Understanding npm. Nsight. [22 July 2016]. (原始内容存档于2016年7月8日). 
  7. ^ Yegulalp, Serdar. How one yanked JavaScript package wreaked havoc. InfoWorld. 23 March 2016 [22 July 2016]. (原始内容存档于2016-12-05). 
  8. ^ Williams, Chris. How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript. The Register. [17 April 2016]. (原始内容存档于2016-03-24). 
  9. ^ npm, Inc. npm. npm. [22 October 2016]. (原始内容存档于2016-10-22). 
  10. ^ npm-stat: download statistics for NPM packages. [2016-12-07]. (原始内容存档于2016-08-11). 
  11. ^ Ellingwood, Justin. How To Use npm to Manage Node.js Packages on a Linux Server. DigitalOcean. [22 October 2016]. (原始内容存档于2016-10-22). 
  12. ^ npm-install. docs.npmjs. [22 October 2016]. (原始内容存档于2016-12-03). 
  13. ^ semver. docs.npmjs. [22 October 2016]. (原始内容存档于2016-12-03). 
  14. ^ npm-version. docs.npm. [29 October 2016]. (原始内容存档于2016-12-03). 
  15. ^ Williams, Chris; Chief, Editor in. How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript. www.theregister.com. [2023-09-10]. (原始内容存档于2023-10-16) (英语). 
  16. ^ npm Blog Archive: changes to npm’s unpublish policy. blog.npmjs.org. [2023-09-10]. (原始内容存档于2023-06-23). 
  17. ^ BIG sabotage: Famous npm package deletes files to protest Ukraine war. BleepingComputer. [2023-09-10]. (原始内容存档于2022-03-17) (美国英语). 

外部連結

[编辑]

参见

[编辑]