2023年度状态之Npm

本文译者为 360 奇舞团前端开发工程师

原文标题:State Of Npm 2023: The Overview

原文链接:blog.sandworm.dev/state-of-np...

原文作者: Gabi Dobocan

概览

  • 一些 Npm 小知识
  • 软件包总数: 3,342,873
  • 每月创建的软件包数
  • 每月发布的版本
  • 过时和未发布版本
  • 体积大小
  • 每月上传的大小
  • 热门关键词
  • 最受欢迎的版本库
  • 未定义Repos的软件包: 1,716,770
  • 未指定版本库的最受欢迎软件包

最古老的和最新的包

  • 按时间跨度计算出的包数量
  • 按最后发布日期列出的软件包数量
  • 注册表中最老的软件包
  • 最老的且目前仍旧活跃在社区当中的软件包: temp
  • Express是最旧的100个软件包中最受欢迎的
  • 最受欢迎的旧软件包
  • 最受欢迎的旧软件包之Chalk
  • 第二受欢迎的旧包:Commander
  • 近期最受欢迎的软件包
  • 近期最受欢迎的软件包:picocolors
  • 近期第二最受欢迎软件包: vite
  • 最受欢迎的新包
  • 最受欢迎的新软件包: update-browserslist-db
  • 第二最受欢迎的新软件包: gopd

本文是《2023 年 npm 状态》系列文章的一部分。在本系列文章中,Sandworm团队将深入研究 npm 的现状,挖掘引人入胜的统计数据,并揭示有关注册表的耐人寻味的事实。

在广阔的软件开发领域,有一个名字已成为 JavaScript 生态系统的代名词:npm

作为全球数百万开发人员的首选软件包管理器,npm 在彻底改变我们构建和共享 JavaScript 代码的方式方面发挥了举足轻重的作用。npm 拥有庞大的注册表,其中的软件包不断增加,它已成为不可或缺的工具,为创新提供了动力,并使开发人员能够轻松创建出色的应用程序。

在本系列中,Sandworm 团队将深入研究 npm 的现状 ,发掘引人入胜的统计数据 ,揭开注册表的神秘面纱。从数量庞大的软件包到最受欢迎的库,我们将探索这个为 JavaScript 社区提供动力的强大机构的内部运作。请加入我们的行列,与我们一起仔细研究 npm 的现状,深入了解其中蕴含的趋势、模式和充满活力的生态系统

一些 Npm 小知识

Npm 的初始提交Isaac Z. Schlueter (isaacs) 于 2009 年 9 月 29 日推送。

  • 它最初只是 VPS 上的一个 CouchDB 服务。

  • npm "这个名字最初是指 "节点软件包管理器"。但后来它被更改了,目前是 "npm 不是首字母缩写 "的递归首字母缩写。首字母缩写是指由首字母拼成现有单词或名称的单词组成的短语。

  • Npm 于 2014 年成立公司,当时筹集了 260 万美元,用于为其快速发展的社区提供可持续的运营资金。

  • GitHub 于 2020 年收购了 npm

包总数: 3,342,873

版本总数 34,335,328
每个包的平均版本 10.27
过去 12 个月创建的软件包 1,390,303
过去 12 个月创建的"垃圾包" 至少 562,743

每月创建的软件包

下图全面概述了 npm 注册表的增长情况以及垃圾软件包的存在情况。从 2010 年 11 月开始,注册表每月创建的软件包数量稳步增长。不过,直到 2023 年 3 月才出现了明显的激增,其中大部分是垃圾软件包的创建。

分析数据后发现,垃圾软件包虽然在注册表的整个历史中都存在,但在此期间却急剧增加。这些信息凸显了 npm 不断演变的格局,以及在维护注册表完整性方面所面临的挑战。

每月发布的版本

下图紧跟已创建软件包的数量,但显示的是指数增长而非线性增长,因为即使是旧软件包也在不断上传新版本。

弃用和未发布

弃用的软件包是指将其标记为过时或不再推荐使用。这通常是在软件包过时、存在安全漏洞或被新版本取代时进行的。通过弃用软件包,开发者可以了解到该软件包已不再被积极维护,因此应该寻找替代品。

另一方面,取消发布软件包指的是从 npm 注册表中完全删除该软件包。这一操作是不可逆的,会永久删除软件包,使其他开发者无法访问。一般不鼓励解除发布,因为这会破坏依赖该软件包的其他项目。不过,在意外发布敏感信息等特殊情况下,开发者可以选择取消发布以降低潜在风险。

