简介
CommoneJS模块化:CommoneJS为代表(Node应用由模块组成,采用CommonJS模块规范)。其主要特点是语法简洁,模块使用同步加载机制,主要使用在服务器端。
异步模块定义(AMD):RequireJS为代表。其主要特点是模块使用异步加载,主要使用在浏览器端。
CommonJS规范
CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。
var a = 5;
var fn = function (value) {
return value + a;
};
module.exports.a = a;
module.exports.fn = fn;
上面代码通过module.exports输出变量a和函数fn。
require方法用于加载模块。
var example = require('./a.js');
console.log(a.a); // 5
console.log(a.fn(1)); // 6
exports 与 module.exports
为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。
var exports = module.exports;
于是我们可以直接在 exports 对象上添加方法,表示对外输出的接口,如同在module.exports上添加一样。注意,不能直接将exports变量指向一个值,因为这样等于切断了exports与module.exports的联系。
ES6模块规范
不同于CommonJS,ES6使用 export 和 import 来导出、导入模块。
// a.js
var a= 'a';
var b= 'b';
var c= 123;
export {a, b, c};
需要特别注意的是,export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。
// 写法一
export var a = 1;
// 写法二
var a = 1;
export {a};
// 写法三
var b = 1;
export {b as a};
export default 命令
使用export default命令,为模块指定默认输出。
// a.js
export default function () {
console.log('123');
}
export default 和 export 区别:
1.export与export default均可用于导出常量、函数、文件、模块等
2.在其它文件或模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其进行使用
3.在一个文件或模块中,export、import可以有多个,export default仅有一个
4.通过export方式导出,在导入时要加{ },export default则不需要
注意
1.使用export导出需要{},与此相对使用import导入也需要{}
2.使用export default 导出不需要{},与此相对使用import导入也不需要{}
支持状况
ES6为JavaScript带来了模块机制,但ES6的模块机制在当前所有的浏览器及Node.js中均不受支持。但我们可以通过一些编译器来对ES6语法进行转换,从而利用这些新特性给我们项目带来便利:
Babel-Babel是一个ES6语法转换为ES5语法的转换器,其支持对ES6模块语法的转换,包括:异步加载、状态隔离、顶级命名空间隔离等
es6-module-transpiler -将ES6模块编译为AMD规范或者CommonJS规范的模块
ES6 module loader-能支持动态加载ES6风格的模块
Traceur-Google开发的JS转换编译器,目的在于支持更多的JavaScript特性包括ES6模块