js中common.js和ECMAScript.js區別

以下是關于 CommonJS 和 ECMAScript Modules(ESM)的詳細對比分析,包含底層原理和示例說明:


🧩 核心差異對比表

特性CommonJSES Modules
來源Node.js 社區規范ECMAScript 語言標準
加載方式動態加載(運行時解析)靜態加載(編譯時解析)
加載環境Node.js 原生支持瀏覽器原生支持,Node.js需開啟 --experimental-modules(v13.2+已穩定)
語法格式require() / module.exportsimport / export
加載行為同步加載異步加載
模塊解析文件路徑需完整支持 bare module 說明符(需要導入映射)
變量訪問修改原始導出對象綁定只讀引用
循環引用處理部分加載(未完成的狀態)引用預解析(存在TDZ)
頂層作用域模塊內this指向module.exports頂層thisundefined
靜態分析不支持 Tree-shaking支持 Tree-shaking 優化

📦 底層加載機制差異(圖示)

CommonJS 運行時解析流程
1. 執行代碼 → 2. 構建模塊對象 → 3. 按需加載依賴 → 4. 包裹成函數執行

Module Wrapper 偽代碼:

function (exports, require, module, __filename, __dirname) {// 用戶代碼在此執行module.exports = ...;
}
ESM 預解析流程
1. 解析階段 → 2. 建立模塊關系圖 → 3. 編譯階段 → 4. 實例化 → 5. 執行代碼

關鍵特性:

  • 模塊記錄(Module Record):存儲導入/導出關系
  • 實時綁定(Live Bindings):導出值變化會同步到導入方

🛠? 代碼示例對比

模塊導出差異
// CommonJS 動態修改
exports.a = 1;        // ? { a: 1 }
module.exports = { b: 2 };  // 最終導出 { b: 2 }// ESM 綁定不可變
export let count = 0;
export function increment() {count++;  // 所有導入模塊都會看到更新后的值
}
循環依賴處理
// commonjs/a.js
console.log('a開始');
exports.done = false;
const b = require('./b');  // 此時b尚未完成加載
console.log('在a中,b.done =', b.done);
exports.done = true;
console.log('a結束');// commonjs/b.js
console.log('b開始');
exports.done = false;
const a = require('./a');  // 此時a導出{done: false}
console.log('在b中,a.done =', a.done);
exports.done = true;
console.log('b結束');
# 執行結果:
a開始 → b開始 → 在b中,a.done = false → b結束 → 在a中,b.done = true → a結束

? 現代項目中的互操作性

混合使用解決方案
// 在 ESM 中引入 CJS
import cjsModule from './commonjs-module.cjs';// 在 CJS 中引入 ESM(需異步)
const esModule = await import('./es-module.mjs');
Package.json 配置
{"type": "module",       // 默認使用ESM"main": "./index.cjs",  // CJS入口"exports": {"import": "./esm/index.js",   // ESM入口"require": "./cjs/index.js"   // CJS入口}
}

🔧 轉譯工具處理原理(以Babel為例)

# 轉換步驟示例
ESM → 解析為AST → 檢測import/export → 替換為require語法 → 添加helper函數

示例轉換效果:

// 原始ESM
import { readFile } from 'fs';
export const data = readFile('./file.txt');// 轉換后CommonJS
const { readFile } = require('fs');
exports.data = readFile('./file.txt'); 

🚀 性能優化差異

  1. CommonJS 優化難點

    • 無法預知依賴關系,阻礙并行加載
    • 動態表達式導致死代碼難以消除
    require(condition ? 'a' : 'b'); // 無法靜態分析
    
  2. ESM 優化空間

    // webpack利用靜態分析實現的特性
    import(/* webpackPrefetch: true */ './chart'); // 預取
    import(/* webpackChunkName: "utils" */ './utils'); // 分塊命名
    

🌐 瀏覽器支持情況

瀏覽器ESM支持版本
Chrome61+
Firefox60+
Safari10.1+
Edge16+
<!-- 瀏覽器直接使用ESM -->
<script type="module" src="app.js"></script>

💡 選用建議

  1. Node.js 服務端

    • 新項目 > Node 14:優先使用ESM
    • 舊項目遷移:逐步替換關鍵模塊
  2. 前端工程

    • 統一使用ESM(配合webpack等打包工具)
    • 第三方庫需提供ESM版本(通過package.jsonmodule字段)
  3. 工具庫開發

    # 推薦雙模式發布
    lib/
    ├── esm/       # ESM版本(支持Tree-shaking)
    ├── cjs/       # CommonJS版本 
    └── index.d.ts # 類型聲明
    

