Node.js 模塊化規范詳解

在 Node.js 中,模塊化是開發應用程序的核心概念,它使得代碼可以按照功能模塊進行分割,易于維護、復用和擴展。Node.js 支持兩種模塊化規范:

  • CommonJS(CJS):這是 Node.js 最初使用的模塊化規范。

  • ECMAScript Modules(ESM):這是現代 JavaScript 的官方模塊化規范,自 ECMAScript 2015(ES6)引入。

1.?CommonJS 模塊化規范

CommonJS 是 Node.js 早期就支持的模塊化標準,允許在服務端使用模塊。在 CommonJS 中,每個文件都被視為一個獨立的模塊。你可以通過 module.exports 導出模塊內容,并使用 require() 函數引入模塊。

1.1.?CommonJS 基本用法

  • 導出模塊:使用 module.exports 或 exports。

  • 引入模塊:使用 require()。

定義模塊:

// math.js - 定義模塊
function add(a, b) {return a + b;
}function subtract(a, b) {return a - b;
}// 使用 module.exports 導出模塊
module.exports = {add,subtract,
};// 或者也可以使用 exports(兩者作用相同)
exports.add = add;
exports.subtract = subtract;

引入模塊:

// main.js - 引入并使用模塊
const math = require('./math');console.log(math.add(5, 3));  // 輸出:8
console.log(math.subtract(5, 3));  // 輸出:2

1.2.?CommonJS 特點

  • 同步加載:require() 是同步的,這意味著模塊會在需要時同步加載。這在服務端是可以接受的,但在瀏覽器中不夠高效。

  • 模塊緩存:加載的模塊會被緩存,因此多次 require() 同一個模塊時,模塊只會被加載一次。

2.?ECMAScript Modules 規范

隨著 JavaScript 語言的發展,ECMAScript Modules(ESM)被引入,成為 JavaScript 官方標準的模塊系統。Node.js 從版本 12.17 開始支持 ESM,Node.js 通過引入 .mjs 文件擴展名和 package.json 中的 "type": "module" 字段來實現對 ESM 的支持。

2.1.?ECMAScript Modules 基本用法

  • 導出模塊:使用 export 關鍵字。

  • 引入模塊:使用 import 關鍵字。

定義模塊:

// math.mjs - 定義模塊
export function add(a, b) {return a + b;
}export function subtract(a, b) {return a - b;
}

導入模塊:

// main.mjs - 引入并使用模塊
import { add, subtract } from './math.mjs';console.log(add(5, 3));  // 輸出:8
console.log(subtract(5, 3));  // 輸出:2

2.2.?ESM 特點

  • 靜態解析:ESM 是靜態的,這意味著在代碼編譯時就能確定模塊的依賴關系(相較于 CommonJS 的動態加載)。

  • 異步加載:import 支持異步加載,這在瀏覽器中更高效,特別是當你需要懶加載模塊時。

  • 嚴格模式:所有的 ECMAScript 模塊都默認處于嚴格模式("use strict")。

  • 不允許動態導入和導出:ESM 不支持像 CommonJS 那樣的動態 require,必須在頂層進行 import/export。

3.?文件后綴與模塊加載規則

3.1.?CommonJS 文件后綴

對于 CommonJS 模塊,文件通常使用 .js 后綴。如果你在 Node.js 中編寫 CommonJS 模塊,直接使用 .js 文件即可。

3.2.?ECMAScript 模塊的文件后綴

在 Node.js 中,可以通過以下兩種方式啟用 ESM:

  • 使用 .mjs 文件后綴:如果文件擴展名是 .mjs,Node.js 會將其視為 ESM。

  • 配置 package.json:在項目的 package.json 中設置 "type": "module",這樣即使文件是 .js 后綴,Node.js 也會將其作為 ESM 處理。

3.3.?如何區分 CommonJS 和 ESM

Node.js 根據以下規則來確定模塊系統:

  • CommonJS:默認情況下,Node.js 中所有 .js 文件都被視為 CommonJS 模塊,除非另有指定。

  • ESM:當你使用 .mjs 擴展名,或者在 package.json 中指定 "type": "module",所有的 .js 文件都會被視為 ESM 模塊。

4.?require 和 import 互操作性

盡管 Node.js 支持 CommonJS 和 ESM 兩種規范,但兩者在一起使用時需要注意一些限制:

4.1.?從 CommonJS 中引入 ESM

從 CommonJS 文件中引入 ESM 模塊是有一定限制的。require() 無法直接加載 ESM 模塊,必須使用 import() 函數(它是一個異步函數)。

// 在 CommonJS 模塊中動態引入 ESM 模塊
(async () => {const math = await import('./math.mjs');console.log(math.add(5, 3));
})();

