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

ES6和CommonJS模块区别

ES6 模块(ESM)和 CommonJS 是 JavaScript 中两种主要的模块规范,它们在设计理念、语法和行为上有显著区别。以下是两者的核心差异:

1. 语法规范与用途

  • ES6 模块(ESM)
    是 ECMAScript 2015 标准化的模块系统,适用于浏览器和 Node.js(需显式启用),是 JavaScript 官方模块规范。
    核心关键字:exportimportexport default

  • CommonJS
    是 Node.js 原生的模块规范,主要为服务器端设计,早期用于解决 Node.js 中的模块依赖问题。
    核心关键字:module.exportsexportsrequire()

2. 导出 / 导入语法

操作

ES6 模块(ESM)

CommonJS

默认导出

export default { ... }

module.exports = { ... }

命名导出

export const a = 1; export function f() {}

exports.a = 1; exports.f = function() {}

导入默认

import obj from './module.js'

const obj = require('./module.js')

导入命名

import { a, f } from './module.js'

const { a, f } = require('./module.js')

3. 加载时机与方式

  • ES6 模块:静态加载

    • 导入和导出语句在代码解析阶段执行(编译时加载),而非运行时。

    • 导入路径必须是静态字符串(不能动态拼接)。

    • 支持 import() 动态导入(返回 Promise)。

    示例:

    javascript

    运行

    --javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
    // 静态导入(解析时执行)
    import { utils } from './tools.js';// 动态导入(运行时执行)
    import('./tools.js').then(module => { ... });
    
  • CommonJS:动态加载

    • 导入(require())在代码运行阶段执行,支持动态路径。

    • 模块加载是同步的(Node.js 中对本地模块有缓存优化)。

    示例:

    javascript

    运行

    --javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
    // 支持动态路径
    const path = './tools.js';
    const utils = require(path);
    

4. 模块输出的本质

  • ES6 模块:值的引用

    • 导出的是值的只读引用,模块内部值变化时,导入方会同步更新。

    • 导入的变量是只读的(不能重新赋值)。

    示例:

    javascript

    运行

    --javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
    // module.js
    export let count = 0;
    export function increment() { count++; }// main.js
    import { count, increment } from './module.js';
    increment();
    console.log(count); // 输出 1(跟随模块内部变化)
    
  • CommonJS:值的拷贝

    • 导出的是值的拷贝(对象导出的是引用地址的拷贝),模块内部值变化不影响导入方。

    • 导入的变量可以重新赋值。

    示例:

    javascript

    运行

    --javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
    // module.js
    let count = 0;
    module.exports = {count,increment: () => { count++; }
    };// main.js
    const { count, increment } = require('./module.js');
    increment();
    console.log(count); // 输出 0(拷贝的值未更新)
    

5. 循环依赖处理

  • ES6 模块
    由于静态解析,模块在加载时会先创建「模块记录」,循环依赖时能正确引用未完全初始化的模块(返回部分导出值)。

  • CommonJS
    循环依赖时,会返回模块当前已执行部分的导出值(可能是不完整的),依赖后续执行补充。

6. 顶层 this 指向

  • ES6 模块:顶层 this 为 undefined

  • CommonJS:顶层 this 指向当前模块的 module.exports

7. 使用场景

  • ES6 模块

    • 浏览器环境(原生支持,需在 <script type="module"> 中使用)。

    • 现代前端工程(Vue、React 项目,通过 Webpack/Vite 打包)。

    • Node.js 13.2+(需在 package.json 中设置 "type": "module")。

  • CommonJS

    • Node.js 环境(默认模块系统)。

    • 早期 Node.js 生态的库(如 Express 中间件)。

总结

特性

ES6 模块(ESM)

CommonJS

加载时机

解析时(静态)

运行时(动态)

输出本质

值的引用(只读)

值的拷贝(可修改)

循环依赖处理

基于模块记录(更可靠)

基于执行状态(可能不完整)

适用环境

