1

我多年来一直对此感到困惑,并且有许多不同的shim设置。他们中的大多数给出了大致相同的问题。在阅读了很多关于此的文档后,我什至无法开始写下我尝试过的所有排列。所以我希望有人会认识到这个问题并知道正确的方法。

问题是加载bootstrap, jqueryUi,jsViewsbridget同时在使用 优化时有时会失败r.js

我有这样的设置。

这在未优化时有效:

config.js

requirejs.config({
    baseUrl     : 'js',

    paths: {
        "jquery"            : "lib/jquery",
        "jqueryUi"          : "lib/jquery.ui",
        "domReady"          : "lib/domReady",
        "bootstrap"         : "lib/bootstrap",
        "bootbox"           : "lib/bootbox",
        "bridget"           : "lib/jquery-bridget",
        "jsViews"           : "lib/jsviews"
    },

    shim: {
        "bridget"   : {
            deps        : ['jquery']
        },
        "jqueryUi"  : {
            deps        : ['jquery']
        },
        "jsViews"   : {
            exports     : "$",
            deps        : ['jqueryUi']
        },
        "bootstrap" : {
            exports     : "$",
            deps        : ['jsViews']
        },
        "bootbox"   : {
            deps        : ['bootstrap']
        }
    }

});

require(['app', 'domReady!', 'jsViews', 'jqueryUi', 'bootbox'], function(app) {
    app.start();
});

app.js

define(function(require) {

    var bootbox = require('bootbox');
    var $ = require('bootstrap');
    require('bridget');
    var Masonry = require('masonry.pkgd.js');

    // ...
    // .bridget is SOMETIMES undefined
    $.bridget('masonry', Masonry);

    // ...
    // .views (jsViews) is SOMETIMES undefined
    $.views.templates.mainView.render(data);

    // ...
    // .draggable (jquery-ui) is SOMETIMES undefined
    $('#selector').draggable(options);
});

现在奇怪的是,在优化后它有时也可以工作。在开发人员控制台打开的情况下按 Ctrl+F5时,它显示这有时会起作用,并且有时会抛出上述代码中以Uncaught TypeError: undefined is not a function.

我还注意到,当页面加载成功时,全局命名空间中有三个jQuery对象。当出现其中一个错误时,只有两个jQuery对象。

而且我认为整个游戏就是这样modulesshims所以只有一个。

这似乎是完全随机的。令我困惑的是,优化和未优化的构建之间的行为是不同的。


我认为以下内容与可能的解决方案无关,但这里是其他部分:

启动应用程序的 HTML:

<!DOCTYPE html>

<html>
    <head>
        <script data-main="js/config" src="js/lib/require.js"></script>

咕噜声r.js配置:

grunt.initConfig({
    requirejs: {
        build: {
            options: {
                baseUrl     : "js/",
                mainConfigFile  : "js/config.js",
                dir     : 'release/js/',
                modules     : [{
                    name: 'js/app'
                }],
                findNestedDependencies  : true,
                optimize    : "none", // faster for testing
                done    : function(done, output) {
                    var duplicates = require('rjs-build-analysis').duplicates(output);

                    if (duplicates.length > 0) {
                        grunt.log.subhead('Duplicates found in requirejs build:');
                        grunt.log.warn(duplicates);
                        done(new Error('r.js built duplicate modules, please check the excludes option.'));
                    }

                    done();
                }
            }
        }
    }

编辑:

借助google的魔力,我重新发现了一个我4个月前问过的类似问题,没有任何有用的答案:RequireJS loading jquery-ui failed after optimization

不同之处在于我当前的设置有时会失败,而不是所有时间。

4

0 回答 0