兩種模塊系統在JavaScript生態中仍將長期共存,理解其底層機制有助于更高效地處理模塊化問題。隨著Node.js對ESM支持的完善,未來ESM會成為主流選擇,但CommonJS仍將在老項目中持續存在。

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

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

相關文章

玻纖效應的時序偏差

隨著比特率繼續飆升&#xff0c;光纖編織效應時序偏移正成為一個越來越嚴重的問題。對于 5GB/s 及以上的信號傳輸速率&#xff0c;它實際上會毀了您的一天。例如&#xff0c;左圖顯示由于 12.7 英寸的纖維編織效果&#xff0c;5GB/s 的接收眼完全閉合。使用 Agilent ADS 軟件進…

異步上傳石墨文件進度條前端展示記錄(采用Redis中String數據結構實現)

事件起因是客戶現場需要從石墨文檔中獲取文件信息&#xff0c;文件信息存在存在多個&#xff0c;進行批量上傳。為了用戶的友好型體驗&#xff0c;需要做進行條展示的方式&#xff0c;具體實現見下文… 上傳流程介紹 石墨文檔支持從鏈接&#x1f517;方式獲取文件信息&#xf…

3D建模的全景圖譜:從55個工具到元宇宙的數字革命

3D建模已從專業工程師的工具箱演變為全民創作的數字語言。從代碼驅動的精確建模到AI自動生成紋理&#xff0c;從開源協作到程序化生成城市&#xff0c;技術正重塑我們創造虛擬世界的方式。本文將系統解析55個核心3D建模工具/插件&#xff0c;涵蓋在線編輯器、開源軟件、程序化生…

jsrpc進階模式 秒殺js前端逆向問題 burp聯動進行爆破

案例演示 思路就是 這個 jsrpc遠程加載加密函數的方法就是 在js代碼中進行插入一個 遠程加載的代碼 從而實現 &#xff1a; 第一步還是使用 js_tools 進行 查找算法的位置 這個可以幫助我們找到明文>密文 加密算法函數的位置 因為這個需要我們進行js前端代碼的修改 所以…

基于BERT-Prompt的領域句子向量訓練方法

基于BERT-Prompt的領域句子向量訓練方法 一、核心原理:基于BERT-Prompt的領域句子向量訓練方法 論文提出一種結合提示學習(Prompt Learning)和BERT的領域句子向量訓練方法,旨在解決裝備保障領域文本的語義表示問題。核心原理如下: 以下通過具體例子解釋傳統詞向量方法和…

Python PyMySQL

1.PyMySQL是什么 是Python操作mysql的一個包 2.PyMySQL使用基本步驟 2.1 創建連接 conn pymysql.connect(host10.248.53.148,password123456,port3306,userroot,databasetest_database,charsetutf8)2.2 游標 2.2.1 什么是游標 游標實際上是一種能從包括多條數據記錄的結果…

OC—UI學習-1

OC—UI學習 UILabel UILabel是UIKit框架中的一個類Label主要參數 text&#xff1a;文本frame&#xff1a;位置框架backgroundcolor&#xff1a;背景顏色textAlignment&#xff1a;設置文本在Label中的位置textColor&#xff1a;文本顏色shadowColor&#xff1a;陰影顏色shado…

【應用密碼學】實驗七 Hash函數——SM3

一、實驗要求與目的 理解哈希函數的基本原理及在密碼學中的應用&#xff1b;掌握國密哈希標準 SM3 的算法結構&#xff1b;編程實現 SM3 摘要算法&#xff0c;包括消息填充、消息擴展、壓縮函數及摘要輸出&#xff1b;對中間變量 W、W′ 和 A~H 的迭代過程進行可視化&#xff…

進行性核上性麻痹護理之道:助力患者舒適生活

進行性核上性麻痹是一種緩慢進展的神經退行性疾病&#xff0c;主要影響患者的運動、語言和吞咽功能&#xff0c;給日常生活帶來諸多不便。除了遵醫囑接受藥物或物理治療&#xff0c;科學的健康護理對延緩病情發展、提升生活質量尤為重要。 運動康復是護理的關鍵環節。由于患者常…

