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

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.dtcms.com/a/335005.html

相关文章:

  • 19.3 Transformers量化模型极速加载指南:4倍推理加速+75%显存节省实战
  • ArrayList的contains问题
  • 【C++学习篇】:基础
  • Markdown 生成 Gantt 甘特图
  • STM32硬件SPI配置为全双工模式下不要单独使用HAL_SPI_Transmit API及HAL_SPI_TransmitReceive改造方法
  • 【图像算法 - 14】精准识别路面墙体裂缝:基于YOLO12与OpenCV的实例分割智能检测实战(附完整代码)
  • 人工智能之数学基础:条件独立
  • AI提升SEO关键词搜索效果
  • UDP/TCP套接字编程简单实战指南
  • 数据结构 栈与队列
  • Tomcat配置文件深度解析
  • [安洵杯 2019]Attack
  • STM32F407VET6开发板标准库实现DMA空闲接收和发送
  • 同创物流学习记录2·电车光电
  • 行为型设计模式:对象协作的舞蹈家(中)
  • Rust 入门 KV存储HashMap (十七)
  • 如何得知是Counter.razor通过HTTP回调处理的还是WASM处理的,怎么检测?
  • LeetCode 55.跳跃游戏:贪心策略下的可达性判断
  • 2025年睿抗国赛本科组题解
  • JavaScript 数组方法汇总
  • 第四章 数字特征
  • 数智管理学(四十七)
  • 【论文笔记】Multi-Agent Based Character Simulation for Story Writing
  • Kafka 面试题及详细答案100道(11-22)-- 核心机制1
  • 算法题打卡力扣第42题接雨水(hard)
  • 【图像算法 - 15】智能行李识别新高度:基于YOLO12实例分割与OpenCV的精准检测(附完整代码)
  • 一次性能排查引发的Spring MVC深度思考
  • Netty 的 Select/Poll 机制核心实现主要在 NioEventLoop 的事件循环
  • 院校机试刷题第二十三天|大精度整数运算、约瑟夫环
  • 二叉树应用实践