前端构建产物里的 __esModule 是什么?一次讲清楚它的原理和作用
如果你经常翻构建后的代码基本都会看到这样一行Object.defineProperty(exports, __esModule, { value: true });很多人第一次看到都会疑惑这是干嘛的能删吗不加会怎么样和 default 导出有什么关系这篇文章专门把这个现象讲清楚。太长不看版Object.defineProperty(exports, __esModule, { value: true });本质就是标记“这个CommonJS 文件是从 ES Module转译来的”用于默认导出语义的互操作。它不是功能代码不是业务逻辑。它只是模块系统演化过程中的一个兼容标志。一、为什么会出现__esModule根本原因只有一个ES Module 和 CommonJS 的语义不一样。我们简单对比一下。ES Moduleexport default function foo() {}CommonJSmodule.exports function foo() {}两者看起来都叫“默认导出”但内部机制完全不同。当构建工具TypeScript / Babel​​​​​​​/Webpack /Rspack等把 ESM 转成 CJS 时语义必须“模拟”出来。于是就变成Object.defineProperty(exports, __esModule, { value: true }); exports.default foo;关键问题来了如何区分“普通 CJS 模块”和“从 ESM 转过来的 CJS 模块”这就是__esModule存在的意义。二、__esModule到底做了什么它只是一个标记。exports.__esModule true之所以用Object.defineProperty是为了不可枚举更符合 Babel 的标准输出避免污染遍历结果本质就是告诉别人这个模块原本是 ES Module。仅此而已。三、真正的核心默认导出的互操作问题来看一个经典场景。1️⃣ 原始 ESMexport default function foo() {}2️⃣ 被编译成 CJSexports.default foo;3️⃣ 用 CommonJS 引入const foo require(./foo);得到的其实是{ default: [Function: foo] }这就有问题了。我们希望的是foo() // 直接调用而不是foo.default()于是构建工具会生成一个 helperfunction _interopRequireDefault(obj) { return obj obj.__esModule ? obj : { default: obj }; }逻辑是如果模块带有__esModule标记 → 说明是 ESM 转的 → 直接用default如果没有 → 说明是普通 CJS → 包一层{ default: obj }这就是整个互操作的关键。四、为什么不能只判断default属性因为普通 CJS 也可能写module.exports { default: something }这时你没法区分是 ESM 编译产物还是普通对象刚好有个 default 字段所以必须有一个“官方标记”。__esModule就成了事实标准。五、什么时候会生成它只要发生ESM → CJS 转译基本都会生成。常见场景TypeScript 编译为module: commonjsBabel preset-env 输出 CJSWebpack / Rspack 输出 target 为 node CJS老 Node 项目混用 import / require如果你使用{ type: module }并且输出原生 ESM那就不会有__esModule。它只存在于“模块系统过渡时代”。注意它不是 JS 语言特性非常重要的一点__esModule不是语言规范的一部分。它是Babel 约定构建器约定社区事实标准是一种“工程层解决方案”。换句话说它属于模块系统演化历史的一部分。从更高层看模块系统的过渡遗产JavaScript 的模块系统经历了三代无模块全局变量时代CommonJSNode 时代ES Module标准化但 Node 生态已经建立在 CJS 上。所以必须有一个桥接层。__esModule就是这座桥的一块砖。它存在的原因不是设计优雅而是历史兼容。

相关新闻

RexUniNLU零样本文本分类实战:电商评论三分类(正/负/中)教程

RexUniNLU零样本文本分类实战:电商评论三分类(正/负/中)教程

RexUniNLU零样本文本分类实战:电商评论三分类(正/负/中)教程 你是不是也遇到过这样的烦恼?每天面对海量的电商评论,想快速知道用户是夸还是骂,却苦于没有标注好的数据去训练模型。手动一条条看&#xff1f…

2026/5/17 8:21:04 阅读更多 →
Java SpringBoot+Vue3+MyBatis 饮食分享平台系统源码|前后端分离+MySQL数据库

Java SpringBoot+Vue3+MyBatis 饮食分享平台系统源码|前后端分离+MySQL数据库

摘要 随着互联网技术的快速发展和人们生活水平的提高,饮食健康逐渐成为社会关注的焦点。现代人对于饮食的需求不再局限于简单的温饱,而是追求营养均衡、个性化搭配和社交分享。传统的饮食信息传播方式,如纸质食谱或电视节目,已经无…

2026/5/17 9:18:18 阅读更多 →
前后端分离智能停车计费系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

前后端分离智能停车计费系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着城市化进程的加快,机动车保有量持续增长,传统停车管理模式已难以满足高效、智能化的需求。停车难、收费不透明、管理效率低下等问题日益突出,亟需一种基于现代信息技术的智能停车解决方案。智能停车计费系统通过整合物联网、云计算和…

2026/5/17 9:18:17 阅读更多 →

最新新闻

如何3步完成iOS激活锁绕过:面向A9-A11设备的完整指南

如何3步完成iOS激活锁绕过:面向A9-A11设备的完整指南

如何3步完成iOS激活锁绕过:面向A9-A11设备的完整指南 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 你是否曾遇到过这样的情况:购买二手iPhone后却卡在激活锁界面无法使用&…

2026/7/4 12:39:05 阅读更多 →
Android ML Kit人脸比对技术实现与优化

Android ML Kit人脸比对技术实现与优化

1. Android ML Kit 人脸比对技术解析在移动应用开发中,人脸识别技术已经成为身份验证、社交互动等场景的核心功能。Google提供的ML Kit人脸识别API为开发者提供了便捷高效的解决方案。不同于传统的人脸比对方式(如直接比较像素值)&#xff0c…

2026/7/4 12:39:05 阅读更多 →
机器学习可观测性实战:构建数据-模型-业务三层健康保障体系

机器学习可观测性实战:构建数据-模型-业务三层健康保障体系

1. 项目概述:这不是一次模型训练,而是一场交付实战“From Notebook to Production: Running ML in the Real World (Part 4)”——光看标题,你可能以为这是某套系列教程的第四讲,讲点模型部署或API封装。但如果你真在一线做过三个…

2026/7/4 12:37:05 阅读更多 →
STM32与LP5812实现动态灯光控制方案

STM32与LP5812实现动态灯光控制方案

1. 项目背景与硬件选型解析 在嵌入式系统开发中,动态灯光效果已经成为提升用户交互体验的重要手段。这次我选择了STM32F429ZI作为主控芯片,搭配德州仪器的LP5812 RGB LED驱动器,构建了一套高灵活性的灯光控制系统。这个组合特别适合需要复杂灯…

2026/7/4 12:37:05 阅读更多 →
深度学习优化器对比实验:固定网络下6种optimizer性能全解析

深度学习优化器对比实验:固定网络下6种optimizer性能全解析

1. 项目概述:为什么同一个神经网络要换着 optimizer 跑? “Training the Same Neural Network with Different Optimizers”——这个标题看起来像一句实验课作业要求,但背后藏着深度学习实践中最常被忽视、却影响最深远的底层逻辑&#xff1a…

2026/7/4 12:37:05 阅读更多 →
OpenSSH私钥加密:bcrypt KDF原理、实现与安全实践

OpenSSH私钥加密:bcrypt KDF原理、实现与安全实践

1. 项目概述:bcrypt在OpenSSH密钥加密中的角色如果你用过OpenSSH,一定对ssh-keygen命令生成密钥时那个“Enter passphrase”的提示不陌生。这个“passphrase”就是用来加密你的私钥的。很多人可能以为这只是个简单的密码保护,但背后其实是一套…

2026/7/4 12:35:04 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