未捕获的错误:匿名的define()模块不匹配

时间:2015-05-12 08:03:22

标签: javascript requirejs modernizr

我是一个受虐狂,所以我决定改变我在项目中加载require.js的方式。我所做的就是从这里开始(使用Modernizr.load)......

<script type="text/javascript">

    function requireJsConfig () {
        requirejs.config({
            'baseUrl': '{{ STATIC_URL }}js',
            'paths': {
                'jquery': 'libraries/jquery',
                'backbone': 'libraries/backbone',
                'underscore': 'libraries/underscore',
                'jquery.cookie': 'libraries/jquery-cookie',
                'tinymce': 'tinymce/tinymce.min',
                'react' : 'libraries/react',
                'history': 'history'
            },
            waitSeconds: 30,
            shim: {
                'jquery' : 'jquery',
                'underscore' : {
                    exports: '_'
                },
                'backbone': {
                    deps: ['underscore', 'jquery'],
                    exports: 'Backbone'
                },
                'jquery.cookie': {
                    deps: ['jquery'],
                    exports: '$.cookie'
                },
                'tinymce': {
                    deps: ['jquery'],
                    exports: 'tinymce'
                }
            }
        });

        define('static_url', [], "{{ STATIC_URL }}");
        window.static_url = "{{ STATIC_URL }}";
        define('PUBNUB_SUBSCRIBE_KEY', [], "{{ PUBNUB_SUBSCRIBE_KEY }}");

        require(["teacher"]);
    };

    Modernizr.load({
        load: '{{ STATIC_URL }}js/require.js',
        complete: function() {
            requireJsConfig();
        }
    });

</script>

...到此(不使用Modernizr.load)......

<script type="text/javascript" src="{{ STATIC_URL }}js/require.js"></script>

<script type="text/javascript">

    function requireJsConfig () {
        requirejs.config({
            'baseUrl': '{{ STATIC_URL }}js',
            'paths': {
                'jquery': 'libraries/jquery',
                'backbone': 'libraries/backbone',
                'underscore': 'libraries/underscore',
                'jquery.cookie': 'libraries/jquery-cookie',
                'tinymce': 'tinymce/tinymce.min',
                'react' : 'libraries/react',
                'history': 'history'
            },
            waitSeconds: 30,
            shim: {
                'jquery' : 'jquery',
                'underscore' : {
                    exports: '_'
                },
                'backbone': {
                    deps: ['underscore', 'jquery'],
                    exports: 'Backbone'
                },
                'jquery.cookie': {
                    deps: ['jquery'],
                    exports: '$.cookie'
                },
                'tinymce': {
                    deps: ['jquery'],
                    exports: 'tinymce'
                }
            }
        });

        define('static_url', [], "{{ STATIC_URL }}");
        window.static_url = "{{ STATIC_URL }}";
        define('PUBNUB_SUBSCRIBE_KEY', [], "{{ PUBNUB_SUBSCRIBE_KEY }}");

        require(["teacher"]);
    };

    requireJsConfig();

</script>

......现在我得到了这个:

  

未捕获错误:匿名的define()模块:函数不匹配   (){return r}

FWIW,这是发生错误的地方(在require.js中):

function intakeDefines() {
    var args;

    //Any defined modules in the global queue, intake them now.
    takeGlobalQueue();

    //Make sure any remaining defQueue items get properly processed.
    while (defQueue.length) {
        args = defQueue.shift();
        if (args[0] === null) {
            return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));
        } else {
          //args are id, deps, factory. Should be normalized by the
          //define() function.
          callGetModule(args);
        }
    }
}

顺便说一句,我已经确认these都没有申请。

为什么这个看似无害的变化导致核弹在我的项目中爆炸? (是的,实际的核弹引爆......似乎数以百万计的声音突然在恐怖中大声喊叫,并突然沉默......)

2 个答案:

答案 0 :(得分:0)

你说&#34;这些都不适用&#34;但是除非你手动修改了下划线,否则certainly does

答案 1 :(得分:0)

让我们看看我是否能比帕特里克更好地解释它......

shim您不需要underscore,因为它会检测它是否与AMD加载程序一起运行,如果是,则调用define请勿将shim用于呼叫define的模块。

您还应该删除jQuery的shim。除非您使用的是古老版本,否则它还会检测到它是使用AMD加载程序运行并调用define。此外,shim jquery: "jquery"毫无意义。 (我能想到的最接近有意义的shimjquery: ["jquery"],这意味着“jquery取决于jquery”。)

至于它之前为什么会有效...当你使用shim模块调用define时,你会输入未定义的区域:有时它会起作用,有时它不起作用。

我不知道其他模块是否需要垫片,因为我不经常使用它们。如果我是你,我会检查他们是否致电define