2

我在 IE8 中返回以下错误:

消息:预期对象行:27 字符:1 代码:0 URI: http ://cdn.example.com/images/example4/js/libs/jquery.backgroundSize.js

消息:'$.fn' 为空或不是对象行:8 字符:1 代码:0 URI: http ://cdn.example.com/images/example4/js/libs/jquery.waitUntilExists.js

消息:'fn' 为空或不是对象行:62 字符:73 代码:0 URI: http ://cdn.example.com/images/example4/js/libs/jquery.nicescroll.js

消息:对象预期行:34 字符:231 代码:0 URI: http ://cdn.example.com/images/example4/js/libs/backbone.js

消息:'Vent' 为空或不是对象行:19 字符:3 代码:0 URI:http ://cdn.example.com/images/example4/js/models/auth.js

我们的网站是一个使用 Backbone.js 和 Require.js 构建的 SPA,用于依赖管理。这个问题只出现在 IE8(可能还有更早的版本)上。这些文件中的每一个,除了最后一个是因为 'Vent' 扩展 Backbone.Event 引起的,都在我们的 Require.js 配置文件中创建为 Backbone.js 的垫片。

Require.js 配置:

requirejs.config({
    baseUrl: 'http://cdn.staging.example.com/images/example4/js',
    paths: {
        underscore: './libs/underscore',
        jquery: './libs/jquery',
        backbone: './libs/backbone',
        example: './libs/example',
        blockui: './libs/jquery.blockUI',
        backgroundsize: './libs/jquery.backgroundSize',
        nicescroll: './libs/jquery.nicescroll',
        waituntilexists: './libs/jquery.waitUntilExists',
        swfobject: './libs/swfobject',
        spinner: './libs/jquery.spinner'
    },
    //Create shims for Backbone
    shim: {
        'backgroundsize': {
            deps: [ 'jquery'],
            exports: 'backgroundsize'
        },
        'nicescroll': {
            deps: ['jquery'],
            exports: 'nicescroll'
        },
        'waituntilexists': {
            deps: ['jquery'],
            exports: 'waituntilexists'
        },
        'spinner': {
            deps: ['jquery'],
            exports: 'spinner'
        },
        'backbone': {
            deps: [ 'underscore', 'jquery','blockui','backgroundsize','nicescroll', 'waituntilexists', 'swfobject', 'spinner'],
            exports: 'Backbone'
        }
    }
});

requirejs(['app'],
    function(App){
        App.initialize();
    });

任何会导致此问题的建议,我们都在使用 Backbone.js 0.9.2 和 Require.js 2.0.6。

4

2 回答 2

0

尝试像这样将主干添加到您的主要需求中:

    requirejs(['app', 'backbone'], function(App){ App.initialize(); });

另外,尝试使用 r.js 生成一个连接文件(确保关闭优化),您可以看到 require 加载脚本的顺序。

于 2013-02-19T11:37:11.207 回答
0

IE 的垫片存在一些问题,您可以在此处阅读http://requirejs.org/docs/errors.html#nodefine

据我了解http://requirejs.org/docs/api.html#config-shim

仅使用其他“填充”模块作为填充脚本的依赖项,或没有依赖项的 AMD 库,并在它们也创建全局(如 jQuery 或 lodash)后调用 define()。否则,如果您使用 AMD 模块作为 shim 配置模块的依赖项,则在构建之后,该 AMD 模块可能直到构建中的 shimed 代码执行后才被评估,并且将发生错误。最终的解决方法是升级所有填充代码以具有可选的 AMD define() 调用。

将 jquery 作为 shim 的依赖项可能存在问题,或者未加载 jquery,因此无法将其设置为全局。

于 2013-02-15T08:46:01.683 回答