javascript - IE8 及更低版本的 RequireJS shim 问题

标签 javascript backbone.js internet-explorer-8 requirejs amd

我在这里遇到了困难,我试图在加载任何 AMD 模块之前加载非 AMD 模块 jquery/lodash/underscore。我知道我应该使用“垫片”,我确实这样做了。 Evertyghing 似乎适用于除 IE8 及更低版本之外的所有浏览器。 IE7/8 是否有某种解决方法?

我看过“使用”插件/“订购”插件并将全局变量包装到 AMD 模块中 (http://tbranyen.com/post/amdrequirejs-shim-plugin-for-loading-incompatible-javascript)。一切都失败了。关于如何完成的任何想法?

编辑

require.config({
use: {
    backbone: {
        deps: ["underscore", "jquery"],
        attach: "Backbone"
    },

    underscore: {
        attach: "_"
    },

    jquery : {
        attach: 'jquery'
    }
},
paths: {
    'underscore': 'lodash-1.3.1.min',
    'backbone': 'backbone-1.0.0.min',
    'jquery': 'jquery-1.10.2.min',
}
});

require([
'use',
'jquery',
'underscore',
'backbone',
'app',
], function($) {
'use strict';
});

'use' 是 use.js 插件。我以前也用过“垫片”。

编辑 2

shim: {
    'app': {
        deps: ['backbone']
    },
    'backbone': {
        deps: ['underscore', 'jquery'],
        exports: 'Backbone'
    },
    'underscore': {
        exports: '_'
    },
    'jquery' : {
        exports: 'jquery'
    },
},

我的垫片配置。要求版本为 2.1.10。

编辑 3:

require.config({
paths: {
    'underscore': '//cdn.vgc.no/js/libs/lodash/lodash-1.3.1.min',
    'backbone': '//cdn.vgc.no/js/libs/backbone/backbone-1.0.0.min',
    'jquery': '//cdn.vgc.no/js/libs/jquery/jquery-1.10.2.min'
},
enforceDefine : true
});

require([
'jquery',
'underscore',
'backbone'
], function($, _, Backbone) {
'use strict';

console.log($);
console.log(_);
console.log(Backbone);
})

这应该在 IE8 下工作吗?

最佳答案

jquery 的 shim 是多余的。

另外,如果 app 是一个实际的 RequireJS 模块,你不需要它的 shim。 appdefine 调用应该是 define(['backbone'], function (Backbone) {...

Asgoth 指出 lodash 和 Backbone 是 AMD 兼容的,因此您不应该为 underscoreBackbone 使用 shim。您将 lodash 用于 underscore。 Lodash 有一段时间(也许永远)不需要 shim。 Backbone 过去需要垫片,但现在支持 AMD 风格的加载器。

所以目前,您的配置中的垫片似乎都不是必需的。您仍然应该使用 enforceDefine

如果这是混淆的根源,让我澄清一下使用 shim 的基本规则是:如果一个模块使用 define 来定义自己,那么它不能有 shim;如果一个模块不使用 define,那么它必须有一个 shim。讨论使用 enforceDefine 并确保所有垫片都设置了 exports 的文档不会更改此规则。它的意思是,如果需要一个 shim(根据上面的规则),那么这个 shim 应该有一个 exports 字段。

编辑: 我可以使用以下代码在 IE8 中加载它。你会在那里看到一个 Backbone 的垫片,尽管我之前有评论。为什么?因为您使用的是不支持 AMD 的 Backbone 1.0.0。最新版本 Backbone 1.1.2 支持 AMD。所以如果你要升级到这个版本,你就不需要垫片了。 (此代码以 http: 作为 CDN 路径的前缀,但我不认为这是您问题的一个因素。只是我首先从本地文件系统加载测试 HTML 并执行此操作,http: 前缀是必需的。)

  require.config({
      paths: {
          'underscore': 'http://cdn.vgc.no/js/libs/lodash/lodash-1.3.1.min',
          'backbone': 'http://cdn.vgc.no/js/libs/backbone/backbone-1.0.0.min',
          'jquery': 'http://cdn.vgc.no/js/libs/jquery/jquery-1.10.2.min'
      },
      shim: {
          backbone: {
              deps: ["jquery", "underscore"],
              exports: "Backbone"
          }
      },
      enforceDefine : true
  });

  require([
      'jquery',
      'underscore',
      'backbone'
  ], function($, _, Backbone) {
      'use strict';

      console.log($);
      console.log(_);
      console.log(Backbone);
  });

这是 IE8 中控制台输出的屏幕截图:

Screenshot in SauceLab

关于javascript - IE8 及更低版本的 RequireJS shim 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21934353/

相关文章:

javascript - 使用jQuery点击元素触发css :active

javascript - 将授权和安全性应用于 RIA

html - 由于 "height : 75%"CSS,SELECT 列表未在 IE8 中显示

javascript - Mongoose 在嵌套模式中查找

javascript - 尝试从 javascript/JQuery 数组中删除项目

javascript - 比较 Canvas 上的线条

javascript - Backbone.js 没有在模型更改时发布到服务器?为什么?

javascript - backSpace 没有在 android 手机中触发 keyup 事件

css - 负绝对定位导致 overflow hidden (IE7/8)

javascript - Google Maps API v3 在没有 fitbounds 的情况下无法加载,缩放导致无限循环/stackoverflow