日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

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

來源: 責(zé)編: 時間:2024-03-26 17:40:02 193觀看
導(dǎo)讀一直以來 Node.js 中存在一個問題,CommonJS 與 ES Modules 如何更好的共存? 是令大多數(shù) Node.js 開發(fā)者頭疼的問題。問題當(dāng)在 ES Modules 模塊中引入 CommonJS 模塊代碼,一切是 Ok 的。如下代碼所示:// c.jsmodule.export

一直以來 Node.js 中存在一個問題,CommonJS 與 ES Modules 如何更好的共存? 是令大多數(shù) Node.js 開發(fā)者頭疼的問題。9PC28資訊網(wǎng)——每日最新資訊28at.com

問題

當(dāng)在 ES Modules 模塊中引入 CommonJS 模塊代碼,一切是 Ok 的。如下代碼所示:9PC28資訊網(wǎng)——每日最新資訊28at.com

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

換一種方式,讓 CommonJS 引入 ES Modules,如下代碼所示:9PC28資訊網(wǎng)——每日最新資訊28at.com

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

終端運行 node c.js,會得到如下提示9PC28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片9PC28資訊網(wǎng)——每日最新資訊28at.com

ERR_REQUIRE_ESM 這個錯誤太熟悉不過了,它困惑了很多的 Node.js 開發(fā)者,為什么換個順序就不行?9PC28資訊網(wǎng)——每日最新資訊28at.com

看到的很多答案是這樣的 “不支持使用 require 加載 ES 模塊,因為 ES 模塊是異步執(zhí)行的”,后面大家就默認了 “CommonJS 是同步,ES Modules 是異步” 這樣的一個規(guī)則。9PC28資訊網(wǎng)——每日最新資訊28at.com

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

CommonJS 模塊如何加載 ES Modules 模塊,這個問題 2019 年就已經(jīng)提出,參考 “Support requiring .mjs files” https://github.com/nodejs/node/pull/30891 這個問題在當(dāng)時沒有被解決。9PC28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片9PC28資訊網(wǎng)——每日最新資訊28at.com

ES Modules 在文件頂層可以使用 Top-Level Await,該方法看之前的介紹,是在使用 esm 加載器加載的 .mjs 文件上使用 require 的功能時,使用了與 esm Top-Level Await 相同的權(quán)衡。9PC28資訊網(wǎng)——每日最新資訊28at.com

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

最后,問題被關(guān)閉了,原因是 “因為純粹從技術(shù)角度來看,目前嘗試在事件循環(huán)已經(jīng)運行時旋轉(zhuǎn)它是行不通的”。9PC28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片9PC28資訊網(wǎng)——每日最新資訊28at.com

問題是挺錯綜復(fù)雜的,感興趣的可以去看看 2019 年提出的這個 Issue。9PC28資訊網(wǎng)——每日最新資訊28at.com

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

2019 ~ 2024 這一令大多數(shù)開發(fā)者頭疼的問題,由 Node.js 的維護者成員 “Joyee Cheung” 再次提出了解決方案。參考 Issue “module: support require()ing synchronous ESM graphs” https://github.com/nodejs/node/pull/519779PC28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片9PC28資訊網(wǎng)——每日最新資訊28at.com

參考 Joyee Cheung 博客的介紹 https://joyeecheung.github.io/blog/2024/03/18/require-esm-in-node-js/9PC28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片9PC28資訊網(wǎng)——每日最新資訊28at.com

去年年底左右,Joyee Cheung 發(fā)現(xiàn)了 ESM 的求值可以基于語法同步,而只是 Node.js 將異步性扔到加載過程中后,便與 @GeoffreyBooth 開始討論重新啟動同步 require(esm)。9PC28資訊網(wǎng)——每日最新資訊28at.com

因此,才有了這個 PR。與 2019 年的 PR 相比主要區(qū)別在于它試圖將 require(esm) 的范圍保持小型,并且僅支持加載同步 ESM。9PC28資訊網(wǎng)——每日最新資訊28at.com

后續(xù)會通過 --experimental-require-module 標(biāo)志啟用,則加載的 ECMAScript 模塊 require() 時要滿足以下要求:9PC28資訊網(wǎng)——每日最新資訊28at.com

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

