requirejs笔记
1.RequireJS是一个工具库,主要用于客户端的模块管理.它可以让客户端的代码分成一个个模块.实现异步或动态加载,从而提高代码的性能和可维护性.它的模块管理遵循AMD规范(Asynchronous Module Definition).
2.基本思想:通过define方法,将代码定义为一个模块用require方法实现代码的模块加载.
3.将require.js嵌入网页,然后就能在网页中进行模块化编程了.
<script data-main="js/main" src="js/require.js"></script>
data-main属性:页面的入口js.路径main.js相对于页面
4.define方法:定义模块.(requireJS要求每个独立模块放在一个单独的文件里.)
4.0:定义模块不依赖其他模块,是个独立模块.
4.1:定义模块依赖其他模块,非独立模块.
4.2:三个参数.
独立模块:define({
method1:function(){},
method2:function(){}
})
或者:
define(function(){
return{
method1:function(){},
method2:function(){}
}
})
建议使用后一种写法,这种自由度更高一些.
define定义的模块可以返回任何值,不限于对象.
非独立模块:
define(["module1","module2"],function(m1,m2){
})
第一个参数是数组,它的成员是当前模块所依赖的模块.
比如当前模块就是依赖于"module1.js","module2.js".只有先加载这两个模块,新模块才能正常运行.这个写法表示module1和module2模块就在当前目录.等同于['./module1','./module2'].
第二个参数是一个函数,但前面的数组的所有成员加载成功后,他将被调用.它的参数与数组的成员一一对应.
define(['module1','module2'],function(m1,m2){
return {
method:function(){
m1.methodA();
m2.methodB();
}
}
});
如果依赖额模块很多,参数与模块一一对应的写法非常麻烦.
define(['dep1','dep2','dep3','dep4','dep5','dep6'...],
function('dep1','dep2','dep3','dep4','dep5','dep6'...){
});
为了避免上面代码那样繁琐的写法.可以这样写:
define(function(require){
var dep1=require('dep1');
var dep2=require('dep2');
var dep3=require('dep3');
var dep4=require('dep4');
var dep5=require('dep5');
var dep6=require('dep6');
var dep7=require('dep7');
.........
.........
});
define([模块名称,][依赖模块],function(参数){
});
注意:requireJs会自动根据文件名(不含后缀名,即不含.js)来给定义的模块命名,如果你显示的给定义的一个模块命名了,那么在日后改动了文件名或模块名,requireJs将无法加载.因此:不要显示的定义模块名,让文件名成为默认的模块名,方便requireJs管理.
define()实际运用的例子1:
define(["math","grap"],function(math,graph){
return{
plot:function(x,y){
return graph.drawPie(math.randomGrid(x,y));
}
}
});
define()实际运用的例子2:
判断是否是IE而加载zepto或jQuery.
define(('__proto__' in{} ?['zepto']:['jquery']),function($){
return $;
});
5.require方法:调用模块.
require(['foo','bar'],function(foo,bar){
foo.doSomething();
});
require方法的第一个参数,是一个表示依赖关系的数组.
require([window.JSON?undefined:'util/json2'],function(JSON){
JSON=JSON||window.JSON;
console.log(JSON.parse('{"JSON":"HERE"}'));
});
上面代码:加载JSON模块时,首先判断浏览器是否原生支持JSON对象.如果是的,则将undefined传入回调函数,否则加载util目录下的json2模块.
require方法也可以用在define方法内部.
define(function(require){
var otherModule=require("otherModule");
});
下面的例子显示了如何动态加载模板.
define(function(require){
var isReady=false,foobar;
require(['foo','bar'],function(foo,bar){
isReady=true;
foobar=foo()+bar();
});
return{
isReady:isReady,
foobar:foobar
}
});
上面代码定义的模块,内部加载了foo和bar两个模块,在没有加载完成前,isReady属性为fale,加载完成后就变成了true.因此,可以根据isReady属性的值,决定下一步的动作.
下面的例子是模块的输出结果是一个promise对象.
define(['lib/Deferred'],function(Deferred){
var defer=new Deferred();
require(['lib/templates/?index.html','lib/data/?stats'],function(template,data){
defer.resolve({template:template,data:data});
});
return defer.promise();
});
上面define方法返回一个promise对象,可以再改对象的then方法,指定下一步的动作.
如果服务器端采用JSONP模式,则可以直接在require中调用,方法是指定JSONP中调用,方法是指定JSONP的callback参数define.
require(['http://someapi.com/foo?callback=define'],function(data){
console.log(data);
});
require方法允许添加第三个参数,错误处理的回调函数
require(["backbone"],
function(){Backbone}{
return Backbone.View.extend(/*.....*/);
},
function(err){
//....
}
)
require对象还允许指定一个全局性的Error事件的监听函数.所有没有被上面的方法捕获的错误,都会被触发这个监听函数.
requirejs.onError=function(err){
//...
}
==============AMD模式小结===========
define和require这两个定义模块,调用模式的方法,合称AMD模式.它的模块定义的方法非常清晰,不会污染全局环境.能够清楚的显示依赖关系.
AMD模式可以用于浏览器环境,并且允许非同步加载模块,也可以根据需要动态加载模块.
6.require方法本身也是一个对象,它带有一个config方法,用来配置require.js运行参数.
require.config({
paths:{
jquery:[]
}
});
7.配置require.js:config方法
require.config({
paths:{
jquery:[
'//cdnjs.cloudflart.com/ajax/libs/jquery/2.0.0/jquery.min.js',
'lib/jquery'
],
gys:'gys',
people:'people'
}
});
paths
:参数指定各个模块的位置.这个位置可以是同一个服务器上的相对位置,也可以是外部网址.可以为每个模块定义多个位置,如果第一个位置加载失败,则加载第二个位置,上面的事例就表示如果cds加载失败,则加载服务器上的备用脚本.注意的是,指定本地路径时,可以省略文件最后的js后缀名.
require(['jquery'],function($){
//......
});
上面代码加载jquery模块,因为jquery的路径已经在paths参数中定义了,所以就会到事先设定的位置下载.
baseUrl:
baseUrl参数指定本地模块位置的基准目录,即本地模块的路径是相对于哪个目录的.该属性通常有require.js加载时的data-main属性指定.
shim:
有些库不是AMD兼容的,这时就需要指定shim属性的值.shim可以理解成'垫片',用来帮助require.js加载非AMD规范的库.
require.config({
paths:{
'bockbone':'vendor/backbone',
'underscore':'vendor/underscore'
},
shim:{
'backbone':{
deps:['underscore'],//被依赖
exports:'backbone' //输出符号
},
'underscore':{
exports:"_" //输出符号
}
}
});
上面backbone和underscore就是非AMD规范的库.shim指定他们的依赖关系(backbone依赖于underscore),以及输出符号(backbone为Backbone,underscore为"_").
8.插件
require允许使用插件,加载各种格式的数据.
define(['backbone','text!abc.html'],function(Backbone,abc){
//.....
});
上面代码加载的第一个模块时backbone,第二个模块则是一个文本,用'text!'表示.该文本作为字符串,存在回调函数的abc变量中.
===================利用r.js打包项目=================
9.因为过多的模块亲求会降低网站的速度,这个时候就需要吧那些零散的项目合并起来.
有两种方式
第一种通过cmd的命令行在node环境下打包处理
第二种:造node环境下执行配置文件.
讲第二种:
原先的文件目录
1
js
gys.js
gysExt.js
index.js
news.js
people.js
peopleExt.js
require.js
build.js
index.html
news.html
r.js
描述:index.js依赖gysExt.js; gysExt.js依赖gys.js
news.js依赖于peopleExt.js;peopleExt.js依赖于people.js
build.js是配置文件:
代码如下:
({
appDir:"./",
baseUrl:"js",
dir:"../2",
paths:{
jquery:'empty:'
},
modules:[
{name:"index"},
{name:"news"}
]
})
在cmd下,切换到1目录下,执行命令:node r.js -o build.js
结过如下
requirejs笔记的更多相关文章
- requirejs 笔记
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- RequireJS学习笔记
前言 进入移动前端是很不错的选择,这块也是我希望的道路,但是不熟悉啊... 现在项目用的是require+backbone,整个框架被封装了一次,今天看了代码搞不清楚,觉得应该先从源头抓起,所以再看看 ...
- 【原】requirejs学习笔记
随着JS越来越庞大,已经不仅仅是以前复制粘贴做特效的时代了,JS越来越偏向于业务逻辑与应用.JS在web开发中占有越来越重要的地位. 由于JS代码庞大,文件数目多,传统的使用<script sr ...
- jquery学习笔记---requirejs 和模块化编程
http://www.cnblogs.com/lisongy/p/4711056.html jquery模块化编程:http://www.cnblogs.com/digdeep/p/4602460.h ...
- Requirejs学习笔记(一)
中文api 和 英文api网上都有的我就不翻译了,我的学习方法是先看英文api,然后看不懂的就比对中文api看一遍. requirejs可以帮助js代码模块化开发,模块化意味了解决了代码凌乱的问题,方 ...
- RequireJS学习笔记(转)
前言 进入移动前端是很不错的选择,这块也是我希望的道路,但是不熟悉啊... 现在项目用的是require+backbone,整个框架被封装了一次,今天看了代码搞不清楚,觉得应该先从源头抓起,所以再看看 ...
- RequireJs学习笔记之data-main Entry Point
You will typically use a data-main script to set configuration options and then load the first appli ...
- RequireJs学习笔记之Define a Module
简单的键值对定义define({ color: "black", size: "unisize"}); 如果一个模块没有任何依赖,又需要做用一个函数 ...
- WeX5学习笔记
目录 WeX5学习笔记... 1 1.轻松看透WeX5产品能力和技术... 1 2.WeX5可以怎么玩?... 3 一.纯本地App. 3 二.关联一个网站,希望默认就打开某页... 4 三.UI设计 ...
随机推荐
- ionic 安装本地插件极光推送
问题:按照官方文档的步骤 假如把插件保存到了D:\push\jpush,当执行到 cordova plugin add D:\push\jpush 的时候,ionic 不是从本地目录安装,而是从reg ...
- launch文件
launch在ROS应用中,每个节点通常有许多参数需要设置,为了方便高效操作多个节点,可以编写launch文件,然后用roslaunch命令运行roslaunch: roslaunch [option ...
- wpf中UserControl的几种绑定方式
我们经常会抽取一些可重用的控件,某个属性是否需要重用,直接决定了这个属性的绑定方式. 1.完全不可重用的控件 有一些与业务强相关的控件,它们的属性完全来自ViewModel,越是相对复杂的控件,越容易 ...
- mybaits入门
1.回顾jdbc开发 orm概述 orm是一种解决持久层对象关系映射的规则,而不是一种具体技术.jdbc/dbutils/springdao,hibernate/springorm,mybaits同属 ...
- excel列递增方法技巧
最近处理世界买家网100多万的数据,需要用到excel来对数据进行处理,其中有一项是对数据做一个排序,以方便数据导入时来对应唯一的id编号,之前都是 几万,最多也是30来万的数据,所以列递增就直接用鼠 ...
- For-Each循环
For-Each循环也叫增强型的for循环,或者叫foreach循环. For-Each循环是JDK5.0的新特性(其他新特性比如泛型.自动装箱等). For-Each循环的加入简化了集合的遍历. 语 ...
- Jmeter—4 添加断言 判断响应数据是否符合预期
发出请求之后,通过添加断言可以判断响应数据是否是我们的预期结果. 1 在Jmeter中发送一个登录的http请求(参数故意输入错误).结果肯定是登陆失败啦. 但结果树中http请求的图标显示‘绿色’表 ...
- 2、Linux系统root用户忘记密码的重置方式
.界面按空格暂停,按E .找到UTF-,在后面空格后输入init=/bin/sh 然后CHRL+X启动 .进入到这个界面,输入mount -o remount,rw / .输入passwd..然后输入 ...
- WCF 服务器调用回调函数 单程-双程操作模式:(待补充Demo)
服务器端Server 实现回调接口Interface定义.客户端实现回调接口Interface实现,从而实现服务器端通过 var channel = OperationContent.Current ...
- [Java Basics] Collection
除了Java collection class/interface外,方便的有Google guava的utility class: Lists/Sets/Maps/Queues, 用它们可以方便地创 ...