AMD
AMD (Asynchromous Module Definition - 异步模块定义) 是 requirejs 在推广过程中对模块定义规范化产出的,AMD 是异步加载模块,推崇依赖前置
特点:
- 异步加载
- 管理模块之间的依赖性,便于代码的编写和维护
- 环境:浏览器环境
写法:
导入: require(['模块名称'], function('模块引入变量'){ // TODO.... })
;
导出:define(function(){ return "某写值" })
;
demo
导入导出demo
1
2
3
4
5
6
7
8
9
10// testA.js
define(function (){
return {
a:'hello! I am testA'
}
});
// testB.js
require(['./testA.js'], function (moduleA){
console.log(moduleA.a); // 打印出:hello! I am testA
});依赖加载 demo
1
2
3define('module1', ['jquery'], ($) => {
//TODO.....
});
当定义模块(module1)时,就会加载依赖(jquery)
CMD
CMD(Common Module Definition - 公共模块定义)是 Seajs 在推广过程中对模块定义的规范化产出,对于模块的依赖,CMD 是延迟执行,推崇依赖就近,CMD 是在 AMD 基础上改进的一种率规范。同时CMD也是延自CommonJS Modules/2.0规范。
特点
- CMD 与 AMD 的区别是 CMD 是就近依赖, AMD 是前置依赖
- 环境:浏览器环境
语法
导入:define(function(require, exports, module) { // TODO... });
导出:define(function (){return '值');
demo
导出导出 demo
1
2
3
4
5
6
7
8
9
10// testA.js
define(function (require, exports, module){
exports.a = 'hello! I am testA';
});
// testB.js
define(function (require, exports, module){
var moduleA = require('./testA.js');
console.log(moduleA.a); // 打印出:hello! I am testA
});依赖 demo
1 | define((require, exports, module) => { |
以上代码只有真正执行到 function1 方法时,才会去执行导入 jquery
CommonJS
CommonJS 是服务端模块的规范,由于 Nodejs 被广泛认知,Commonjs 规范中一个单独的文件就是一个模块,加载模块使用 require 方法,该方法读取一个文件并执行,最后返回文件内部的 module.exports 对象。
特点
- 模块可以多次加载,但是只会在第一次加载时运行一次,然后将运行结果进行缓存,之后的加载就直接读取缓存结果。如果想要模块再次运行必须清除缓存。
- 同步加载(会阻塞接下来代码的执行)
- 环境:服务器环境
语法
导入:require('路径')
导出: module.exports和exports
exports 和 module.exports 的区别:
exports 只是 module.exports 的一个引用,相当于在每个模块的头部都有一句var exports = module.exports
demo
- 导出导出 demo
1
2
3
4
5
6// testA.js
exports.a = "Hello TestA"
// testB.js
var moduleA = require("./testA.js);
console.log(moduleA.a) // 输出 Hello TestA
UMD
UMD(Universal Module Definition - 通用模块定义) 是 AMD 和 CommonJS 的糅合,AMD 是浏览器优先异步加载,而 CommonJS 是服务器优先同步加载,如果想要同时支持需要区分他们,方法如下:
- 判断 nodejs 模块存在就是用 nodejs (CommonJS)
- 判断 define 存在就使用 AMD 的加载
特点
- 同时包含 AMD 和 CommonJS 两种语法
- 环境:浏览器环境(AMD)和服务器环境(CommonJS)
- 无导入导出规范
demo
1 | (function (root, factory) { |
ES6 module
特点
- ES6 的最新语法支持规范
导入导出
导入
import Module, { ModuleA, ModuleB } from './moduleA.js'
import("./moduleA").then()
导出:export ModulA
和 export default Module
注意:export 只支持对象形式导出,不支持值的导出,export default 导出的是默认导出,只支持 值的导出,但是只能指定一个。本质上它输出一个 default 的变量或者方法
demo
1 | /*错误的写法*/ |