4.2.?從 ESM 中引入 CommonJS

ESM 模塊可以直接通過 import 引入 CommonJS 模塊,因為 Node.js 會將 CommonJS 模塊包裝成 ESM 格式以供使用。

// 在 ESM 中引入 CommonJS 模塊
import math from './math.js';  // 假設 math.js 是一個 CommonJS 模塊
console.log(math.add(5, 3));

5.?選擇 CommonJS 還是 ESM?

在實際開發中,選擇使用 CommonJS 還是 ESM 取決于幾個因素:

  • 兼容性:如果你要支持舊的 Node.js 版本(12 之前)或使用大量依賴的第三方庫(特別是歷史遺留的),CommonJS 可能更合適。

  • 未來發展:ESM 是 JavaScript 官方標準,未來會有更多的支持,因此如果是新項目,推薦使用 ESM。

  • 生態系統:目前 Node.js 生態中的大多數庫仍然使用 CommonJS,但越來越多的庫開始遷移到 ESM。

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

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

相關文章

前端網絡性能優化實踐:從 HTTP 請求到 HTTPS 與 HTTP/2 升級

在前端性能優化體系中,服務端與網絡層的優化是提升用戶體驗的關鍵環節。本文將圍繞 HTTP 請求優化、Cookie 管理、服務器緩存配置、gzip 壓縮、HTTPS 部署及 HTTP/2 升級等核心內容,系統拆解優化策略與實施方法,為團隊技術分享提供完整的知識…

[數據結構——lesson8.樹]

目錄 引言 學習目標 1.樹的概念及結構 1.1樹的定義 1.2樹的基本概念 1.3 樹的表示 (1)雙親表示法 (2)孩子表示法 (3)左孩子右兄弟表示法 1.4 樹在實際中的運用(表示文件系統的目錄樹結構) 結束語: 引言 之前我們學習了棧和隊列數…

告別雙系統——WSL2+UBUNTU在WIN上暢游LINUX

