写点什么

两行代码险些搞垮 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:304397
用户头像
李俊辰 InfoQ编辑

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

关注

评论 2 条评论

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

聚力共赢:超聚变联合枫清科技,构建“算力底座+知识中台”企业智能化新引擎

Fabarta

人工智能 #大模型

如何成功防护T级超大流量的DDoS攻击

网络安全服务

CDN 服务器 DDoS 高防服务器 高防IP

AI电视里的达摩

脑极体

AI

百度文小言全面接入文心4.5Turbo、X1Turbo,进一步增强多模态能力

极客天地

成事:程序员最硬的通货,产品经理最好的PRD

AI时代的一滴水

程序员 成长

Rime 最新 TTS 模型 Arcana:能听到呼吸声和轻微口腔音;Bubba AI:专为卡车司机打造的语音交互智能体丨日报

声网

YashanDB 知识库|如何回收表空间?高水位线是关键!

数据库砖家

数据库·

运维实战来了|手把手教你构建 YashanDB 的 Prometheus Exporter

数据库砖家

数据库·

分布式高性能Java架构设计:高可用+低延迟+弹性扩展的架构范式与生产级方案及Java架构:核心原理与案例实战!

程序员高级码农

Java Java 面试 高性能

YashanDB 知识库|跨库访问不求人!手把手教你用 DBLink 玩转多库联动

数据库砖家

数据库、

YashanDB 知识库|主备延迟怎么查?一文教你搞懂根源在哪

数据库砖家

数据库

如何鉴别全彩LED显示屏的品质等级

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家 户内led显示屏

抖音集团电商流量实时数仓建设实践

Apache Flink

大数据 flink 实时计算 实时数仓

YashanDB 知识库|共享集群换 IP 怎么操作?这篇教你全流程无坑换网段!

数据库砖家

数据库·

YashanDB |自研 YFS,为共享集群打造专属“高性能存储引擎”

数据库砖家

数据库

匠心打造超级 ping,多运营商多协议全方位测试,sir.net 正式上线!

timerring

测试 网站 IP

百度搜索AI开放计划:助力开发者通过MCP Server连接用户和应用

猫头虎

AI MCP 百度搜索开放平台 百度AI开放计划 mcpserver

Semantic Kernel也能充当MCP Client

为自己带盐

semantic kernel MCP

怎么在线制作数据看板?3个看板软件大盘点!

职场工具箱

项目管理 职场 数据看板 看板软件 在线看板工具软件

基于华为开发者空间定制C/C++开发环境镜像

华为云开发者联盟

,华为云 华为开发者空间

观测云数据在Grafana展示的最佳实践

观测云

Grafana

YashanDB 知识库|YMP 迁移报告无法下载?可能是你的 Java 版本“太新了”

数据库砖家

百度慧播星打造高说服力数字人,具备四大能力

极客天地

4.29 时序分析与模型直播详解,从功能到应用的全面科普!

Apache IoTDB

YashanDB 知识库|数据库明明在线,yasboot 却显示“off”?其实是启动方式不对

数据库砖家

数据库·

YashanDB 知识库|数据误删别慌!一文教你搞定“表闪回”

数据库砖家

数据库·

YashanDB 知识库|YMP 报 YAS-04204 创建索引失败?可能是你配置超了并发上限

数据库砖家

数据库·

Arthas classloader (查看 classloader 的继承树,urls,类加载信息)

刘大猫

ClassLoader Arthas 大模型 类加载信息 继承树

视频丨Google 最新 AI 眼镜原型曝光:轻量 XR+情境感知 AI 打造下一代计算平台

声网

深入解析淘宝商品详情 API 接口:功能、使用与实践指南

tbapi

淘宝API 淘宝商品详情API接口 淘宝商品数据采集 天猫商品详情API接口

英特尔2025年Q1营收127亿美元,数据中心与AI业务可圈可点

E科讯

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