JavaScript 的美好未来不会实现

凭借雄厚资金支持(需知npm母公司GitHub隶属微软,市值高达3万亿美元),它将开发并推出新一代JavaScript包管理方案

 💬 22 条评论 |  javascript/NPM | 

在经历了史上最大规模的供应链攻击之后,JavaScript社区本应迎来反思时刻,并作出决断:绝不再犯。当恐慌与羞愧逐渐平息,被入侵的开发者完成工作站重置与密钥轮换后,整个生态系统或许会重新聚焦于解决导致此次事件的根本缺陷。

毕竟多年来人们一直在敲响警钟,指出这种依赖管理方式鲁莽至极危险的设计缺陷。或许此刻正是JavaScript生态系统开始认识到该问题的重要性和紧迫性,并着手修正方向的转折点。它可以摒弃那些充斥着微型库的庞杂依赖树,建立基于信任关系的软件分发体系,并吸纳更严谨的依赖管理系统数十年来积累的研究成果与创新实践。

或许谷歌和Mozilla——这两家在JavaScript标准制定与实现领域占据领导地位的公司——将着手开发真正的JavaScript标准库,让left-pad这类微依赖成为历史。此举可与整合工作相结合,将微型库合并为功能更完整、范围更统一的大型包,进而精简各自的依赖关系树。

元素周期表

这或许是npm正视其缺陷设计的关键时刻。凭借雄厚资金支持(需知npm母公司GitHub隶属微软,市值高达3万亿美元),它将开发并推出新一代JavaScript包管理方案。新方案可借鉴Linux发行版经实践验证的成熟机制——通过解耦开发与打包分发流程,设立包维护者负责整合分发精选的软件库集合。引入可执行代码包的通用签名机制、小型化信任链、可复现构建流程,以及负责任的包管理器普遍采用的其他直观技术。

或许其他依赖于这种缺陷依赖管理模型的语言——如Cargo、PyPI、RubyGems等——正在关注此次事件,并意识到同样的危机正笼罩在它们的未来。或许在不可避免的危机降临之前,它们也会改变方向。

试想,倘若其他依赖并从这堆草率构建的庞大软件中获利的大型企业,能投入资金和资源来解决这些问题——让工程师们着手修复漏洞,联合制定并实施新标准,直接资助相关项目,并通过NLNet等机构分配资金——那么我们将迎来一个负责任、可持续且安全的软件开发时代。

这本是美好的未来图景,却非我们即将面对的现实。未来只会延续现状。我们只会看到象征性举措——强制双因素认证将在更多平台推行,巨头们也会在营销预算中以“开源安全与韧性”之名拨出微薄捐款。

无人会吸取教训。数十年来循环往复,至今无人从中获得启示。这正是当代软件开发领域最致命的傲慢。

本文文字及图片出自 A better future for JavaScript that won't happen