弃用的软件包数量 72,754
未公布的包件数量 82,747
停用的版本数量 1,332,206
未发布版本数量 150,666

体积大小

npm 软件包的大小是开发人员需要考虑的一个重要因素,因为它会直接影响应用程序的性能、下载时间和整体用户体验。npm 软件包的大小差异很大,从很小的实用程序库到具有广泛依赖关系的大型框架,不一而足。

一般来说,较小的软件包因其效率高、安装快而更受青睐,而较大的软件包可能会提供更强大的功能和特性集。不过,这样做的代价是下载和安装时间的增加,尤其是对于带宽有限的应用程序或移动用户来说,这可能是一个令人担忧的问题。为了解决这个问题,我们鼓励开发人员通过消除不必要的依赖关系、压缩资源以及利用树状结构和代码拆分等技术来优化软件包的大小。在功能和软件包大小之间取得适当的平衡对于在 npm 生态系统中创建高效、高性能的应用程序至关重要。

版本总体积 24.17 TB
单项软件包的体积大小平均值 416KB

每月上传大小

热门关键字

package.json 文件中的 "keywords "字段在组织和分类 npm 软件包方面发挥着至关重要的作用。它允许开发人员指定一系列描述软件包功能、目的或领域的相关关键字。这些关键字就像元数据一样,为用户提供有价值的信息,并促进软件包的发现。在向 npm 注册表发布软件包时,关键字可帮助用户通过搜索与需求相关的特定术语更容易地找到软件包。

译者注: 以下为npm热门关键字概览

最受欢迎的版本库

软件包清单中的 Repository 字段提供了有关软件包源代码库的宝贵信息,允许用户审查代码以及提Issue等。

未定义Repos的软件包: 1,716,770

如果 npm 软件包没有在清单文件(package.json)中声明其版本库,就会引起人们对软件包可靠性和可信度的担忧。没有这些信息,评估软件包的质量、可维护性和社区支持就会变得非常困难。

虽然没有版本库声明并不一定表明软件包不安全,但会增加评估其合法性和安全性的难度。一般建议使用能提供清晰透明的源代码库信息的软件包。这样用户就能更清楚地了解软件包的开发过程、代码库和社区参与情况,而这些都是评估 npm 软件包可靠性和安全性的关键因素。

未指定Repo的最受欢迎软件包

上面列表中的许多软件包只是忘记或忽略了在其清单文件中添加版本库信息,但对于某些软件包来说,版本库的缺失表明了更深层次的问题。我们曾在这篇文章中提到过 https 软件包:安全警报:不要使用 npm install https


按年份分列的软件包数量

如果我们将 2023 年初左右发布的 SEO 垃圾软件包包括在内,并且目前(6 月 23 日)仍可在注册表中找到,那么我们可以看到,几乎一半的现有软件包都是在过去 12 个月内创建的

Sandworm已检测到去年发布的至少 56 万个垃圾软件包 。考虑到软件包的历史增长率,我们估计实际数量大约在 100 万个垃圾软件包左右,约占整个注册表大小的三分之一

以下为截至2023年6月23日为止的npm包分布图:

按最后发布日期统计的软件包数量

自 2017 年 5 月以来,约 90% 的软件包至少更新过一次。

注册表中最老的软件包(前4名)

| 排名 包名称 创建日期 最新版本 何时未发布 最后发布日期 已弃用的最新版本
1 sprintf 2010 年 11 月 0.1.5 14 年 12 月 sprintf 软件包已被弃用,取而代之的是 sprintf-js。
2 temp 2010 年 11 月 0.9.4 20 年 11 月
3 monomi 2010 年 11 月 0.0.1 2010 年 11 月 不再支持软件包。如需了解更多信息,请发送电子邮件至 www.npmjs.com/support 联系技术支持。
4 express-session-mongo 2010 年 11 月 0.1.0 2014年7月

译者注: 对最古老的npm包排名数据感兴趣的读者可以自行阅读www.datawrapper.de/_/ZosCg/

  • 在历史最悠久的 100 个软件包中,只有 11 个已弃用的或未发布。

  • 在最老的 100 个软件包中,有 13 个仍在运行,并在去年发布了新版本。

最旧的并且仍然活跃的软件包: temp

由于 sprintf 已被弃用,因此 temp 是目前在注册表中仍处于活跃状态(未被弃用或未发布)的最古老的 npm 软件包。它创建于 2010 年 11 月 9 日,最新版本(0.9.4)发布于 2020 年 11 月 10 日。

