【Js】易混淆的CommonJS和ESM(ES Module),及它们区别

前言:
【CommonJs】exports,modules.exports,require的区别

📌概念

1. CommonJS 概念

历史:早期 JavaScript 主要跑在浏览器,没有模块系统;Node.js 为了管理代码,引入了 CommonJS 规范。

核心特点:

  • require() 导入模块
  • module.exportsexports 导出模块
  • 模块在运行时加载(同步加载)
  • 每个文件就是一个独立作用域

👉 示例:

// foo.js
module.exports = { a: 1 };// bar.js
const foo = require('./foo');
console.log(foo.a); // 1

2. ESM (ES Module) 概念

历史:ES6(2015)标准化了 JavaScript 原生模块系统,叫 ESM。

核心特点:

  • import 导入
  • export 导出
  • 模块在 编译时 静态解析(比 CommonJS 更高效)
  • 支持 tree-shaking(去掉没用到的代码)
  • 既能在浏览器直接运行,也能在 Node.js(新版本)中使用

👉 示例:

// foo.js
export const a = 1;// bar.js
import { a } from './foo.js';
console.log(a); // 1

📌区别

CommonJS vs ESM 的区别

对比维度CommonJSESM
语法require / module.exportsimport/ export
加载时机运行时加载(同步)编译时加载(静态)
导出方式整个对象(module.exports)默认导出 + 具名导出
导入结果require() 拿到的是对象副本import 拿到的是 绑定的引用
Tree Shaking❌ 不支持✅ 支持(Webpack、Rollup 等)
是否动态✅ 可以写 require(someVar) 动态导入❌ 只能静态导入(不过有 import() 动态语法)
执行顺序按代码执行顺序加载静态依赖分析后再执行
Node 默认支持✅ (默认)✅ (需 .mjs 后缀 或 package.json "type": "module")
浏览器支持❌ 原生不支持(需打包工具)✅ 现代浏览器原生支持 <script type="module">

📌使用场景

场景

CommonJS:

  • 主要在 Node.js 老项目中使用(兼容性好)
  • 适合脚本、工具类项目

ESM:

  • 现代前端开发的主流选择(React, Vue, Angular 全部用 ESM)
  • Tree-shaking、静态分析、跨平台更优
  • Node.js 16+ 也推荐逐步迁移到 ESM

直观理解

CommonJS 像是:“我执行到这里,才去加载另一个文件”。
ESM 像是:“我在编译时就知道要依赖哪些文件,先解析好,再运行”。

1. CommonJS (Node 里默认用的)

写法:require
导出方式:

// foo.js
// 方法1:exports
exports.a = 1;
exports.sayHi = () => console.log('hi');// 方法2:module.exports
module.exports = {b: 2,sayBye: () => console.log('bye')
};

导入方式:

const foo = require('./foo.js');
console.log(foo.a); // 1
foo.sayHi();        // hi
console.log(foo.b); // 2
foo.sayBye();       // bye

👉 CommonJS 里只有 require,没有 import {} 的语法。

2. ES Module (ESM,现代写法)

写法:import
导出方式:

// foo.mjs 或者 package.json 里加 "type": "module"
// 默认导出(只能有一个)
export default function() {console.log('default fn');
}// 具名导出(可以有多个)
export const a = 1;
export function sayHi() { console.log('hi'); }

导入方式:

// 默认导入
import foo from './foo.js'; 
foo(); // default fn// 具名导入
import { a, sayHi } from './foo.js';
console.log(a); // 1
sayHi();        // hi

3. 关键区别:import xxx vs import { xxx }

写法对应导出特点
import xxx from ‘./foo.js’export default …只能对应 一个默认导出
import { xxx } from ‘./foo.js’export const xxx = … / export function xxx…对应 具名导出,可以同时导入多个
import * as all from ‘./foo.js’所有导出(默认 + 具名)用对象的方式访问

4. CommonJS 和 ESM 混用情况

Node 现在也支持 import,但规则有点复杂:
如果模块是用module.exports = { ... }导出的:

// foo.js (CommonJS)
module.exports = { a: 1, b: 2 };// ESM 导入
import foo from './foo.js';    // 默认导入
console.log(foo.a); // 1import { a } from './foo.js';  // ❌ 会报错,找不到具名导出

