最近刚做了一个需要兼容IE8的项目,因为主流的框架都不兼容,所以就用requireJS+Jquery+grunt来写
这里总结了一下requireJS的一些优缺点,以及适用场合。
1.requireJS采用预加载的模式,需要什么提前按需加载,不加载那些不需要的JS,提高效率。
2.requireJS和其他许多框架一样,可以避免全局污染。团队联合开发的时候,也会减少失误,git提交也会减少冲突。
这里引用一段我项目ndex.js中的代码i,作为示例。
define(
[
"require",
"jquery",
"config/gobal",
"config/filter",
"config/route",
"handle/handleCtrl"
],
function (require, $) {
"use strict";
var IndexOperation = {
//内容略……
};
return IndexOperation
});
这段代码是典型的模块化代码。而在上方define()函数中的第一个参数数组中,这些就是要预加载的文件。
每个define()都要返回一个 return 的对象 ,这里就是IndexOperation 这个对象 ,从而使得这个文件的内容也可以被其他文件引用。(这里就涉及到AMD规范问题)
当然,一个项目可能有好几十个JS文件,但是在define()第二个参数函数中,所要引用到的就这些文件,因此也就加载这些就足够了!
这里需要提到的一点是,seaJS的模块与requireJS的模块很像。
直观看到的优点是:同样避免了全局污染,代码可以模块化,避免多人开发引起冲突。
但是seaJS与requireJS有明显的一个不通点。
seaJS是lazyload延迟加载模式(CMD),而requireJS是预加载模式(AMD)。
它们之间的不同就是在文件的开头一下子加载完这个文件所需的模块,还是边执行边加载模块,等需要用到哪个再加载哪个。
按需加载就是seaJS 、预先加载就是requireJS
关于requireJS的不适用场合
requireJS为我们提供了很大的便利,但是还是有些问题比较麻烦。
1.当一个项目中需要引用许多插件的时候。
许多插件都是别人写的,而别人写的时候并没有考虑到项目需要配合什么样的项目。因此特别是有些面向过程写法的插件,不符合AMD书写规范(就像上面模块需要返回一个对象供其他模块引用的方式)。
当项目中出现大量的这种插件就不再适合requireJS了。
2.requireJS的绑定事件确实有点坑爹,无法在页面标签绑定事件,什么onclick,onchange 写到HTML页面?不存在的~
全都要老老实实根据JS定位,先获取节点,再在JS中绑定该事件。这在某种程度上影响了网页的效率,因此也算是一个缺点。