JavaScript模块化以ES6 import/export为核心,支持命名导出、默认导出及混合导入;具静态性、单例性、实时绑定等特性,与CommonJS的值拷贝和动态加载有本质区别。
JavaScript 的模块化开发主要通过 ES6 的 import 和 export 语法实现,它原生支持静态分析、编译时检查和树摇优化,是现代前端开发的标准方式。
一个模块文件(如 math.js)可以使用多种方式导出变量、函数或类:
export const PI = 3.14159;
export function add(a, b) { return a + b; }
export class Calculator { /* ... */ }export default function debounce(fn, delay) { /* ... */ }导入需与导出方式匹配,且路径必须是字符串字面量(不能拼接):
{},可重命名(as)import { PI, add } from './math.js';
import { add as sum } from './math.js'; // 重命名import debounce from './utils.js'; import myDebounce from './utils.js'; // 名字随意
import debounce, { PI, add } from './math.js'; // 默认在前
,命名在后import * as math from './math.js'; console.log(math.PI, math.add(2, 3));
ES6 模块是静态的、顶层的、单例的,这些特性决定了它的行为边界:
./ 或 ../)或绝对(以 / 开头)URL,不支持动态字符串 加载,否则会报错ES6 模块不是对象,而是绑定关系(live binding):
module.exports / require)导出的是值的快照,修改原始变量不影响已导入值