在日常开发中,涉及到多人协作,复杂的软件开发时,代码直接被通过复制粘贴的方式运用到整个项目中时,会导致代码难以维护和修改。

为了解决这个问题,模块化编程的概念诞生了。

1 什么是模块系统

模块系统是指代码组织结构的一种模式,通过模块化的方式将代码分为独立的模块,以提高代码复用性和可维护性。模块系统使得大型应用程序可以被分解成小的、独立的部分,每个部分解决一个特定的问题这样做既有助于协同开发大型应用,也能够使得交付的应用程序体积更加小巧。

模块化允许代码分离,将其组织为可维护的单元,提升代码的可复用性和可读性。

2 为什么需要模块化

前端在没有模块化规范的早期时代,代码通常是下面这样的,直接使用内联脚本。

```html

Document

```

但随着 js 能做的事越来越多,代码量越来越大,这种方式就不太合适了,于是我们开始使用外联脚本。

```html

Document

```

但随着项目越来越大,我们需要引入的外联脚本越来越多,管理越来越困难,相互依赖关系越来越复杂,需要严格的遵循引入顺序,

没有模块化标准的问题就暴露出来了,于是 CommonJS、AMD、CMD、UMD、ESM 等模块化标准相继诞生。

3 Node.js 中的模块系统

早期的编程语言,如 C 语言,通常采用函数库的形式实现模块化,随着面向对象编程的兴起,类和对象被广泛应用于模块化设计。

Node.js 在早期就采用了 CommonJS 规范实现了模块化,而 Web (浏览器) 中的 JS,在发展过程中诞生了 ECMAScript 标准,在 ES6(ES2015) 中才推出了 ECMAScript Modules 规范。

PS:ECMAScript 是一种由 Ecma 国际组织制定的脚本语言标准,也被称为 ECMA-262 标准。它定义了 JavaScript 的语法、类型、对象和行为规范,提供了一种通用的、跨平台的脚本语言规范。

在2015年 (ES2015/ES6) 发布较大更新后,此后每年都会发布一些新的特性的更新,具体可通过 ES Table 查看。

Node.js 不同版本对 ES 特性的支持情况,可以通过node-compat-table 查看

image.png

时至今日,Node.js 的模块系统也支持了 ESM 语法,于是,我们可以在 Node.js 中使用 CJS 和 ESM 两种模块系统。

接下来将分别介绍 CJS(CommonJS)ESM(ECMAScript Modules) 两种模块系统的用法,以及其异同。

在后续的教程中,示例代码会以 ESM 为主,这个也是现在开发中最常用的方式。