ES Module 和 CommonJS的區別

ES Module(ESM,ES6 模塊系統)和 CommonJS 是 JavaScript 中兩種主流的模塊規范,分別用于現代前端和 Node.js 環境(早期),它們在語法、加載機制、特性等方面有顯著區別。以下是詳細對比:

一、語法差異

1. 導出(Export)

ES Module:

使用 export 關鍵字,支持命名導出和默認導出,可在同一模塊中混合使用。

運行
// 命名導出(多個)
export const name = 'foo';
export function func() {};// 默認導出(一個模塊只能有一個)
export default { id: 1 };

CommonJS:

使用 module.exports 或 exports 導出,本質是導出一個對象(默認導出)。

運行
// 導出對象
module.exports = {name: 'foo',func: function() {}
};// 也可單獨賦值(通過 exports 引用 module.exports)
exports.name = 'foo';
exports.func = function() {};

2. 導入(Import)

ES Module:

使用 import 關鍵字,支持導入命名成員、默認成員或整體導入。

運行
// 導入命名成員
import { name, func } from './module.js';// 導入默認成員(可自定義名稱)
import obj from './module.js';// 整體導入(命名空間對象)
import * as mod from './module.js';

CommonJS:

使用 require() 函數導入,返回模塊導出的對象。

運行
// 整體導入
const mod = require('./module.js');
console.log(mod.name); // 訪問導出的成員// 解構導入(模擬命名導入)
const { name, func } = require('./module.js');

二、加載機制

1. 加載時機

ES Module:

  • 靜態加載:導入和導出語句在代碼解析階段(編譯時)執行,而非運行時。
  • 導入語句只能放在模塊頂層(不能在 if、函數等代碼塊中),瀏覽器 / 引擎可提前分析模塊依賴,實現樹搖(Tree Shaking)(刪除未使用的代碼)。

CommonJS:

  • 動態加載:require() 在運行時執行,可根據條件動態導入(如在 if 語句中調用 require())。
  • 無法在編譯時確定依賴關系,不支持樹搖。

2. 模塊加載方式

ES Module:

  • 異步加載:在瀏覽器中,ESM 通過
運行
// module.js
export let count = 0;
export function increment() { count++; }// main.js
import { count, increment } from './module.js';
increment();
console.log(count); // 輸出 1(同步更新)

CommonJS:

  • 同步加載:在 Node.js 中,require() 是同步加載,適合服務端(文件讀取快),不適合瀏覽器(會阻塞渲染)。
  • 值的拷貝:導入的是模塊導出值的 “拷貝”,模塊內部后續修改不會影響導入方。
運行
// module.js
let count = 0;
module.exports = {count,increment() { count++; }
};// main.js
const mod = require('./module.js');
mod.increment();
console.log(mod.count); // 輸出 0(拷貝未更新)

三、模塊標識與路徑

ES Module:

  • 必須使用完整路徑(包括文件擴展名,如 .js、.mjs),或通過配置(如 package.json 的 type: “module”)省略。
  • 支持絕對路徑、相對路徑和 URL(如 import 'https://cdn.example.com/module.js')。
運行
import './utils.js'; // 必須帶 .js 擴展名(Node.js 中需配置)

CommonJS:

  • 可省略文件擴展名(.js、.json 等會被自動補全),支持查找 node_modules 中的模塊。
運行
require('./utils'); // 自動補全為 ./utils.js
require('lodash'); // 從 node_modules 中查找

四、循環依賴處理

ES Module:

  • 遇到循環依賴(A 依賴 B,B 依賴 A)時,會返回 “未完成的模塊實例”(部分導出已可用),后續代碼執行時補充完整。
運行
// a.js
import { b } from './b.js';
export const a = 1;
console.log('a 中 b 的值:', b); // 輸出 undefined(此時 b 尚未導出)// b.js
import { a } from './a.js';
export const b = 2;
console.log('b 中 a 的值:', a); // 輸出 1(a 已導出)

CommonJS:

  • 循環依賴時,會緩存已執行的部分模塊,返回 “緩存的導出對象”(可能不完整)。
運行
// a.js
const { b } = require('./b.js');
exports.a = 1;
console.log('a 中 b 的值:', b); // 輸出 undefined(b 尚未導出)// b.js
const { a } = require('./a.js');
exports.b = 2;
console.log('b 中 a 的值:', a); // 輸出 undefined(a 尚未導出)

五、適用環境

ES Module:

  • 現代瀏覽器(原生支持,需·<script type="module">)。
    Node.js 14.3+(需文件后綴為 .mjs 或 package.json 中設置 “type”: “module”)。
  • 前端工程化工具(Webpack、Vite 等)默認支持,是前端模塊化的主流方案。

