首先明确几点:
-
ES6
的模块编程:import & export
-
ES5
的模块编程:require & define
和require & exports/module.exports
-
ES6
的模块编程思想是:编译时将import
进来的模块导入进来整合到一起;import
是编译时调用,所以必须放在文件开头(可以认为是静态的) -
ES5
的模块编程思想是:代码运行时,根据require
的需求,将模块请求进来。所有require
语句可以放在代码的任何地方(可以认为是动态的) -
ES6
之前的模块规范分为两种:同步 和 异步;对应的技术标准主要为:CommonJS
和AMD
; -
CommonJS
对应的是require & exports/module.exports
,典型代表是Node.js; -
AMD
对应的是require & define
,典型的代表是require.js
注意事项:
AMD
定义模块时,define
方法的第三个参数,即回调方法中也可以使用 require
和exports
,exports
就是你导出的模块对象,所以,你可以将属性或方法挂载到exports
上
define("alpha", ["require", "exports"], function (require, exports) {
var app_root_1 = require("./components/app/app-root");
exports.IonicApp = app_root_1.IonicApp;
});
像上面这个例子,在回调函数中又依赖了其他模块(./components/app/app-root
),导出的模块alpha
其实就是exports
对象,上面挂载了IonicApp
属性
以上几点通过这么几个关键词串起来:ES5、ES6、同步、异步、静态、动态
引申知识点:
Node.js
(服务端)使用 CommonJS
来实现模块,浏览器端使用 AMD
来实现模块,为啥?
答:
① ES5
的模块是动态请求的
② 在服务端,模块都存储在本地硬盘中,虽然是动态请求模块,但是请求非常
快,时间延迟可以忽略不计,所以使用同步编程(CommonJS
)
③ 在浏览器端,动态请求模块需要访问网络,时间延迟不可不考虑,必须使用异步编程(AMD
)
④ 我想在浏览器端也是用CommonJS
编程,怎么办?请阅读使用Browserify
来实现CommonJS
的浏览器加载
网友评论