node.js模塊化步驟(各標準區別)CommonJS規范、AMD規范、UMD規范、ES Modules (ESM)

前后端建議統一使用ESM

文章目錄

  • Node.js模塊化發展歷程與標準對比
    • 一、模塊化的意義
      • 1.1 解決的核心問題
      • 1.2 沒有模塊化的問題
    • 二、CommonJS規范
      • 2.1 核心特征
      • 2.2 實現示例
    • 三、AMD (Asynchronous Module Definition)
      • 3.1 特點
      • 3.2 代碼示例
    • 四、UMD (Universal Module Definition)
      • 4.1 核心思想
      • 4.2 模板示例
    • 五、ES Modules (ESM)
      • 5.1 主要特性
      • 5.2 使用方式
    • 六、各規范對比
      • 6.1 加載機制
      • 6.2 語法差異
    • 七、最佳實踐建議
      • 7.1 選擇標準
      • 7.2 工程化配置
    • 八、未來發展趨勢
      • 8.1 ESM的統一趨勢
      • 8.2 新特性支持

Node.js模塊化發展歷程與標準對比

一、模塊化的意義

1.1 解決的核心問題

  • 避免命名沖突
  • 更好的依賴管理
  • 提高代碼可維護性
  • 實現代碼復用

1.2 沒有模塊化的問題

// 全局作用域污染示例
var userName = "張三";
var getUserInfo = function() { /*...*/ };// 其他文件可能會不小心覆蓋這些變量
var userName = "李四";  // 變量被覆蓋

二、CommonJS規范

2.1 核心特征

  • 同步加載
  • Node.js默認支持
  • 使用require引入,module.exports導出

2.2 實現示例

// math.js - 導出模塊
module.exports = {add: function(a, b) {return a + b;},subtract: function(a, b) {return a - b;}
};// main.js - 導入模塊
const math = require('./math');
console.log(math.add(2, 3));  // 輸出: 5

三、AMD (Asynchronous Module Definition)

3.1 特點

  • 異步加載
  • 瀏覽器端使用
  • 依賴前置聲明

3.2 代碼示例

// 使用 RequireJS 實現AMD規范
define(['jquery', 'lodash'], function($, _) {// 模塊定義return {// 導出的方法processData: function(data) {// 使用jquery和lodash處理數據return _.map(data, function(item) {return $(item).val();});}};
});

四、UMD (Universal Module Definition)

4.1 核心思想

  • 通用模塊規范
  • 兼容CommonJS和AMD
  • 適配多環境運行

4.2 模板示例

