写点什么

两行代码险些搞垮 JavaScript 生态,受影响项目超百万

  • 2020-04-29
  • 本文字数:1282 字

    阅读完需:约 4 分钟

两行代码险些搞垮 JavaScript 生态,受影响项目超百万

4 月 25 日,一个名为 is-promise 的 npm 库进行了更新并发布了 v2.2.0 版本,没想到这一次更新却使 JavaScript 生态陷入危机,据媒体报道,目前已有数百万个项目受到了影响,而事件的始作俑者竟是一个仅仅“单行”的 JavaScript 库。

事件回顾

is-promise 库主要用来测试 JavaScript 对象是否为“Promise”,并在开发时使用该函数返回布尔值 yes 或 no,开发者可以通过 one-liner 调用并在自己的项目中使用这个库。4 月 25 日,is-promise 正常进行更新,发布了 is-promise v2.2.0,但由于该版本并未遵循正确的 ES 模块标准,从而导致更新完成后,由于不正确的 ES 模块标准,所有在构建时使用 is-promise 库的项目几乎全部发生故障。虽然这一错误不会使现有项目崩溃,但它却对开发者编译自己项目的新版本造成了影响。


来看一下“肇事者”:


declare function isPromise<T, S>(obj: Promise<T> | S): obj is Promise<T>;export default isPromise;
复制代码


虽然这个问题立即就被发现了,但仍影响到了一些 JavaScript 生态系统中的“大项目”,其中包括 Facebook 的 Create App,三大框架之一的 Angular,Google 的 Firebase 工具,亚马逊的 AWS Serverless CLI,Nuxt.js,AVA 等等。很多开发者都表示受到了影响:


https://github.com/then/is-promise/issues/13


GitHub 上显示,与该库有依赖关系的项目超过 340 万个。



该团队在第一时间发布了 is-promise v2.2.1 更新,但是并未能解决问题,最终在几个小时后发布的 is-promise v2.2.2 中修正了 ES 模块支持的问题,这一“紧急事件”才落下帷幕。

并非第一起事故

仅仅两行代码就造成了这么大的影响,实际上这并不是第一次发生。早在 2016 年 3 月,一个名为 left-pad 且仅有 17 行代码的 npm 库也曾引发过一起事故,起因是这个库的作者创建了一个 npm 模块并命名为 kik,这个名字与当时的一个聊天软件 Kik 如出一辙,所以 Kik 的负责人找到该作者并希望他换一个名字,结果双方并没有谈妥,该作者一气之下突然决定取消发布所有的库,导致无数项目出现事故。


与 2016 年一样,“is-promise 事件”引发了一众开发者的疑问:是否需要在 JavaScript 生态中提供 one-liner 库?JavaScript 模块化究竟是否必需?

JavaScript 模块化

一部分开发者认为,当开发人员创建这种只有几行代码的库时,模块化实在是过于繁琐;而另一部分开发者则认为,模块化十分有必要,某一个任务可以在其对应的模块内统一管理,而不是让开发者以不同的方式在自己的项目中处理。


对于一个复杂的 Web 应用来说,模块化编程显然是一个更具优势的选择,很多 JavaScript 库都是这样实现的。在 ES6 之前,很多前端社区曾自己钻研模块化开发,经历了 AMD/CMD/UMD 等阶段,这里不过多赘述。ES6 中首次引入模块化开发规范,让 Javascript 首次支持原生模块化开发,从此,JavaScript 模块化被越来越多的开发者接受。


JavaScript 模块化也说明了 Web 的能力在不断增强,Web 应用日趋复杂。相信未来 JavaScript 的能力会继续提升,前端开发者们的开发效率也会更加高效。

延伸阅读

https://www.zdnet.com/article/another-one-line-npm-package-breaks-the-javascript-ecosystem/


2020-04-29 11:304305
用户头像
李俊辰 InfoQ编辑

发布了 228 篇内容, 共 85.4 次阅读, 收获喜欢 274 次。

关注

评论 2 条评论