CommonJS:

  • 主要用于 Node.js 環境(默認模塊系統),早期前端通過 Browserify、Webpack 等工具轉換后使用。
  • 目前 Node.js 仍廣泛兼容,但新項目更推薦 ESM。

六、核心區別總結

在這里插入圖片描述

七、如何選擇?

  • 前端項目:優先使用 ES Module,配合工程化工具實現樹搖和優化。
  • Node.js 項目:新項目推薦 ES Module(“type”: “module”),舊項目兼容 CommonJS。
  • 需動態加載模塊(如根據條件導入):可在 ESM 中使用 import() 函數(返回 Promise,支持動態加載),兼具靜態分析和動態能力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93652.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93652.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93652.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

貓頭虎AI分享|一款智能量化交易系統:QuantCell,從數據收集到策略執行全流程自動化

貓頭虎AI分享&#xff5c;一款智能量化交易系統&#xff1a;QuantCell&#xff0c;從數據收集到策略執行全流程自動化 在當今金融市場中&#xff0c;量化交易系統已經成為越來越多投資者和機構的重要選擇。無論是股票、期貨還是加密貨幣&#xff0c;自動化交易與人工智能的結合…

直播美顏SDK架構揭秘:動態貼紙功能的實現原理與性能優化

如今&#xff0c;美顏SDK 已經不再只是“磨皮、美白”的基礎工具&#xff0c;而是逐漸進化為一個涵蓋 人臉識別、實時特效、動態貼紙交互 的復雜技術體系。尤其是 動態貼紙功能 的加入&#xff0c;讓主播與觀眾之間的互動更加生動有趣&#xff0c;也成為提升用戶粘性與平臺差異…

Docker安裝CDC

Docker安裝CDC拉取鏡像離線形式安裝上傳文件并創建docker-compose.yml把鏡像加載到docker中啟動容器連接數據庫創建賬號&#xff0c;并給賬號授權設置wal_level確認wal_level的值創建鏈接查詢連接狀態使用kafdrop消息中看不到修改之前的信息怎么辦補充拉取鏡像 docker pull co…

如何在win服務器中部署若依項目

一、安裝jdk的環境&#xff1a; 這一步很簡單&#xff0c;直接拿到安裝包雙擊安裝即可。 二、配置jdk的環境變量默認安裝的路徑為&#xff1a;C:\Program Files (x86)\Java\jdk1.7.0_51安裝完成之后進行環境變量配置右擊計算機&#xff08;此電腦&#xff09;點擊屬性點擊高級系…

CSS從入門到精通完整指南

第一部分&#xff1a;CSS基礎入門1.1 什么是CSSCSS&#xff08;層疊樣式表&#xff0c;Cascading Style Sheets&#xff09;是用于描述HTML文檔外觀和格式的樣式語言。CSS將內容與表現分離&#xff0c;讓HTML專注于內容結構&#xff0c;CSS專注于視覺效果。1.2 CSS語法結構選擇…

重溫k8s基礎概念知識系列二(Pod)

文章目錄1、Pod概念2、K8s 中的 Pod 的兩種用法3、定義Pod4、Pod的創建資源5、Pod 模板6、容器探針7、總結干貨8、 K8s Pod 經典面試題速查表Pod是Kubernetes中最小的單元&#xff1a; 1、Pod概念 Pod 是可以在 Kubernetes中創建和管理的、最小的可部署的計算單元。它由一組、一…

設計模式之靜態代理

一些個人理解 顧名思義&#xff0c;就是代理一個對象。 那么&#xff0c;既然要代理一個東西&#xff0c;就要傳入它吧? 【1】所以將代理對象當作屬性【【2】往往通過構造方法傳入被代理的目標對象】。 既然要代理&#xff0c;那必然要和代理對象擁有相同的功能吧? 所以實現了…

牛津大學xDeepMind 自然語言處理(1)

牛津大學xDeepMind 自然語言處理 Natural Language Processing 詞向量與詞匯語義學 Word Vectors and Lexical Semantics 詞語表示的基本問題與分布語義思想 傳統詞語表示&#xff08;如獨熱向量&#xff09;存在稀疏、正交、語義弱的問題&#xff0c;無法表達語義相似性。分布…

StarRocks數據庫集群的完整部署流程

目錄 依賴環境 下載安裝包 部署FE 部署BE 搭建集群 停止集群 依賴環境 詳見&#xff1a;StarRocks 部署&#xff1a;依賴環境-CSDN博客 下載安裝包 在官方網站下載安裝包&#xff1a;StarRocks 部署FE 創建元數據目錄。 mkdir -p <meta_dir> 修改 FE 配置文件 f…

