AMD和CMD的区别以及运用
- 都运用于浏览器端,AMD是异步加载资源,而CMD是松散加载资源,根据需求加载。
- AMD是全部加载后,然后需求使用,而CMD是按需加载,就近依赖
- AMD在加载模块完成后就会执行模块,所有模快都记载完成后,就会进入required的回调函数,执行主逻辑函数,,这样的效果就是依赖模块的执行顺序和书写顺序不一定一致,看网络速度,哪个先下载下来,哪个先执行,但是主逻辑一定在所有依赖加载完成后才执行。
- CMD加载完某个依赖模块后并不执行,只是下载而已,在所有依赖模块加载完成后进入主逻辑,遇到require语句的时候才执行对应的模块,这样模块的执行顺序和书写顺序是完全一致的
//AMD
define(['jquery','dailog','carousel'],function(jquery,dailog,Carousel){
var $=jquery;
var dailog=dailog;
var Carousel=Carousel;
})
//CMD
//1. 定义一个模快myModule.js
define(function(require,exports,module){
var $=require(jquery);
$("div").addClass("active");
exports.add=function(){
var i=0;
i++
return i
}
})
define(function(require,exports,module){
var sum=require("myModule").add;
console.log(sum)
})
require
方法,该方法读取一个文件并执行,返回文件内部的module.exports
对象//定义一个a.js文件
var name="hcc";
function printName(){
console.log(name)
}
module.exports={
printName:printName
}
//在b.js中引用a.js
var b= require('./a') //接受a.js的exports的值
b.printName() //输出hcc
//首先浏览器不会识别data-main属性的地址,
2. require.config() 配置文件,配置资源的入口
![事例文件夹配置](http://upload-images.jianshu.io/upload_images/3635292-9976be7feae413a6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
// 1.加载requirejs库(假如下载后的require.js在lib下)- AMD规范的调用
//1. 没有回调函数,就会直接调用依赖
### 项目实际运用
![根目录列表](http://upload-images.jianshu.io/upload_images/3635292-d63146917d5ced4b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
1. 首页引入require.js
``
**解析:**当浏览器加载到require.js,加载完成后,会去寻找data-main里面的脚本运用到页面中
2. 当解析完成后,会找到相应路经的main.js文件
requirejs.config({3. `./js/lib/app/main.js`里面的js文件加载页面的主要功能
define(['jquery','goTop','Carousel','Waterfall'],function( $ ,GoTop,Carousel,Waterfall){Carousel.init($(".carousel")) //轮播
//
new Waterfall($(".wrap-pic")) //瀑布流
})
**解析:** 由于我们已经设置了main.js的基本目录,后面所有加载的js文件都是根据baseUrl+paths的路经,所以./js/lib下面的js插件都可以直接运用名字(后缀名js省略)
> 相当于加载jquery.js / goTop.js / Carousel.js / Waterfall.js 并给它传入到相应的回调函数的形参,用来调用相应的方法。
4. 解析define的用法
为什么`define(['jquery','goTop','Carousel','Waterfall'],function(){.....}`之后就会有相应的方法和函数出来呢?
define('id',[],function(){})5. 相应的子js文件的解析
* goTop.js
//定义goTop.js需要的依赖(jquery),在回调函数中用$使用jquery//return 出来
return GoTop
})* Waterfall.js
//定义Waterfall.js需要的jquery依赖 this.$itemLiWidth = this.$itemLi.outerWidth(true);
this.arrLength = parseInt(this.$itemLi.parents('.wrap').width() / this.$itemLiWidth)
this.pageCount= this.arrLength*2;
this.curPage=1;
this.dataIsArrive=false
this.arr=[];
//初始化数组
for(var i=0;i";
tpls+="";
tpls+="![](+nodes[i].img_url+)";
tpls+=""
tpls+=""+nodes[i].short_name+"
"
tpls+=""+nodes[i].short_intro+"
"
tpls+=""
}
return $(tpls)
}
return Waterfall
//返回Waterfall构造函数给其它的文件使用6. 打包所有的js文件,减少服务器请求
//全局安装requirejs打包js7. 配置相应的路径文件打包
我们需要给r.js一个配置文件来打包所有的js文件,并且配置文件baseUrl找到我们requirejs.config配置的baseUrl
例如:build.js文件
({8. 切换到build.js的文件夹下运行打包
r.js -o build.js //打包js文件
![打包减少请求](http://upload-images.jianshu.io/upload_images/3635292-b7904d56fe145165.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### [requirejs官网](http://www.requirejs.cn/)