如果模块是用exports.a = ... 导出的:
结果和上面一样,import {a} 在 ESM 里也不生效。
👉 所以 CommonJS 导出的对象 = ESM 的默认导出。

记忆口诀:

  • CommonJSmodule.exports 导出啥,require() 就拿到啥。
  • ESMexport default 对应 import xxxexport const xxx 对应 import { xxx }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96972.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自然处理语言NLP: 基于双分支 LSTM 的酒店评论情感分析模型构建与实现

文章目录数据预处理一、导入依赖库二、定义路径和基础参数三、构建词表字典&#xff08;data_deal函数&#xff09;四、文本转索引五、词表长度统计六、填充数据&#xff08;统一文本长度&#xff09;七、划分训练集和测试集八、批量加载数据完整代码简单模型构建步骤 1&#x…

nginx代理 flink Dashboard、sentinel dashboard的问题

nginx代理 flink web、sentinel dashboard的坑 Nginx反向代理Flink Dashboard和Sentinel Dashboard的问题 问题背景 问题分析(sentinel为例) 原理解析 1. 尾部斜杠的重要性 2. 修复方案的工作原理 3. 代理配置的细节 解决方案 经验总结 Nginx反向代理Flink Dashboard和Sentinel…

Baumer高防护相机如何通过YoloV8深度学习模型实现形状检测器的使用(YOLOv8 Shape Detector)

《------往期经典推荐------》 AI应用软件开发实战专栏【链接】 序号项目名称项目名称11.工业相机 YOLOv8 实现人物检测识别&#xff1a;&#xff08;C#代码&#xff0c;UI界面版&#xff09;2.工业相机 YOLOv8 实现PCB的缺陷检测&#xff1a;&#xff08;C#代码&#xff0…

代码随想录算法训练营第五十天|图论part08

软件构建&#xff08;拓扑排序&#xff09;题目描述&#xff1a;某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果文件 A 依赖于文件 B&#xff0c;则必须…

要闻集锦|阿里官网调整为四大业务板块;华为云重组多个事业部涉及上千人;群核科技在港交所更新招股书

互联网大事件阿里官网调整为四大业务板块阿里巴巴官网“我们的业务”板块变更&#xff0c;从六大业务集团其他业务变更为阿里中国电商集团、阿里国际数字商业集团、云智能集团及所有其他业务。饿了么、飞猪归入阿里中国电商集团&#xff0c;高德地图、菜鸟、优酷、大麦娱乐等归…

潇洒郎: Python实现检测鼠标移动和音视频播放行为——打造省电脚本

