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

CommonJS(CJS)和ESModule(ESM)有什么區(qū)別詳解

 更新時間:2026年06月23日 09:39:18   作者:半島@少年  
ES Modules(ESM)和CommonJS(CJS)是JavaScript中兩種主要的模塊系統(tǒng),它們在語法、加載方式和運行時有顯著差異,這篇文章主要介紹了CommonJS(CJS)和ESModule(ESM)有什么區(qū)別的相關資料,需要的朋友可以參考下

一:定義

  • CommonJS(CJS)非ECMA官方規(guī)范,用于NodeJS默認加載加載模塊化方式,瀏覽器無法運行,使用**module.exports/require**導入模塊文件。
  • ESModule(ESM):ES6(ECMA)官網標準,瀏覽器 + Node通用模塊化規(guī)范,前端工程主流方案,使用**export/import**導入模塊文件。

二:使用場景

1. 模塊的導入導出

規(guī)范

導出

導入

CJS

module.exports = { a: 1, b: 2, ... }

exports.a = 1

const module = require("./xxx")
ESM

export const a = 1

export default = { a: 1, b: 2, ... }

import module from "./xxx" (靜態(tài)、同步)

import ("./xxx") (動態(tài)、異步)

// CJS示例
// a.js
exports.num = 1
// index.js
const { num } = require('./a')

// ESM示例
// a.js
export let num = 1
// 靜態(tài)導入(頂層專用)
import { num } from './a'
// 動態(tài)導入(任意位置,返回Promise)
import('./a').then(res=>{})

2. 加載順序

# CJS:同步加載,會阻塞代碼運行。require是普通函數(shù),代碼執(zhí)行到當前行才會加載該文件,支持代碼動態(tài)引入。

// CJS合法:if、for、函數(shù)內部任意位置寫require
if(flag){
  const m = require('./mod1')
}else{
  const m = require('./mod2')
}

# ESM靜態(tài)引入:編譯時靜態(tài)解析,提前寫入全部模塊路徑,必須寫在代碼最頂層,代碼同步加載。

// ESM 靜態(tài)文件加載
// 默認 導入
import module from "./xxx"
// 命名 導入
import { module } from "./xxx"
// 全量導入
import  * as module from "./xxx"

# ESM動態(tài)引入:可以運行時異步加載,返回Promise,import()是ES內置函數(shù),CJS/ESM環(huán)境都能識別,任意位置都能調用,用于路由懶加載、按需引入。

// ESM 動態(tài)導入
import("./xxx")

// Promise
import("./xxx").then(res => {
    // 業(yè)務代碼
})

3. 導出值綁定:值拷貝 vs 實時綁定

# CJS:導出值的副本(淺拷貝),原模塊變量變化不影響導入值

// c.js(CJS)
let count = 1
exports.count = count
exports.add = ()=>count++

// index.js(CJS)
const {count,add}=require('./c')
console.log(count) //1
add()
console.log(count) //1(拷貝快照,原變量變了不更新)

# ESM:導出實時引用綁定,原模塊值變更,導入變量自動同步更新

// e.js(ESM)
export let count =1
export const add = ()=>count++

// index.js(ESM)
import {count,add} from './e'
console.log(count)//1
add()
console.log(count)//2(實時綁定,同步變化)

4. 靜態(tài)優(yōu)化能力(Tree-Shaking 關鍵)

# CJS無法 Tree-Shaking,運行時動態(tài)解析依賴,打包階段無法剔除未使用代碼,打包體積偏大。

# ESM支持 Tree-Shaking,編譯時確定導入導出,webpack/rollup 可刪除未被引入的export代碼,精簡打包產物。

5. 頂層 this 與內置變量

# CJS:每個模塊被包裝成閉包函數(shù),頂層 this = module.exports;

# ESM:頂層 this = undefined,默認開啟嚴格模式use strict

6. 模塊緩存 & 循環(huán)依賴

# CJS第一次require加載后緩存module.exports,再次引入直接讀緩存;循環(huán)依賴時返回未完成導出的空對象;

# ESM:通過拓撲排序解析依賴,循環(huán)依賴拿到實時引用,不會返回空對象。

7. 跨規(guī)范互導規(guī)則

ESM import CJS:只能整體默認導入,無法單獨解構 CJS 命名導出。

// cjs模塊:module.exports={a:1,b:2}
import all from './cjs' //?正確,all={a:1,b:2}
import {a} from './cjs' //?報錯,ESM不能解構CJS導出

CJS require ESM:Node 原生不支持同步require(ESM),直接報ERR_REQUIRE_ESM,只能用await import()異步引入。

三:使用場景總結

