久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

聊聊Node兩種模塊規范:CJS 與 ESM,有什么不同點?

本篇文章給大家帶大家了解一下Node的兩種模塊規范(難以相容的 CJS 與 ESM),介紹一下CJS 和 ESM 的不同點,怎么實現 CJS、ESM 混寫,希望對大家有所幫助!

聊聊Node兩種模塊規范:CJS 與 ESM,有什么不同點?

13.2.0 版本開始,Nodejs 在保留了 CommonJS(CJS)語法的前提下,新增了對 ES Modules(ESM)語法的支持。

天下苦 CJS 久已,Node 逐漸擁抱新標準的規劃當然值得稱贊,我們也會展望未來 Node 不再需要借助工具,就能打破兩種模塊化語法的壁壘……

但實際上,一切沒有想象中的那么美好。

一、并不完美的 ESM 支持

1.1 在 Node 中使用 ESM

Node 默認只支持 CJS 語法,這意味著你書寫了一個 ESM 語法的 js 文件,將無法被執行。

如果想在 Node 中使用 ESM 語法,有兩種可行方式:

  • ⑴ 在 package.json 中新增 "type": "module" 配置項。
  • ⑵ 將希望使用 ESM 的文件改為 .mjs 后綴。

對于第一種方式,Node 會將和 package.json 文件同路徑下的模塊,全部當作 ESM 來解析。

第二種方式不需要修改 package.json,Node 會自動地把全部 xxx.mjs 文件都作為 ESM 來解析。

同理,如果在 package.json 文件中設置 "type": "commonjs",則表示該路徑下模塊以 CJS 形式來解析。 如果文件后綴名為 .cjs,Node 會自動地將其作為 CJS 模塊來解析(即使在 package.json 中配置為 ESM 模式)。

我們可以通過上述修改 package.json 的方式,來讓全部模塊都以 ESM 形式執行,然后項目上的模塊都統一使用 ESM 語法來書寫。

如果存在較多陳舊的 CJS 模塊懶得修改,也沒關系,把它們全部挪到一個文件夾,在該文件夾路徑下新增一個內容為 {"type": "commonjs"}package.json 即可。

Node 在解析某個被引用的模塊時(無論它是被 import 還是被 require),會根據被引用模塊的后綴名,或對應的 package.json 配置去解析該模塊。

1.2 ESM 引用 CJS 模塊的問題

ESM 基本可以順利地 import CJS 模塊,但對于具名的 exports(Named exports,即被整體賦值的 module.exports),只能以 default export 的形式引入:

/** @file cjs/a.js **/ // named exports module.exports = {     foo: () => {         console.log("It's a foo function...")     } }   /** @file index_err.js **/ import { foo } from './cjs/a.js';   // SyntaxError: Named export 'foo' not found. The requested module './cjs/a.js' is a CommonJS module, which may not support all module.exports as named exports. foo();   /** @file index_err.js **/ import pkg from './cjs/a.js';  // 以 default export 的形式引入 pkg.foo();  // 正常執行

到 Github 獲取示例代碼(test1):

https://github.com/VaJoy/BlogDemo3/tree/main/220220/test1

具體原因我們會在后續提及。

1.3 CJS 引用 ESM 模塊的問題

假設你在開發一個供別人使用的開源項目,且使用 ESM 的形式導出模塊,那么問題來了 —— 目前 CJS 的 require 函數無法直接引入 ESM 包,會報錯:

let { foo } = require('./esm/b.js');               ^  Error [ERR_REQUIRE_ESM]: require() of ES Module BlogDemo3220220test2esmb.js from BlogDemo3220220test2require.js not supported. Instead change the require of b.js in BlogDemo3220220test2require.js to a dynamic import() which is available in all CommonJS modules.     at Object.<anonymous> (BlogDemo3220220test2require.js:4:15) {   code: 'ERR_REQUIRE_ESM' }

按照上述錯誤陳述,我們不能并使用 require 引入 ES 模塊(原因會在后續提及),應當改為使用 CJS 模塊內置的動態 import 方法:

import('./esm/b.js').then(({ foo }) => {     foo(); });  // or  (async () => {      const { foo } = await import('./esm/b.js');  })();

到 Github 獲取示例代碼(test2):

https://github.com/VaJoy/BlogDemo3/tree/main/220220/test2

查閱 dynamic import 文檔

