ES、CommonJS、AMD三种 JavaScript模块化方案的区别与实现原理

2023-06-1307:25:18编程语言入门到精通Comments822 views字数 2391阅读模式

前端技术的不断发展,大型 web 应用越来越复杂和庞大,为了使代码更加规范化、可读性更好、易于维护和重构,也为了支持模块化编程,各大浏览器和 Node.js 都提供了自己的 JavaScript 模块化方案。其中,ES、CommonJS 和 AMD 是比较常见的三种模块化方案,本文将对它们进行详细的分析并比较其优缺点。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

ES6 的模块化

ES6 标准在 2015 年发布,引入了一套全新的模块化系统,该系统被称为 ES6 模块化。ES6 模块化是代码静态编译时进行解析的,因此模块内部不能使用条件语句等动态语言特性。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

导出

ES6 模块化使用 export 关键字将变量或函数导出:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

// 导出一个变量
export const name = 'Tom';

// 导出一个函数
export function sayHello() {
  console.log('Hello!');
}

// 导出一个类
export class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  sayHi() {
    console.log(`Hi, I'm ${this.name}.`);
  }
}

导入

ES6 模块化使用 import 关键字将模块导入:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

// 导入一个变量或函数
import { name, sayHello } from './module';

// 导入一个类
import { Person } from './module';

// 导入全部
import * as module from './module';

特点

ES6 模块化是官方标准,将成为未来 web 开发的主流方案。其特点如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

  • 代码静态编译时进行解析,不支持动态语言特性;
  • 编写简单,易于理解和维护;
  • 支持循环依赖;
  • 可以通过 export default 导出一个默认值,而其他方案不支持此功能。

CommonJS

CommonJS 是 Node.js 的模块化方案,在 Node.js 中,每个文件都是一个模块。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

导出

CommonJS 使用 module.exports 将模块导出:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

// 导出一个变量
module.exports.name = 'Tom';

// 导出一个函数
module.exports.sayHello = function() {
  console.log('Hello!');
};

// 导出一个类
module.exports.Person = class {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  sayHi() {
    console.log(`Hi, I'm ${this.name}.`);
  }
};

导入

CommonJS 使用 require 函数将模块导入:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

// 导入一个变量或函数
const { name, sayHello } = require('./module');

// 导入一个类
const { Person } = require('./module');

// 导入全部
const module = require('./module');

特点

CommonJS 是 Node.js 自带的模块化方案,也是目前大多数 Node.js 开发者使用的方案。其特点如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

  • 支持动态语言特性;
  • 不能在浏览器中使用,因为浏览器不支持 module.exports 语法。

AMD

AMD(Asynchronous Module Definition)是由 RequireJS 提出的一种 JavaScript 模块化规范,主要用于浏览器端的模块化开发。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

导出

AMD 使用 define 函数将模块导出:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

define('module', [], function() {
  var name = 'Tom';

  function sayHello() {
    console.log('Hello!');
  }

  return {
    name: name,
    sayHello: sayHello
  };
});

导入

AMD 使用 require 函数将模块导入:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

require(['module'], function(module) {
  console.log(module.name);
  module.sayHello();
});

特点

AMD 是一种异步的模块化方案,主要用于浏览器端的模块化开发。其特点如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

  • 支持动态加载模块;
  • 适用于多个模块之间存在依赖关系的情况。

ES6、CommonJS 和 AMD 的比较

加载方式

ES6 模块化是通过静态分析,在代码编译时就确定了模块之间的依赖关系。在浏览器中,可以通过 <script type="module"> 标签来加载 ES6 模块。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

CommonJS 是通过 require 函数动态加载模块的,而且 require 函数是同步进行的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

AMD 是通过 define 函数定义模块并异步加载模块的,或者使用 require 函数进行异步加载。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

兼容性

ES6 模块化标准是现代 web 开发的趋势,但是目前仍有一些浏览器不支持 ES6 模块化,需要通过工具(如 Babel)进行转换后才能使用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

CommonJS 是 Node.js 自带的模块化方案,在浏览器中无法使用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

AMD 是由 RequireJS 提出的一种模块化规范,需要引入 RequireJS 库才能使用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

循环依赖

ES6 模块化支持循环依赖,即模块 A 可以依赖于模块 B,同时模块 B 也可以依赖于模块 A。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

CommonJS 和 AMD 都支持循环依赖,但是需要小心处理,否则会导致程序陷入死循环。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

动态语言特性

ES6 模块化不支持动态语言特性,因为它是在静态编译时进行解析的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

CommonJS 支持动态语言特性,因为它是在运行时进行加载和执行的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

AMD 也支持动态语言特性,因为它是异步加载模块的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

总结

三种 JavaScript 模块化方案各有优缺点,开发者可以根据自己的需求选择合适的方案。ES6 模块化是未来 web 开发的主流方案,而 CommonJS 和 AMD 则更加适用于 Node.js 和浏览器端的模块化开发。在实际开发中,开发者可以根据项目需求、技术栈等因素综合考虑,灵活应用这三种方案。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html

作者:饺子不放糖
来源:稀土掘金
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/46870.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/46870.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定