requirejs:不在不同站点上一致地加载库

时间:2014-04-17 08:12:42

标签: javascript requirejs

我遇到一些问题,我尝试通过require.js加载store.js,结果是它不同站点之间(我正在尝试书签)。我正在使用此处的网站列表。 https://github.com/jrburke/requirejs/wiki/Sites-using-RequireJS

bbc.com和fool.com有效,但其他(http://www.rtt.ag/enhttp://www.usatoday.com/http://www.hallmark.com/easter/ideas/easter-recipes/)不一致。例如,有时jquery不可用,有时qtip不可用,有时商店不可用。

if (window.require) {
    requirejs.config({
        paths: {
            jq: '//cdnjs.cloudflare.com/ajax/libs/jquery/1.8.2/jquery.min',
            qtip2: '//cdnjs.cloudflare.com/ajax/libs/qtip2/2.2.0/jquery.qtip',
            json2: '//cdnjs.cloudflare.com/ajax/libs/json2/20130526/json2.min',
            jstore: '//cdnjs.cloudflare.com/ajax/libs/store.js/1.3.14/store.min'
        },
        map: {
            'qtip2': { 'jq': 'jquery-private' },
            'json2': { 'jq': 'jquery-private' }
        },
        findNestedDependencies: true
    });

    define('jquery-private', ['jq'], function () {
        return jQuery.noConflict(true);
    });

    require(['jstore'], function(store){
        require(['jquery-private', 'qtip2', 'json2'], function (jay) {
            console.log(store);
            console.log(jay);
            qtip2Initializer(jay,store);

        });
    });

}

function qtip2Initializer(jay,store) {
    console.log(jay().jquery);
    // Your logic to execute when qTip2 is available
    jay(document).ready(function () {
      $('a').qtip();
      store.set("test",1);
    });
}

1 个答案:

答案 0 :(得分:0)

您的代码无法在某些网站上运行,这并不神奇。我没有按下整个列表,但http://www.rtt.ag/enhttp://www.usatoday.com/没有定义window.require,所以您展示的代码会测试为它,找到它不存在并跳过if分支。以下是为什么任何给定网站可能无法正常工作的原因:

  1. refer to由社区维护的网站列表。所以它很可能是错的。如果某个网站过去常常使用RequireJS,但我不希望他们的开发人员访问此列表并删除该链接。

  2. window.require可能由于其他原因而被定义,而不是加载RequireJS。其他加载系统在全局空间中定义require。 (您可能在控制台中遇到一些错误。)

  3. 可以使用RequireJS,但不能在那里定义通常在全局空间中定义的任何符号。例如,如果站点使用使用namespace选项的优化捆绑包,则通常为全局的符号将在此命名空间中定义。

    另一种情况是优化捆绑包加载Almond并配置为不会将任何内容泄漏到全局空间中。

  4. 您正在尝试做的其他问题:

    1. findNestedDependencies是优化器选项,而不是运行时选项。所以它什么都不做。

    2. jQuery必须在依赖项中列为jquery,因为它在调用define时对其名称进行了硬编码。如果您使用与jquery不同的名称,则会出现不稳定的行为。

    3. 您报告的间歇性错误通常适用于从两个不同位置获取jQuery的情况。除了你的代码加载带有RequireJS的jQuery之外,还可以这样做:

      一个。该站点的代码使用RequireJS加载jQuery。

      湾该网站的代码使用<script>标记加载jQuery。

      ℃。该网站的代码以另一种方式加载jQuery。

      由于RequireJS是异步的,任何依赖于jQuery的代码都可能获得一个jQuery实例,当加载第二个jQuery时,它将被覆盖。