JavaScript模块加载器本质是解决浏览器端无法原生按需、异步、有依赖地加载代码的问题;require.js作为AMD代表填补了ES6前的空白,而ES6模块是语言级标准,已被现代浏览器和Node.js原生支持,静态分析、实时绑定、动态import等特性使其取代require.js成为主流。

JavaScript 模块加载器,本质是为了解决浏览器端“无法原生按需、异步、有依赖地加载代码”的问题。在 ES6 之前,浏览器没有 import 和 export,所有脚本默认全局执行,靠 标签顺序加载——既阻塞渲染,又难管理依赖。模块加载器就是填补这个空白的运行时工具。
require.js 是典型的 AMD 模块加载器
它用 define() 定义模块,用 require([deps], callback) 异步加载依赖并执行回调。比如:
require(['jquery', 'utils'], function($, utils) {
$('#btn').click(utils.handle);
});
这种写法让模块可声明依赖、延迟执行、不阻塞页面,解决了传统多 script 标签的两大痛点:加载卡顿和顺序错乱。
立即学习“Java免费学习笔记(深入)”;
ES6 模块是语言级标准,无需额外加载器
浏览器从 Chrome 61+、Firefox 60+ 开始原生支持 import/export,Node.js 也从 v13.2+(配合 .mjs 后缀或 "type": "module")支持。关键差异在于:
- 静态分析:import 必须在顶层,编译期就能确定依赖图,便于打包工具优化、tree-shaking
- 实时绑定:export 的值是动态引用(不是拷贝),模块内变量更新,import 处能感知
-
天然支持顶层 await、动态 import():现代语法更灵活,且
import()返回 Promise,本身已是异步加载方案
RequireJS 被取代不是因为不好,而是环境变了
它曾是浏览器模块化的关键过渡方案,但如今已成历史角色:
- 现代构建工具(Vite、Webpack、Rollup)直接处理 ES 模块,自动做代码分割、懒加载,不再需要手写 define/require
- 原生
type="module"script 支持直接在 HTML 中使用 import,零配置启动 - RequireJS 自身维护停滞(最新版 2.3.6 发布于 2025 年初),社区重心完全转向 ESM 生态
- 它无法与现代特性深度集成,比如无法直接 import npm 包(需额外配置 shim),而 ESM 可无缝对接 package.json 的 exports 字段
简单说:require.js 是给没有模块能力的浏览器“打补丁”,ES6 模块是浏览器自己长出了这块肌肉——补丁自然卸载。











