写点什么

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

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

关注

评论 2 条评论

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

一键自动化博客发布工具,用过的人都说好(简书篇)

程序那些事

程序那些事 工具技巧

Advanced RAG 05:探讨基于文本内在语义信息的数据分块方法

Baihai IDP

人工智能 程序员 AI rag 检索增强生成

「软件测试面试题集解析课」限时优惠,助你高效备战,一举拿下心仪职位

霍格沃兹测试开发学社

国内独家|阿里云瑶池发布ClickHouse企业版:云原生Serverless新体验

阿里云瑶池数据库

数据库 云计算 阿里云 Clickhouse

想开发一款带有视频通话/共享屏幕功能的产品?那WebRTC是你必须要知道的!

编程的平行世界

WebRTC

春耕司法护农时,阳光便捷驻田间!

天翼云开发者社区

云计算 云服务 云电脑

模型量化与量化在LLM中的应用 | 得物技术

得物技术

算法 性能优化 AIGC LLM 企业号 4 月 PK 榜

万界星空科技MES系统中的业务过程管理流程

万界星空科技

生产管理系统 mes 车间管理

电商新篇章:深入解析亚马逊国际关键字搜索商品API返回值

技术冰糖葫芦

API Explorer API boy api 货币化 pinduoduo API

三项国际人工智能顶会大奖!拿下!

天翼云开发者社区

人工智能 云计算 天翼云

双栈网络使用什么技术实现总部网络能访问分部网络?

天翼云开发者社区

云计算 安全 网络 ipv6

「软件测试面试题解析」限时优惠,助你高效备战,拿下心仪职位

测试人

软件测试

MES管理系统在人工智能方面的应用

万界星空科技

人工智能 智能工厂 mes 万界星空科技

【Android】Binder的Oneway拦截

iofomo

android 源码剖析 拦截器 binder

软件测试学习笔记丨Bug处理流程

测试人

软件测试

穿越周期,天翼云IaaS+PaaS全年市场份额跃居中国公有云市场第三!

新消费日报

Linux设备驱动系列(八)——ioctl系统调用

Linux内核拾遗

Linux Kenel 内核开发 设备驱动

Linux Bridge和Tap关系详解

天翼云开发者社区

云计算 Linux bridge

杭州悦数与伟仕佳杰达成战略合作,共绘图数据库市场新蓝图

悦数图数据库

图数据库 知识图

碳课堂|快速了解标准要点:ISO 14064-1

AMT企源

碳中和 碳达峰 碳管理

Altair 宣布收购 Cambridge Semantics,为新一代企业Data Fabric和生成式 AI 赋能

新消费日报

Baidu Comate:“AI +”让软件研发更高效更安全

百度安全

记录工作以来遇到的最离谱的一个Bug

京东零售技术

Java 后端 企业号 4 月 PK 榜

首届超算互联网峰会!天翼云弹性高性能计算E-HPC亮相!

天翼云开发者社区

云计算 高性能计算 互联网峰会

一本书了解AI的下一个风口:AI Agent

博文视点Broadview

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