JavaScript Modules
Why use modules?
早期的JavaScript只是做一些简单的交互,所以不需要模块化。但是随着JavaScript的发展,现在的JavaScript已经可以做很多事情了,比如构建大型的应用程序,而Node.js的出现使得JavaScript甚至可以胜任某些Server端的工作,这时候模块化就显得非常重要了。
模块化的好处有很多,比如:
- 代码复用
- 代码隔离
- 代码维护
- 依赖管理
JavaScript模块化主要经历了以下几个阶段:
- IIFE
- CommonJS
- AMD
- UMD
- ES6 Modules
IIFE
IIFE(Immediately Invoked Function Expression)是一种立即执行的函数表达式,它可以用来模拟模块化。IIFE的特点是:
- 使用闭包来隔离作用域
- 通过返回一个对象来暴露接口
1 | const module = (function() { |
下面的代码使用IIFE封装了一个Person类,其中getName方法是public的,其他方法是private的。因为IIFE是定义后就立即执行的,所以这里我们使用一个person变量来接收IIFE的返回值,这样就可以调用getName方法了。
想要向外暴露任何接口,只需要在返回的对象中添加即可。
1 | const person = (function person(firstName, lastName) { |
CommonJS
CommonJS是Node.js的模块化规范,它的特点是:
- 使用
require
来引入模块 - 使用
module.exports
来暴露接口
1 | // index.js |
1 | // module.js |
AMD
AMD(Asynchronous Module Definition)是另一种模块化规范,它的特点是:
- 使用
define
来定义模块 - 使用
require
来引入模块
1 | define(['module'], function(module) { |
UMD
UMD(Universal Module Definition)是一种通用的模块化规范,它的特点是:
- 支持CommonJS和AMD
- 通过判断
typeof module
来判断当前环境
1 | (function (root, factory) { |
ES6 Modules
ES6 Modules是JavaScript的模块化规范,它的特点是:
- 使用
import
来引入模块 - 使用
export
来暴露接口
1 | // index.js |
1 | // module.js |
Node.js中的ES6 Modules
Node.js从v13.2.0开始支持ES6 Modules,但是需要使用.mjs
后缀名。
1 | // index.mjs |
1 | // module.mjs |
总结
JavaScript模块化的发展经历了很多阶段,从IIFE到CommonJS、AMD、UMD,最后到ES6 Modules。ES6 Modules是JavaScript的官方模块化规范,它的特点是简洁、易用,所以在现代的JavaScript开发中,推荐使用ES6 Modules。
References:
- MDN - JavaScript modules
- V8 blog - JavaScript Modules
- V8 blog - ES modules in Node.js: status and future