5G 核心網中 NRF 網元的功能、接口及參數詳解

引言 在 5G 核心網的架構體系里,網絡存儲功能(Network Repository Function,NRF)占據著關鍵地位,承擔著核心網網絡功能(Network Function,NF)的注冊、發現以及服務管理等重要任務,為整個 5G 網絡的高效穩定運行提供了堅實支撐。接下來,讓我們深入剖析 NRF 網元在注冊…

HUAWEI交換機配置鏡像口驗證(eNSP)

技術術語&#xff1a; 流量觀察口&#xff1a;就是我們常說的鏡像口&#xff0c;被觀察的流量的引流目的端口 流量源端口&#xff1a;企業生產端口&#xff0c;作為觀察口觀察對象。 命令介紹&#xff1a; [核心交換機]observe-port [觀察端口ID或編號&#xff08;數字&am…

Spring AI Alibaba 發布企業級 MCP 分布式部署方案

作者&#xff1a; 影子&#xff0c;劉宏宇&#xff0c;劉軍 Spring AI 通過集成 MCP 官方的 java sdk&#xff0c;讓 Spring Boot 開發者可以非常方便的開發自己的 MCP 服務&#xff0c;把自己企業內部的業務系統通過標準 MCP 形式發布為 AI Agent 能夠接入的工具&#xff1b;…

Redis實戰-緩存篇(萬字總結)

前言&#xff1a; 今天結合黑馬點評這個項目&#xff0c;講下有關Redis緩存的一些內容&#xff0c;例如緩存更新策略&#xff0c;緩存穿透&#xff0c;雪崩和擊穿等。 今日所學&#xff1a; 什么是緩存緩存更新策略緩存穿透緩存雪崩緩存擊穿緩存工具封存 目錄 1.什么是緩存…

openFuyao開源發布,建設多樣化算力集群開源軟件生態

openFuyao 開源發布 隨著 AI 技術的高速發展&#xff0c;算力需求呈爆發式增長&#xff0c;集群已成為主流生產方式。然而&#xff0c;當前集群軟件生態發展滯后于硬件系統&#xff0c;面臨多樣化算力調度困難、超大規模集群軟件支撐不足等挑戰。這些問題的根源在于集群生產的…

深入理解 Redis 哨兵模式

Redis 哨兵模式深度解析&#xff1a;從原理到實踐的全流程指南 在分布式系統架構中&#xff0c;Redis 作為高性能的內存數據庫&#xff0c;其哨兵模式&#xff08;Sentinel&#xff09;是保障服務高可用性的核心方案。本文將從基礎概念、運行機制出發&#xff0c;結合具體配置…

HackMyVM-Find

信息搜集 主機發現 ┌──(root?kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:39:60:4c, IPv4: 192.168.43.126 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.43.1 c6:45:66:05:91:88 …

2025年滲透測試面試題總結-匿名[校招]安全服務工程師(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 匿名[校招]安全服務工程師 一面問題與完整回答 1. 學校、專業、成績與排名 2. 學習安全時長 3. 當前學習…

TopCode之手撕快排

題目鏈接 912. 排序數組 - 力扣&#xff08;LeetCode&#xff09; 題目解析 算法原理 使用數組分三塊的思想 i用來遍歷整個數組 left用來標記<key的邊界 right用來標記>key的邊界 然后i進行遍歷,數組就分成了四塊 [l,left]<key [left1,i-1]key [i,right-1]未…

bi軟件是什么?bi軟件是做什么用的?

目錄 一、BI 軟件是什么 1. 基本概念 2. 工作原理 二、BI 軟件是做什么用的&#xff1f; 1. 精準洞察市場趨勢 2. 優化企業戰略規劃 3. 輔助投資決策 三、如何選擇合適的 BI 軟件 1.功能匹配度 2.易用性和可擴展性 3.數據安全和穩定性 4.技術支持和服務 總結 生產…

11.14 LangGraph檢查點系統實戰:AI Agent會話恢復率提升287%的企業級方案

使用 LangGraph 構建生產級 AI Agent:LangGraph 持久化與記憶的"檢查點系統的實現" 關鍵詞:LangGraph 檢查點系統,多回合記憶,狀態持久化,會話恢復,AI Agent 容錯機制 1. 檢查點系統的核心價值 在復雜對話場景中,AI Agent 需要處理長達數十輪甚至數百輪的交…