模块规范

一开始,js 只是作为一个脚本语言来使用,代码都是通过 script 脚本来引入,此时的代码都是 IIFE 的方式。
但这种方式会有一个问题,就是依赖循环引用的问题。
早期的解决方式是通过闭包和命名空间,避免全局污染。

随着 node.js 的出现,我们可以通过其他方式引入 js:即 commonjs 的 require 和 module.exports (cjs)

但是 commonjs 有一个致命的缺点,即,它是同步引入 js 模块的。如果出现网速过慢等问题,就会阻塞后面代码执行。所以 commonjs 并不适用前端。

因此又引入了 AMD 规范。(requirejs)
AMD 是 CommonJS 的一个延伸,即可以异步引入一个模块。

后来玉伯又搞了一个 CMD(seajs,通用标准模块)
CMD 与 AMD 的区别在于定义模块和依赖引入的部门。

为了让同一个模块可以运行在前后端,所以有了 UMD。
兼容各种模块规范的 UMD (通用模块规范)

ES6 最终是弄了个 ES Module,即我们现在常用的 import 和 export 的引入方式。

但是,node 12 以后才支持在 package.json 中添加 type 字段 为 module,将默认的模块系统改为 es module

或者使用实验性指令:

  1. node --experimental-modules b.mjs

或者使用 babel 等其他编译工具将 es6 转换为 es5。

nodejs 默认的模块规范是 CommonJS,虽然 ES6 提出了 ES Module,不过 nodejs 的默认模块规范并不支持,我们需要将代码编译成 ES5 才可以运行。

为什么需要打包工具?

在上古时期,打包工具解决的主要问题是,把多个 js 文件合并成一个 js 文件。