ES6学习(一)--- 模块化

简介

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模块

你可能感兴趣的:(ES6学习(一)--- 模块化)