`
zhouyrt
  • 浏览: 1188967 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

RequireJS 2.0 正式发布

 
阅读更多

就在前天晚上RequireJS发布了一个大版本,直接从version1.0.8升级到了2.0。随后的几小时James Burke又迅速的将版本调整为2.0.1,当然其配套的打包压缩工具r.js也同时升级到了2.0.1。此次变化较大,代码也进行了重构,层次更清晰可读。功能上主要变化如下:

 

1,延迟模块的执行。

这是一个很大变化,以前模块加载后factory立马执行。性能上肯定有一些损耗。2.0修改实现,再没人诟病AMD的模块是立即执行的。现在也可以等到require的时候才执行。

 

2,config增加了shim,map,module,enforceDefine。

shim参数解决了使用非AMD方式定义的模块(如jQuery插件)及其载入顺序。使用shim参数来取代1.0版本的order插件。其实在1.0版本中就曾经有人开发过usewrap插件来解决此类问题。考虑到很多开发者有此类需求(比如某些JS模块是较早时候其他人开发的,非AMD方式)此次2.0版本直接将其内置其中。

下面是一个使用jQuery插件形式配置的参数。我们知道jQuery插件本质上是将命名空间挂在全局的jQuery或jQuery.fn上而非使用define定义的模块。而jQuery插件都依赖于jQuery,即在require插件时得保证jQuery先下载下来。可以如下配置

 

require.config({
    shim: {
        'jquery-slide': ['jquery']
    }
});
require(['jquery-slide']);

 

这时会保证先下载jquery.js,然后再下载jquery-slide.js。

 

map参数用来解决同一个模块的不同版本问题,这一灵感来自于Dojo的packageMap。有这样的场景:开发初期使用了的jquery-1.6.4,后期升级到了1.7.2。但担心有些依赖jquery-1.6.4的代码升级到1.7.2后有问题。因此保守的让这部分代码继续使用1.6.4版本。这时map参数将派上用场。

假如A,B模块中使用了jquery-1.6.4.js,C,D模块中使用了jquery-1.7.2.js。如下

 

requirejs.config({
    map: {
        'A': {
            'jquery': 'jquery-1.6.4'
        },
        'B': {
            'jquery': 'jquery-1.7.2'
        }
    }
});
require(['A']); // download jquery-1.6.4.js
require(['B']); // download jquery-1.7.2.js

 

这时require(['A'])将会下载jquery-1.6.4.js,require(['B'])会下载jquery-1.7.2.js。模块“A”如果写成“*”则表示除了B模块使用jquery-1.7.2之外其它模块都使用jquery-1.6.4。map参数解决了模块的各个版本问题,很好的向下兼容了老代码。

 

config参数用来给指定的模块传递一些有用的数据。如下

 

require.config({
    config: {
        'A': {
            info: {name: 'jack'}
        }
    }
});

使用A的模块中可以通过A.config().info获取到该数据信息。如

 

require(['A'], function(A) {
    var info = a.config().info;
    console.log(info);
});

enforceDefine用来强制模块使用define定义,默认为false。如underscore不再支持AMD后,其代码移除了define。此时如果仍然使用requirejs来载入它,它就是普通的js文件了。此时如果enforceDefine设为true,虽然underscore.js能下载但requirejs会报错。如

 

require.config({
    enforceDefine: true
});
require(['underscore'], function(_){
    console.log(_)
})

错误信息

 

 

4,require函数增加了第三个参数errbacks。

很明显该函数指模块文件没有载入成功时的回调。这个也是应一些开发者得要求而增加,其中还包括另一个著名AMD的实现curl的作者John Hann

 

require(['b'], function(){
    console.log('success');
},function(err){
    console.log(err)
}); 

err会给出一些出错提示信息。

 

 

5,更强大的paths参数。

requirejs 1.x版本中已经有paths参数,用来映射模块别名。requirejs2.0更加强大,可以配置为一个数组,顺序映射。当前面的路径没有成功载入时可接着使用后面的路径。如下

 

requirejs.config({
    enforceDefine: true,
    paths: {
        jquery: [
            'http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min',
            'lib/jquery'
        ]
    }
});
 
require(['jquery'], function ($) {
});

 当google cdn上的jquery.min.js没有获取时(假如google宕机),可以使用本地的lib/jquery.js。

 

 

6,在模块载入失败回调中可以使用undef函数移除模块的注册。

这个灵感来自dojo AMD loader,RequireJS取名undef。如下

 

require(['jquery'], function ($) {
    //Do something with $ here
}, function (err) {
    var failedId = err.requireModules && err.requireModules[0];
    if (failedId === 'jquery') {
        requirejs.undef(failedId);
    } 
});
 

 

7,删除了jQuery domready相关代码。

这次没人再诟病RequireJS和jQuery耦合的太紧密。

 

8,删除了priority,packagePaths,catchError.define。

这几个参数已经有相应的替代品。

 

最后需要注意的是,虽然功能增加了不少。但代码量却减少了近60行。主要是去掉了jQuery ready相关代码。另外newContext函数依然有1000多行。

  • 大小: 11.7 KB
分享到:
评论

相关推荐

    domReady:Bower-domReady

    domReady 一个用于检测DOM就绪的AMD加载程序插件。 已知可在RequireJS中使用,但应在支持相同加载器插件API的其他AMD加载器...该插件一直在,直到requirejs 2.0版本发布为止。 贡献 domReady遵循,并被视为的子项目。

    JavaScript资源.zip

    JavaScript的第一个版本随同Netscape Navigator 2.0一同发布。 随着互联网的发展,JavaScript也不断推出新的版本和标准,最著名的标准化过程是由ECMA(欧洲计算机制造商协会)发起的ECMAScript标准。最新的稳定版本...

    Nv-engine:升级,重建和重命名所有代码

    采用定时器和发布订阅者模式混合状态进行订阅 => 全量发布订阅者模式效率提高30倍+,业务越复杂倍率越高 使用了Es6进行了重构 扩展了诸多方法 在经历多次筛选后,特别感谢 'bj.zhangtao' 提供的新框架命名: 全名称...

    前端开源库-fume

    AMD规范主要被RequireJS所采纳,适合于浏览器环境,尤其在处理大量脚本时,能够提升加载速度。fume库实现了AMD规范,意味着开发者可以利用它来实现模块的异步加载,同时支持动态加载和按需加载,降低初始页面加载时...

    mod-season1

    2. **AMD(Asynchronous Module Definition)**:AMD是RequireJS提出的一种异步模块加载方案,适应于浏览器环境。它允许模块和模块依赖可以并行加载,但依赖关系会按需解析。主要通过`define`函数定义模块和`require...

Global site tag (gtag.js) - Google Analytics