Temp 是 Node.js 的一个软件包,提供处理临时文件、目录和流的功能。通过该软件包,您可以在系统的临时目录中生成唯一的文件和目录名,设置适当的文件模式,并支持根据请求自动删除临时文件。

javascript 复制代码
const temp = require('temp');
const fs   = require('fs');
const util  = require('util');
const exec = require('child_process').exec;

// Automatically track and cleanup files at exit
temp.track();

// Fake data
let myData = "foo\nbar\nfoo\nbaz";

// Process the data (note: error handling omitted)
temp.open('myprefix', function(err, info) {
  if (!err) {
    fs.write(info.fd, myData, (err) => {
        console.log(err);
    });
    fs.close(info.fd, function(err) {
      exec("grep foo '" + info.path + "' | wc -l", function(err, stdout) {
        util.puts(stdout.trim());
      });
    });
  }
});

最古老的 100 种包中最受欢迎的包:Express

大多数 Node 开发人员都非常熟悉 express:它是 Node.js 的一个流行 Web 应用程序框架。它提供了一系列强大的功能和实用工具,包括路由、中间件、请求和响应处理、模板和静态文件服务,从而简化了构建网络应用程序和 API 的过程。

javascript 复制代码
// Import the Express module
const express = require('express');

// Create an instance of Express
const app = express();

// Define a route handler for the root URL '/'
app.get('/', (req, res) => {
  // Send a response with "Hello, World!"
  res.send('Hello, World!');
});

// Start the server and listen on port 3000
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

最受欢迎的旧软件包

在本节中,"旧"指的是 2014 年之前创建的。

最受欢迎的旧包:Chalk

Chalk 是一个用于 Node 的软件包,它提供了一种在终端中对文本进行样式和着色的简单方法。通过它,您可以在控制台输出中添加各种颜色、样式(如粗体、斜体)和背景颜色,使其更具视觉吸引力,更易于阅读。

Chalk "模块的主要功能和使用示例包括

使用预定义的颜色名称或 RGB 值为文本添加颜色。您可以从红、绿、黄、蓝、洋红、青、白等多种颜色中进行选择。

添加文本样式,如粗体、斜体、下划线和删除线,以强调或装饰输出结果。

在文本后面设置背景颜色,以创建视觉上不同的部分。

将各种方法串联起来,创建复杂的样式和组合。

通过定义自己的颜色和样式组合来创建自定义主题,以便在整个应用程序中使用一致的样式。

javascript 复制代码
const chalk = require('chalk');

console.log(chalk.red('Error:'), chalk.bold('Something went wrong!'));
console.log(chalk.yellow.bgBlue('Warning:'), 'This action may have consequences.');
console.log(chalk.cyan.underline('Info:'), 'Please note the following details.');

第二受欢迎的旧包:Commander

Commander 是一种流行的框架,用于在 Node 中构建命令行界面(CLI)。它提供了一系列功能和实用程序,可简化创建强大且用户友好的命令行应用程序的过程。

javascript 复制代码
// Import the commander module
const { program } = require('commander');

// Define the command and option
program
  .version('1.0.0')
  .command('greet <name>')
  .description('Greet a person')
  .option('-t, --times <count>', 'Number of times to greet', parseInt)
  .action((name, options) => {
    const count = options.times || 1;
    for (let i = 0; i < count; i++) {
      console.log(`Hello, ${name}!`);
    }
  });

// Parse the command-line arguments
program.parse(process.argv);

近期最受欢迎的包

在本节中,"近期 "指 2020 年之后创建。

近期最受欢迎的软件包: picocolors

和Chalk一样,picocolors 也是一个终端文本着色库。它自称是 "用 ANSI 颜色进行终端输出格式化的最小、最快的库"。

通过 picocolors,它的作者试图引起人们对 node_modules 大小问题的关注,并倡导性能优先的文化。

picocolors拥有如下优点:

  • 没有依赖关系。

  • 比 Chalk 小 14 倍,速度快 2 倍。

  • PostCSS、SVGO、Stylelint 和 Browserslist 等流行工具都在使用picocolors。

javascript 复制代码
import pc from "picocolors"

console.log(
  pc.green(`How are ${pc.italic(`you`)} doing?`)
)

近期第二受欢迎: vite

Vite 是一款构建工具和开发服务器,专为现代网络开发工作流程而设计。它旨在通过利用浏览器中的本地 ES 模块 (ESM) 提供快速高效的开发体验。以下是 vite 软件包的一些主要功能:

  • Server Fast,近乎瞬时的热模块替换(HMR),大大加快了开发迭代速度。

  • 支持 ES 模块(ESM)。

  • 带 HMR 的Dev Server--对代码所做的更改会立即反映在浏览器中,无需重新加载整个页面。

  • 快速构建。

  • 插件生态系统: 支持 TypeScript、CSS 预处理(如 PostCSS)等。

  • 内置 Vue.js 和 React 支持。

lua 复制代码
npm install -g create-vite
create-vite my-vue-app --template vue
cd my-vue-app
npm run dev

最受欢迎的新包

在本节中,"全新 "是指在过去 12 个月中(截至2023年6月为止)创建的。

以下为过去一年中创建的最受欢迎包(前20名)(截至2023年6月23日为止):

对于前一百名排名数据感兴趣的读者可以前往Most Popular Packages Created In The Past Year (Jun 23)查看相关数据。

最受欢迎的新包: update-browserslist-db

Update-browserslist-db 是一个简单的 CLI 工具,用于根据浏览器列表配置中的Browserlist更新 caniuse-lite。

Caniuse-lite 是一个轻量级浏览器兼容性数据库,提供不同网络浏览器对网络技术的支持信息。它是更大的 caniuse 数据库的一个子集,而 caniuse 数据库是跟踪各种网络功能的浏览器支持情况的综合资源。

出于以下三个主要原因,定期更新 caniuse-lite 是必不可少的:

  • 了解最新的浏览器版本和统计数据: 在进行最后 2 个版本或 >1% 等查询时,获得最新的浏览器数据非常重要。如果不更新 caniuse-lite,结果中可能会出现过时的浏览器。

  • 利用准确的浏览器数据减少Polyfills: 掌握有关浏览器实际使用情况的最新信息,可以减少Polyfill程序的使用。这样可以减小 JavaScript 和 CSS 文件,从而提高网站性能。通过更新 caniuse-lite,您可以确保数据准确反映正在使用的浏览器,从而相应地优化代码。

  • 在不同工具间同步版本兼容性:caniuse-lite 是各种工具的兼容性数据源。定期更新有助于保持这些工具版本的一致性和协调性。

sql 复制代码
npx update-browserslist-db@latest

第二受欢迎的新包:GOPD

IE8 不支持非 DOM 对象上的 Object.getOwnPropertyDescriptor。如果您仍然需要以某种方式支持 IE8,那么此软件包只需对 IE 的错误实现进行说明即可。

javascript 复制代码
var gOPD = require('gopd');
var assert = require('assert');

if (gOPD) {
    assert.equal(typeof gOPD, 'function', 'descriptors supported');
    // use gOPD like Object.getOwnPropertyDescriptor here
} else {
    assert.ok(!gOPD, 'descriptors not supported');
}

如果您喜欢这篇文章,请参阅 Sandworm audit,该项目可以使您的 JavaScript 项目更加安全!

Sandworm Audit 是一款不错的开源 npm 审计工具:它可以检查多种类型的问题(如漏洞或许可证合规性),可以输出 SVG 图表和 CSV,可以将问题标记为已解决,还可以在 CI 中运行它来执行安全规则。请查看文档,并在 JavaScript 应用程序的根目录中安装 npx @sandworm/audit@latest,以试用它。

sandworm-audit gif

Last but not Least,译者在与原文作者Gabi Dobocan获取翻译和转载授权的交流中得知,原作者十分在意读者的评论和反馈等,因为此系列作为长期更新的长文,需要有一定数量的反馈,才能更好的继续写作下去。希望各位读者朋友多多留言反馈。

相关推荐
cwj&xyp7 分钟前
Python(二)str、list、tuple、dict、set
前端·python·算法
dlnu20152506229 分钟前
ssr实现方案
前端·javascript·ssr
古木201914 分钟前
前端面试宝典
前端·面试·职场和发展
轻口味2 小时前
命名空间与模块化概述
开发语言·前端·javascript
前端小小王2 小时前
React Hooks
前端·javascript·react.js
迷途小码农零零发2 小时前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
娃哈哈哈哈呀3 小时前
vue中的css深度选择器v-deep 配合!important
前端·css·vue.js
旭东怪3 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
ekskef_sef5 小时前
32岁前端干了8年,是继续做前端开发,还是转其它工作
前端