当前位置:首页 > 科技  > 软件

一个提出五年的 Node.js 模块问题,终被解决!

来源: 责编: 时间:2024-03-26 17:40:02 274观看
导读一直以来 Node.js 中存在一个问题,CommonJS 与 ES Modules 如何更好的共存? 是令大多数 Node.js 开发者头疼的问题。问题当在 ES Modules 模块中引入 CommonJS 模块代码,一切是 Ok 的。如下代码所示:// c.jsmodule.export

一直以来 Node.js 中存在一个问题,CommonJS 与 ES Modules 如何更好的共存? 是令大多数 Node.js 开发者头疼的问题。NJ128资讯网——每日最新资讯28at.com

问题

当在 ES Modules 模块中引入 CommonJS 模块代码,一切是 Ok 的。如下代码所示:NJ128资讯网——每日最新资讯28at.com

// c.jsmodule.exports = {  moduleName: 'a'}
// m.mjsimport C_Module from './c.js'console.log(C_Module); // { moduleName: 'a' }

换一种方式,让 CommonJS 引入 ES Modules,如下代码所示:NJ128资讯网——每日最新资讯28at.com

// m.mjsexport default 'm'
// c.jsconst M_Module = require('./m.mjs')console.log(M_Module);

终端运行 node c.js,会得到如下提示NJ128资讯网——每日最新资讯28at.com

图片图片NJ128资讯网——每日最新资讯28at.com

ERR_REQUIRE_ESM 这个错误太熟悉不过了,它困惑了很多的 Node.js 开发者,为什么换个顺序就不行?NJ128资讯网——每日最新资讯28at.com

看到的很多答案是这样的 “不支持使用 require 加载 ES 模块,因为 ES 模块是异步执行的”,后面大家就默认了 “CommonJS 是同步,ES Modules 是异步” 这样的一个规则。NJ128资讯网——每日最新资讯28at.com

2019 提出后很遗憾未能继续推进

CommonJS 模块如何加载 ES Modules 模块,这个问题 2019 年就已经提出,参考 “Support requiring .mjs files” https://github.com/nodejs/node/pull/30891 这个问题在当时没有被解决。NJ128资讯网——每日最新资讯28at.com

图片图片NJ128资讯网——每日最新资讯28at.com

ES Modules 在文件顶层可以使用 Top-Level Await,该方法看之前的介绍,是在使用 esm 加载器加载的 .mjs 文件上使用 require 的功能时,使用了与 esm Top-Level Await 相同的权衡。NJ128资讯网——每日最新资讯28at.com

这意味着:如果可能,所有执行和评估都是同步进行的,通过立即展开执行的组件承诺。这意味着任何现有的代码都不应该有可观察到的行为变化,因为到目前为止还不存在任何异步模块。问题在于,一旦使用需要异步执行的模块,它必须让出事件循环来执行该操作,这反过来又允许其他代码在异步操作之后的继续执行之前执行,这对于现在变成了异步模块的调用者是可观察到的。如果这对你的调用者很重要,那么意味着将你的模块执行异步化可能被视为库的破坏性更改,但实际上,对于大多数调用者来说,这并不重要。而且,由于当前的生态系统,零个模块是异步执行的,因此在有异步执行的模块之前,这种方法没有任何缺点,因为没有执行会改变人们今天所期望的(当然,除了不再错误地要求("./foo.mjs"))。NJ128资讯网——每日最新资讯28at.com

最后,问题被关闭了,原因是 “因为纯粹从技术角度来看,目前尝试在事件循环已经运行时旋转它是行不通的”。NJ128资讯网——每日最新资讯28at.com

图片图片NJ128资讯网——每日最新资讯28at.com

问题是挺错综复杂的,感兴趣的可以去看看 2019 年提出的这个 Issue。NJ128资讯网——每日最新资讯28at.com

2024 由 Joyee Cheung's 提出解决方案

2019 ~ 2024 这一令大多数开发者头疼的问题,由 Node.js 的维护者成员 “Joyee Cheung” 再次提出了解决方案。参考 Issue “module: support require()ing synchronous ESM graphs” https://github.com/nodejs/node/pull/51977NJ128资讯网——每日最新资讯28at.com

图片图片NJ128资讯网——每日最新资讯28at.com

参考 Joyee Cheung 博客的介绍 https://joyeecheung.github.io/blog/2024/03/18/require-esm-in-node-js/NJ128资讯网——每日最新资讯28at.com

图片图片NJ128资讯网——每日最新资讯28at.com

去年年底左右,Joyee Cheung 发现了 ESM 的求值可以基于语法同步,而只是 Node.js 将异步性扔到加载过程中后,便与 @GeoffreyBooth 开始讨论重新启动同步 require(esm)。NJ128资讯网——每日最新资讯28at.com

因此,才有了这个 PR。与 2019 年的 PR 相比主要区别在于它试图将 require(esm) 的范围保持小型,并且仅支持加载同步 ESM。NJ128资讯网——每日最新资讯28at.com

后续会通过 --experimental-require-module 标志启用,则加载的 ECMAScript 模块 require() 时要满足以下要求:NJ128资讯网——每日最新资讯28at.com

  • 在最接近的 package.json 文件或 .mjs 扩展中明确标记为 ES 模块,具有 "type": "module" 字段
  • 完全同步(不包含 Top-Level Await)

有网友就在下面问了,这能向后移至到 Node.js 18? 大家还是很喜欢这个功能的!Node.js v20 可能还有希望,这要取决于 Node.js 的发布团队,期待下个 Node.js 版本!NJ128资讯网——每日最新资讯28at.com

图片图片NJ128资讯网——每日最新资讯28at.com

这一问题的解决对 Node.js 模块来讲是里程碑式的,很敬佩 Joyee Cheung 的才华!NJ128资讯网——每日最新资讯28at.com

参考

  • https://github.com/nodejs/node/pull/30891
  • https://github.com/nodejs/node/pull/51977
  • https://joyeecheung.github.io/blog/2024/03/18/require-esm-in-node-js/

本文链接:http://www.28at.com/showinfo-26-79450-0.html一个提出五年的 Node.js 模块问题,终被解决!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 我们一起聊聊如何向文本添加渐变效果和图案

下一篇: 你还在用Mybatis?试试这款神器,纵享丝滑

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
  • 三星Galaxy Z Fold5官方渲染图曝光:13.4mm折叠厚度依旧感人

    据官方此前宣布,三星将于7月26日在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
Top