CommonJS概述
JavaScript的是根据ECMAScript规范指定的一种用于网络的脚本语言,而在此基础上,为了完善JS语言,增加其跨平台的特性,增添了对后端的规范。CommonJS这一规范,该规范主要用于后端服务器。
- 没有模块系统
- 没有标准接口
- 标准库较少
- 异步JS嵌套回调灾难
要详细了解这些内容,推荐《深入浅出Node.js》一书。本文章主要用于介绍CommonJS中的Promise规范(用于解决回调函数嵌套)、模块化规范(require)
Promise规范
Promise规范主要规定了异步调用实现包括:success\fail\ready三个状态,以及两个回调函数:success和fail,并且要求提供then方法(核心)。用于解决回调时候的嵌套过多的问题。
then方法:then(success,fail),then中包含两个参数,一个是成功时的回调函数,一个失败时的回调函数。同时then方法返回一个promise,即你可以Promise.then(s1,f1).then(s2,f2).then(s3,f3)….这样一直调用下去。
已经实现了Promise的浏览器中,可以使用js原生或者jQuery的Promise去调用then。
如:jQuery:
var $info = $("#info");
$.ajax({
url: "/echo/json/",
data: {
json: JSON.stringify({
"name": "someValue"
})
},
type: "POST"
})
.then(function (response) {
$info.text(response.name);
});
javascript:
var promise = new Promise(function(resolve, reject) {
// 做一些异步操作的事情,然后……
if (/* 一切正常 */) {
resolve("Stuff worked!");
}
else {
reject(Error("It broke"));
}
});
promise.then(function(result) {
console.log(result); // “完美!”
}, function(err) {
console.log(err); // Error: "出问题了"
});
模块化规范
根据CommonJS,一个文件就是一个模块。加载模块使用require方法,并且返回文件内exports的对象或者函数。
1、调用模块
对本地文件:
var exam = require(‘./example.js’);或var exam = require(‘./example’);(默认省略.js后缀名)
exam即获得了example.js中exports对象。
如果需要返回对象时,文件写成
exports.a = 123;
exports.b = function(){}
则调用时:exports = {a:123,b:[fun]}
2、定义模块
如果需要返回函数时,文件写成
module.exports = function(){}
则调用时:exports = [function]
对核心模块(如express.js):
var exam = require(‘express’);
省略路径即可。服务器默认从node_modules目录中寻找模块
3、AMD与Common的兼容
CommonJS规范加载时同步加载的,即阻塞性。需要加载完毕才继续后面的操作。
AMD规范加载是异步加载的(如前端的require.js库),使用的是依赖注入的方式调用回调函数。
如想了解,可以查看requireJS是如何定义模块的。
同时AMD规范可以兼容CommonJS规范,此时,需要在依赖注入的回调中加上:
var myCommon = require(“commonModule”)即可。
参考链接
CommonJS规范-csdn:http://blog.youkuaiyun.com/neil_lee_/article/details/16967987
Promise/A+规范:http://segmentfault.com/a/1190000002452115
JavaScript异步编程助手:Promise模式-csdn:http://www.youkuaiyun.com/article/2013-08-12/2816527-Promise