//-------------------------------------------------------------
前端开发在近一两年发展的非常快,JavaScript作为主流的开发语言得到了前所未有的热捧。大量的前端框架出现了,这些框架都在尝试着解决一些前端开发中的共性问题,但是实现又不尽相同。在这个背景下,CommonJS社区诞生了,为了让前端框架发展的更加成熟,CommonJS鼓励开发人员一起在社区里为一些完成特定功能的框架制定规范。AMD(Asynchronous Module Definition)就是其中的一个规范。
让我们来看看一般情况下JavaScript代码是如何开发的:通过
有人可能会想到,加载这个文件,也可能造成网页失去响应。解决办法有两个,一个是把它放在网页底部加载,另一个是写成下面这样:
async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上。
这种写法虽然简单,但其实并不推荐,一般的写法还要再加个属性:
就像一个c程序总有一个 main 方法作为入口一样,上面这种写法,做了几件事情:
define( ['wojilu.test1'], function( t1 ) {
return {
NewTest : function() { t1.MyTest();}
};
});
通过文件名(不需要后缀名),引入了 wojilu.test1 命名空间,并给它取了别名 t1,然后在代码中使用 t1.MyTest() 方法。
按照 RequireJS 的规范,所有的模块定义,都必须放在 return {} 对象中。也就是说,你的代码都要写在 return 返回的 {} 对象里面。这会不会导致代码臃肿难看?当然不会。你可以重构一下,比如这样做:
define代码
define(['wojilu.test1'], function (t1) {
function someFunc1() {
// 实际主要代码
}
function someFunc2() {
// 实际主要代码
}
// 通过 return 方式,将需要公开的函数暴露出来,供其他 js 调用
return {
NewTest: function () {
t1.MyTest();
},
fun1: someFunc1,
fun2: someFunc2
};
});
到此为止,我们遇到了两个关键词,一个是 define ,可以用来定义模块(命名空间),第一部分我们讲了;还有一个是 require,可以直接加载其他 js。它除了简单的用法:
之外,还有和 define 类似的复杂用法:
总结一下,define 是你定义自己的模块的时候使用,可以顺便加载其他js;require 直截了当,供你加载用的,它就是一个加载方法,加载的时候,可以定义别名。
require.config()就写在主模块(main.js)的头部。参数就是一个对象,这个对象的paths属性指定各个模块的加载路径。
require.config({
paths: {
"jquery": "lib/jquery.min",
"underscore": "lib/underscore.min",
"backbone": "lib/backbone.min"
}
});
另一种则是直接改变基目录(baseUrl)。
require.config({
baseUrl: "js/lib",
paths: {
"jquery": "jquery.min",
"underscore": "underscore.min",
"backbone": "backbone.min"
}
});
如果某个模块在另一台主机上,也可以直接指定它的网址,比如:
require.config({
paths: {
"jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"
}
});
1、define 的return只有一个函数,require的回调函数可以直接用别名代替该函数名。
2、define 的return当有多个函数,require的回调函数必须用别名调用所有的函数。
require(['selector','book'], function(query,book) {
var els = query('.wrapper');
book.fun1();
book.fun2();
});
此处query 函数是1的情况,book 函数是2的情况。
当调用的js文件不是使用define定义,直接使用其全局变量或函数就可以了,没有影响。
这个时候只是控制了js 文件的加载顺序。
@@部分资料来自网络,感谢伟大的乐于分享的程序猿们!
require.js:http://www.requirejs.org
require.js入门教程:http://www.verydemo.com/demo_c110_i2031.html
使用RequireJS优化Web应用前端:http://www.csdn.net/article/2012-09-27/2810404
require.js链接汇总:http://webeginner.diandian.com/post/2013-12-04/40060318517