说一下ES6的模块化?以及和AMD、CMD的区别?
es6的模块化
es6的模块化是浏览器端和服务器端通用的模块开发规范,其设计思想就是尽量的静态化,在编译时就确定模块的依赖关系,以及输入输出的变量
其模块化规范中定义:
每个js文件都是一个独立的模块
导入其他成员用import关键字
向外共享成员变量用export关键字
AMD
异步加载模块,主要用于浏览器,其定义需要使用requireJs
-
AMD具有以下几个特性:
- 采用异步方式加载模块,模块的加载不影响它后面语句的运行.
- 所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行.
- 推崇依赖前置,在定义模块的时候就要声明其依赖的模块
-
AMD的使用
使用require.js来实现AMD规范的模块化:用require.config()指定引用路径。用define()来定义模块用require来加载模块。
define('moduleName',['a','b'],function(ma, mb) { return someExportValue; }) require(['a', 'b'], function(ma, mb) { // do something })
CMD
通用模块定义,就近依赖,延迟执行,其定义使用用SeaJs
-
CMD具有以下几个特性:
1.采用异步方式加载模块,模块的加载不影响它后面语句的运行.
2.推崇就近依赖,只有在用到某个模块的时候再去require -
CMD的使用
使用define来定义define(id?, deps?, factory)
factory是一个函数,有三个参数,function(require, exports, module)
require 是一个方法,接受 模块标识 作为唯一参数,用来获取其他模块提供的接口:require(id)
exports 是一个对象,用来向外提供模块接口
module 是一个对象,上面存储了与当前模块相关联的一些属性和方法
// 定义模块 module.js define(function(require, exports, module) { var $ = require('jquery.min.js') $('div').addClass('active'); }); // 加载模块 seajs.use(['module.js'], function(my){ });