我在这里遇到了困难,我试图在加载任何 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。 app
的 define
调用应该是 define(['backbone'], function (Backbone) {...
。
Asgoth 指出 lodash 和 Backbone 是 AMD 兼容的,因此您不应该为 underscore
或 Backbone
使用 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 中控制台输出的屏幕截图:
关于javascript - IE8 及更低版本的 RequireJS shim 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21934353/