发布
用户头像
看不懂 这不是ts的声明文件写法么?问题是啥?
2020-05-03 16:28
回复
用户头像
两行的话,还是放项目内吧,何必呢。依赖越多,越脆弱
2020-04-29 16:41
回复
没有更多了
发现更多内容

链游冷启动核弹:DeFi清算收益+社交裂变,7天零成本获取10万真实玩家

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

AI 大模型+智能客服:自动识别客户意图,实现高效沟通

阿里巴巴云原生

阿里云 云原生 函数计算

文献解读-SARS-CoV-2 variant Delta rapidly displaced variant Alpha in the United States and led to higher viral loads

INSVAST

生信服务 delta 变异检测 全基因组测序 基因分析

从零到一:如何用 AI 工具一天内完成 Java 项目搭建?

飞算JavaAI开发助手

三星Neo QLED再次进化:高端电视还能怎么玩?

Alter

APISIX 可观测性最佳实践

观测云

APISIX

YashanDB故障状态

YashanDB

数据库 yashandb

火山引擎云上实战: DeepSeek R1 大模型(全尺寸)

火山引擎开发者社区

🔥 新手也能懂!Shopee商品详情API接口全攻略

Noah

和鲸科技执行总裁殷自强受邀主讲华中附属同济医院大模型应用通识首期课程

ModelWhale

人工智能 大数据 医疗

什么是权威解析服务器?权威解析服务器有什么用?(国科云)

国科云

运维的价值为何经常被挑战?哪些工作更有价值?

巴辉特

运维 SRE

中物院超级计算与数字智能2025年大会:嘉为蓝鲸揭秘数智化运维转型关键突破点

嘉为蓝鲸

智能运维 数智化

摊牌了!一文教会你轻松上手豆包MarsCode 编程助手!

火山引擎开发者社区

交易所开发:数字文明进化的基础设施革命

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 交易所开发代币开发

黑龙江省多家政务服务移动端及政企内部办公应用适配鸿蒙,加速智慧政务升级

最新动态

实战案例|利用MarsCode内置的DeepSeek服务,单元测试耗时缩短70%!

火山引擎开发者社区

Bypass Paywalls Clean 被封禁背后的新闻业困局

TechubNews

区块链 新闻 web3

如何通过CAD坐标找点?

在路上

cad cad看图 CAD看图王

CAD中镜像功能真好用,大大提高绘图效率!

在路上

cad cad看图 CAD看图王

技术赋能与创新实践:基于低代码平台的高性能应用开发

JeeLowCode低代码平台

低代码 低代码开发 低代码平台 低代码, 低代码选择

从 Copilot 到垂直工具:AI 编程的 "专精特新" 进化论

飞算JavaAI开发助手

DApp开发中的LP分红系统:流动性激励机制的范式革命与生态重构

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

ITSM运营双引擎:科学度量指标体系×LLM智能分析实战

嘉为蓝鲸

运维 AIOPS ITSM

数仓架构告别「补丁」时代!全新批流一体 Domino 架构终结“批流缝合”

YMatrix 超融合数据库

数据仓库 数据架构 流式数仓 超融合数据库 YMatrix

Java 开发者必备:2025 年 AI 工具推荐

飞算JavaAI开发助手

为什么大厂团队禁用代码片段工具?完整生成工具的 4 大不可替代性

飞算JavaAI开发助手

运维生态重构进行时:从嘉为蓝鲸全栈智能观测中心V4.4看全栈观测的AI化跃迁路径

嘉为蓝鲸

智能运维 产品发布 全栈智能观测中心

运维人的AI外挂来了!WeOpsV4.20&V5.20深度集成三大模型实现知识沉淀

嘉为蓝鲸

自动化运维 #WeOps

嘉为蓝鲸自动化运维中心V2.6:规范运维范式,保障数字化转型成果

嘉为蓝鲸

AIOPS 自动化运维

从加班到准点走:程序员用飞算 JavaAI 实现需求交付效率翻倍

飞算JavaAI开发助手

两行代码险些搞垮 JavaScript 生态,受影响项目超百万_大前端_李俊辰_InfoQ精选文章