<script src="js/require.js"></script>有人可能会想到,加载这个文件,也可能造成网页失去响应。解决办法有两个,一个是把它放在网页底部加载,另一个是写成下面这样:
<script src="js/require.js" defer async="true" ></script>async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上。
这种写法虽然简单,但其实并不推荐,一般的写法还要再加个属性:
<script data-main="js/main" src="js/require-jquery.js"></script>就像一个c程序总有一个 main 方法作为入口一样,上面这种写法,做了几件事情:
require.config({
baseUrl: ‘js/‘,
paths: {
"backbone": "backbone",
"underscore": "underscore"
},
shim: {
"backbone": {
deps: [ "underscore" ],
exports: "Backbone"
},
"underscore": {
exports: "_"
}
}
});baseUrl:指定基路径require([‘jquery‘, ‘underscore‘, ‘backbone‘], function ($, _, Backbone){
// some code here
});// math.js
define(function (){
var add = function (x,y){
return x+y;
};
return {
add: add
};
});加载方法如下:// main.js
require([‘math‘], function (math){
alert(math.add(1,1));
});如果这个模块还依赖其他模块,那么define()函数的第一个参数,必须是一个数组,指明该模块的依赖性。define([‘myLib‘], function(myLib){
function foo(){
myLib.doSomething();
}
return {
foo : foo
};
});
定义的模块返回函数个数问题
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的情况。<script> require( ["some" ] ); </script>之外,还有和 define 类似的复杂用法:
<script>
require(["aModule", "bModule"], function() {
myFunctionA(); // 使用 aModule.js 中的函数 myFunctionA
myFunctionB(); // 使用 bModule.js 中的函数 myFunctionB
});
</script> 总结一下,define 是你定义自己的模块的时候使用,可以顺便加载其他js;require 直截了当,供你加载用的,它就是一个加载方法,加载的时候,可以定义别名。
require.js还提供一系列插件,实现一些特定的功能。
domready插件,可以让回调函数在页面DOM结构加载完成后再运行。
require([‘domready!‘], function (doc){
// called once the DOM is ready
});text和image插件,则是允许require.js加载文本和图片文件。define([
‘text!review.txt‘,
‘image!cat.jpg‘
],
function(review,cat){
console.log(review);
document.body.appendChild(cat);
}
);类似的插件还有json和mdown,用于加载json文件和markdown文件。<script data-main="js/main" src="js/require-jquery.js"></script>也就是默认加载 data-main 指定的目录,即 js/main.js 文件所在的目录。当然,你可以通过配置文件修改。
3、在代码中require一个文件多次,不会导致浏览器反复加载
不会,这是 RequrieJS 的优点,即使你反复 require 它,它只加载一次。
requirejs.config({
paths: {
jquery: [
‘//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js‘,
‘lib/jquery‘
]
}
});2、没有依赖?对象字面量?没问题!define({
forceChoke: function() {
},
forceLighting: function() {
},
forceRun: function() {
}
});很简单,也很有用,如果该模块仅仅是功能的集合,或者只是一个数据包。// js/app/moduleA.js
define( [ "require", "app/app"],
function( require, app ) {
return {
foo: function( title ) {
var app = require( "app/app" );
return app.something();
}
}
}
);4、得到模块的地址var path = require.toUrl("./style.css");5、JSONPrequire( [
"http://someapi.com/foo?callback=define"
], function (data) {
console.log(data);
});
Require.js 提供一个脚本 r.js ,可以将所有使用到的模块压缩成一个脚本文件,r.js 可以使用 node.js 来执行。
在压缩模块前,需要写一个配置文件,说明主模块名,压缩后的文件名,哪些模块不要压缩
没有使用 define 定义的模块都不要压缩,包括 jquery,backbone 等库及其插件
//build.js
({
baseUrl: ‘.‘,
paths: {
‘jquery‘: ‘empty:‘,
‘underscore‘: ‘empty:‘,
‘backbone‘: ‘empty:‘,
},
name: ‘main‘,
out: ‘main.min.js‘
})压缩命令:node r.js -o build.js更多require.js学习链接
原文:http://blog.csdn.net/cowlkkn/article/details/22865953