+
27
-

回答

JavaScript 的四种常见模块格式(IIFE、ESM、UMD、CJS)主要区别在于使用场景、语法和兼容性。以下是简明对比:

1. IIFE(Immediately Invoked Function Expression)

本质:不是模块系统,而是一种立即执行函数的写法。

特点

用 (function(){...})() 包裹代码,避免污染全局作用域。

无模块导入/导出能力

用途:早期浏览器端“伪模块”,现已基本被替代。

示例

(function() {
  var name = 'IIFE';
  window.myLib = { name };
})();

2. CJS(CommonJS)

环境:Node.js 原生支持(不支持浏览器直接运行)。

语法

导出:module.exports = ... 或 exports.xxx = ...

导入:const mod = require('mod')

特点

同步加载,适合服务器端。

每个文件是一个模块。

示例

// math.js
exports.add = (a, b) => a + b;

// main.js
const { add } = require('./math');

3. ESM(ECMAScript Modules)

环境:现代浏览器 + Node.js(需 .mjs 或 package.json 中设 "type": "module")。

语法

导出:export / export default

导入:import xxx from '...'

特点

静态分析(编译时确定依赖),支持 tree-shaking。

异步加载(浏览器中)。

示例

// math.js
export const add = (a, b) => a + b;

// main.js
import { add } from './math.js';

4. UMD(Universal Module Definition)

目标一套代码兼容多种环境(浏览器全局变量 / AMD / CommonJS)。

用途:开源库(如 jQuery、Lodash)常用,确保在任何环境下都能用。

特点:代码较复杂,是“兼容性兜底方案”。

示例(简化版):

(function (root, factory) {
  if (typeof module === 'object' && module.exports) {
    // CommonJS
    module.exports = factory();
  } else if (typeof define === 'function' && define.amd) {
    // AMD
    define(factory);
  } else {
    // 浏览器全局变量
    root.myLib = factory();
  }
}(typeof self !== 'undefined' ? self : this, function () {
  return { name: 'UMD' };
}));

趋势:新项目优先用 ESM;发布库时可打包成 UMD + ESM 双版本。

网友回复

我知道答案,我要回答