最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js中common.js和ECMAScript.js區(qū)別對比分析

 更新時間:2025年05月29日 10:02:47   作者:以碼平川  
這篇文章主要介紹了js中common.js和ECMAScript.js區(qū)別對比分析,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

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

?? 核心差異對比表

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

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

CommonJS 運行時解析流程

1. 執(zhí)行代碼 → 2. 構(gòu)建模塊對象 → 3. 按需加載依賴 → 4. 包裹成函數(shù)執(zhí)行

Module Wrapper 偽代碼:

function (exports, require, module, __filename, __dirname) {
  // 用戶代碼在此執(zhí)行
  module.exports = ...;
}

ESM 預解析流程

1. 解析階段 → 2. 建立模塊關系圖 → 3. 編譯階段 → 4. 實例化 → 5. 執(zhí)行代碼

關鍵特性:

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

??? 代碼示例對比

模塊導出差異

// CommonJS 動態(tài)修改
exports.a = 1;        // ? { a: 1 }
module.exports = { b: 2 };  // 最終導出 { b: 2 }
// ESM 綁定不可變
export let count = 0;
export function increment() {
  count++;  // 所有導入模塊都會看到更新后的值
}

循環(huán)依賴處理

// 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結(jié)束');
// 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結(jié)束');
# 執(zhí)行結(jié)果:
a開始 → b開始 → 在b中,a.done = false → b結(jié)束 → 在a中,b.done = true → a結(jié)束

? 現(xiàn)代項目中的互操作性

混合使用解決方案

// 在 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入口
  }
}

?? 轉(zhuǎn)譯工具處理原理(以Babel為例)

# 轉(zhuǎn)換步驟示例
ESM → 解析為AST → 檢測import/export → 替換為require語法 → 添加helper函數(shù)

示例轉(zhuǎn)換效果:

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

?? 性能優(yōu)化差異

CommonJS 優(yōu)化難點

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

ESM 優(yōu)化空間

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

?? 瀏覽器支持情況

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

?? 選用建議

Node.js 服務端

  • 新項目 > Node 14:優(yōu)先使用ESM
  • 舊項目遷移:逐步替換關鍵模塊

前端工程

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

工具庫開發(fā)

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

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

到此這篇關于js中common.js和ECMAScript.js區(qū)別的文章就介紹到這了,更多相關js common.js和ECMAScript.js內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JS實現(xiàn)駝峰字符串轉(zhuǎn)下劃線字符串的三種方法

    JS實現(xiàn)駝峰字符串轉(zhuǎn)下劃線字符串的三種方法

    這篇文章主要介紹了js下劃線和駝峰互相轉(zhuǎn)換的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-11-11
  • javascript實現(xiàn)簡單的省市區(qū)三級聯(lián)動

    javascript實現(xiàn)簡單的省市區(qū)三級聯(lián)動

    本文給大家反映的是javascript實現(xiàn)的簡單的省市區(qū)三級聯(lián)動特效,不需要訪問后臺服務器端,不使用Ajax,無刷新,純JS實現(xiàn)的省市區(qū)三級聯(lián)動。當省市區(qū)數(shù)據(jù)變動是只需調(diào)正js即可。
    2015-05-05
  • javascript常用經(jīng)典算法實例詳解

    javascript常用經(jīng)典算法實例詳解

    這篇文章主要介紹了javascript常用算法,結(jié)合實例形式較為詳細的分析總結(jié)了JavaScript中常見的各種排序算法以及堆、棧、鏈表等數(shù)據(jù)結(jié)構(gòu)的相關實現(xiàn)與使用技巧,需要的朋友可以參考下
    2015-11-11
  • Javascript模擬實現(xiàn)new原理解析

    Javascript模擬實現(xiàn)new原理解析

    這篇文章主要介紹了Javascript模擬實現(xiàn)new原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • 微信小程序按鈕點擊跳轉(zhuǎn)頁面詳解

    微信小程序按鈕點擊跳轉(zhuǎn)頁面詳解

    這篇文章主要介紹了微信小程序按鈕點擊跳轉(zhuǎn)頁面,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • 類似CSDN圖片切換效果腳本

    類似CSDN圖片切換效果腳本

    原來的腳本當只有一張圖片時會彈出JavaScript腳本錯誤,特此將自己修改完的版本貼出。
    2009-09-09
  • JS使用隊列對數(shù)組排列,基數(shù)排序算法示例

    JS使用隊列對數(shù)組排列,基數(shù)排序算法示例

    這篇文章主要介紹了JS使用隊列對數(shù)組排列,基數(shù)排序算法,涉及javascript隊列的定義、使用,基數(shù)排序?qū)崿F(xiàn)方法等相關操作技巧,需要的朋友可以參考下
    2019-03-03
  • swiper移動端輪播插件(觸碰圖片之后停止輪播)

    swiper移動端輪播插件(觸碰圖片之后停止輪播)

    這篇文章主要為大家詳細介紹了swiper移動端輪播插件,觸碰圖片之后停止輪播,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 微信小程序?qū)崿F(xiàn)折疊展開效果

    微信小程序?qū)崿F(xiàn)折疊展開效果

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)折疊展開效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • uni-app禁用返回按鈕/返回鍵的具體實現(xiàn)

    uni-app禁用返回按鈕/返回鍵的具體實現(xiàn)

    今天在使用uni-app開發(fā)登錄頁面時遇到一個需求,需要禁用返回按鈕,下面這篇文章主要給大家介紹了關于uni-app禁用返回按鈕/返回鍵的具體實現(xiàn),需要的朋友可以參考下
    2022-11-11

最新評論

尉犁县| 佳木斯市| 吴川市| 青田县| 汕头市| 大埔县| 马边| 双牌县| 宁明县| 修水县| 阳泉市| 溧水县| 石林| 廉江市| 珠海市| 桐柏县| 平陆县| 清河县| 西华县| 饶河县| 武威市| 镇江市| 新龙县| 山西省| 新和县| 大厂| 仁怀市| 南宫市| 个旧市| 延安市| 抚远县| 八宿县| 牟定县| 岢岚县| 西和县| 砀山县| 和硕县| 南雄市| 宁强县| 原阳县| 昌邑市|