https://v8.dev/features/dynamic-import#dynamic

開源項目當然不能強制要求用戶改用這種形式來引入,所以又得借助 rollup 之類的工具將項目編譯為 CJS 模塊……


由上可見目前 Node.js 對 ESM 語法的支持是有限制的,如果不借助工具處理,這些限制可能會很糟心。

對于想入門前端的新手來說,這些麻煩的規則和限制也會讓人困惑。

截至我落筆書寫本文時, Node.js LTS 版本為 16.14.0,距離開始支持 ESM 的 13.2.0 版本已過去了兩年多的時間。

那么為何 Node.js 到現在還無法打通 CJS 和 ESM?

答案并非 Node.js 敵視 ESM 標準從而遲遲不做優化,而是因為 —— CJS 和 ESM,二者真是太不一樣了。

二、CJS 和 ESM 的不同點

2.1 不同的加載邏輯

在 CJS 模塊中,require() 是一個同步接口,它會直接從磁盤(或網絡)讀取依賴模塊并立即執行對應的腳本。

ESM 標準的模塊加載器則完全不同,它讀取到腳本后不會直接執行,而是會先進入編譯階段進行模塊解析,檢查模塊上調用了 importexport 的地方,并順騰摸瓜把依賴模塊一個個異步、并行地下載下來。

在此階段 ESM 加載器不會執行任何依賴模塊代碼,只會進行語法檢錯、確定模塊的依賴關系、確定模塊輸入和輸出的變量。

最后 ESM 會進入執行階段,按順序執行各模塊腳本。

所以我們常常會說,CommonJS 模塊是運行時加載,ES6 模塊是編譯時輸出接口

在上方 1.2 小節,我們曾提及到 ESM 中無法通過指定依賴模塊屬性的形式引入 CJS named exports:

/** @file cjs/a.js **/ // named exports module.exports = {     foo: () => {         console.log("It's a foo function...")     } }  /** @file index_err.js **/ import { foo } from './cjs/a.js';   // SyntaxError: Named export 'foo' not found. The requested module './cjs/a.js' is a CommonJS module, which may not support all module.exports as named exports. foo();

這是因為 ESM 獲取所指定的依賴模塊屬性(花括號內部的屬性),是需要在編譯階段進行靜態分析的,而 CJS 的腳本要在執行階段才能計算出它們的 named exports 的值,會導致 ESM 在編譯階段無法進行分析。

2.2 不同的模式

ESM 默認使用了嚴格模式(use strict),因此在 ES 模塊中的 this 不再指向全局對象(而是 undefined),且變量在聲明前無法使用。

這也是為何在瀏覽器中,<script> 標簽如要啟用原生引入 ES 模塊能力,必須加上 type="module" 告知瀏覽器應當把它和常規 JS 區分開來處理。

