【程式語言 - Javascript】 ESM與CJS

更新於 2023/07/10閱讀時間約 3 分鐘
JavaScript 中的 ESM(ES Modules)和 CJS(CommonJS)是用於模塊化開發的兩種不同的模組系統。

關於CJS

CJS 是 CommonJS 的模塊系統,最初是為了在伺服器端使用的 Node.js 開發而設計的,但也被廣泛用於前端開發。CJS 使用 require 函數來導入模塊,並使用 module.exportsexports 對象來定義導出的內容,例如:
// 定義模塊
// math.js
exports.add = function(a, b) {
return a + b;
};

// 導入模塊
// main.js
var math = require('./math.js');
console.log(math.add(2, 3)); // 輸出: 5

關於ESM

ESM 是 ECMAScript 的模塊系統,從 ECMAScript 6(ES6)開始引入並成為 JavaScript 的一部分。ESM 使用 importexport 關鍵字來定義和導入模塊。例如:
// 定義模塊
// math.js
export function add(a, b) {
return a + b;
}

// 導入模塊
// main.js
import { add } from './math.js';
console.log(add(2, 3)); // 輸出: 5

兩者差異之處

ESM 和 CJS 在語法和用法上有一些不同之處,主要區別如下:
  1. 語法:ESM 使用 importexport,而 CJS 使用 requiremodule.exportsexports
  2. 加載時間:ESM 是靜態加載,即在編譯時就可以確定模塊的依賴關係;而 CJS 是動態加載,即在運行時根據需要動態加載模塊。
  3. 運行環境:ESM 可以在現代瀏覽器中使用,但需要在 <script> 標籤上使用 type="module" 屬性;而 CJS 主要用於 Node.js 環境。
  4. 預設導出:ESM 支援預設導出,可以使用 export default,而 CJS 沒有內建的預設導出機制。
需要注意的是,ESM 和 CJS 是不相容的模塊系統,即不能直接在 ES6 模塊和 CommonJS 模塊之間進行導入和導出。
這也就是為什麼衍生了許多的轉換套件, 例如 Babel 或 webpack…。

目前主流

目前主流的模塊系統是 ESM(ES Modules)。
ESM 是 JavaScript 的官方模塊系統,自 ECMAScript 6(ES6)開始引入並成為語言的一部分。
它在現代瀏覽器中得到廣泛支援,同時也可以在 Node.js 環境中使用(從 Node.js 12 版本開始原生支援)。
相較於CJS之下有以下的優勢:
  1. 靜態加載:ESM 在編譯時就可以確定模塊的依賴關係,這使得瀏覽器可以更有效地進行模塊的加載和緩存,提高應用程序的性能。
  2. 非阻塞加載:ESM 的加載是非阻塞的,這意味著當瀏覽器遇到 <script type="module"> 標籤時,它可以繼續解析後面的 HTML,而不需要等待模塊加載完成。
  3. 預設導出:ESM 支援預設導出,可以使用 export default 導出模塊的預設內容,這使得導入模塊時可以更簡潔。