有網(wǎng)友就在下面問了,這能向后移至到 Node.js 18? 大家還是很喜歡這個功能的!Node.js v20 可能還有希望,這要取決于 Node.js 的發(fā)布團隊,期待下個 Node.js 版本!9PC28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片9PC28資訊網(wǎng)——每日最新資訊28at.com

這一問題的解決對 Node.js 模塊來講是里程碑式的,很敬佩 Joyee Cheung 的才華!9PC28資訊網(wǎng)——每日最新資訊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.www897cc.com/showinfo-26-79450-0.html一個提出五年的 Node.js 模塊問題,終被解決!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 我們一起聊聊如何向文本添加漸變效果和圖案

下一篇: 你還在用Mybatis?試試這款神器,縱享絲滑

標(biāo)簽:
  • 熱門焦點
  • 官方承諾:K60至尊版將會首批升級MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版將會搭載天璣9200+處理器和獨顯芯片X7的同時,Redmi給出了官方承諾,K60至尊重大更新首批升級,會首批推送MIUI 15。也就是說雖然
  • 6月安卓手機性價比榜:Note 12 Turbo斷層式碾壓

    6月份有一個618,雖然這是京東周年慶的日子,但別的電商也都不約而同的跟進了,反正促銷沒壞處,廠商和用戶都能滿意。618期間一些產(chǎn)品也出現(xiàn)了歷史低價,那么各個價位段的產(chǎn)品性價比
  • 企業(yè)采用CRM系統(tǒng)的11個好處

    客戶關(guān)系管理(CRM)軟件可以為企業(yè)提供很多的好處,從客戶保留到提高生產(chǎn)力?! RM軟件用于企業(yè)收集客戶互動,以改善客戶體驗和滿意度。  CRM軟件市場規(guī)模如今超過580
  • 自動化在DevOps中的力量:簡化軟件開發(fā)和交付

    自動化在DevOps中扮演著重要角色,它提升了DevOps的效能。通過自動化工具和方法,DevOps團隊可以實現(xiàn)以下目標(biāo):消除手動和重復(fù)性任務(wù)。簡化流程。在整個軟件開發(fā)生命周期中實現(xiàn)更
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設(shè)備上有一個固定元素,當(dāng)激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發(fā)生
  • 騰訊VS網(wǎng)易,最卷游戲暑期檔,誰能笑到最后?

    作者:無銹缽來源:財經(jīng)無忌7月16日晚,上海1862時尚藝術(shù)中心。伴隨著幻象的精準(zhǔn)命中,碩大的熒幕之上,比分被定格在了14:12,被寄予厚望的EDG戰(zhàn)隊以絕對的優(yōu)勢戰(zhàn)勝了BLG戰(zhàn)隊,拿下了總決
  • 網(wǎng)傳小米汽車開始篩選交付中心 建筑面積不低于3000平方米

    7月7日消息,近日有微博網(wǎng)友@長三角行健者爆料稱,據(jù)經(jīng)銷商集團反饋,小米汽車目前已經(jīng)開始了交付中心的篩選工作,要求候選場地至少有120個車位,建筑不能低
  • 消息稱小米汽車開始篩選交付中心:需至少120個車位

    IT之家 7 月 7 日消息,日前,有微博簡介為“汽車行業(yè)從業(yè)者、長三角一體化擁護者”的微博用戶 @長三角行健者 發(fā)文表示,據(jù)經(jīng)銷商集團反饋,小米汽車目前
  • 上海舉辦人工智能大會活動,建設(shè)人工智能新高地

    人工智能大會在上海浦江兩岸隆重拉開帷幕,人工智能新技術(shù)、新產(chǎn)品、新應(yīng)用、新理念集中亮相。8月30日晚,作為大會的特色活動之一的上海人工智能發(fā)展盛典人工
Top 主站蜘蛛池模板: 阳信县| 大渡口区| 洛隆县| 肇源县| 大庆市| 鹰潭市| 静海县| 宁阳县| 固阳县| 岳西县| 英德市| 郯城县| 阜新| 墨江| 灵丘县| 赤峰市| 方正县| 屯留县| 通渭县| 郸城县| 新昌县| 弥勒县| 扎赉特旗| 平江县| 宁安市| 海伦市| 黄浦区| 常州市| 嘉禾县| 揭东县| 湖北省| 通道| 凭祥市| 安徽省| 上蔡县| 临漳县| 峨山| 梨树县| 武胜县| 富平县| 当涂县|