当前位置: 首页 > ops >正文

23. CommonJS 和 ES6 Module 区别

总结

  • CommonJS 是 Node.js 中使用的模块化规范,适用于服务端。
  • ES6 Module(ESM) 是 ECMAScript 2015 引入的官方模块化标准,适用于浏览器和现代 Node.js 环境。
  • 主要区别如下:
    1. 加载时机不同:CommonJS 是运行时加载,ES6 Module 是编译时加载
    2. 输出方式不同:CommonJS 输出值的拷贝,ES6 Module 输出值的引用
    3. 使用语法不同:CommonJS 使用 requiremodule.exports,ES6 Module 使用 importexport

对比表格

特性CommonJSES6 Module
加载时机运行时加载编译时加载
输出类型值的拷贝值的引用
是否可动态导入✅ 可以(如 require()✅ 支持动态导入(import()
是否支持静态分析❌ 不支持✅ 支持(利于 Tree-shaking)
语法require / module.exportsimport / export
是否可按需加载❌ 否✅ 可通过 Tree-shaking 实现
是否支持异步加载❌ 否✅ 支持(如动态导入)

示例对比

1. CommonJS 示例

// math.js
exports.add = function (a, b) {return a + b;
};// 或 module.exports
module.exports = {add(a, b) {return a + b;},
};// app.js
const math = require("./math");
console.log(math.add(1, 2));

2. ES6 Module 示例

// math.js
export function add(a, b) {return a + b;
}// 或导出默认
export default {add(a, b) {return a + b;},
};// app.js
import { add } from "./math.js";
console.log(add(1, 2));// 或导入默认导出
import math from "./math.js";
console.log(math.add(1, 2));

加载机制详解

CommonJS:运行时加载

  • CommonJS 在代码执行阶段才加载模块。
  • 模块输出的是值的拷贝,后续模块内部的值变化不会影响已导出的值。
// counter.js
let count = 0;
function increment() {count++;
}
module.exports = { count, increment };// app.js
const { count, increment } = require("./counter");
console.log(count); // 0
increment();
console.log(count); // 0(因为 count 是原始值的拷贝)

ES6 Module:编译时加载

  • ES6 Module 在代码执行前就已经解析并绑定模块。
  • 模块输出的是值的引用,模块内部值变化会影响外部引用。
// counter.js
export let count = 0;
export function increment() {count++;
}// app.js
import { count, increment } from "./counter.js";
console.log(count); // 0
increment();
console.log(count); // 1(count 是引用)

应用场景对比

场景推荐使用
Node.js 项目(旧版本)✅ CommonJS
浏览器项目✅ ES6 Module
需要 Tree-shaking 优化✅ ES6 Module
动态导入模块✅ 两者都支持(CommonJS 用 require(),ES6 用 import()
模块间共享状态✅ ES6 Module(引用机制)

注意事项

  • Node.js 中使用 ES6 Module:需要将文件扩展名改为 .mjs 或在 package.json 中设置 "type": "module"
  • CommonJS 不支持按需加载:打包工具无法进行 Tree-shaking。
  • ES6 Module 更适合现代前端开发:与打包工具(如 Webpack、Rollup)配合更好,支持优化。

http://www.xdnf.cn/news/17928.html

相关文章:

  • [1Prompt1Story] 生成行为控制器 | 语义向量重加权(SVR)
  • 【计算机视觉与深度学习实战】03基于Canny、Sobel和Laplacian算子的边缘检测系统设计与实现
  • Day11 栈与队列part2
  • duiLib 实现鼠标拖动状态栏时,窗口跟着拖动
  • webrtc弱网-VideoSendStreamImpl类源码分析与算法原理
  • 《Leetcode》-面试题-hot100-技巧
  • 嵌入式硬件篇---常见的单片机型号
  • 按键及消抖
  • Python环境下载安装、以及环境配置教程(Windows版)
  • java项目怎么实现用户行为分析、漏斗转化、数据可视化报表。
  • C语言零基础第18讲:自定义类型—结构体
  • 楼宇自控系统赋能建筑全维度管理,实现环境、安全与能耗全面监管
  • [Oracle数据库] Oracle 复杂查询
  • 当 GitHub 宕机时,我们如何协作?
  • Flink Sql 按分钟或日期统计数据量
  • 从 “视频孪生” 到 “视频动态目标三维重构”:技术演进与核心突破
  • PHP域名授权系统网站源码_授权管理工单系统_精美UI_附教程
  • 基于W55MH32Q-EVB 实现 HTTP 服务器配置 OLED 滚动显示信息
  • 企业级Java项目金融应用领域——银行系统
  • 【P40 6-3】OpenCV Python——图像融合(两张相同属性的图片按比例叠加),addWeighted()
  • B3924 [GESP202312 二级] 小杨的H字矩阵
  • Java后台生成多个Excel并用Zip打包下载
  • 《Python学习之字典(一):基础操作与核心用法》
  • 基于 EC 数据与大模型技术实现天气预报:从数据到上线的全栈方法
  • 学习嵌入式第三十天
  • C++进阶:IO流
  • 【Vibe Coding 工程之 StockAnalyzerPro 记录】- EP3.Phase 2股票列表管理功能
  • JCTools 无锁并发队列基础:ConcurrentCircularArrayQueue
  • TDengine IDMP 高级功能(4. 元素引用)
  • C# 反射和特性(关于应用特性的更多内容)