当前位置: 首页 > 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.lryc.cn/news/623365.html

相关文章:

  • 第6问 数据分析领域主要的岗位有哪些?
  • autofit.js: 自动调整HTML元素大小的JavaScript库
  • Java设计模式详细解读
  • 安卓四大组件基础题
  • AI搜索:大模型商业落地的“第一束光”,照见了什么?
  • 【数据结构】深入理解单链表与通讯录项目实现
  • aws(学习笔记第五十一课) ECS集中练习(3)
  • MySQL锁机制:悲观锁VS乐观锁详解
  • 初识c语言————宏定义和调用
  • C语言零基础第18讲:自定义类型—结构体
  • 新手向:GitCode疑难问题诊疗
  • C语言:文件操作详解
  • 从 MySQL 5.7 迁移到 8.0:别让 SQL 文件 “坑” 了你
  • 双指针和codetop复习
  • 【LeetCode每日一题】
  • JavaWeb开发_Day14
  • 嵌入式 Linux LED 驱动开发实验
  • Proteus 入门教程
  • KingbaseES主备读写分离集群安装教程
  • 通配符 重定向 管道符
  • 心路历程-三个了解敲开linux的大门
  • 高等数学 8.4 空间直线及其方程
  • 机器学习 [白板推导](十二)[卡曼滤波、粒子滤波]
  • Python语言---OrangePi全志H616
  • CPP多线程1:C++11的std::thread
  • Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
  • linux设备驱动之字符设备驱动
  • 链式二叉树的基本操作——遍历
  • 【论文笔记】Multi-Agent Based Character Simulation for Story Writing
  • 同创物流学习记录2·电车