Node.js 模块系统:CJS 与 ESM 详解
文章目录前言一、CommonJS (CJS)二、ESMES Module三、跨模块互相导入重要坑点四、有关路径的要求总结前言Node.js 两套模块系统CommonJS(CJS)、ESM由package.json和文件后缀共同决定。JavaScript 最初没有模块系统Node.js 诞生后自行实现 CommonJSrequire/module.exports用于服务端并非语言官方标准。随后ES6 推出官方标准 ESMimport/export支持浏览器与 Node支持静态分析但 Node 为兼容海量旧生态没有直接替换 CommonJS。于是 Node 两套模块共存依靠package.json type和文件后缀.mjs/.cjs区分由此产生各类导入语法差异。一、CommonJS (CJS)要求如下package.json: “type”: “commonjs” 默认值不写type也是CJS文件后缀.js - CJS; .cjs - 强制 CJS无视package.json语法require() / module.exports不能用import/export导出helpers.js// 方式1整体导出对象最常用module.exports{func1,func2};// 方式2逐个挂载exports.func1func1;exports.func2func2;导入main.js// ✅ 本地文件必须 ./ 开头后缀 .js 可以省略建议写上const{func1,func2}require(./helpers.js);// ❌ 错误不带 ./node会去node_modules查找npm包const{func1}require(helpers);require(./helpers)省略后缀也可以Node 自动补.js/.json。只能用.js后缀不能命名为.mjs。运行命令node main.js二、ESMES Modulepackage.jsontype:module文件后缀.mjs→ 强制 ESM完全忽略 package.json 的 type 配置语法import / export原生不能直接用require()重点.mjs永远 ESM.cjs永远 CJS普通.js看package.json的type字段。导出helpers.js:// 方式1声明时直接导出exportasyncfunctionloadPackage(){}// 方式2末尾集中导出export{loadPackage};// 默认导出exportdefault{loadPackage};导入main.mjs:// ✅本地文件必须 ./ 开头**后缀 .js 不能省略ESM不会自动补后缀**import{loadPackage}from./helpers.js;// 如果导入的是CJS模块helpers.js是module.exports也可以default导入importhelpersfrom./helpers.js;const{loadPackage}helpers;// ❌错误1无 ./当作npm包import{loadPackage}fromhelpers;// ❌错误2省略后缀ESM直接报模块找不到import{loadPackage}from./helpers;当文件是.mjs就算 package.json 是commonjs依然执行 ESM 语法。运行node generateTestcase.mjs三、跨模块互相导入重要坑点ESM (.mjs) 导入 CJS (.js):允许CJS 的module.exports对象被 ESM 识别支持解构导入。import{loadPackage}from./helpers.js;// 结构导入// 或者使用CJS的原生require导入import{createRequire}frommodule;constrequirecreateRequire(import.meta.url);// Enable require in ESMconstpkgrequire(pkgPath);CJS 导入 ESMCJS 的require()不能直接 require ESM 文件会报错只能用动态await import()。// CJS里面加载ESM模块只能动态importconstesmModuleawaitimport(./some-esm.js);四、有关路径的要求ESM 动态导入await import其路径必须是file://开头的 URL 字符串指向本地磁盘文件。不接受windows系统的反斜杠。// ✅ 本地磁盘文件必须转成file:// URLconsturlpathToFileURL(absDiskPath).href;constmodawaitimport(url);constabsFsPathC:\\Users\\LIly\\file.js;// path.resolve得到带反斜杠 const url pathToFileURL(absFsPath).href; // ✅API内部自动处理反斜杠 → file:///C:/... const mod await import(url);awaitimport(./dir/test.js);// ✅ 只能正斜杠 await import(./dir\\test.js);// ❌ 反斜杠不行同静态import// Windows反斜杠转换functionnormalizeSlash(p){if(isWindows()){returnp.replace(/\\/g,/);}returnp;}ESM 静态导入 import xxx from “xxx”静态导入不接受 file:// URL也不接受操作系统磁盘绝对路径C:\xxx /home/xxx。不接受Windows的反斜杠。静态导入只有两类合法输入裸模块名npm 包、node 内置模块lodash、fs/promisesimportxfromlodash相对说明符./xxx.js、…/xxx.jsimportxfrom./dir\\test.js;// ❌错误\是字符串转义符号路径直接错乱importxfrom./dir/test.js;// ✅只能正斜杠 /require的动态导入操作系统原生磁盘路径完全接纳 Windows 反斜杠\唯一坑给 require 的相对本地文件路径必须带上./或者../否则会被识别成npm包。letpath./helper.js;constmrequire(path);// ✅完全合法if(flag){require(./other.js)}总结Node.js 中 CJS 与 ESM 双模块系统共存核心区分逻辑是package.json的type字段 文件后缀.mjs/.cjsCJSrequire/module.exportstype: commonjs或默认require对本地文件路径带./后缀.js可省略。ESMimport/exporttype: module或.mjs后缀强制import必须写./且后缀不可省略。跨模块导入ESM 导入 CJS 一般没问题支持解构导入反过来 CJS 用require加载 ESM 会直接报错必须用动态await import()。日常开发先确认项目根目录package.json的type再决定用哪个文件后缀和导入语法可以避免绝大多数模块解析错误。导入方式类型执行时机静态 / 动态路径完整要求Windows 反斜杠支持相对路径要求CommonJSrequire()运行时函数调用执行到该行才加载✅动态导入1. npm 包直接写包名2. 本地文件操作系统原生磁盘路径不需要 file:// 协议✅兼容\与/本地相对文件必须带.//../不带则识别为 npm 包后缀可省略ESM 静态导入import xxx from xxxJS 语法解析阶段代码运行前✅静态导入1. npm 包直接写包名2. 本地文件仅允许.//../相对说明符禁止 file://、禁止磁盘绝对路径只能字符串字面量不能变量❌禁止\只能正斜杠/必须.//../前缀必须写完整.js后缀不可省略ESM 动态导入await import(xxx)Promise 函数调用执行到该行才加载✅动态导入1. npm 包直接写包名2. 本地磁盘文件必须传入file://URL不能直接传操作系统磁盘路径支持变量传参❌不要手动处理\原始磁盘路径交给pathToFileURL()自动转 URL字面量写./xxx.js规则同静态导入变量加载本地文件必须转为file://