共有 22 条讨论

  1. > 或许谷歌和Mozilla——这两家在JavaScript标准制定与实现领域占据领导地位的公司——将着手开发真正的JavaScript标准库,让left-pad这类微依赖成为历史。

    这种观点虽不无道理,但已显陈旧过时。近十年来,left-pad的功能早已成为所有浏览器和运行时的标准配置。许多其他微型包同样已被淘汰,当前的主流趋势是避免发布或使用任何形式的微型包。

    “零依赖”如今已成为前端领域的顶级营销术语。遗憾的是,消除依赖的过程仍在持续,彻底清除生态系统中的这类包已耗费过多时间。但这并非因为JavaScript社区从未关注过此问题。“扩充JS标准功能,弃用is-number”并非新颖见解或宝贵洞察。

    更关键的是,大量非微型包同样受到波及。继续纠缠这个老生常谈或许有趣,却偏离了核心议题。

    1. 这项努力还受到少数不良行为者的阻挠。

      典型案例:某位极具影响力的个人垄断项目所有权,并将自己的库作为依赖项强制纳入。后来发现他存在增加这些库下载量的经济利益:[https://github.com/A11yance/axobject-query/pull/354](https://github.com/A11yance/axobject-query/pull/354)

  2. 我所在的组织已有人提议开始使用大型语言模型从零构建完整的 NIH 技术栈。老板,我累了。

    1. > 我所在的组织已有人提议开始使用大型语言模型从零构建完整的 NIH 技术栈。老板,我累了。

      当DeepSeek开始检测代码是否被用于$enemy_of_state_org组织,进而生成暗藏后门或漏洞的代码时,一切就不再是儿戏了。

      1. 听起来很合理——它已经完成了一半。

  3. 事件发生后就看到这些抱怨。可没人给出具体方案,全是“改进包管理”这种空泛说辞。这算什么?我们早就有强制双因素认证和私有npm注册库了。

    生态系统脆弱的根本原因在于大量包由单人开发者维护。只需一次入侵就能波及海量代码库。

    我能想到的唯一预防方案是:当任何依赖项或子依赖项(其本身就是复杂的依赖树)更新时,对每个npm包进行自动化LLM扫描。

    1. > _却无人提出具体方案._

      文章中其实列举了大量具体建议:

      “通过为可执行代码包引入通用签名、更小的信道和信任网络、可重复构建,以及负责任的包管理器采用的其他诸多简单明了的技术。”

      不过我与作者同样悲观,认为这些建议不会被采纳。

  4. 哦,又是老生常谈。“照着发行版的做法做就行”。

    好吧,那就来算算账。

    Debian约有1000名志愿者维护2万个软件包,假设比例为20:1。

    仅npm生态(不计其他平台)就拥有300万个软件包。

    这意味着需要15万名志愿者——不计原始作者,光是无偿参与的个人就需15万。

    这还只是一个仓库。

    “胡说八道!”你反驳道,“其中真正有价值的包顶多十万个!”

    好,那就“只需”五千名志愿者。Debian顶多只有千人规模,却可能是史上最常用软件的发源地。但没问题,我们肯定能找到五千名愿意免费工作的合格人才。

    哦,但如何筛选这十万个包?好吧,用下载量?引用次数?网络中心度?好极了。但部分包将被驱逐出这个严谨打包的天堂。替代品呢?糟了,我们得让人手翻查三百万个包才能找出值得保留的。

    我需要发行版推动者明白的是:大型C库的包管理器生态圈规模至少比其他领域小两个数量级,若将所有最大仓库合并计算,差距甚至接近三个数量级。语言生态系统的运作逻辑截然不同。对着云端咆哮“这本该轻而易举”根本无济于事。

    1. 开源社区中真正值得关注的库与框架大概只有5000个,其组织架构类似Eclipse基金会或Apache。其余要么是垃圾项目,要么是风险低的小型个人维护项目,要么就是企业雇员维护的专属资产。

    2. _> 哦,又是老生常谈。“照着发行版的做法做就行”…但语言生态系统的运作逻辑根本不同。

      规模失控的根源或许在于缺乏完善的包检测与维护机制——而那些令人厌烦的老生常谈恰恰提供了这些功能。

      完善的包管理机制能实现双赢:包数量减少,质量提升。

      能否一次性改造所有包?不能。只需为那些愿意迁移到新流程的作者或维护者打上质量标记。其余则标注警告——“该软件包未通过质量检测”。搞定!

    1. 我本想说自己在Deno上开发应用,这些应用独立于npm生态系统之外——但问题在于如今Deno已支持npm依赖,因此存在风险:供应链中若有成员使用npm,某个依赖就会突然再次暴露。

      我坚持使用Deno标准库,因为它自成体系。

  5. > 或许JavaScript标准与实现领域的领导者谷歌和Mozilla,将着手开发真正的JavaScript标准库,让left-pad这类微依赖成为历史。这可与整合工作相结合:将微型库合并为范围更统一、目的更整体的大型包,进而精简其依赖树。

    这简直是我能想象到的最大程度的稻草人论证。这两种“不可能实现的解决方案”其实早已存在:

    – ECMAScript标准已将`Strong.padStart()`定义为JavaScript“真正”标准库的一部分[1]

    – 事实上已存在广为人知的lodash库[2],正是将此类微工具整合为一体的典型

    > 人们永远不会吸取教训。这种现象持续数十年,至今无人从中获得启示。这正是当代软件开发领域最典型的傲慢症结。

    作者似乎纯粹出于憎恶心理而刻意贬低整个生态系统。

    [1] [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe…](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart)

    [2] [https://lodash.com/](https://lodash.com/)

    1. 没错,现在到了这样一个地步:那些声称left-pad未修复的人,反而更像是没在认真关注问题的表现。我基本不再纠正这类言论了,因为很明显存在相当一部分群体,他们就是喜欢对JS挑刺,不愿现实打破他们的幻想。

    2. 作者显然不是在说left-pad库至今仍是特定问题。他将其作为仍在发生的问题的_范例_提出。随后他指出:或许我们本应减少封装式JS代码的使用,更多软件解决方案本应(且理应始终)作为标准库或Lodash这类维护良好的包存在(尽管他未点名提及,仅阐述其体现的概念)。你似乎是只见树木不见森林了。

    1. yarn 功能更新:实现 npmMinimumReleaseAge 和 npmMinimumReleaseAgeExclude 配置选项[https://github.com/yarnpkg/berry/pull/6901](https://github.com/yarnpkg/berry/pull/6901)

      情况不太理想。若需紧急部署安全补丁,必须完全豁免该软件包的最低版本要求,无法仅允许特定版本。

    2. 根本上,解决方案并非技术层面的,而是社会/结构层面的。

      企业要么对所用依赖项的签名负责,要么要求仓库对依赖项签名负责,要么继续维持现状。

      第三种方案摊销成本最低。

  6. > 没人会吸取教训。这种情况持续数十年,至今无人从中获得启示。这正是本世代[X]的典型傲慢。

    [X]

    “软件开发”

    “气候变化”

    “医疗改革”

    “政治极化”…

    1. > 作者似乎纯粹为了憎恨而憎恨[X]。

      [X]

      “生态系统”

      “国家”

      “政党”…

  7. 当包管理器配备能自动扫描更新的人工智能——它们识别恶意代码的能力远超人类——问题不就很快解决了?

    1. 不确定是否讽刺,但这主意糟透了。乐观情况是它会降低人类警惕性,让恶意代码攻击的成功率变成掷骰子。更可能的是,那些专门欺骗大型语言模型的混淆技术将为恶意代码打开闸门。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

你也许感兴趣的: