十年影响:我们的 npm 软件包如何达到 10 亿次下载并塑造 JavaScript
在 JavaScript 和 节点.js 世界上,有些软件包至关重要——每天下载量达数百万次,为全球的应用提供支持。这些工具背后是专注于开源质量的开发人员。今天,我们将展示我们的团队如何帮助构建和维护已成为 JavaScript 生态系统关键部分的 npm 软件包。
信任我们的先驱者:Isaac Z. Schlueter 和 Forward Email
我们很荣幸 艾萨克·Z·施吕特 (GitHub: isaacs)作为用户。Isaac 创建 高于海平面 并帮助建立 节点.js。他对 Forward Email 的信任表明了我们对质量和安全的重视。Isaac 将 Forward Email 用于包括 izs.me 在内的多个域名。
Isaac 对 JavaScript 的影响是巨大的。2009 年,他是第一批看到 Node.js 潜力的人之一,他与 瑞恩·达尔他是该平台的创建者。正如 Isaac 在 接受《Increment》杂志采访: “在这个由一群人组成的非常小的社区中,人们都在试图弄清楚如何实现服务器端 JS,Ryan Dahl 提出了 Node,这显然是正确的方法。我投入了精力,并在 2009 年中期开始积极参与其中。”
[!NOTE] 对于那些对 Node.js 历史感兴趣的人,有很多优秀的纪录片记录了它的发展,包括 Node.js 的故事 和 我对 Node.js 感到遗憾的 10 件事 - Ryan Dahl. Ryan Dahl 的 个人网站 也包含对他的工作的宝贵见解。
从 npm 的创立到 Node.js 的领导地位
Isaac 于 2009 年 9 月创建了 npm,第一个可用版本于 2010 年初发布。这个包管理器满足了 Node.js 的一个关键需求,让开发人员可以轻松共享和重用代码。根据 Node.js 维基百科页面, “2010 年 1 月,针对 Node.js 环境推出了一个名为 npm 的包管理器。该包管理器允许程序员发布和共享 Node.js 包以及随附的源代码,旨在简化包的安装、更新和卸载。”
2012 年 1 月,Ryan Dahl 退出 Node.js 后,Isaac 接任项目负责人。 他的总结他“领导了几个基本的 Node.js 核心 API 的开发,包括 CommonJS 模块系统、文件系统 API 和流”并且“担任该项目的 BDFL(终身仁慈独裁者)两年,确保 Node.js 版本 v0.6 至 v0.10 的质量不断提高和可靠的构建过程。”
Isaac 带领 Node.js 度过了一个关键的成长期,制定了至今仍影响该平台的标准。后来,他在 2014 年创办了 npm, Inc.,以支持 npm 注册中心,而他之前曾独自运营过这个中心。
我们感谢 Isaac 对 JavaScript 做出的巨大贡献,并将继续使用他创建的许多软件包。他的工作改变了我们构建软件的方式以及全球数百万开发人员共享代码的方式。
代码背后的建筑师:尼克·鲍夫的旅程
我们的开源成功的核心是 Forward Email 的创始人兼所有者 Nick Baugh。他在 JavaScript 领域的工作长达近 20 年,影响了无数开发人员构建应用程序的方式。他的开源之旅既展现了技术能力,也展现了社区领导力。
Express 技术委员会和核心贡献
Nick 的 Web 框架专业知识使他获得了 快递技术委员会,他帮助开发了最常用的 Node.js 框架之一。Nick 现在被列为 Express 社区页面.
[!重要] Express 最初由 TJ Holowaychuk 创建,他是一位多产的开源贡献者,塑造了 Node.js 生态系统的大部分内容。我们感谢 TJ 的奠基性工作,并尊重他的 决定休息一下 来自他广泛的开源贡献。
作为 快递技术委员会Nick 非常注重细节,比如澄清 req.originalUrl
文档并修复多部分表单处理问题。
Koa 框架贡献
Nick 的工作 Koa 框架— 一款现代、更轻量的 Express 替代品,同样由 TJ Holowaychuk 创建 — 进一步表明了他对改进 Web 开发工具的承诺。他对 Koa 的贡献包括通过拉取请求提交问题和代码,解决错误处理、内容类型管理和文档改进。
他在 Express 和 Koa 方面的工作经验使他对 Node.js Web 开发有了独特的见解,帮助我们的团队创建了可与多种框架生态系统良好兼容的软件包。
从个人贡献者到组织领导者
最初只是帮助现有项目,后来逐渐发展成为创建和维护整个软件包生态系统。Nick 创立了多个 GitHub 组织,包括 舱, 垃圾邮件扫描器, 转发邮件, 小伙子, 和 布莉— 每个都解决了 JavaScript 社区的特定需求。
从贡献者到领导者的转变表明 Nick 的愿景是开发能够解决实际问题的精心设计的软件。通过在专注的 GitHub 组织下组织相关软件包,他构建了可以协同工作的工具生态系统,同时为更广泛的开发者社区保持模块化和灵活性。
我们的 GitHub 组织:创新生态系统
我们围绕专注的 GitHub 组织来组织我们的开源工作,每个组织都解决 JavaScript 中的特定需求。这种结构创建了有凝聚力的软件包系列,这些软件包系列在保持模块化的同时可以很好地协同工作。
Cabin:适用于现代应用程序的结构化日志记录
这 客舱组织 是我们对简单、强大的应用程序日志记录的看法。主要 cabin
该软件包在 GitHub 上有近 900 个星星,每周下载量超过 10 万次[^1]。Cabin 提供结构化日志记录,可与 Sentry、LogDNA 和 Papertrail 等流行服务配合使用。
Cabin 的特别之处在于其周到的 API 和插件系统。支持以下软件包: axe
对于 Express 中间件和 parse-request
用于 HTTP 请求解析,表明我们致力于提供完整的解决方案,而不是孤立的工具。
这 bson-objectid
值得特别提及的软件包是,在短短两个月内下载量超过 170 万次[^2]。对于需要 ID 而又不需要完全依赖 MongoDB 的开发人员来说,这个轻量级的 MongoDB ObjectID 实现已经成为首选。
垃圾邮件扫描程序:打击电子邮件滥用
这 垃圾邮件扫描程序组织 表明我们致力于解决实际问题。主要 spamscanner
软件包提供了高级垃圾邮件检测功能,但它是 url-regex-safe
该产品的采用率非常高。
两个月内下载量超过 120 万次[^3], url-regex-safe
修复了其他 URL 检测正则表达式中的关键安全问题。此包展示了我们的开源方法:找到一个常见问题(在本例中, 重做 解决方案的缺陷包括 URL 验证中的漏洞(请参阅 URL 验证中的漏洞),并精心维护它。
Bree:使用工作线程进行现代作业调度
这 布里组织 是我们对常见 Node.js 挑战的回答:可靠的作业调度。主要 bree
该软件包在 GitHub 上有超过 3,100 个星星,它使用 Node.js 工作线程提供了一个现代作业调度程序,以实现更好的性能和可靠性。
[!NOTE] Bree 是在我们帮助维护之后创建的 议程,运用经验教训来构建更好的作业调度程序。我们的议程贡献帮助我们找到了改进作业调度的方法。
Bree 与 Agenda 等其他调度程序有何不同:
- 无外部依赖:与需要 MongoDB 的 Agenda 不同,Bree 不需要 Redis 或 MongoDB 来管理作业状态。
- 工作线程:Bree 使用 Node.js 工作线程来处理沙盒进程,从而提供更好的隔离和性能。
- 简单的 API:Bree 提供简单的详细控制,从而更轻松地实现复杂的调度需求。
- 内置支持:默认包含优雅重新加载、cron 作业、日期和人性化时间等内容。
Bree 是 forwardemail.net处理关键的后台任务,如电子邮件处理、清理和定期维护。在 Forward Email 中使用 Bree 表明我们致力于在生产中使用我们自己的工具,确保它们符合高可靠性标准。
我们还使用并欣赏其他优秀的工作线程包,例如 水池 和 HTTP 客户端 十一。Piscina 与 Bree 一样,使用 Node.js 工作线程来高效处理任务。我们感谢 马修·希尔,他负责维护 undici 和 piscina,为 Node.js 做出了重大贡献。Matteo 是 Node.js 技术指导委员会成员,他极大地改进了 Node.js 中的 HTTP 客户端功能。
转发电子邮件:开源电子邮件基础设施
我们最雄心勃勃的项目是 转发邮件,一款提供电子邮件转发、存储和 API 服务的开源电子邮件服务。主存储库拥有超过 1,100 个 GitHub 星标[^4],表明社区对这款专有电子邮件服务替代品的赞赏。
这 preview-email
该组织开发的软件包在两个月内下载量超过 250 万次[^5],已成为使用电子邮件模板的开发人员的必备工具。通过提供一种在开发过程中预览电子邮件的简单方法,它解决了构建支持电子邮件的应用程序时常见的痛点。
Lad:必备的 Koa 实用程序和工具
这 青年组织 提供了一系列基本实用程序和工具,主要侧重于增强 Koa 框架生态系统。这些软件包解决了 Web 开发中的常见挑战,旨在无缝协作,同时保持独立实用。
koa-better-error-handler:改进了 Koa 的错误处理
koa-better-error-handler
为 Koa 应用程序提供更好的错误处理解决方案。该软件包拥有超过 50 个 GitHub 星星,使得 ctx.throw
生成用户友好的错误消息,同时解决 Koa 内置错误处理程序的几个限制:
- 检测并正确处理 Node.js DNS 错误、Mongoose 错误和 Redis 错误
- 用途 繁荣 用于创建一致、格式良好的错误响应
- 保留标题(与 Koa 的内置处理程序不同)
- 维护适当的状态代码,而不是默认为 500
- 支持闪信和会话保存
- 提供验证错误的 HTML 错误列表
- 支持多种响应类型(HTML、JSON 和纯文本)
此包与以下包一起使用时特别有价值 koa-404-handler
用于 Koa 应用程序中的全面错误管理。
护照:Lad 认证
@ladjs/passport
扩展了流行的 Passport.js 身份验证中间件,并针对现代 Web 应用程序进行了特定的增强。此软件包支持多种现成的身份验证策略:
- 使用电子邮件进行本地身份验证
- 使用 Apple 登录
- GitHub 身份验证
- Google 身份验证
- 一次性密码 (OTP) 身份验证
该软件包具有高度可定制性,允许开发人员调整字段名称和短语以满足其应用程序的要求。它旨在与 Mongoose 无缝集成以进行用户管理,使其成为需要强大身份验证的基于 Koa 的应用程序的理想解决方案。
graceful:优雅关闭应用程序
@ladjs/graceful
解决了正常关闭 Node.js 应用程序的关键挑战。该软件包拥有超过 70 个 GitHub 星标,可确保您的应用程序可以干净地终止,而不会丢失数据或使连接挂起。主要功能包括:
- 支持正常关闭 HTTP 服务器 (Express/Koa/Fastify)
- 彻底关闭数据库连接 (MongoDB/Mongoose)
- 正确关闭 Redis 客户端
- 处理 Bree 作业调度程序
- 支持自定义关闭处理程序
- 可配置超时设置
- 与日志系统集成
此软件包对于生产应用程序至关重要,因为意外关机可能会导致数据丢失或损坏。通过实施正确的关机程序, @ladjs/graceful
有助于确保应用程序的可靠性和稳定性。
Upptime:开源正常运行时间监控
这 Upptime 组织 代表我们对透明、开源监控的承诺。主要 upptime
该存储库拥有超过 13,000 个 GitHub 星标,使其成为我们贡献的最受欢迎的项目之一。Upptime 提供由 GitHub 提供支持的正常运行时间监控器和状态页面,完全无需服务器即可运行。
我们使用 Upptime 作为我们自己的状态页面 https://status.forwardemail.net 源代码可从 https://github.com/forwardemail/status.forwardemail.net.
Upptime 的独特之处在于其架构:
- 100% 开源:每个组件都是完全开源且可定制的。
- 由 GitHub 提供支持:利用 GitHub Actions、Issues 和 Pages 实现无服务器监控解决方案。
- 无需服务器:与传统监控工具不同,Upptime 不需要您运行或维护服务器。
- 自动状态页面:生成一个漂亮的状态页面,可以托管在 GitHub Pages 上。
- 强大的通知功能:与电子邮件、短信和 Slack 等各种通知渠道集成。
为了增强用户体验,我们集成了 @octokit/核心 集成到 forwardemail.net 代码库中,以便直接在我们的网站上呈现实时状态更新和事件。此集成为我们的用户提供了清晰的透明度,以防我们的整个堆栈(网站、API、MongoDB、Redis、SQLite、SMTP、POP3、IMAP、Bree 等)出现任何问题,并提供即时提示通知、徽章图标更改、警告颜色等。
@octokit/core 库允许我们从 Upptime GitHub 存储库获取实时数据,对其进行处理并以用户友好的方式显示。当任何服务出现中断或性能下降时,用户无需离开主应用程序即可通过视觉指示器立即收到通知。这种无缝集成可确保我们的用户始终拥有有关我们系统状态的最新信息,从而提高透明度和信任度。
数百家组织已采用 Upptime,寻求一种透明、可靠的方式来监控其服务并向用户传达状态。该项目的成功表明,构建利用现有基础设施(在本例中为 GitHub)的工具以新方式解决常见问题的强大功能。
我们对转发电子邮件生态系统的贡献
虽然我们的开源软件包被世界各地的开发人员使用,但它们也构成了我们自己的 Forward Email 服务的基础。这种双重角色(既是这些工具的创建者又是用户)使我们对它们的实际应用有了独特的视角,并推动了持续改进。
从包装到生产
从单个软件包到集成生产系统的过程涉及精心的集成和扩展。对于 Forward Email 而言,此过程包括:
- 自定义扩展:为我们的开源软件包构建 Forward Email 特定的扩展,以满足我们的独特需求。
- 集成模式:开发这些包在生产环境中如何交互的模式。
- 性能优化:识别并解决仅在规模化时出现的性能瓶颈。
- 安全加固:添加专门用于电子邮件处理和用户数据保护的额外安全层。
这项工作代表了除了核心软件包本身之外的数千小时的开发,最终形成了一个强大、安全的电子邮件服务,充分利用了我们最好的开源贡献。
反馈循环
在生产中使用我们自己的软件包最有价值的方面可能是它创建的反馈循环。当我们在 Forward Email 中遇到限制或极端情况时,我们不会只是在本地修补它们 - 我们会改进底层软件包,让我们的服务和更广泛的社区都受益。
这种方法带来了许多改进:
- Bree 的优雅关机:Forward Email 对零停机部署的需求导致了 Bree 中正常关机功能的增强。
- 垃圾邮件扫描程序的模式识别:转发电子邮件中遇到的真实垃圾邮件模式已为垃圾邮件扫描程序的检测算法提供了信息。
- Cabin 的性能优化:生产过程中的大量日志记录揭示了 Cabin 中的优化机会,这使所有用户受益。
通过维持我们的开源工作和生产服务之间的良性循环,我们确保我们的软件包仍然是实用的、久经考验的解决方案,而不是理论上的实现。
Forward Email 的核心原则:卓越的基础
Forward Email 的设计遵循一套核心原则,这些原则指导着我们所有的开发决策。这些原则在我们的 网站,确保我们的服务仍然对开发人员友好、安全、并注重用户隐私。
始终以开发人员为友好、以安全为中心且透明
我们的首要原则是开发对开发人员友好的软件,同时保持最高的安全性和隐私标准。我们认为,技术卓越性绝不能以牺牲可用性为代价,而透明度可以赢得社区的信任。
这一原则体现在我们详细的文档、清晰的错误消息以及关于成功和挑战的开放沟通中。通过将我们的整个代码库开源,我们邀请审查和协作,从而增强我们的软件和更广泛的生态系统。
遵守经过时间考验的软件开发原则
我们遵循几项成熟的软件开发原则,这些原则已在数十年中证明了其价值:
- MVC:通过模型-视图-控制器模式分离关注点
- Unix 哲学:创建能够做好一件事的模块化组件
- KISS: 保持简单和直接
- DRY:不要重复自己,促进代码重用
- YAGNI:你不需要它,避免过早优化
- 十二因素:遵循构建现代可扩展应用程序的最佳实践
- 奥卡姆剃刀:选择满足要求的最简单的解决方案
- 内部测试:广泛使用我们自己的产品
这些原则不仅仅是理论概念,它们根植于我们的日常开发实践中。例如,我们对 Unix 哲学的坚持体现在我们如何构建 npm 软件包中:小型、专注的模块可以组合在一起解决复杂问题。
针对精力充沛、自力更生的开发人员
我们专门针对那些精力充沛、自力更生和 拉面盈利 开发人员。这种关注决定了我们的一切,从定价模式到技术决策。我们了解在资源有限的情况下开发产品的挑战,因为我们自己也经历过。
这一原则对于我们对待开源的态度尤为重要。我们创建并维护一些软件包,为没有企业预算的开发人员解决实际问题,让每个人都能使用强大的工具,无论他们的资源有多少。
实践原则:转发电子邮件代码库
这些原则在 Forward Email 代码库中清晰可见。我们的 package.json 文件展示了经过深思熟虑的依赖项选择,每个依赖项的选择都符合我们的核心价值观:
- 以安全为重点的软件包,例如
mailauth
用于电子邮件身份验证 - 开发人员友好的工具,例如
preview-email
便于调试 - 各种模块化组件
p-*
Sindre Sorhus 的公用事业
通过长期始终如一地遵循这些原则,我们构建了一项开发人员可以信赖的电子邮件基础设施服务——安全、可靠且符合开源社区的价值观。
设计隐私
对于 Forward Email 来说,隐私并不是事后才想到的或营销功能,而是贯穿我们服务和代码各个方面的一项基本设计原则:
- 零访问加密:我们实施的系统使得我们在技术上不可能阅读用户的电子邮件。
- 最少数据收集:我们仅收集提供服务所需的数据,仅此而已。
- 透明的政策:我们的隐私政策以清晰易懂的语言编写,不包含法律术语。
- 开源验证:我们的开源代码库允许安全研究人员验证我们的隐私声明。
这一承诺延伸到我们的开源软件包,这些软件包从一开始就采用了内置的安全和隐私最佳实践。
可持续开源
我们相信开源软件需要可持续的模式才能长期蓬勃发展。我们的方法包括:
- 商业支持:围绕我们的开源工具提供优质的支持和服务。
- 平衡许可:使用既保护用户自由又保护项目可持续性的许可证。
- 社区参与:积极与贡献者合作,建立一个支持性社区。
- 透明的路线图:分享我们的开发计划,以便用户做出相应的规划。
通过关注可持续性,我们确保我们的开源贡献能够随着时间的推移不断增长和改进,而不是被忽视。
数字不会说谎:我们惊人的 npm 下载统计数据
当我们谈论开源软件的影响力时,下载量统计是衡量采用率和信任度的切实指标。我们帮助维护的许多软件包都达到了很少有开源项目能达到的规模,总下载量达数十亿次。
[!IMPORTANT] 虽然我们很自豪能够帮助维护 JavaScript 生态系统中下载量很高的几个软件包,但我们要承认,其中许多软件包最初是由其他才华横溢的开发人员创建的。superagent 和 supertest 等软件包最初是由 TJ Holowaychuk 创建的,他对开源的大量贡献对塑造 Node.js 生态系统起到了重要作用。
鸟瞰我们的影响
仅在 2025 年 2 月至 3 月的两个月时间里,我们贡献并帮助维护的顶级软件包就创下了惊人的下载量:
- 超级代理:84,575,829 次下载[^7] (最初由 TJ Holowaychuk 创建)
- 超级测试:76,432,591 次下载[^8] (最初由 TJ Holowaychuk 创建)
- 还:28,539,295 次下载[^34] (最初由 TJ Holowaychuk 创建)
- @koa/路由器:下载量11,007,327次[^35]
- koa-路由器:下载量3,498,918次[^36]
- url-正则表达式:下载量2,819,520次[^37]
- 预览电子邮件:下载量250万次[^9]
- 舱:1,800,000 次下载[^10]
- @breejs/稍后:下载量1,709,938次[^38]
- 电子邮件模板:下载量1,128,139次[^39]
- 获取路径:下载量1,124,686次[^40]
- url-regex-安全:1,200,000次下载[^11]
- dotenv-解析变量:下载量894,666次[^41]
- @koa/multer:下载量839,585次[^42]
- 垃圾邮件扫描程序:145,000次下载[^12]
- 布里:下载量24,270次[^30]
[!NOTE] 我们帮助维护但未创建的其他几个软件包的下载次数甚至更高,包括
form-data
(下载量超过 7.38 亿次),toidentifier
(下载量超过 3.09 亿次),stackframe
(下载量超过 1.16 亿次),以及error-stack-parser
(下载量超过 1.13 亿次)。我们很荣幸能为这些软件包做出贡献,同时尊重原作者的劳动成果。
这些不仅仅是令人印象深刻的数字——它们代表了真正的开发人员用我们帮助维护的代码解决实际问题。每次下载都是这些软件包帮助某人构建有意义的东西的一个例子,从业余爱好者项目到数百万人使用的企业应用程序。
每日大规模影响
每日下载模式显示,使用量持续高涨,峰值达到每日数百万次[^13]。这种一致性表明这些软件包的稳定性和可靠性——开发人员不只是尝试它们;他们将它们集成到核心工作流程中,并日复一日地依赖它们。
每周下载模式显示的数字更加惊人,每周下载量稳定在数千万次左右[^14]。这代表着 JavaScript 生态系统的巨大影响力,这些软件包在全球各地的生产环境中运行。
超越原始数据
虽然下载量本身就令人印象深刻,但它们更深刻地说明了社区对这些软件包的信任。要维护如此规模的软件包,需要坚定不移地致力于:
- 向后兼容性:必须仔细考虑变更以避免破坏现有的实施。
- 安全:由于数百万个应用程序依赖于这些软件包,安全漏洞可能会产生深远的影响。
- 表现:在这种规模下,即使是微小的性能改进也能带来显著的总体效益。
- 文档:清晰、全面的文档对于各个经验水平的开发人员使用的软件包都至关重要。
随着时间的推移,下载量的持续增长反映了我们成功履行了这些承诺,并通过可靠、维护良好的软件包与开发者社区建立了信任。
支持生态系统:我们的开源赞助
[!TIP] 开源可持续性不仅仅涉及贡献代码,还涉及支持维护关键基础设施的开发人员。
除了对 JavaScript 生态系统的直接贡献外,我们还很荣幸能够赞助杰出的 Node.js 贡献者,他们的工作构成了许多现代应用程序的基础。我们的赞助包括:
Andris Reinman:电子邮件基础设施先驱
安德里斯·雷因曼 是 注意邮件,这是 Node.js 最受欢迎的电子邮件发送库,每周下载量超过 1400 万次[^15]。他的工作还涉及其他关键的电子邮件基础设施组件,例如 SMTP 服务器, 邮件解析器, 和 野鸭.
我们的赞助有助于确保这些重要工具的持续维护和开发,这些工具为无数 Node.js 应用程序(包括我们自己的转发电子邮件服务)提供电子邮件通信支持。
Sindre Sorhus:实用程序包策划者
辛德雷·索尔胡斯 是 JavaScript 生态系统中最多产的开源贡献者之一,他名下有超过 1,000 个 npm 软件包。他开发的实用程序包括 p-图, 预重试, 和 是流 是整个 Node.js 生态系统使用的根本构建块。
通过赞助 Sindre 的工作,我们帮助维持这些关键实用程序的开发,使 JavaScript 开发更加高效和可靠。
这些赞助体现了我们对更广泛的开源生态系统的承诺。我们认识到,我们自己的成功是建立在这些和其他贡献者奠定的基础之上的,我们致力于确保整个生态系统的可持续性。
揭示 JavaScript 生态系统中的安全漏洞
我们对开源的承诺不仅限于功能开发,还包括识别和解决可能影响数百万开发人员的安全漏洞。我们对 JavaScript 生态系统的几项最重大贡献都与安全领域有关。
Koa-Router 救援
2019 年 2 月,Nick 发现了流行的 koa-router 软件包维护中的一个关键问题。他 Hacker News 报道,该软件包已被其原始维护者抛弃,留下未解决的安全漏洞,社区也没有任何更新。
[!警告] 存在安全漏洞的废弃软件包对整个生态系统构成重大风险,尤其是当它们每周被下载数百万次时。
作为回应,尼克创建了 @koa/路由器 并帮助向社区通报了这一情况。从那时起,他就一直在维护这个关键软件包,确保 Koa 用户拥有安全、维护良好的路由解决方案。
解决 ReDoS 漏洞
2020 年,Nick 发现并解决了一个关键问题 正则表达式拒绝服务 (ReDoS) 广泛使用的 url-regex
软件包。此漏洞(SNYK-JS-URLREGEX-569472) 可能允许攻击者通过提供特制的输入来导致拒绝服务,从而导致正则表达式中出现灾难性的回溯。
Nick 并没有简单地修补现有的软件包,而是创建了 url-regex-safe
,一个完全重写的实现,解决了漏洞问题,同时保持了与原始 API 的兼容性。他还发表了一篇 综合博客文章 解释该漏洞以及如何缓解它。
这项工作展示了我们的安全方法:不仅要解决问题,还要教育社区并提供强有力的替代方案,以防止将来出现类似问题。
倡导 Node.js 和 Chromium 安全
Nick 还积极倡导在更广泛的生态系统中改进安全性。2020 年 8 月,他发现了 Node.js 中与其 HTTP 标头处理相关的一个重大安全问题,该问题已报告于 登记册.
此问题源于 Chromium 的一个补丁,可能允许攻击者绕过安全措施。Nick 的倡导有助于确保及时解决此问题,从而保护数百万 Node.js 应用程序免受潜在攻击。
保护 npm 基础设施
同月晚些时候,Nick 发现了另一个严重的安全问题,这次是 npm 的电子邮件基础设施。据 登记册例如,npm 未能正确实施 DMARC、SPF 和 DKIM 电子邮件身份验证协议,这可能允许攻击者发送看似来自 npm 的网络钓鱼电子邮件。
Nick 的报告促进了 npm 电子邮件安全态势的改善,保护了依赖 npm 进行包管理的数百万开发人员免受潜在的网络钓鱼攻击。
我们对转发电子邮件生态系统的贡献
Forward Email 建立在多个关键开源项目之上,包括 Nodemailer、WildDuck 和 mailauth。我们的团队为这些项目做出了重大贡献,帮助识别和修复影响电子邮件传递和安全的深层问题。
增强 Nodemailer 的核心功能
注意邮件 是 Node.js 中电子邮件发送的骨干,我们的贡献使其更加健壮:
- SMTP 服务器改进:我们修复了 SMTP 服务器组件中的解析错误、流处理问题和 TLS 配置问题[^16][^17]。
- 邮件解析器增强功能:我们解决了字符序列解码错误,并解决了可能导致电子邮件处理失败的解析器问题[^18][^19]。
这些贡献确保 Nodemailer 仍然是 Node.js 应用程序(包括 Forward Email)中电子邮件处理的可靠基础。
使用 Mailauth 改进电子邮件身份验证
邮箱 提供关键的电子邮件身份验证功能,我们的贡献显著提高了其功能:
- DKIM 验证改进:我们发现并报告了 X/Twitter 的 DNS 缓存问题,导致 DKIM 无法发送出站消息,并在 Hacker One[^20] 上进行了报告。
- DMARC 和 ARC 增强功能:我们已经修复了 DMARC 和 ARC 验证问题,这些问题可能会导致不正确的身份验证结果[^21][^22]。
- 性能优化:我们已经做出了优化,以提高电子邮件身份验证流程的性能[^23][^24][^25][^26]。
这些改进有助于确保电子邮件身份验证的准确可靠,保护用户免受网络钓鱼和欺骗攻击。
关键正常运行时间增强功能
我们对 Upptime 的贡献包括:
- SSL 证书监控:我们添加了监控 SSL 证书过期的功能,防止由于证书过期而导致意外停机[^27]。
- 支持多个短信号码:我们实现了在事件发生时通过短信向多名团队成员发出警报的支持,从而缩短了响应时间[^28]。
- IPv6 检查修复:我们修复了 IPv6 连接检查问题,确保在现代网络环境中进行更准确的监控[^29]。
- 支持暗/亮模式:我们添加了主题支持以改善状态页面的用户体验[^31]。
- 更好的 TCP-Ping 支持:我们增强了 TCP ping 功能,以提供更可靠的连接测试[^32]。
这些改进不仅有利于 Forward Email 的状态监控,而且可供整个 Upptime 用户社区使用,表明我们致力于改进我们所依赖的工具。
将一切粘合在一起的粘合剂:大规模自定义代码
虽然我们的 npm 软件包和对现有项目的贡献很重要,但集成这些组件的自定义代码才是真正展示我们技术专长的。Forward Email 代码库代表了十年的开发努力,可以追溯到 2017 年,当时该项目开始于 免费电子邮件转发 在合并到 monorepo 之前。
巨大的开发努力
这个自定义集成代码的规模令人印象深刻:
- 总捐款:超过 3,217 次提交
- 代码库大小:JavaScript、Pug、CSS 和 JSON 文件中超过 421,545 行代码[^33]
这代表着数千小时的开发工作、调试会话和性能优化。这是将单个软件包转变为每天供数千名客户使用的统一、可靠的服务的“秘诀”。
核心依赖项集成
Forward Email 代码库将众多依赖项集成为一个无缝整体:
- 电子邮件处理:集成Nodemailer用于发送,SMTP Server用于接收,Mailparser用于解析
- 验证:使用 Mailauth 进行 DKIM、SPF、DMARC 和 ARC 验证
- DNS 解析: 利用 Tangerine 实现具有全局缓存功能的 DNS-over-HTTPS
- MX 连接:利用 mx-connect 与 Tangerine 集成,实现可靠的邮件服务器连接
- 作业调度:使用 Bree 通过工作线程进行可靠的后台任务处理
- 模板:使用电子邮件模板在客户沟通中重复使用网站上的样式表
- 电子邮件存储:使用 better-sqlite3-multiple-ciphers 和 ChaCha20-Poly1305 加密实现单独加密的 SQLite 邮箱,以实现量子安全隐私,确保用户之间完全隔离,并且只有用户才能访问自己的邮箱
每种集成都需要仔细考虑极端情况、性能影响和安全问题。最终结果是,系统可以可靠地处理数百万封电子邮件交易。我们的 SQLite 实现还利用 msgpackr 进行高效的二进制序列化,并利用 WebSockets(通过 ws)在我们的基础设施中实时更新状态。
使用 Tangerine 和 mx-connect 的 DNS 基础设施
Forward Email 基础设施的一个关键组件是我们的 DNS 解析系统,它围绕两个关键包构建:
-
柑橘:我们的 Node.js DNS-over-HTTPS 实现为标准 DNS 解析器提供了直接替代方案,具有内置重试、超时、智能服务器轮换和缓存支持。
-
MX-连接:此软件包建立与 MX 服务器的 TCP 连接,获取目标域或电子邮件地址,解析适当的 MX 服务器,并按优先级顺序连接到它们。
我们已通过以下方式将 Tangerine 与 mx-connect 集成 拉取请求 #4确保整个转发电子邮件过程中 HTTP 请求上的应用层 DNS。这为 DNS 提供了大规模全局缓存,在任何区域、应用程序或流程中都具有 1:1 的一致性——这对于分布式系统中可靠的电子邮件传递至关重要。
企业影响:从开源到关键任务解决方案
我们在开源开发领域长达十年的历程使得 Forward Email 不仅可以为个人开发者提供服务,还可以为构成开源运动支柱的主要企业和教育机构提供服务。
关键任务电子邮件基础设施案例研究
我们致力于可靠性、隐私和开源原则,这使得 Forward Email 成为对电子邮件有严格要求的组织的可信赖选择:
-
教育机构:正如我们 校友电子邮件转发案例研究,各大大学依靠我们的基础设施通过可靠的电子邮件转发服务与数十万校友保持终身联系。
-
企业 Linux 解决方案: 这 Canonical Ubuntu 电子邮件企业案例研究 展示了我们的开源方法如何完美地满足企业 Linux 提供商的需求,并为他们提供所需的透明度和控制力。
-
开源基金会:也许最能证明我们与 Linux 基金会的合作,正如 Linux 基金会电子邮件企业案例研究,我们的服务为负责 Linux 开发的组织提供通信支持。
多年来,我们精心维护的开源软件包使我们能够构建电子邮件服务,现在该服务支持支持开源软件的社区和组织,这其中存在着一种美妙的对称性。从贡献单个软件包到为开源领导者提供企业级电子邮件基础架构,这一完整的历程代表了我们软件开发方法的最终验证。
开源十年:展望未来
当我们回顾过去十年的开源贡献并展望未来十年时,我们对支持我们工作的社区充满感激,并对未来充满兴奋。
我们从个人软件包贡献者成长为大型企业和开源基金会使用的综合电子邮件基础设施的维护者,这一历程令人瞩目。这证明了开源开发的力量,以及精心维护的软件对更广泛的生态系统的影响。
在未来的几年里,我们致力于:
- 继续维护和改进我们现有的套餐,确保它们仍然是全球开发人员值得信赖的工具。
- 扩大对关键基础设施项目的贡献,特别是在电子邮件和安全领域。
- 增强转发电子邮件的功能 同时保持我们对隐私、安全和透明度的承诺。
- 支持下一代开源贡献者 通过指导、赞助和社区参与。
我们相信软件开发的未来是开放的、协作的,并且建立在信任的基础上。通过继续为 JavaScript 生态系统贡献高质量、注重安全的软件包,我们希望为构建这样的未来尽一份力。
感谢所有使用我们的软件包、为我们的项目做出贡献、报告问题或只是宣传我们工作成果的人。你们的支持使这十年的影响力成为可能,我们很高兴看到我们在未来十年能够共同取得的成就。
[^1]: 2025 年 4 月 cabin 的 npm 下载统计信息 [^2]: 2025 年 2 月至 3 月 bson-objectid 的 npm 下载统计信息 [^3]: 2025 年 4 月 url-regex-safe 的 npm 下载统计信息 [^4]: 截至 2025 年 4 月 forwardemail/forwardemail.net 的 GitHub 星数 [^5]: 2025 年 4 月 preview-email 的 npm 下载统计信息 [^7]: 2025 年 2 月至 3 月 superagent 的 npm 下载统计信息 [^8]: 2025 年 2 月至 3 月 supertest 的 npm 下载统计信息 [^9]: 2025 年 2 月至 3 月 preview-email 的 npm 下载统计信息 [^10]: 2025 年 2 月至 3 月 cabin 的 npm 下载统计信息 [^11]: 2 月至 3 月 url-regex-safe 的 npm 下载统计信息2025 [^12]: spamscanner 的 npm 下载统计数据,2025 年 2 月至 3 月 [^13]: npm 统计数据中的每日下载模式,2025 年 4 月 [^14]: npm 统计数据中的每周下载模式,2025 年 4 月 [^15]: nodemailer 的 npm 下载统计数据,2025 年 4 月 [^16]: https://github.com/nodemailer/smtp-server/issues/155 [^17]: https://github.com/nodemailer/smtp-server/issues/node-v12-requires-tls-min [^18]: https://github.com/nodemailer/mailparser/issues/261 [^19]: https://github.com/nodemailer/nodemailer/issues/1102 [^20]: https://github.com/postalsys/mailauth/issues/30 [^21]: https://github.com/postalsys/mailauth/issues/58 [^22]: https://github.com/postalsys/mailauth/issues/48 [^23]: https://github.com/postalsys/mailauth/issues/74 [^24]: https://github.com/postalsys/mailauth/issues/75 [^25]: https://github.com/postalsys/mailauth/issues/60 [^26]: https://github.com/postalsys/mailauth/issues/73 [^27]:基于 Upptime 仓库中的 GitHub 问题 [^28]:基于 Upptime 仓库中的 GitHub 问题 [^29]:基于 Upptime 仓库中的 GitHub 问题 [^30]:2025 年 2 月至 3 月 bree 的 npm 下载统计 [^31]:基于 Upptime 的 GitHub 拉取请求 [^32]:基于 Upptime 的 GitHub 拉取请求 [^34]:2025 年 2 月至 3 月 koa 的 npm 下载统计 [^35]:2025 年 2 月至 3 月 @koa/router 的 npm 下载统计 [^36]:2025 年 2 月至 3 月 koa-router 的 npm 下载统计 [^37]:2025 年 2 月至 3 月 url-regex 的 npm 下载统计 [^38]: @breejs/later,2025 年 2 月至 3 月 [^39]:2025 年 2 月至 3 月,email-templates 的 npm 下载统计数据 [^40]:2025 年 2 月至 3 月,get-paths 的 npm 下载统计数据 [^41]:2025 年 2 月至 3 月,dotenv-parse-variables 的 npm 下载统计数据 [^42]:2025 年 2 月至 3 月,@koa/multer 的 npm 下载统计数据