相关新闻

DAQ 不是“慢速示波器”,它解决的是另一类问题

DAQ 不是“慢速示波器”,它解决的是另一类问题

当问题不再发生在纳秒级,而是表现为几小时、几天甚至更长尺度上的变化时,DAQ 的价值才真正显现。 DAQ 面向多通道、长时间的系统级测量(图片来源:DigiKey)摘要:很多人把 DAQ 理解成“采样慢一点、记录久一点…

2026/8/8 8:01:16 阅读更多 →
AI总结幻觉:三大类型拆解与可落地的检测缓解方案

AI总结幻觉:三大类型拆解与可落地的检测缓解方案

1. 从一次真实的“翻车”现场说起上周,我们团队内部评审一个即将上线的智能文档分析功能。产品经理信心满满地演示:用户上传一份50页的行业研究报告,我们的AI助手能在30秒内生成一份结构清晰、要点突出的千字摘要。演示很顺利,摘要…

2026/8/8 8:01:16 阅读更多 →
AI辅助编程实战:用Python与Pygame开发经典贪吃蛇游戏

AI辅助编程实战:用Python与Pygame开发经典贪吃蛇游戏

1. 项目概述:当经典游戏开发遇上AI助手 最近几年,AI编程工具的发展速度确实让人惊讶。作为一名有十多年编程经验的开发者,我最初对这类工具的态度是怀疑的——它们能写出真正可用的代码吗?会不会只是生成一些华而不实的“玩具”&a…

2026/8/8 8:01:16 阅读更多 →

最新新闻

docker学习日志(完善中)

docker学习日志(完善中)

一、安装docker 1.1 配置更新yum yum update -yyum install -y yum-utils device-mapper-persistent-data lvm2 git注: yum-utils yum管理工具,另外两个是devicemapper驱动依赖,和git工具 1.2 配置yum源 yum-config-manager --add-repo http:…

2026/8/8 18:21:41 阅读更多 →
深度探索:deepcpgdna-smallwood2014-2i的Conv1D层如何提取DNA序列特征

深度探索:deepcpgdna-smallwood2014-2i的Conv1D层如何提取DNA序列特征

Nano Node完全指南:如何构建零费用的数字货币节点 【免费下载链接】nano-node Nano is digital currency. Its ticker is: XNO and its currency symbol is: Ӿ 项目地址: https://gitcode.com/gh_mirrors/na/nano-node Nano是一种创新的数字货币&#xff0c…

2026/8/8 18:21:41 阅读更多 →
终极PT助手:如何用PT-Plugin-Plus插件3倍提升你的下载效率

终极PT助手:如何用PT-Plugin-Plus插件3倍提升你的下载效率

终极PT助手:如何用PT-Plugin-Plus插件3倍提升你的下载效率 【免费下载链接】PT-Plugin-Plus PT 助手 Plus,为 Microsoft Edge、Google Chrome、Firefox 浏览器插件(Web Extensions),主要用于辅助下载 PT 站的种子。 …

2026/8/8 18:21:41 阅读更多 →
构建RF-Clown:ESP32与nRF24L01三通道无线干扰器完全指南

构建RF-Clown:ESP32与nRF24L01三通道无线干扰器完全指南

构建RF-Clown:ESP32与nRF24L01三通道无线干扰器完全指南 【免费下载链接】nRF-jammer BLE and Bluetooth Jammer with nRF24L01 and ESP32 项目地址: https://gitcode.com/gh_mirrors/nr/nRF-jammer RF-Clown是一款基于ESP32和nRF24L01模块的开源便携式无线干…

2026/8/8 18:20:41 阅读更多 →
深度解析DeepCpG-DNA:hou2016-hcc模型如何精准预测单细胞DNA甲基化状态

深度解析DeepCpG-DNA:hou2016-hcc模型如何精准预测单细胞DNA甲基化状态

Go INI库多行值处理:Python风格与AWS嵌套值的完整实现 【免费下载链接】ini Package ini provides INI file read and write functionality in Go 项目地址: https://gitcode.com/gh_mirrors/in/ini 在Go语言生态中,INI配置文件解析是一个常见需求…

2026/8/8 18:20:41 阅读更多 →
5分钟掌握暗黑破坏神2存档编辑器:轻松定制你的游戏体验

5分钟掌握暗黑破坏神2存档编辑器:轻松定制你的游戏体验

5分钟掌握暗黑破坏神2存档编辑器:轻松定制你的游戏体验 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2中重复刷装备而烦恼吗?想快速体验不同职业Build却不想从头练级?d2s-e…

2026/8/8 18:20:41 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/8 17:02:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/8 8:58:26 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/8 17:02:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/8 17:02:44 阅读更多 →