写点什么

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

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

关注

评论 2 条评论

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

12 张图 | 深入理解 Eureka三层缓存架构

悟空聊架构

缓存 Eureka 28天写作 悟空聊架构 12月日更

模块1作业

miliving

Flutter 动画【Flutter专题16】

坚果

flutter 28天写作 签约计划第二季 12月日更

从微服务架构的现状和未来看学习路径

博文视点Broadview

使用javap深入理解Java整型常量和整型变量的区别

汪子熙

Java jdk 28天写作 12月日更 javap

大厂算法面试之leetcode精讲23.并查集

全栈潇晨

算法 LeetCode

【LeetCode】截断句子Java题解

Albert

算法 LeetCode 12月日更

使用 javap 分析 Java 的字符串操作

汪子熙

Java jdk 28天写作 12月日更 javac

喜报 | 旺链科技获批张江国家自主创新示范区专项发展资金!

旺链科技

区块链 数字经济 产业区块链

【量化】资产组合理论:鸡蛋不能放在一个篮子里

恒生LIGHT云社区

量化投资 量化

对话中国人寿:DevOps实践经验分享

龙智—DevSecOps解决方案

DevOps 中国人寿

模块一学习总结

whoami

「架构实战营」

聊聊 Kafka: 在 Linux 环境上搭建 Kafka

老周聊架构

签约计划第二季 2月月更

全网最全-混合精度训练原理

科技热闻

拖延

Nydia

说说节奏感

Justin

方法论 28天写作

react源码解析18事件系统

buchila11

React React Hooks

Go语言学习查缺补漏ing Day4

恒生LIGHT云社区

编程语言 Go 语言

Prometheus Exporter (十九)Collectd Exporter

耳东@Erdong

Prometheus 28天写作 exporter 12月日更 Collectd

Flutter开发:TextField常用属性的使用

三掌柜

28天写作 12月日更

Git进阶(十一):Git 常用操作汇总

No Silver Bullet

git 12月日更

学python,怎么能不学习scrapy呢,这篇博客带你学会它

梦想橡皮擦

12月日更

有了六顶思考帽,从此告别无效争吵

Ian哥

项目管理 28天写作 项目管理工具 六顶思考帽

团队基建系列 - 组织知识传承 1

搬砖的周狮傅

团队成长

大厂算法面试之leetcode精讲24.其他类型题

全栈潇晨

算法 LeetCode

react源码解析17.context

buchila11

React React Hooks

【HarmonyOS 专题】01 基础 Mac 环境安装配置

阿策小和尚

HarmonyOS 28天写作 Android 小菜鸟 12月日更

Linux云计算架构师:Linux全套实战学习资料

侠盗安全

Linux linux运维 运维工程师 云计算架构师 linux电子书

MySQL 连接数过多的处理方法合集 - ERROR 1040 Too many connections - 卡拉云

蒋川

MySQL MySQL 数据库

Prometheus Exporter (十八)Graphite Exporter

耳东@Erdong

Prometheus 28天写作 exporter 12月日更 Graphite

网络协议之:基于UDP的高速数据传输协议UDT

程序那些事

TCP 网络协议 udp 程序那些事 12月日更

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