目标:Windows自动睡眠监控器,检测笔记本长时间无用户行为操作后进入睡眠模式以节省电量 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Windows自动睡眠监控器 检测笔记本长时间无用户行为操作后进入睡眠模式以节省电量 """ import os …

Qt工具栏中图标槽函数没有响应的问题分析

1、在ui_QtGuitTest.h中有定义 QAction *action_distanceMeasureQAction *action_distanceMeasure;在QtGuiTest.cpp的InitToolBar()函数中也有定义&#xff0c;如下图所示&#xff1a;2、槽函数为//距离测量槽函数 void QtGuiTest::slot_onDistanceMeasureButtonClicked() {_is…

Java中 0.05 + 0.01 ≠ 0.06 揭秘浮点数精度陷阱

目录 问题现象根本原因详细分析实际验证解决方案最佳实践总结 一开始看到这个说法的时候我还不相信&#xff0c;还以为之前我学的都错完了&#xff0c;研究之后才明白为什么 问题现象 令人困惑的计算结果 public class FloatPrecisionDemo {public static void main(Strin…

【44页PPT】DeepSeek在银行业务场景的应用(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808811/91716562 资料解读&#xff1a;【44页PPT】DeepSeek在银行业务场景的应用 详细资料请看本解读文章的最后内容。在智能化时代的浪潮下&#x…

TOPSIS

概述TOPSIS&#xff08;逼近理想解排序法&#xff09;是一种多属性决策方法&#xff0c;通过计算各方案与 “理想解”“负理想解” 的距离&#xff0c;排序选最优。操作步骤输入原始决策矩阵&#xff08;方案 指标&#xff09;&#xff1b;标准化处理&#xff08;消除量纲&…

Base64 编码优化 Web 图片加载:异步响应式架构(Java 后端 + 前端全流程实现)

异步响应式图片加载与Base64编码实现方案 在Web开发中&#xff0c;图片加载效率直接影响页面性能和用户体验。本文介绍一套基于Java后端和JavaScript前端的实现方案&#xff0c;通过Base64编码传输图片&#xff0c;结合异步加载和响应式布局&#xff0c;实现高效、安全的图片展…

【C语言】分支和循环

目录 前置&#xff1a;关系操作符和逻辑操作符 关系操作符 逻辑操作符 其他补充知识 分支语句&#xff1a; 一、if类 基本式&#xff1a;if... 变式1&#xff1a;if...else... 变式2&#xff1a;if...else if...else... 变式3&#xff1a;嵌套 二、switch 循环语句&…

商超客流密度统计误差率↓35%!陌讯多模态融合算法在零售智慧运营的实战解析

原创声明 本文为原创技术解析文章&#xff0c;核心技术参数与架构设计引用自 “陌讯技术白皮书&#xff08;2024 版&#xff09;”&#xff0c;技术描述均经过重写转换&#xff0c;无复制官网文案情况&#xff0c;仅用于计算机视觉技术交流与实战经验分享。 一、零售客流统计的…

游戏空间划分技术

【前言】 空间划分主要是为了降低搜索比较量&#xff0c;如果不采用空间划分&#xff0c;暴力遍历也是可以求解的&#xff0c;但耗时过长。通过空间划分将全局搜索简化为为局部搜索&#xff0c;大大降低搜索量。 搜索出来后最终还要是一一比较&#xff0c;比较的是距离&#…

【C#】观察者模式 + UI 线程调度、委托讲解

“观察者模式 UI 线程调度”的典型应用A. 涉及的知识点&#xff08;抽象&#xff09;观察者模式&#xff08;Observer Pattern&#xff09; 发布者&#xff1a;DemoDeviceService.cs 内部生成一帧数据 ScopeFrame&#xff0c;通过 OnScopeFrame?.Invoke(frame) 发布事件。订阅…

Linux应用软件编程---网络编程(TCP:[ 其他机制、头部标志位、应用示例 ]、 HTTP:[ 万维网、概念、格式、报文、应用示例 ]

一、TCP 网络协议补充内容1、TCP 的其他机制1&#xff09;TCP 头部的标志位TCP 头部可用抓包工具 (wireshark) 来查看。头部标志位用途SYN请求建立连接标志位ACK响应报文标志位PSH携带数据标志位&#xff0c;通知接收方该从缓冲区读数据FIN请求断开连接标志位RST复位标志位URG紧…

基于开源飞控pix的无人机装调与测试

文章目录 前言资源下载1、地面站软件独家汉化版QGC地面站&#xff08;推荐&#xff09;原版QGC地面站Mission Planner地面站 2、安装好环境的虚拟机安装虚拟机打开虚拟机文件 3、完整的各版本PX4、QGC源码PX4QGC 一、无人机基本常识/预备知识&#xff08;1&#xff09;无人机飞…

Ubuntu解决makefile交叉编译的问题

问题1&#xff1a;/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: cannot find -lwiringpi: No such file or directory 找不到-lwiringpi库路径&#xff0c;其实在3rd/usr/lib/aarch64-linux-gnu下没有libwiringPi.so.2 …

ExcelUtils实现 设置内容 插入行 复制行列格式

ExcelUtils实现&#xff1a;1.实现输入 例如 2 A 的excel格式&#xff0c;自动填充对应excel单元格&#xff1b;2.实现复制并新增下一行&#xff1b;3.实现控制复制上一行相同列的格式&#xff1b;4.实现控制复制同一行上一列的格式&#xff1b;/*** 在指定行下方插入新行并复…

SQLBot 智能问数、数据洞察逻辑拆解

* 基于 SQLBot v1.0.2* 使用 AI Gateway 抓取模型调用记录SQLBot 通过融入 LLM 能力实现了非常优秀的问数体验&#xff0c;这里记录一下产品中如何引入 AI 能力&#xff0c;顺便探究一下调用大模型的数据安全的问题&#xff08;是否会向模型提供真实数据&#xff09;。结论&…