Skip to content

模块规范

CJS 、ESM 、IIFE 、AMD 等。

CJS

CommonJS 是业界最早正式提出的 JavaScript 模块规范,主要用于服务端,随着 Node.js 越来越普及,这个规范也被业界广泛应用。

对于模块规范而言,一般会包含两方面内容:

  1. 统一的模块化代码规范
  2. 实现自动加载模块的加载器 ( 也称 loader )

对 CommonJS 而言,一方面它定义了一套完整的模块化代码规范,另一方面 Node.js 为之实现了自动加载模块的 loader ,但也存在一些问题:

  • 模块加载器由 Node.js 提供,依赖了 Node.js 本身的功能实现,比如文件系统,所以 CJS 模块直接放到浏览器中无法执行
  • CommonJS 本身约定以同步的方式进行模块加载,这种加载机制放在服务端没有问题,一来模块都在本地,不需要进行网络 IO ,二来只有服务启动时才会加载模块,而服务通常启动后会一直运行,所以对服务的性能并没有太大影响。如果这种机制放到浏览器端,带了明显的性能问题,它会产生大量同步的模块请求,浏览器要等待响应返回后才能继续解析模块。即,模块请求会造成浏览器 JS 解析过程的阻塞,导致页面加载速度缓慢。

ESM

ESM 是 ECMAScript 官方提出的模块化规范,已经得到了现代浏览器的内置支持。

在现代浏览器中,如果在 HTML 中加入含有 type="module" 属性的 script 标签,那么浏览器会按照 ESM 规范来进行依赖加载和模块解析。