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

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

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

以下是關(guān)于 CommonJS 和 ECMAScript Modules(ESM)的詳細(xì)對(duì)比分析,包含底層原理和示例說(shuō)明:

?? 核心差異對(duì)比表

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

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

CommonJS 運(yùn)行時(shí)解析流程

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

Module Wrapper 偽代碼:

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

ESM 預(yù)解析流程

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

關(guān)鍵特性:

  • 模塊記錄(Module Record):存儲(chǔ)導(dǎo)入/導(dǎo)出關(guān)系
  • 實(shí)時(shí)綁定(Live Bindings):導(dǎo)出值變化會(huì)同步到導(dǎo)入方

??? 代碼示例對(duì)比

模塊導(dǎo)出差異

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

循環(huán)依賴處理

// commonjs/a.js
console.log('a開始');
exports.done = false;
const b = require('./b');  // 此時(shí)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');  // 此時(shí)a導(dǎo)出{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)代項(xiàng)目中的互操作性

混合使用解決方案

// 在 ESM 中引入 CJS
import cjsModule from './commonjs-module.cjs';
// 在 CJS 中引入 ESM(需異步)
const esModule = await import('./es-module.mjs');

Package.json 配置

{
  "type": "module",       // 默認(rèn)使用ESM
  "main": "./index.cjs",  // CJS入口
  "exports": {
    "import": "./esm/index.js",   // ESM入口
    "require": "./cjs/index.js"   // CJS入口
  }
}

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

# 轉(zhuǎn)換步驟示例
ESM → 解析為AST → 檢測(cè)import/export → 替換為require語(yǔ)法 → 添加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)化難點(diǎn)

  • 無(wú)法預(yù)知依賴關(guān)系,阻礙并行加載
  • 動(dòng)態(tài)表達(dá)式導(dǎo)致死代碼難以消除
require(condition ? 'a' : 'b'); // 無(wú)法靜態(tài)分析

ESM 優(yōu)化空間

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

?? 瀏覽器支持情況

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

?? 選用建議

Node.js 服務(wù)端

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

前端工程

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

工具庫(kù)開發(fā)

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

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

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

相關(guān)文章

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

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

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

    javascript實(shí)現(xiàn)簡(jiǎn)單的省市區(qū)三級(jí)聯(lián)動(dòng)

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

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

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

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

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

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

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

    類似CSDN圖片切換效果腳本

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

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

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

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

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

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

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

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

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

最新評(píng)論

来宾市| 和静县| 云林县| 景东| 油尖旺区| 峨山| 玛曲县| 潞西市| 安义县| 霍州市| 石河子市| 灵川县| 江都市| 安龙县| 乌拉特前旗| 韶关市| 阜康市| 进贤县| 白玉县| 黑山县| 常宁市| 黔西| 凤阳县| 申扎县| 宁城县| 汉寿县| 南充市| 新乐市| 珲春市| 廉江市| 儋州市| 东丽区| 龙井市| 九江市| 永嘉县| 岳阳县| 澄迈县| 福泉市| 罗平县| 吴堡县| 福海县|