// UMD模塊包裝器
(function(root, factory) {if (typeof define === 'function' && define.amd) {// AMD環境define(['jquery'], factory);} else if (typeof exports === 'object') {// CommonJS環境module.exports = factory(require('jquery'));} else {// 瀏覽器全局環境root.returnExports = factory(root.jQuery);}
}(this, function($) {// 模塊實現return {// 公共方法method: function() {}};
}));

五、ES Modules (ESM)

5.1 主要特性

  • 靜態導入導出
  • 支持異步加載
  • 官方標準規范
  • Tree Shaking支持

5.2 使用方式

// utils.js - 導出模塊
export const formatDate = (date) => {// 日期格式化邏輯return date.toISOString();
};export const calculateAge = (birthDate) => {// 年齡計算邏輯return new Date().getFullYear() - birthDate.getFullYear();
};// main.js - 導入模塊
import { formatDate, calculateAge } from './utils.js';
// 按需導入,支持Tree Shaking

六、各規范對比

6.1 加載機制

  • CommonJS: 同步加載,適合服務器
  • AMD: 異步加載,適合瀏覽器
  • UMD: 兼容多環境
  • ESM: 支持同步異步,靜態分析

6.2 語法差異

// CommonJS
const module = require('./module');// AMD
define(['./module'], function(module) {});// ESM
import module from './module';

七、最佳實踐建議

7.1 選擇標準

  • Node.js后端:優先使用CommonJS
  • 現代前端:優先使用ESM
  • 需要兼容多環境:考慮UMD
  • 老舊項目:可能需要AMD

7.2 工程化配置

// package.json配置示例
{"type": "module",  // 啟用ESM"exports": {// 同時支持CommonJS和ESM"require": "./dist/index.cjs","import": "./dist/index.mjs"}
}

八、未來發展趨勢

8.1 ESM的統一趨勢

  • 瀏覽器原生支持
  • Node.js增強支持
  • 工具鏈全面支持

8.2 新特性支持

  • 動態導入
  • 模塊命名空間
  • 更細粒度的模塊控制

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

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

相關文章

人工智能與智能合約:如何用AI優化區塊鏈技術中的合約執行?

引言:科技融合的新風口 區塊鏈和人工智能,是當前最受矚目的兩大前沿技術。一個以去中心化、可溯源的機制重構信任體系,另一個以智能學習與決策能力重塑數據的價值。當這兩項技術相遇,會碰撞出什么樣的火花? 智能合約作…

RabbitMQ-api開發

前言 MQ就是接收并轉發消息 核心概念 admin是用戶 每個虛擬機上都有多個交換機 快速入門 引入依賴 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.22.0</version></dependen…

PostgreSQL Patroni集群組件作用介紹:Patroni、etcd、HAProxy、Keepalived、Watchdog

1. Watchdog 簡介 1.1 核心作用 ? 主節點故障檢測 Watchdog 會定時檢測數據庫主節點&#xff08;或 Pgpool 主節點&#xff09;的運行狀態。 一旦主節點宕機&#xff0c;它會發起故障切換請求。 ? 協調主備切換 多個 Pgpool 節點時&#xff0c;Watchdog 保證只有一個 Pg…

【多種不同提交方式】通過springboot實現與前端網頁數據交互(非常簡潔快速)

【多種不同提交方式】通過springboot實現與前端網頁數據交互 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是springboot的使用。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性。【幫幫志系列文章】&am…

使用 AI 如何高效解析視頻內容?生成思維導圖或分時段概括總結

一、前言 AI 發展的如此迅速&#xff0c;有人想通過 AI 提效對視頻的解析&#xff0c;怎么做呢&#xff1f; 豆包里面有 AI 視頻總結的功能&#xff0c;可以解析bilibili網站上部分視頻&#xff0c;如下圖所示&#xff1a; 但有的視頻解析時提示&#xff1a; 所以呢&#x…

鞅與停時 - 一種特別的概率論問題

討論一個有趣的概率問題&#xff1a; [P3334 ZJOI2013] 拋硬幣 - 洛谷 實際上是一個猴子打字問題&#xff0c;考慮一直無規律隨即打字的猴子&#xff0c;鍵盤上只有A-Z一共26個字母&#xff0c;對于一個特定的字符串 S S S &#xff1a; ABCABCAB &#xff0c;能否在有限的打…

arcgis和ENVI中如何將數據輸出為tif

一、arcgis中轉換為tif 右鍵圖層&#xff1a; Data -> Export Data, 按照圖示進行選擇&#xff0c;選擇tiff格式導出即可&#xff0c;還可以選擇其他類型的格式&#xff0c;比如envi。 二、 ENVI中轉換為tif File -> Save As -> Save As (ENVI, NITF, TIFF, DTED) …

如何用命令行判斷一個exe是不是c#wpf開發的

在powershell下執行 $assembly [Reflection.Assembly]::ReflectionOnlyLoadFrom("你的exe全路徑") $references $assembly.GetReferencedAssemblies() echo $assembly $references | Where-Object { $_.Name -match "PresentationFramework|PresentationCore…

2025.05.07-華為機考第三題300分

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍OJ 03. 城市緊急救援隊伍協同規劃 問題描述 智慧城市建設中,盧小姐負責設計一套緊急救援隊伍協同系統。城市被規劃為一個 n n n \times n

深入理解Redis SDS:高性能字符串的終極設計指南

&#x1f4cd; 文章提示 10分鐘掌握Redis核心字符串設計 | 從底層結構到源碼實現&#xff0c;揭秘SDS如何解決C字符串七大缺陷&#xff0c;通過20手繪圖示與可運行的C代碼案例&#xff0c;助你徹底理解二進制安全、自動擴容等核心機制&#xff0c;文末附實戰優化技巧&#xff…

jupyter notebook漢化教程

本章教程記錄&#xff0c;jupyter notebook漢化步驟&#xff0c;如果對漢化有需求的小伙伴可以看看。 一、安裝jupyter 如果你是安裝的anaconda的那么默認是包含了Jupyter notebook的&#xff0c;如果是miniconda或者基礎python&#xff0c;默認是不包含的jupyter組件的&#x…

模擬設計中如何減小失配

Xx 芯片測試結果顯示&#xff0c;offset 指標偏高&#xff0c;不符合指標要求。所以查看了資料&#xff0c;溫習了減小的失配的方法。 注意點一&#xff1a; 將所有offet折算到輸入端&#xff0c;得到以下公式&#xff1a; 可以看到a&#xff09;閾值電壓失配直接折算成輸…

C++ 與 Lua 聯合編程

在軟件開發的廣闊天地里&#xff0c;不同編程語言各有所長。C 以其卓越的性能、強大的功能和對硬件的直接操控能力&#xff0c;在系統開發、游戲引擎、服務器等底層領域占據重要地位&#xff0c;但c編寫的程序需要編譯&#xff0c;這往往是一個耗時操作&#xff0c;特別對于大型…

烤箱面包烘焙狀態圖詳解:從UML設計到PlantUML實現

題目&#xff1a;假設你正著手設計一個烤箱。建立一個跟蹤烤箱中面包狀態的狀態圖。要包括必要的觸發器事件、動作和監視條件。 一、狀態圖概述 狀態圖是UML&#xff08;統一建模語言&#xff09;中的一種行為圖&#xff0c;它用于描述系統中對象的狀態變化以及觸發這些變化的…

三款實用工具推薦:配音軟件+Windows暫停更新+音視頻下載!

各位打工人請注意&#xff01;今天李師傅掏出的三件套&#xff0c;都是經過實戰檢驗的效率放大器。先收藏再劃走&#xff0c;說不定哪天就能救命&#xff01; 一.祈風TTS-配音大師 做短視頻的朋友肯定深有體會——配個音比寫腳本還費勁&#xff01;要么付費買聲音&#xff0c…

物流無人機結構與載貨設計分析!

一、物流無人機的結構與載貨設計模塊運行方式 1.結構設計特點 垂直起降與固定翼結合&#xff1a;針對復雜地形&#xff08;如山區、城市&#xff09;需求&#xff0c;采用垂直起降&#xff08;VTOL&#xff09;與固定翼結合的復合布局&#xff0c;例如“天馬”H型無人機&am…

Decode rpc invocation failed: null -> DecodeableRpcInvocation

DecodeableRpcInvocation 異常情況解決方法 錯誤警告官方FAQ 異常情況 記錄一下Dubbo調用異常 java.util.concurrent.ExecutionException: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2025-05-07 22:09:5…

Excel VBA 詞頻統計宏

在Excel中&#xff0c;我們經常需要分析文本數據&#xff0c;例如統計某個單詞或短語在文檔中出現的次數。雖然Excel本身提供了一些文本處理功能&#xff08;如COUNTIF&#xff09;&#xff0c;但對于復雜的詞頻統計&#xff0c;手動操作可能效率低下。這時&#xff0c;VBA宏可…

DRV8301 三相電機驅動芯片的硬件參數與應用設計

DRV8301 硬件參數分析 1. 電源與驅動能力 輸入電壓范圍&#xff1a;PVDD1&#xff08;主電源&#xff09;6V~60V&#xff0c;PVDD2&#xff08;降壓轉換器電源&#xff09;3.5V~60V&#xff0c;支持寬電壓應用場景。 驅動電流&#xff1a;1.7A 源極驅動電流&#xff08;Sourc…

QT Sqlite數據庫-教程03 插入數據-下

【1】手動提交事務 #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QtSql/QSqlRecord>QSqlDatabase db; db.transaction(); for(int i0; i<100000; i){QSqlQuery cmd(QString("UPDATE %1 SET %2%3 WHERE id%4").arg(tab…