『JavaScript』两行代码的库引发“血案”:坑了数百万个项目( 二 )
其中包括有:Facebook 的 Create React App(用于创建 React 应用程序的标准模板)、谷歌的 Angular.js 框架、谷歌的 Firebasse-tools、亚马逊的 AWS Serverless CLI、Nuxt.js 和 AVA 等 。
【『JavaScript』两行代码的库引发“血案”:坑了数百万个项目】
本文插图
引发问题的ES 模块标准
is-promise 库之所以引发问题 , 关键在于没有遵循正确的ES模块标准 , 而提到ES模块标准(EMS) , 我们还要从最基本的概念聊起 。 我们知道JavaScript是一门动态的脚本化语言 , 它让前端页面的开发变得非常简单 。
JavaScript的编程范式抽象成维护变量、赋值和计算操作 。 大量的代码用于操作变量 , 开发者需要懂得如何去组织和维护这些变量 。 JavaScript 提供了一种方式 , 即函数作用域 。
在一个函数内只需要考虑这个函数的变量问题 , 不必去担心其他函数会操作这些变量 。
随之带来的问题是变量无法共享 , 无法在不同的函数之间相互共享变量 。 如果想要在作用域外共享变量 , 只能通过外层作用域 , 或者全局作用域 。
ES模块标准是提供了更好的方式来组织变量和函数 , 把相关的变量和函数组织到一起 。 具体就是将这些函数和变量放到一个模块作用域内 , 实现在模块间共享变量 。 与函数作用域不同的是 , 模块内部的变量实现了在其他模块内共享 。
还可指定哪些变量、类或者函数可以共享 。 在其他模块中共享 , 被称为 export 。 这就出现了模块间的依赖 , 这是一种很明确的关系 , 当移除一个模块时可以准确地知道哪些模块会出错 。 一旦有了模块间导出和引用变量的能力 , 我们就可以将代码打成小包 。 然后就可以像乐高玩具那样组合 , 再组合 。 使用小模块就可以创建出各类应用 。 在使用模块的时候 , 其实就是在做一个依赖关系图 。 ESM的模块包括三个过程:
1、构建:下载 , 解析 , 然后把文件解析为模块记录;
2、实例化:为模块分内存空间(此时还没赋值) , 然后依照导入 , 导出语句把模块指向内存地址 , 这个过程叫链接;
3、运行(求值):运行代码的时候 , 才会给内存空间填充真实的值 。
EMS则通过一系列的标准来确保相关代码可以实现上述模块化的功能 。
is-promise v.2.2.0 版本却未遵循正确的 ES 模块标准 。 因此在其更新发布后 , 引用了is-promise在各个项目都在的构建链时出现了问题 。
总结一下本文内容 , Promise是Javascript中实现异步功能的重要机制 , is-promise又是目前流行度最高的promise对象检测工具 , 而由于is-promise没有遵循正确的ES模块标准 , 使得其它引用了is-promise包的程序出现了问题 。
最后引用司徒正美老师在《前端开发 20 年变迁史》的话来做结束:“当初JavaScript被误解为最糟糕的语言 , 时至今日它是最流行的语言 , GitHub 60%的项目都是与JavaScript有关……任何可以使用JavaScript来编写的应用 , 最终会由JavaScript编写 。 ”
愿前端开发之路越来越好!
npm地址:https://www.npmjs.com/package/p-is-promise
Github地址:https://github.com/sindresorhus/p-is-promise
本文插图
本文插图
?当互联网码农遇见国企老同学
?一个月面试近 20 家 , 拿下阿里 Offer!
?华为海思超越高通 , 一季度国内占有率第一;苹果 iOS 13.5 优化 Face ID;Ruby 2.4 结束支持 | 极客头条
- 青铜财识605代码首次使用,5月11日新股申购;威奥股份
- 威奥股份5月11日新股申购;威奥股份 605代码首次使用
- 代码漏洞、黑客、市场波动、套利者:DeFi 风险管理的范式 | 火星号精选
- 凤凰网辽宁综合HW行动:围追“恶意代码” 制止勒索病毒
- HW行动:围追“恶意代码” 制止勒索病毒
- 指尖上的代码如何学习IT这门技术?
- 一部手机,万物皆可复制粘贴,这位兼职写代码设计师将AR玩出新高度
- 《应用软件安全编程指南》国标发布 奇安信代码卫士参与标准制定
- 设计如何干掉开发人员——0代码开发
- 数据库Jeecg Boot 2.2 首个里程碑版本发布,低代码平台