最近几天在学习一个javascript库require.js,也看了一些相关的教学视频,这里推荐一下幕课网阿当老师的《阿当大话西游之Web组件》的教学视频,一整套看下来,参照视频里面的demo从头做一遍,对于require.js的使用以及web组件的编写挺有帮助的,作为菜鸟,看完后觉得获得更多的是一种编程思想的塑造!可以去看看!
言归正传,什么是require.js?
RequireJS是一个工具库,主要用于客户端的模块管理。它可以让客户端的代码分成一个个模块,实现异步或动态加载,从而提高代码的性能和可维护性。它的模块管理遵守AMD规范,模块与模块之间可以互相依赖,当然可能会有人会想,模块之间的依赖,要是没法正确地去按照特定顺序加载,会出现错误,AMD规范可以处理这种问题,AMD就是这样一种对模块的定义,使模块和它的依赖可以被异步的加载,但又按照正确的顺序。
AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。
将require.js下载下来,嵌入网页中,
<script data-main="scripts/main" src="scripts/require.js"></script>
这里的data-main属性声明的是入口文件scripts/main.js,这里我们把.js后缀省略掉了。也有以下这种写法:
<script src="scripts/require.js" data-main="scripts/main" defer async="true" ></script>
async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上。同时,官方提供了 require.js和 jquery 的打包版本,于是也可以怎么引入:
<script src="scripts/require-jquery.js" data-main="scripts/main" defer async="true" ></script>
RequireJS通过define方法,将代码定义为模块;通过require方法,实现代码的模块加载。
使用define方法,可以将代码写在一个js文件,独立开来作为一个模块,如我建立一个animate模块(animate.js),如下:
define(function(){
function animate(){
this.name="animate";
};
return {
animate:animate ,
dec:"这是一个描述"
};
})
将你的模块代码放置在define(function(){ /*代码*/ });,然后将该模块return的对象暴露出来,可以供其他模块依赖此模块的时候,可以去调用这个模块的API。比如我们建立一个tabview模块(tabview.js)去依赖这个animate模块,
define([‘animate‘],function(a){ function tabview(){ this.name= ‘tabview‘; this.animate = a.animate.name; this.dec = a.dec; } return { tabview:tabview }; })
分析上面的代码,我们将animate模块引入,并给其赋予一个a的别名。那么在该模块不就可以调用animate模块里面的方法和属性了吗?
这里我们在多建一个treeview模块(treeview.js),如下:
define(function(){ function treeview(){ this.name="treeview"; }; return { treeview:treeview }; })
接下来,我们需要去使用前面我们定义好的模块,便可以require方法来实现,见其写在main.js中,如下:
require([‘tabview‘,‘treeview‘],function(a,b){ var tab = new a.tabview(); var tree = new b.treeview(); alert(tab.name); alert(tab.animate); alert(tab.dec); alert(tree.name); });
使用该方法加载tabview、treeview两个模块,而tabview会去依赖animate模块,由于模块返回的都是对象,那我们可以new一个对象去调用加载模块中的方法和属性!
在main.js,我们需要去配置一下模块的路径,就那上面例子来说,需要配置一下几个模块的路径,如下:
require.config({ paths: { "tabview": "js/tabview", "animate": "js/animate", "treeview": "js/treeview" } }); //另一种则是直接改变基目录(baseUrl)。后缀.js可以省略 require.config({ baseUrl: "js/lib", paths: { "jquery": "jquery.min", "underscore": "underscore.min", "backbone": "backbone.min" } });
这样require.js便可以很灵活地使用来进行模块化管理了,这里有一个基于require.js去搭建一个web组件(弹窗的demo),很值得学习一下!可以去看看!github地址:https://github.com/xiaobinwu/require.js-Popup-window-