在Windows 11上配置WSL開發環境指南 最近換工作需要深入研究代碼,發現WSL(Windows Subsystem for Linux)是微軟為Windows開發者提供的強大工具,可以在Windows上直接運行Ubuntu子系統,無需雙系統或虛擬機(滿…

Python爬蟲實戰:研究Ticks and spines模塊,構建電商數據采集和分析系統

1. 引言 1.1 研究背景 在信息時代,互聯網數據呈現爆炸式增長,涵蓋社會、經濟、文化等多個領域,具有極高的研究與應用價值。如何高效獲取目標數據并進行深度分析,成為信息處理領域的重要課題。Python 憑借其豐富的庫支持和簡潔的語法,在數據爬取與分析領域得到廣泛應用:…

前端基礎 —— B / CSS基礎

一、CSS 基礎概述定義&#xff1a;層疊樣式表&#xff08;Cascading Style Sheets&#xff09;作用&#xff1a;美化頁面、實現樣式與結構分離二、CSS 基本語法與引入方式1. 語法規范選擇器 {一條/N條聲明}選擇器決定針對誰修改 (找誰) 聲明決定修改啥. (干啥)<style> p…

智能農機無人駕駛作業套圈路徑規劃

國產輕量級桌面GIS軟件Snaplayers實踐&#xff1a;智能農機無人駕駛作業套圈路徑規劃1、選擇地塊角點坐標文件2、加載地塊到地圖中3、設置套圈作業路徑規劃參數4、生成套圈作業路徑5、查看套圈路徑6、查看套圈路徑8、完成本算法已經在國內外等農場已經使用多年。Snaplayers研發…

Java Collection集合框架:體系、核心與選型

目錄 一、集合框架的頂層設計&#xff1a;接口與層次 1. 兩大核心接口&#xff1a;Collection 和 Map 2. Collection接口的三大派系 二、核心實現類詳解 1. List家族實現 2. Set家族實現 3. Queue/Deque家族實現 PriorityQueue&#xff1a; ArrayDeque&#xff1a; 三…

“計算機基礎、軟件工程、設計模式、數據結構算法、操作系統、數據庫、網絡、法律法規”是計算機領域從基礎理論到工程實踐

“計算機基礎、軟件工程、設計模式、數據結構算法、操作系統、數據庫、網絡、法律法規”是計算機領域從基礎理論到工程實踐、再到合規規范的核心知識體系&#xff0c;覆蓋了軟件開發、系統架構、技術合規等關鍵維度。以下將對每個領域進行系統拆解&#xff0c;包括核心內容、學…

利用Rancher平臺搭建Swarm集群

一、Rancher概述1、rancher平臺Rancher是一個開源的企業級容器管理平臺&#xff0c;它可以幫助企業在生產環境中輕松快捷地部署和管理容器&#xff0c;也可以輕松管理各種環境的Kubernetes&#xff0c;并提供對DevOps的支持。Rancher目前已經具備全棧化一鍵部署應用、各種編排調…

Debezium日常分享系列之:MongoDB 新文檔狀態提取

Debezium日常分享系列之&#xff1a;MongoDB 新文檔狀態提取變更事件結構行為配置數組編碼嵌套結構展平MongoDB $unset 處理確定原始操作添加元數據字段選擇性應用轉換的選項配置選項已知限制Debezium MongoDB 連接器會發出數據變更消息&#xff0c;以表示 MongoDB 集合中發生的…

OpenCV:圖像透視變換

文章目錄一、透視變換是什么&#xff1f;二、透視變換的核心原理1. 關鍵概念&#xff1a;透視變換矩陣2. 核心條件&#xff1a;4對對應點三、OpenCV實現透視變換的關鍵步驟步驟1&#xff1a;讀取并預處理圖像步驟2&#xff1a;尋找目標物體的4個頂點步驟3&#xff1a;計算透視變…

commons-csv

maven依賴<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-csv --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-csv</artifactId><version>1.14.1</version></dependency…

LeetCode 1446.連續字符

給你一個字符串 s &#xff0c;字符串的「能量」定義為&#xff1a;只包含一種字符的最長非空子字符串的長度。 請你返回字符串 s 的 能量。 示例 1&#xff1a; 輸入&#xff1a;s “leetcode” 輸出&#xff1a;2 解釋&#xff1a;子字符串 “ee” 長度為 2 &#xff0c;只包…

CTFHub SSRF通關筆記9:302跳轉 Bypass 原理詳解與滲透實戰

目錄 一、SSRF與302跳轉 1、SSRF 2、302響應 3、SSRF與302結合 &#xff08;1&#xff09;SSRF源碼分析 &#xff08;2&#xff09;攻擊鏈條&#xff08;Flow of Exploit&#xff09; 二、滲透實戰 1、打開靶場 2、嘗試127.0.0.1訪問 3、file協議分析源碼 &#xff…

Windows-Use實戰:AI驅動的Windows自動化

Windows-Use實戰:AI驅動的Windows自動化 前言 項目介紹與準備工作 Windows-Use是什么? 系統要求 必需環境 步驟一:安裝Python和基礎環境 1.1 安裝Python 檢查Python版本 Python安裝步驟 1.2 創建項目目錄 步驟二:安裝Windows-Use 2.1 使用pip安裝(推薦) 步驟三:運行和基…

STM32-FreeRTOS操作系統-二值信號量與計數信號量

引言在嵌入式開發領域&#xff0c;任務同步與通信是系統穩定運行的核心。STM32配合FreeRTOS操作系統&#xff0c;為開發者提供了強大的工具支持。其中&#xff0c;二值信號量和計數信號量作為FreeRTOS的關鍵同步機制&#xff0c;分別用于任務間的簡單同步和資源計數控制。二值信…

MarTech營銷技術全景解析:概念、圖譜與最新實踐案例

一、引言&#xff1a;為什么企業越來越依賴MarTech&#xff1f;在數字化浪潮下&#xff0c;企業營銷環境正發生深刻變化&#xff1a;客戶觸點增加&#xff1a;從官網、社交媒體到短視頻、展會&#xff0c;信息渠道呈指數級增長。決策鏈條復雜&#xff1a;B2B客戶通常需要多輪調…

服務器 - 從一臺服務器切換至另一臺服務器(損失數十條訪客記錄)

服務器 - 從一臺服務器切換至另一臺服務器(損失數十條PV記錄為代價) 看著四年的服務器正式到期&#xff0c;沒什么轟轟烈烈的告別&#xff0c;就像目送老朋友轉身走遠&#xff0c;只默默記下&#xff1a;哦&#xff0c;原來它陪了我這么久啊。 前言 一臺陪伴了我4年的服務器昨…

《云原生邊緣與AI訓練場景:2類高頻隱蔽Bug的深度排查與架構修復》

在云原生技術向邊緣計算與AI訓練場景滲透的過程中&#xff0c;基礎設施層的問題往往會被場景特性放大——邊緣環境的弱網絡、異構硬件&#xff0c;AI訓練的高資源依賴、分布式協作&#xff0c;都可能讓原本隱藏的Bug以“業務故障”的形式爆發。這些問題大多不具備直觀的報錯信息…

【51單片機】【protues仿真】基于51單片機數控直流穩壓電源系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 1、數碼管顯示輸出電壓值 2、滑動電阻調節輸出電壓 3、電壓輸出范圍0-15V&#xff0c;步進值1 二、使用步驟 基于51單片機的數控直流穩壓電源是一種通過數字控制實現電壓調節的智…