浏览器 + 现代 Node.js

Node.js 原生

动态导入支持

import()(返回 Promise)

require() 天然支持


现代前端开发以 ES6 模块为主,而 CommonJS 主要用于 Node.js 后端开发。在实际项目中,两者可通过打包工具(如 Webpack)相互兼容。


文章转载自:

http://xRaZS1Xk.fgkxj.cn
http://zvEPGH0j.fgkxj.cn
http://tQK96CvJ.fgkxj.cn
http://R4tOeeHq.fgkxj.cn
http://w1ngGrhx.fgkxj.cn
http://iO3KAb5P.fgkxj.cn
http://4xu53SNk.fgkxj.cn
http://ELWETUZV.fgkxj.cn
http://FbwGh06Q.fgkxj.cn
http://rYAzdv9k.fgkxj.cn
http://IFeSoqlO.fgkxj.cn
http://3q4ua7qU.fgkxj.cn
http://126G1NCB.fgkxj.cn
http://QZmNrqeK.fgkxj.cn
http://umIoYCsp.fgkxj.cn
http://Iq2byItL.fgkxj.cn
http://YwmG0ZnN.fgkxj.cn
http://iXURl69l.fgkxj.cn
http://yoQkrfms.fgkxj.cn
http://9lJ9Owsb.fgkxj.cn
http://nd9EjMYD.fgkxj.cn
http://erns1T0B.fgkxj.cn
http://vEOH5Y9w.fgkxj.cn
http://AOZbXKyU.fgkxj.cn
http://ELLH23CF.fgkxj.cn
http://jHpDTGpk.fgkxj.cn
http://UMiXkHwG.fgkxj.cn
http://e8KRDrt7.fgkxj.cn
http://dBa2pFjc.fgkxj.cn
http://oFdQEGbn.fgkxj.cn
http://www.dtcms.com/a/362687.html

相关文章:

  • Linux系统强大的命令行工具之fuser
  • 江协科技-1-1软件开发与2-1新建工程
  • C语言精选100道编程题(附有图解和源码)
  • 控制系统仿真之PID参数整定的Z-N法(弯曲切线法)(十)
  • K6 html压力测试报告中参数详解以及常见问题解析
  • 算法题打卡力扣第3题:无重复字符的最长子串(mid)
  • 在线拍卖|基于Springboot+vue的在线拍卖管理系统(源码+数据库+文档)
  • F5发布后量子API安全解决方案,以AI驱动全面防护应对量子计算威胁
  • 面阵 vs 线阵相机:怎么选不踩坑?选型公式直接套用
  • HTML第二课:块级元素
  • 【实时Linux实战系列】采用实时Linux构建无人机控制系统
  • Vue基础知识-Vue中v-cloak、v-text、v-html、v-once、v-pre指令详解
  • 【Doris入门】Doris数据表模型:聚合模型(Aggregate Key Model)详解
  • 数论常见公式定理大全
  • C++学习——继承
  • 无线通信网络是互联网边缘的重要组成,同时也是局域联网的主要方式
  • RT-Thread SMP相关问题分析
  • 01-html css
  • 【论文阅读】Jet-Nemotron: 高效语言模型与后神经网络架构搜索
  • 11.《简单的路由重分布基础知识探秘》
  • 解决完美主义的方法是,去追求不完美--辩证法
  • 《Stable Diffusion XL 1.0 实战:AI 绘画从 “能看” 到 “好看” 的升级技巧》
  • Android把源Bitmap中心缩放到固定宽高的尺寸,Kotlin
  • Kaia AMA 全回顾:如何让 Web3 无痕融入2.5 亿用户日常?9 月 7 日中国行揭秘!
  • WPF启动窗体的三种方式
  • 达梦:存储过程实现多个用户之间表的授权
  • 如何在本地环境中搭建 GitLab 服务器
  • 《IC验证必看|SV中Process控制》
  • ffmpeg 安装
  • 添加⽂件--场景⼆