最近,npm
官方发布了 2023年总结
,其中包括了很多有意思的数据。
作为前端最受欢迎也是最有争议的包管理器,我们一起来看看这份总结吧:
npm 的爆炸式增长
在十年前,npm的员工还可以在一次会议上读出所有 npm
包的名称。但到 2023
年底,来自将近 90w
维护者的 npm
账户已经上传了近 400w
个包。
根据npm官方统计数据显示,到 2023
年底,活跃的包数量超过了 250w
,每月的下载量更是超过了惊人的 1840亿
次。
250w
与 400w
之间的差距表明 —— 许多包被从账户中移除了。在 npm
上发布包是一件非常简单的事,没有发布审核,所以 npm
账号相比其他语言的生态更容易存储恶意包。然而,根据我们在 Python
生态中已经发现的一些恶意行为来看,这个观点可能并不完全准确。
在 2023
年,npm发布了对 Python
和 Go
的支持,并计划在 2024
年支持更多的语言,比如 Java
。未来,我们将发布生态系统之间的对比,这应该能带来些有趣的洞察。
在 2023
年,npm上发布了 10,518,566
个软件包版本。以下是按月份分解的数据,其中,三月和四月更新的包最多,可能是因为在 2023
年3~4月间,npm
遭受了大规模的以John Wick(极速追杀男主)为主题的垃圾邮件和网络钓鱼攻击。
每月发布的npm软件包版本数
npm 包的趋势
虽然 npm
最初是 Node.js
的软件包管理器,但在过去几年中,它的迅猛崛起也使其成为了 JavaScript
前端项目事实上的包管理器,大部分取代了 Bower
,并在 JS
项目中实现了更统一和更流畅的开发工作流程。
下图显示了按依赖数排名前 50
的软件包:
依赖数排名前50的npm软件包
TypeScript
显得非常亮眼,TypeScript
最初发布于2011年10月,在2017-2018年左右获得了显著的增长,并逐渐成为编写大型应用程序的标准,同时也越来越多地用于库代码。
在前端框架和库方面,React
位居第二并不令人意外,鉴于其庞大的组件生态系统和在该领域中的主导地位。此外,列表中唯一的其他前端库是 Vue.js
(Angular
以 @angular/core
在第62位)。
我们还可以从每周下载次数的角度来观察:
Sindre Sorhus
一个人负责了列表中一半包的维护,可以说是非常活跃 & 有能力的开发者了。
安全挑战和应对措施
npm团队使用 Socket AI
,基于人工智能的威胁检测系统,扫描了数百万个 npm
包中的文件。在 2023
一年就扫出五千多个恶意包。
在加密货币领域23年还发生了多起备受关注的供应链攻击。例如,hardhat-gas-report
这个包在数月内都是无害的,但后来被更新为包含恶意代码以窃取以太坊私钥。
在12月14日,一名前 Ledger
员工遭受网络钓鱼攻击后,黑客获取了其 npmjs
账户的访问权限,并发布了一个恶意版本的 Ledger Connect Kit
,试图将资金重定向到黑客的钱包。
除了恶意软件的增加,npm
还面临多次垃圾邮件攻击。在去年2月,攻击者在短短两天内发布了超过 15,000
个垃圾软件包到 npm
中。
彩蛋
名字最长的包
哪个软件包的名称最长?首先应该指出,在 npm
上,软件包名称的最大长度为 214
个字符。那是否有这样的包呢?是的,以下软件包都使用了所有可用的字符数:
-
ifyouwanttogetthesumoftwonumberswherethosetwonumbersarechosenbyfindingthelargestoftwooutofthreenumbersandsquaringthemwhichismultiplyingthembyitselfthenyoushouldinputthreenumbersintothisfunctionanditwilldothatforyou
-
koishi-plugin-uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
-
this-package-exports-the-number-214-and-its-name-is-also-two-hundred-and-fourteen-characters-long-which-is-the-longest-name-currently-allowed-by-the-npm-registry-to-see-how-a-name-that-long-would-look-if-you-did-ii
-
this-package-exports-the-number-214-and-its-name-is-also-two-hundred-and-fourteen-characters-long-which-is-the-longest-name-currently-allowed-by-the-npm-registry-to-see-how-a-name-that-long-would-look-if-you-did-it
-
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
体积最大的包
@chainsafe/eth2-spec-tests
体积高达 5.96 GB
。紧随其后的是 1.1.0
版本的 kuzzle
,大小约为 5.88 GB
。modez
位居第三,为 4.39 GB
。下面是排名前 10 的列表:
-
@chainsafe/eth2-spec-tests@0.12.3(5.96GB)
-
kuzzle@1.1.0 (5.89GB)
-
modez@1.0.4(4.39GB)
-
@mpetrunic/eth2-spec-tests@1.0.1(4.13 GB)
-
docloop@0.9.3(3.38GB)
-
@twigeducation/ts-fe-components@5.9.1 (3.22GB)
-
similar-persian-words@1.0.2 (3.05GB)
-
@sofit/view-locale@2.0.1(2.14GB)
-
quint-cli@0.13.0(2.08GB)
-
steamboat@0.1.1(1.77GB)
维护者最多的包
优胜者是 @seek/asia-translations
,拥有 554 个维护者。紧随其后的是两个来自 Condé Nast
的软件包,但 BBC
在前十名中也有几个出色的软件包。以下是按维护者数量排名的前十个包版本的完整列表。
-
@seek/asia-translations@1.0.0 (554 maintainers)
-
@condenast/seawasp-bull-queue@0.1.4 (530 maintainers)
-
@condenast/cna-st-codec@0.1.4 (530 maintainers)
-
@bbc/storyplayer@0.4.16 (494 maintainers)
-
@bbc/digital-paper-edit-client@0.8.2-alpha.2 (494 maintainers)
-
@bbc/stt-align-node@1.0.0 (494 maintainers)
-
@bbc/newslabs-helper-analytics@3.1.3 (493 maintainers)
-
@bbc/local-election-2020-assets@0.0.1 (491 maintainers)
-
@bbc/digital-paper-edit-storybook@1.7.0 (491 maintainers)
-
@bbc/object-based-media-schema@0.3.3 (490 maintainers)