自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一個(gè)提出五年的 Node.js 模塊問題,終被解決!

開發(fā) 前端
ES Modules 在文件頂層可以使用 Top-Level Await,該方法看之前的介紹,是在使用 esm 加載器加載的 .mjs 文件上使用 require 的功能時(shí),使用了與 esm Top-Level Await 相同的權(quán)衡。

一直以來 Node.js 中存在一個(gè)問題,CommonJS 與 ES Modules 如何更好的共存? 是令大多數(shù) Node.js 開發(fā)者頭疼的問題。

問題

當(dāng)在 ES Modules 模塊中引入 CommonJS 模塊代碼,一切是 Ok 的。如下代碼所示:

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

換一種方式,讓 CommonJS 引入 ES Modules,如下代碼所示:

// m.mjs
export default 'm'
// c.js
const M_Module = require('./m.mjs')
console.log(M_Module);

終端運(yùn)行 node c.js,會(huì)得到如下提示

圖片圖片

ERR_REQUIRE_ESM 這個(gè)錯(cuò)誤太熟悉不過了,它困惑了很多的 Node.js 開發(fā)者,為什么換個(gè)順序就不行?

看到的很多答案是這樣的 “不支持使用 require 加載 ES 模塊,因?yàn)?ES 模塊是異步執(zhí)行的”,后面大家就默認(rèn)了 “CommonJS 是同步,ES Modules 是異步” 這樣的一個(gè)規(guī)則。

2019 提出后很遺憾未能繼續(xù)推進(jìn)

CommonJS 模塊如何加載 ES Modules 模塊,這個(gè)問題 2019 年就已經(jīng)提出,參考 “Support requiring .mjs files” https://github.com/nodejs/node/pull/30891 這個(gè)問題在當(dāng)時(shí)沒有被解決。

圖片圖片

ES Modules 在文件頂層可以使用 Top-Level Await,該方法看之前的介紹,是在使用 esm 加載器加載的 .mjs 文件上使用 require 的功能時(shí),使用了與 esm Top-Level Await 相同的權(quán)衡。

這意味著:如果可能,所有執(zhí)行和評(píng)估都是同步進(jìn)行的,通過立即展開執(zhí)行的組件承諾。這意味著任何現(xiàn)有的代碼都不應(yīng)該有可觀察到的行為變化,因?yàn)榈侥壳盀橹惯€不存在任何異步模塊。問題在于,一旦使用需要異步執(zhí)行的模塊,它必須讓出事件循環(huán)來執(zhí)行該操作,這反過來又允許其他代碼在異步操作之后的繼續(xù)執(zhí)行之前執(zhí)行,這對(duì)于現(xiàn)在變成了異步模塊的調(diào)用者是可觀察到的。如果這對(duì)你的調(diào)用者很重要,那么意味著將你的模塊執(zhí)行異步化可能被視為庫的破壞性更改,但實(shí)際上,對(duì)于大多數(shù)調(diào)用者來說,這并不重要。而且,由于當(dāng)前的生態(tài)系統(tǒng),零個(gè)模塊是異步執(zhí)行的,因此在有異步執(zhí)行的模塊之前,這種方法沒有任何缺點(diǎn),因?yàn)闆]有執(zhí)行會(huì)改變?nèi)藗兘裉焖谕模ó?dāng)然,除了不再錯(cuò)誤地要求("./foo.mjs"))。

最后,問題被關(guān)閉了,原因是 “因?yàn)榧兇鈴募夹g(shù)角度來看,目前嘗試在事件循環(huán)已經(jīng)運(yùn)行時(shí)旋轉(zhuǎn)它是行不通的”。

圖片圖片

問題是挺錯(cuò)綜復(fù)雜的,感興趣的可以去看看 2019 年提出的這個(gè) Issue。

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

2019 ~ 2024 這一令大多數(shù)開發(fā)者頭疼的問題,由 Node.js 的維護(hù)者成員 “Joyee Cheung” 再次提出了解決方案。參考 Issue “module: support require()ing synchronous ESM graphs” https://github.com/nodejs/node/pull/51977

圖片圖片

參考 Joyee Cheung 博客的介紹 https://joyeecheung.github.io/blog/2024/03/18/require-esm-in-node-js/

圖片圖片

去年年底左右,Joyee Cheung 發(fā)現(xiàn)了 ESM 的求值可以基于語法同步,而只是 Node.js 將異步性扔到加載過程中后,便與 @GeoffreyBooth 開始討論重新啟動(dòng)同步 require(esm)。

因此,才有了這個(gè) PR。與 2019 年的 PR 相比主要區(qū)別在于它試圖將 require(esm) 的范圍保持小型,并且僅支持加載同步 ESM。

后續(xù)會(huì)通過 --experimental-require-module 標(biāo)志啟用,則加載的 ECMAScript 模塊 require() 時(shí)要滿足以下要求:

  • 在最接近的 package.json 文件或 .mjs 擴(kuò)展中明確標(biāo)記為 ES 模塊,具有 "type": "module" 字段
  • 完全同步(不包含 Top-Level Await)

有網(wǎng)友就在下面問了,這能向后移至到 Node.js 18? 大家還是很喜歡這個(gè)功能的!Node.js v20 可能還有希望,這要取決于 Node.js 的發(fā)布團(tuán)隊(duì),期待下個(gè) Node.js 版本!

圖片圖片

這一問題的解決對(duì) Node.js 模塊來講是里程碑式的,很敬佩 Joyee Cheung 的才華!

參考

  • 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/
責(zé)任編輯:武曉燕 來源: Nodejs技術(shù)棧
相關(guān)推薦

2023-06-30 23:25:46

HTTP模塊內(nèi)存

2011-10-25 09:28:30

Node.js

2022-01-07 08:00:00

Node.js開發(fā)Web

2021-12-28 20:04:23

Node.js開發(fā)JavaScript

2021-09-26 05:06:04

Node.js模塊機(jī)制

2020-08-07 10:40:56

Node.jsexpress前端

2020-10-23 06:40:31

Node.js前端開發(fā)

2020-04-15 15:48:03

Node.jsstream前端

2024-03-15 09:26:59

2019-12-17 11:40:44

Node.js模塊前端

2011-06-17 10:29:04

Nodejavascript

2022-06-05 13:52:32

Node.jsDNS 的原理DNS 服務(wù)器

2022-01-02 06:55:08

Node.js ObjectWrapAddon

2021-09-15 19:02:42

Node.jsFs模塊

2014-08-01 10:24:11

2020-08-24 08:07:32

Node.js文件函數(shù)

2022-10-18 18:43:40

Node.js低代碼

2022-12-14 14:40:27

Node.js開發(fā)應(yīng)用程序

2022-06-23 06:34:56

Node.js子線程

2021-12-29 07:44:52

CMSNode.js系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)