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

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

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

一:定義

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

二:使用場景

1. 模塊的導(dǎo)入導(dǎo)出

規(guī)范

導(dǎo)出

導(dǎo)入

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") (動(dòng)態(tài)、異步)

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

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

2. 加載順序

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

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

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

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

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

// ESM 動(dòng)態(tài)導(dǎo)入
import("./xxx")

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

3. 導(dǎo)出值綁定:值拷貝 vs 實(shí)時(shí)綁定

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

// 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:導(dǎo)出實(shí)時(shí)引用綁定,原模塊值變更,導(dǎo)入變量自動(dòng)同步更新

// 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(實(shí)時(shí)綁定,同步變化)

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

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

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

5. 頂層 this 與內(nèi)置變量

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

# ESM:頂層 this = undefined,默認(rèn)開啟嚴(yán)格模式use strict。

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

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

# ESM:通過拓?fù)渑判蚪馕鲆蕾?,循環(huán)依賴拿到實(shí)時(shí)引用,不會返回空對象。

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

ESM import CJS:只能整體默認(rèn)導(dǎo)入,無法單獨(dú)解構(gòu) CJS 命名導(dǎo)出。

// cjs模塊:module.exports={a:1,b:2}
import all from './cjs' //?正確,all={a:1,b:2}
import {a} from './cjs' //?報(bào)錯(cuò),ESM不能解構(gòu)CJS導(dǎo)出

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

三:使用場景總結(jié)

# CJS:適用于Node 后端服務(wù)、腳手架工具、老項(xiàng)目遺留代碼;

# ESM:適用于前端 Vue/React 項(xiàng)目、瀏覽器原生模塊化、新項(xiàng)目標(biāo)準(zhǔn)選型。

四:小結(jié)

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

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

相關(guān)文章

  • Bootstrap Table使用整理(一)

    Bootstrap Table使用整理(一)

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

    layui 富文本賦值,取值,取純文本值的實(shí)例

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

    javascript奇異的arguments分析

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

    微信小程序scroll-view實(shí)現(xiàn)滾動(dòng)到錨點(diǎn)左側(cè)導(dǎo)航欄點(diǎn)餐功能(點(diǎn)擊種類,滾動(dòng)到錨點(diǎn))

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

    DEDECMS如何為文章添加HOT NEW標(biāo)志圖片

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

    實(shí)例講解避免javascript沖突的方法

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

    JavaScript圖像延遲加載庫Echo.js

    Echo 是一個(gè)獨(dú)立的 JavaScript 懶加載圖像的工具,快速、體積?。ú蛔?k)和使用 HTML5 的 data- 屬性,通過本文給大家介紹JavaScript圖像延遲加載庫Echo.js ,感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • js實(shí)現(xiàn)上傳圖片預(yù)覽的方法

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

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

    javascript實(shí)現(xiàn)依次輸入input自動(dòng)定焦

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

    Layer+Echarts構(gòu)建彈出層折線圖的方法

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

最新評論

张家川| 芒康县| 自治县| 禹州市| 铜陵市| 兴国县| 和林格尔县| 海淀区| 会泽县| 墨竹工卡县| 延安市| 松阳县| 石阡县| 湛江市| 策勒县| 多伦县| 西青区| 林口县| 松原市| 高阳县| 兰州市| 靖西县| 遂平县| 贡嘎县| 达孜县| 漳平市| 永寿县| 上杭县| 开江县| 深水埗区| 灵丘县| 监利县| 施甸县| 客服| 金昌市| 洱源县| 德令哈市| 城市| 枝江市| 莎车县| 遂昌县|