隨著時代的演進也開始慢慢的走向ESM模組,剛入門的開發者也可以考慮直接以ESM模組來進行學習。
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
116會員
261內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
阿Han的沙龍 的其他內容
上一篇我們有介紹Google Colab Python的爬蟲基礎概念與技巧,還沒閱讀的朋友可以先進行閱讀,並建立基礎概念之後再接著進行實戰演練會比較容易上手唷! 這裡就附上連結「【Google Colab系列】該如何設計自己的爬蟲來抓取Html資料?」供各位參考囉! 這一篇章會以捕魚的四大步驟進行比
上一篇我們已經介紹過Google Colab的基本用法,建議可以先行閱讀「【Google Colab系列】台股分析預備式: Colab平台與Python如何擦出火花?」,進行基本概念與環境的建置再進行下一步會比較容易進行學習。 雖然網路上已經提供非常多的股市資訊,但各個網站可能都零零散散,難免我們得
這次的主題除了結合平時興趣之一的金融理財之外,亦將本業的軟體程式概念進行結合,透過跨領域的想法激盪出屬於自己的交易策略,過程中也將學習歷程進行筆記,提供給路途中的朋友一個方向,讓我們一起動動手打造出自己的分析程式吧! 多年的軟體開發經驗,過程中也踩過不少雷,因此常常在學習道路上都期望有人能夠將技術經
一般來說我們會這樣定義Struct來接收前端請求的POST Body 那假設POST Body是這樣 此時我們利用gin的BindJSON來Unmarshal 結果印出來會是 上述結果的name被我們過濾掉是正常,但enabled就我們的需求上來看,不應該被過濾掉才對。 所以我們應該將bool、in
由於Go語言本身沒有提供Enum的功能, 故我們可以使用package及type的技巧來達到類似的功能,假設今天要定義季節的enum型別, 包含了「春、夏、秋、冬」四種值的時候,可以怎麼做呢? 首先我們可以用package來框住season的範圍: 然而在season.go可以定義一個字串的類型 最
我們開發程式的過程中難免會依賴DB或其他服務, 但複雜的網路環境下我們並沒有辦法確保我們發送的請求是否正確的送達, 因此我們可以在程式中加入Retry機制, 提升我們軟體的強健性。 尤其是面對NoSQL相對弱一致性的DB時更需注意, 而在Go語言, 我們可以用簡單的技巧來完成Retry的策略, 在進
上一篇我們有介紹Google Colab Python的爬蟲基礎概念與技巧,還沒閱讀的朋友可以先進行閱讀,並建立基礎概念之後再接著進行實戰演練會比較容易上手唷! 這裡就附上連結「【Google Colab系列】該如何設計自己的爬蟲來抓取Html資料?」供各位參考囉! 這一篇章會以捕魚的四大步驟進行比
上一篇我們已經介紹過Google Colab的基本用法,建議可以先行閱讀「【Google Colab系列】台股分析預備式: Colab平台與Python如何擦出火花?」,進行基本概念與環境的建置再進行下一步會比較容易進行學習。 雖然網路上已經提供非常多的股市資訊,但各個網站可能都零零散散,難免我們得
這次的主題除了結合平時興趣之一的金融理財之外,亦將本業的軟體程式概念進行結合,透過跨領域的想法激盪出屬於自己的交易策略,過程中也將學習歷程進行筆記,提供給路途中的朋友一個方向,讓我們一起動動手打造出自己的分析程式吧! 多年的軟體開發經驗,過程中也踩過不少雷,因此常常在學習道路上都期望有人能夠將技術經
一般來說我們會這樣定義Struct來接收前端請求的POST Body 那假設POST Body是這樣 此時我們利用gin的BindJSON來Unmarshal 結果印出來會是 上述結果的name被我們過濾掉是正常,但enabled就我們的需求上來看,不應該被過濾掉才對。 所以我們應該將bool、in
由於Go語言本身沒有提供Enum的功能, 故我們可以使用package及type的技巧來達到類似的功能,假設今天要定義季節的enum型別, 包含了「春、夏、秋、冬」四種值的時候,可以怎麼做呢? 首先我們可以用package來框住season的範圍: 然而在season.go可以定義一個字串的類型 最
我們開發程式的過程中難免會依賴DB或其他服務, 但複雜的網路環境下我們並沒有辦法確保我們發送的請求是否正確的送達, 因此我們可以在程式中加入Retry機制, 提升我們軟體的強健性。 尤其是面對NoSQL相對弱一致性的DB時更需注意, 而在Go語言, 我們可以用簡單的技巧來完成Retry的策略, 在進
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
自己在剛開始進入前端領域時,很剛好遇上需要使用 TypeScript 的案子,一開始都是跟著前輩怎麼寫就怎麼寫,不太有其他餘力來思考「為什麼」會需要寫這門程式語言,直到自己後來使用了 TypeScript 完整開發了電商的購物流程,才慢慢理解到使用 TypeScript 的好處與優勢。
Thumbnail
先前大家為了數位中介服務法草案是否會箝制言論自由吵翻天,網路言論自由當然也是存在於Web3.0世界與幣圈,放眼現今與未來的Web3.0世界與幣圈,主要的生態系與應用大多在以太坊的智能合約與代幣經濟,而智能合約與代幣都是由程式語言所撰寫建構。但最近幣圈也出現言論自由遭到迫害的案例,也就是撰擬Torna
Thumbnail
【為何而學?】 相信剛入門自學程式的人都會遇到許多困難,可能教學資源太多無從下手,或是學了基礎可是無法自己寫出功能,不過最常見的應該屬目標導向的問題,就是不知道為何而學,我自己也是靠著自學製作了一個幫賣家封鎖電商黑名單的chrome插件賺取被動收入,對於設定目標有一點點心得想分享給大家:
Thumbnail
為什麼想學程式語言? 這個問題應該是知道我有在學程式語言的人,馬上脫口而出的問題。 對呀!WHY?一個即將邁向40大關的中年男子(從叔叔→阿伯),為什麼要這麼想不開,突然跳進一堆看不懂...呃...
Thumbnail
你知道什麼程式語言讓工程師最崩潰嗎?根據國外工程師論壇統計,列出了各式各樣的程式語言,甚至有些還是現今熱門的語言喔!想知道的話就來瞧瞧吧!
Thumbnail
世界上有最好的程式語言嗎?答案絕對是否定的,每種語言都有適合的使用時機,而也有不少程式語言是隨著時代變遷而消失的。請放下自己要學到最好語言的心態,多看多學,自然會找到適合你的語言。這篇文章會用客觀的角度跟你分享最多人使用的程式語言。
第n項的費式數列為何? #include int main() { int a0=0, a1=1, a2=1, i=3, fib, n; scanf("%d", &n); if (n==0) printf("0\n"); else if (n printf("1\n"); els
Thumbnail
哲宇剛從紐約大學研究所畢業,目前執行新媒體藝術相關事項,在台灣經營墨雨設計工作室來接設計與動態網頁開發相關案件,也有開設線上課程,以程式語言為基礎分享一些有趣的互動開發。
Thumbnail
資訊時代下,學習程式蔚為風潮。許多行業需要跨領域人才,結合程式與專業知識做應用。 如果是初次想學程式,但是不確定興趣領域,又不知道要如何選擇,既期待又害怕受傷害的情形下,我會建議新手從「容易看得見成果」的方向去嘗試,往後是否能保持熱忱與興趣,其實很大的原因是由「成就感」所支撐的。
Thumbnail
Python 從創立之初的沒沒無名,至今被譽為「初學者最佳語言」,在 Python  社群背後默默貢獻的「鄉民」們居功厥偉!讓我們來看一下 Python 那些年的歷歷往事。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
自己在剛開始進入前端領域時,很剛好遇上需要使用 TypeScript 的案子,一開始都是跟著前輩怎麼寫就怎麼寫,不太有其他餘力來思考「為什麼」會需要寫這門程式語言,直到自己後來使用了 TypeScript 完整開發了電商的購物流程,才慢慢理解到使用 TypeScript 的好處與優勢。
Thumbnail
先前大家為了數位中介服務法草案是否會箝制言論自由吵翻天,網路言論自由當然也是存在於Web3.0世界與幣圈,放眼現今與未來的Web3.0世界與幣圈,主要的生態系與應用大多在以太坊的智能合約與代幣經濟,而智能合約與代幣都是由程式語言所撰寫建構。但最近幣圈也出現言論自由遭到迫害的案例,也就是撰擬Torna
Thumbnail
【為何而學?】 相信剛入門自學程式的人都會遇到許多困難,可能教學資源太多無從下手,或是學了基礎可是無法自己寫出功能,不過最常見的應該屬目標導向的問題,就是不知道為何而學,我自己也是靠著自學製作了一個幫賣家封鎖電商黑名單的chrome插件賺取被動收入,對於設定目標有一點點心得想分享給大家:
Thumbnail
為什麼想學程式語言? 這個問題應該是知道我有在學程式語言的人,馬上脫口而出的問題。 對呀!WHY?一個即將邁向40大關的中年男子(從叔叔→阿伯),為什麼要這麼想不開,突然跳進一堆看不懂...呃...
Thumbnail
你知道什麼程式語言讓工程師最崩潰嗎?根據國外工程師論壇統計,列出了各式各樣的程式語言,甚至有些還是現今熱門的語言喔!想知道的話就來瞧瞧吧!
Thumbnail
世界上有最好的程式語言嗎?答案絕對是否定的,每種語言都有適合的使用時機,而也有不少程式語言是隨著時代變遷而消失的。請放下自己要學到最好語言的心態,多看多學,自然會找到適合你的語言。這篇文章會用客觀的角度跟你分享最多人使用的程式語言。
第n項的費式數列為何? #include int main() { int a0=0, a1=1, a2=1, i=3, fib, n; scanf("%d", &n); if (n==0) printf("0\n"); else if (n printf("1\n"); els
Thumbnail
哲宇剛從紐約大學研究所畢業,目前執行新媒體藝術相關事項,在台灣經營墨雨設計工作室來接設計與動態網頁開發相關案件,也有開設線上課程,以程式語言為基礎分享一些有趣的互動開發。
Thumbnail
資訊時代下,學習程式蔚為風潮。許多行業需要跨領域人才,結合程式與專業知識做應用。 如果是初次想學程式,但是不確定興趣領域,又不知道要如何選擇,既期待又害怕受傷害的情形下,我會建議新手從「容易看得見成果」的方向去嘗試,往後是否能保持熱忱與興趣,其實很大的原因是由「成就感」所支撐的。
Thumbnail
Python 從創立之初的沒沒無名,至今被譽為「初學者最佳語言」,在 Python  社群背後默默貢獻的「鄉民」們居功厥偉!讓我們來看一下 Python 那些年的歷歷往事。