查看 ESM 嚴格模式的

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
亚洲另类视频| 日韩在线观看一区二区三区| 精品精品99| 美女性感视频久久| 悠悠资源网久久精品| 欧美日韩伊人| 成人精品高清在线视频| 国产h片在线观看| 亚洲国产一区二区在线观看| 久久婷婷一区| 国产h片在线观看| 中文在线中文资源| 日本а中文在线天堂| 黄毛片在线观看| 国产劲爆久久| 精品欧美日韩精品| 欧美片第1页综合| 国产精品久久久久久久久久白浆| 国产精品一区二区精品视频观看 | 国产欧美日韩视频在线| 欧美日一区二区| 欧美日韩夜夜| 老司机精品久久| 亚洲专区一区| 日韩精选在线| 久久福利在线| 精品欧美日韩精品| 国产亚洲一区二区手机在线观看| 免费高潮视频95在线观看网站| 超碰超碰人人人人精品| 婷婷激情一区| 视频在线观看91| 国产精品亚洲综合色区韩国| 亚洲精品第一| 欧美精品1区| 成人免费电影网址| 激情偷拍久久| 国产精品三级| 国产精品伦理久久久久久| 国产乱码精品| 高清日韩欧美| 日韩二区三区在线观看| 日韩另类视频| 成人精品亚洲| 精品国产一区二区三区性色av| 黄色亚洲在线| 日韩动漫一区| 国产精品a级| www.九色在线| 在线亚洲免费| 日韩精品视频网站| 国产精品亚洲综合久久| 麻豆视频在线观看免费网站黄| 午夜欧美在线| 久久久国产精品入口麻豆| 欧美日韩精品一本二本三本 | 日韩视频精品在线观看| 国产v日韩v欧美v| 国产精品毛片视频| 国产精品99久久免费观看| 99视频在线精品国自产拍免费观看| 日韩美女国产精品| 欧美一级专区| 欧美精品一区二区久久| 日本欧美韩国一区三区| 影音先锋久久精品| 玖玖精品视频| aⅴ色国产欧美| 亚洲女同中文字幕| 国语精品一区| 91久久中文| 日本中文字幕一区二区| 国内精品亚洲| 综合欧美亚洲| 欧洲亚洲一区二区三区| 日韩激情啪啪| 亚洲成人不卡| 免费高清在线一区| 日韩免费一区| 国产精品久久久久久久久免费高清 | 欧美 日韩 国产一区二区在线视频| 在线观看视频免费一区二区三区| 国产精品www.| 99视频精品全国免费| 视频一区二区三区入口| 欧美国产精品| 91成人在线精品视频| 国产欧美日韩一级| 伊人精品久久| 欧美国产中文高清| 亚洲综合精品四区| 国产一区二区三区视频在线| 亚洲欧洲免费| 蜜臀久久99精品久久一区二区| 国产美女久久| 国产亚洲毛片在线| 日韩一区三区| 欧美日韩一区二区三区在线电影| 久久青草久久| 亚洲在线成人| 1000部精品久久久久久久久| 中文字幕成人| 久久亚洲道色| 成人亚洲一区二区| 中文字幕一区二区av| 国产中文一区| 日韩在线卡一卡二| 免播放器亚洲一区| 亚洲国产日韩欧美在线| 日韩亚洲一区在线| 成人在线观看免费视频| 精品久久久网| 免费一区二区视频| 91精品韩国| 日韩在线视频精品| 综合激情在线| 中文字幕一区二区精品区| 欧美日韩视频网站| 亚洲三级观看| 综合国产精品| 日韩视频一二区| 在线日韩视频| 国产精品试看| 狠狠色狠狠色综合日日tαg| 国产精品一区毛片| 每日更新成人在线视频| 日韩啪啪电影网| 日韩一区二区三免费高清在线观看| 婷婷成人在线| 亚洲精品91| 神马日本精品| 久久久噜噜噜| 国产精品一区二区三区四区在线观看| 亚洲作爱视频| 欧美综合国产| 热久久久久久久| 视频一区欧美日韩| 亚洲aa在线| 国产精品日本一区二区三区在线| 国产日韩免费| 亚洲精品美女91| 久久最新视频| 国产精品第一| 国产黄大片在线观看| 欧美性www| 欧美激情另类| 亚洲综合图色| 香蕉视频成人在线观看| 黄色aa久久| 亚洲精品第一| 国产亚洲人成a在线v网站 | 亚洲成人一区在线观看| 国产字幕视频一区二区| 中文字幕av亚洲精品一部二部| 国产精品一线天粉嫩av| 福利一区二区| 99精品视频精品精品视频| 国产99精品一区| 一本一道久久a久久| 精品欧美视频| 免费看欧美美女黄的网站| 国产精品一线天粉嫩av| 国产无遮挡裸体免费久久| 色偷偷偷在线视频播放| 午夜久久av | 日韩久久精品| 欧美久久精品| 在线精品小视频| 免费日韩一区二区三区| 国产精品嫩草99av在线| 久久精品国产网站| 日本欧美在线| 午夜一区在线| 亚洲精品.com| 国产精品精品| 亚州欧美在线| 9国产精品视频| 久久国产成人午夜av影院宅| 国产剧情在线观看一区| 性色一区二区| 在线亚洲免费| 黄色亚洲大片免费在线观看| 精品入口麻豆88视频| 国产精品久久久久久妇女| 久久香蕉精品| 亚洲在线免费| 亚州av乱码久久精品蜜桃| 国产高潮在线| 国产一区二区久久久久| 久久精品国产成人一区二区三区| 亚洲三级观看| 综合亚洲自拍| 久久精品999| 国产精品国码视频| 国产精品videossex| 国产精品蜜月aⅴ在线| 免费亚洲婷婷| 久久久久伊人| 国产一区日韩| 日韩在线短视频|