簡單的 VSCode 設置

以下是我使用的vscode設置。雖然有些主觀&#xff0c;但很實用。1 主題。我放棄了那些炫酷的主題。我選擇了Tokyo Night (Storm)。理由是&#xff1a;它平靜、賞心悅目&#xff0c;并且與代碼形成了美麗的對比&#xff0c;卻又不顯得刺眼。2. 字體。我切換到了 JetBrains Mono …

Rust 條件語句

Rust 條件語句 在編程語言中&#xff0c;條件語句是程序流程控制的重要組成部分。Rust 作為一種系統編程語言&#xff0c;其條件語句的設計簡潔而強大。本文將詳細介紹 Rust 中的條件語句&#xff0c;包括其語法、用法以及一些高級特性。 1. 基本條件語句 Rust 中的基本條件語句…

【Java EE進階 --- SpringBoot】初識Spring(創建SpringBoot項目)

樂觀學習&#xff0c;樂觀生活&#xff0c;才能不斷前進啊&#xff01;&#xff01;&#xff01; 我的主頁&#xff1a;optimistic_chen 我的專欄&#xff1a;c語言 &#xff0c;Java, Java EE初階&#xff0c; Java數據結構 歡迎大家訪問~ 創作不易&#xff0c;大佬們點贊鼓勵…

腦潛在進展:基于潛擴散模型的三維腦磁共振成像個體時空疾病進展研究|文獻速遞-深度學習人工智能醫療圖像

Title題目Brain Latent Progression: Individual-based spatiotemporal diseaseprogression on 3D Brain MRIs via latent diffusion腦潛在進展&#xff1a;基于潛擴散模型的三維腦磁共振成像個體時空疾病進展研究01文獻速遞介紹神經退行性疾病是現代醫療保健領域最緊迫的挑戰之…

專題:2025AI技術應用與發展報告|附600+份報告PDF、數據儀表盤匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p43632 當企業管理者看著后臺65%的任務被AI自動分配&#xff0c;卻仍在為下周的營銷方案熬夜改稿時&#xff0c;一個現實的矛盾浮出水面&#xff1a;AI到底能幫企業做什么&#xff1f; 2025年&#xff0c;算法研發投入占企業AI預算的…

【筆記】擴散模型(一一):Stable Diffusion XL 理論與實現

論文鏈接&#xff1a;SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis 官方實現&#xff1a;Stability-AI/generative-models 非官方實現&#xff1a;huggingface/diffusers Stable Diffusion XL (SDXL) 是 Stablility AI 對 Stable Diffusion 進…

學習安卓APP開發,10年磨一劍,b4a/Android Studio

學習安卓APP開發 記得上次學APP都是在2016年前了&#xff0c;一晃就過去了10年。 當時用ANDROID studio打開一個空項目和編繹分別用了300秒&#xff0c;一下就用了10分鐘。 后來買了一臺一萬多的電腦&#xff0c;CPU換成了I5 8600K 4.2GHZ*6核&#xff0c;再加上M2固態硬盤。 編…

調試技巧(vs2022 C語言)

調試之前首先要保證我們的腦袋是清晰的&#xff0c;我們調試的過程主要是看代碼有沒有按照我們的想法去運行調試最常使用的幾個快捷鍵F5啟動調試&#xff0c;經常用來直接跳到下一個斷點處&#xff08;F5通常和F9配合使用&#xff0c;打了斷點按F5程序可以直接運行到斷點處&…

MySQL深度理解-Innodb底層原理

1.MySQL的內部組件結構大體來說&#xff0c;MySQL可以分為Server層和存儲引擎層兩部分。2.Server層Server層主要包括連接器、查詢緩存、分析器、優化器和執行器等&#xff0c;涵蓋MySQL的大多數核心服務功能&#xff0c;以及所有的內置函數&#xff08;如日期、時間、數據和加密…

QFtp在切換目錄、上傳文件、下載文件、刪除文件等一系列操作時,如何按照預期操作指令順序執行

FTP服務初始化時&#xff0c;考慮到重連、以及commandFinished信號信號執行完成置m_bCmdFinished 為true; void ICore::connectFtpServer() {if(g_pFile nullptr){g_pFile new QFile;}if(g_pFtp){g_pFtp->state();g_pFtp->abort();g_pFtp->deleteLater();g_pFtp n…

JavaSE高級-02

文章目錄1. 多線程1.1 創建線程的三種方式多線程的創建方式一&#xff1a;繼承Thread類多線程的創建方式二&#xff1a;實現Runnable接口多線程的創建方式三&#xff1a;實現Callable接口三種線程的創建方式對比Thread的常用方法1.2 線程安全線程同步方式一&#xff1a;同步代碼…