首先要知道为什么要使用requirejs?
1,防止JS阻塞浏览器渲染。例如我们执行alert时,在alert代码之后的html就会停止加载页面的内容就不会在出现了。
2,防止页面加载过多JS相互依赖时,页面出现过多的页面变丑。
这是我们需要requirejs的2大理由,还有其他一些附加功能也方便我们维护JS。
以下是使用教程
/********************以下是基本用法********************/
1, require([],fn) //第一个参数必须是数组放索引0位置的先执行,第二个参数是回调函数也就是第一个参数里面的js加载成功后才执行。
//首先加载requirejs
2, define //定义一个模块
要想加载a.js成功a.js的代码必须用define来定义
define(function(){
function fun1(){
alert("it works");
}
fun1();
}
3,加载远程文件
require.config({
paths : {
"jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery", "js/jquery"], //如果加载远程文件不成功就加载本地文件,并且自定义一个jquery.js名字
"a" : "js/a" //将本地的a.js自定义一个名字为a的文件
}
})
require(["jquery","a"],function($){
$(function(){
alert("load finished");
})
})
4,加载依赖类似jquery,underscore文件
require(["jquery","underscore"],function($, _){ //有些JS代码依赖jquery依赖JQ的代码要传递一个$,写在回调函数的参数中就行
$(function(){
_.each([1,2,3],alert);
})
})
5,全局配置
上面的教程 如果想要使用自定义好的"jquery"和"a",那就要在每一个页面加上这样类似的代码会不好看。
require.config({
paths : {
"jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery", "js/jquery"],
"a" : "js/a"
}
})
所以推荐使用以下代码写
data-main="js/main" //这里的main.js里面所写的代码将在加载完reuqire.js后处理,这里需要到data-*自定义属性所以IE7以下不支持
如果需要每个页面都要加载到的JS代码就写在main.js即可。
这里注意以下路径问题"js/main"就相当于
require.config({
baseUrl : "js"
})
也就是说原来需要 "js/a"现在只写成 "a"就行了
6,解决不是AMD规范的JS插件、库的加载问题
requirejs是AMD规范,也就是为什么它能解决JS阻塞的原因,因为它不必去等待它依赖的组建去加载完才去运行,是异步加载。
例如:underscore类库,但是他并没有实现AMD规范,那我们可以这样配置
require.config({
shim: {
"underscore" : {
exports : "_";
}
}
})
这样配置后,我们就可以在其他模块中引用underscore模块:
require(["underscore"], function(_){
_.each([1,2,3], alert);
})
也可以直接手动去修改underscore.js源代码让它直接支持AMD规范。
在举例子是jquery插件常用的问题
我们会看到很多插件使用的是类似
(function( $, undefined ) {
})( jQuery );
的结构去封装插件,插件形式的非AMD模块,我们经常会用到jquery插件,而且这些插件基本都不符合AMD规范,比如jquery.form插件,这时候就需要将form插件"垫"到jquery中:
require.config({
shim: {
"underscore" : {
exports : "_" // 将“_”暴露在全局
},
"jquery.form" : {
deps : ["jquery"] //jquery.form依赖jquery的意思
}
}
})
也可以简写为:
require.config({
shim: {
"underscore" : {
exports : "_"
},
"jquery.form" : ["jquery"]
}
})
这样配置之后我们就可以使用加载插件后的jquery了
require.config(["jquery", "jquery.form"], function($){
$(function(){
$("#form").ajaxSubmit({...});
})
})
7,加载样式
define(["require"], function(require) {
var cssUrl = require.toUrl("./style.css");
var link = document.createElement("link");
link.type = "text/css";
link.rel = "stylesheet";
link.href = cssUrl;
document.getElementsByTagName("head")[0].appendChild(link);
});
8,加载未使用define()模块定义的JS。
c.js代码如下 (只能将所有的代码声明一个函数体中)
var wo;
function c(){
alert('11');
}
function w(){
alert('11');
}
-----------------------------------------
main.js代码如下
shim: {
c:{ //这里指的是c.js
init:function(){
return{
c0:c, //c和w指的是函数体的名称
c1:w
}
}
}
},
require(['c'],function(fn){
console.log(fn);
});
当 exports 与 init 同时存在的时候, exports 将被忽略。
/********************以上是基本用法********************/
对外提供接口
//home.js
define(['jquery'],function($){
function run(){
$(function(){
alert( $().jquery );
})
}
return{
hello:run
}
});
//在main.js中调用,
require(["home"],function(home){
home.hello();
});
哪里都可以调用home.hello();只要加载就行