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

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

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

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

问题

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

问题是挺错综复杂的,感兴趣的可以去看看 2019 年提出的这个 Issue。XTS28资讯网——每日最新资讯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/51977XTS28资讯网——每日最新资讯28at.com

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

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

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

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

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

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

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

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

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

这一问题的解决对 Node.js 模块来讲是里程碑式的,很敬佩 Joyee Cheung 的才华!XTS28资讯网——每日最新资讯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?试试这款神器,纵享丝滑

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的“在线鉴别”,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 疑似小米14外观设计图曝光:后置相机模组变化不大

    下半年的大幕已经开启,而谁将成为下半年手机圈的主角就成为了大家关注的焦点,其中被传有望拿下新一代骁龙8 Gen3旗舰芯片的小米14系列更是备受大家瞩
  • 华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    在今日举行的2023年华为云数字文娱AI创新峰会上,华为云全球Marketing与销售服务总裁石冀琳表示,华为云将在后续推出盘古数字人大模型,可帮助用户12小
Top