# CJS:適用于Node 后端服務、腳手架工具、老項目遺留代碼;

# ESM:適用于前端 Vue/React 項目、瀏覽器原生模塊化、新項目標準選型。

四:小結

  • CJS運行時同步加載、值拷貝、無TreeShaking;ESM編譯時靜態(tài)導入 + 動態(tài)import()異步、實時綁定、支持TreeShaking;
  • CJS用require/module.exports,ESM用import/export。
  • CJS環(huán)境不識別靜態(tài)import,僅兼容import()動態(tài)導入。

到此這篇關于CommonJS(CJS)和ESModule(ESM)有什么區(qū)別的文章就介紹到這了,更多相關CJS和ESM區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Bootstrap Table使用整理(一)

    Bootstrap Table使用整理(一)

    基于 Bootstrap 的 jQuery 表格插件,通過簡單的設置,就可以擁有強大的單選、多選、排序、分頁,以及編輯、導出、過濾(擴展)等等的功能
    2017-06-06
  • layui 富文本賦值,取值,取純文本值的實例

    layui 富文本賦值,取值,取純文本值的實例

    今天小編就為大家分享一篇layui 富文本賦值,取值,取純文本值的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • javascript奇異的arguments分析

    javascript奇異的arguments分析

    在 Javascript 的函數(shù)中有個名為 arguments 的類數(shù)組對象。它看起來是那么的詭異而且名不經傳,但眾多的 Javascript 庫都使用著它強大的功能。所以,它的特性需要每個 Javascript 程序員去熟悉它。
    2010-10-10
  • 微信小程序scroll-view實現(xiàn)滾動到錨點左側導航欄點餐功能(點擊種類,滾動到錨點)

    微信小程序scroll-view實現(xiàn)滾動到錨點左側導航欄點餐功能(點擊種類,滾動到錨點)

    這篇文章主要介紹了微信小程序scroll-view左側導航欄點餐功能實現(xiàn),點擊種類,滾動到錨點;滾動到錨點,種類選中,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • DEDECMS如何為文章添加HOT NEW標志圖片

    DEDECMS如何為文章添加HOT NEW標志圖片

    再用織夢建站的時候,常常需要要在列表頁添加前兩天的文章后面添加個new小圖片,那么此功能是怎么實現(xiàn)的呢,下面通過本文給大家詳解dedecms為文章添加HOT NEW標志圖片,需要的朋友可以參考下
    2015-08-08
  • 實例講解避免javascript沖突的方法

    實例講解避免javascript沖突的方法

    這篇文章主要以實例的方式講解了避免javascript沖突的方法,具有一定的參考價值,感興趣的朋友可以參考一下
    2016-01-01
  • JavaScript圖像延遲加載庫Echo.js

    JavaScript圖像延遲加載庫Echo.js

    Echo 是一個獨立的 JavaScript 懶加載圖像的工具,快速、體積小(不足1k)和使用 HTML5 的 data- 屬性,通過本文給大家介紹JavaScript圖像延遲加載庫Echo.js ,感興趣的朋友一起學習吧
    2016-04-04
  • js實現(xiàn)上傳圖片預覽的方法

    js實現(xiàn)上傳圖片預覽的方法

    這篇文章主要介紹了js實現(xiàn)上傳圖片預覽的方法,通過自定義函數(shù)結合onchange方法實現(xiàn)上傳圖片的預覽功能,非常具有實用價值,需要的朋友可以參考下
    2015-02-02
  • javascript實現(xiàn)依次輸入input自動定焦

    javascript實現(xiàn)依次輸入input自動定焦

    這篇文章主要介紹了javascript實現(xiàn)依次輸入input自動定焦的方法及示例代碼,非常實用,這里推薦給小伙伴們
    2014-12-12
  • Layer+Echarts構建彈出層折線圖的方法

    Layer+Echarts構建彈出層折線圖的方法

    今天小編就為大家分享一篇Layer+Echarts構建彈出層折線圖的方法,具有很的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09

最新評論

岗巴县| 五指山市| 珠海市| 九龙坡区| 肥西县| 开江县| 甘肃省| 迁安市| 潮安县| 平塘县| 四会市| 潜江市| 丹江口市| 卫辉市| 龙江县| 介休市| 务川| 德钦县| 漯河市| 阿尔山市| 涞水县| 广宁县| 南通市| 漾濞| 武平县| 阿合奇县| 新丰县| 科技| 东安县| 靖边县| 宿松县| 岚皋县| 武邑县| 长岭县| 无棣县| 娄底市| 宜宾县| 旬阳县| 夏河县| 苗栗县| 乐亭县|