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/10/18 12:10:31 阅读更多 →
AI总结幻觉:三大类型拆解与可落地的检测缓解方案

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

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

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

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

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

2026/10/17 9:25:21 阅读更多 →

最新新闻

零基础也能创建AI智能体:三步搭建个人助手实战指南

零基础也能创建AI智能体:三步搭建个人助手实战指南

身边很多朋友一听到“AI智能体”这个词,第一反应都是:这玩意儿是不是得先学三个月Python,再搞懂什么API调用、微调模型,才配碰一碰?其实真不是。我刚开始接触的时候也抱着同样的刻板印象,直到我自己用纯聊天…

2026/10/18 16:49:44 阅读更多 →
JSP篇之JSP基础语法

JSP篇之JSP基础语法

JSP简介 (图片来源:慕课网) 常见的动态网站开发技术对比 (图片来源:慕课网) JSP页面元素简介以及page指令 JSP元素的构成 (图片来源:慕课网) 指令: JSP指…

2026/10/18 16:49:43 阅读更多 →
佳能相机SDK开发指南:从工业视觉接入到RAW实时处理

佳能相机SDK开发指南:从工业视觉接入到RAW实时处理

简介:本资源为佳能官方相机SDK开发套件,面向Windows平台C/VB开发者,用于构建远程控制、参数调节与图像采集类摄影应用,解决专业相机集成开发中API调用、库链接与环境配置等核心问题。压缩包共854个文件,174.44MB&#…

2026/10/18 16:49:43 阅读更多 →
高通平台音频驱动实战:从ASoC到音频DSP的完整链路

高通平台音频驱动实战:从ASoC到音频DSP的完整链路

刚接手高通平台安卓音频驱动开发时,我一度以为主要工作是改内核设备树、调codec寄存器。真正动手才发现,最耗时间的不是写代码,而是先把一条声音从APP到喇叭的完整链路弄清楚。高通平台的音频驱动和教科书里标准Linux ASoC架构有挺大区别&…

2026/10/18 16:49:43 阅读更多 →
ABS轮速传感器原理与故障排查:从磁电式到霍尔式的信号解读

ABS轮速传感器原理与故障排查:从磁电式到霍尔式的信号解读

简介:这是一份系统讲解ABS车轮速度传感器基本结构与工作原理的技术文档,适合汽车维修技师、汽车电子专业学生及对ABS系统感兴趣的从业者学习参考。资源包内含1个doc文档,压缩包整体仅226KB,聚焦轮速传感器的核心知识模块&#xff…

2026/10/18 16:49:43 阅读更多 →
Nacos 2.4.3 服务端部署实战:从单机到集群的落地指南

Nacos 2.4.3 服务端部署实战:从单机到集群的落地指南

简介:nacos-server-2.4.3.zip 是面向微服务开发者与运维人员的 Nacos 服务端发行包,对应 2.4.3 版本,可用于搭建服务注册与发现、动态配置管理及服务元数据管理平台,兼容 Spring Cloud、Dubbo、Kubernetes 等主流微服务生态&#…

2026/10/18 16:48:43 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →