0

0

javascript模块化如何实现_ES6模块与CommonJS有何区别【教程】

夜晨

夜晨

发布时间:2026-02-01 17:55:28

|

968人浏览过

|

来源于php中文网

原创

ES6模块与CommonJS本质不同:前者静态、编译期确定依赖,后者动态、运行时加载;混用会导致ReferenceError、undefined导出等问题,需依场景选择并正确配置。

javascript模块化如何实现_es6模块与commonjs有何区别【教程】

ES6 模块(import/export)和 CommonJS(require/module.exports)不是“换种写法就行”的关系——它们在加载时机、导出行为、循环引用处理、运行时表现上根本不同。直接混用或盲目替换会触发 ReferenceErrorundefined 导出、甚至打包器报错。

ES6 模块是静态的,CommonJS 是动态的

这是最核心差异。ES6 的 import 必须在模块顶层,不能放在 if 或函数里;而 require 可以随时调用,支持条件加载、拼接路径等运行时逻辑。

常见错误现象:

  • import 写在 if 块里 → 语法错误:Cannot use import statement outside a module
  • import { foo } from './utils.js'utils.js 实际是 CommonJS 格式(无 export)→ Node.jsCannot access 'foo' before initialization 或导入为 undefined

实操建议:

立即学习Java免费学习笔记(深入)”;

  • Node.js 中启用 ES6 模块需在 package.json"type": "module",否则默认按 CommonJS 解析
  • 若想在 CommonJS 文件中导入 ES6 模块,必须用 await import('./es-module.js')(动态导入),不能用 require
  • Webpack/Vite 等工具能自动处理互转,但底层仍依赖静态分析 —— 所以 export 不能写在条件分支里

export defaultmodule.exports 不是一对一映射

ES6 的 export default 导出的是一个值的**绑定**(binding),CommonJS 的 module.exports 是一个可随意赋值的对象引用。这意味着:

  • ES6 中修改 export default 对应的变量,其他模块看到的值会实时更新(如计数器、状态对象)
  • CommonJS 中一旦执行 module.exports = xxx,后续再改 xxx 不会影响已导出的值

示例对比:

// esm.js
let count = 0;
export default () => ++count;

// cjs.js
let count = 0;
module.exports = () => ++count;

如果两个文件都被多次 import / require,ES6 版本共享同一份 count;CommonJS 版本每次 require 都新建闭包,count 各自独立。

循环引用时,ES6 返回未初始化的绑定,CommonJS 返回已执行的 exports 对象

这是最容易踩坑的场景。比如 A 导入 B,B 又导入 A:

Melodrive
Melodrive

Melodrive -一个AI音乐引擎,根据用户的情绪状态和喜好生成个性化的音乐。

下载
  • CommonJS:A 执行到 require('./b') 时,B 已导出空 exports 对象,A 拿到它继续执行;B 后续给 exports.xxx 赋值,A 能读到
  • ES6:A 的 import { x } from './b' 在解析阶段就建立绑定,但此时 B 还没执行完,xundefined;即使 B 后面 export const x = 1,A 中的 x 仍为 undefined(除非用 export default 或命名导出后立即赋值)

实操建议:

立即学习Java免费学习笔记(深入)”;

  • 避免循环引用 —— 提取公共逻辑到第三个模块
  • 若必须循环,ES6 下优先用 export default(它不依赖命名绑定顺序),或确保导出语句在模块顶部且无依赖
  • Node.js 的 require 缓存机制会让循环引用“看起来工作”,但这不是可靠设计依据

浏览器中只能用 ES6 模块,Node.js 默认只认 CommonJS

浏览器原生只支持 type="module",不理解 require;Node.js v12+ 支持 ES6 模块,但需显式声明(.mjs 后缀或 "type": "module"),否则一律当 CommonJS 处理。

常见错误现象:

  • 在 HTML 中写 ,但 index.js 用了 import → 控制台报 Uncaught SyntaxError: Cannot use import statement outside a module
  • Node.js 中 index.jsimport 却没设 "type": "module"SyntaxError: Cannot use import statement outside a module

实操建议:

立即学习Java免费学习笔记(深入)”;

  • 浏览器端:用 ,路径必须是相对/绝对 URL(不能省略 .js
  • Node.js:要么统一用 .mjs 后缀,要么在 package.json 顶层加 "type": "module";混合项目可用 createRequire 兼容旧代码
  • 跨环境库(如工具函数包)建议同时提供 ESM 和 CJS 构建产物,并在 package.json 中用 "exports" 字段精确控制入口

真正难的不是语法转换,而是理解两种模块系统背后的设计哲学:一个是编译期确定依赖图、强调不可变绑定与静态分析;另一个是运行时灵活加载、强调可变状态与动态能力。很多“兼容问题”其实源于强行把一种范式套进另一种约束里。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

422

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

537

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

106

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

195

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

223

2025.12.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

785

2023.08.22

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

30

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号