我的项目中有非AMD主干,非AMD下划线和非AMD jquery。我也有很多不兼容AMD的第三方库。
使用r.js将它们与AMD模块一起编译的最佳方法是什么?我应该开始将所有这些包装到AMD模块中吗?
我在一个使用非AMD库和下划线和主干的模块上运行了r.js,它生成了一个输出,但是在输出的任何地方都有require("backbone")
调用,它返回undefined,我是' m怀疑是因为骨干网没有注册为AMD模块。
与此同时,对我来说非常奇怪的是,如果我不运行r.js并且只是使用require.js加载定期运行网站,则以下行返回正确的值,即使它们不是AMD模块:
var _ = require("underscore")
var Backbone = require("backbone")
我在require.config中将这些路径配置为别名。
答案 0 :(得分:2)
为什么你认为,骨干,下划线或jquery不兼容AMD?他们是这样!只是有点没有开箱即用。您只需要为 main.js 添加更多配置。例如:
require.config({
paths : {
jquery : 'jquery-2.0.3',
backbone: 'backbone',
underscore: 'underscore'
},
shim : {
underscore: {exports: '_'},
backbone: {deps: ['underscore'], exports: 'Backbone'}
}
});
require(['jquery', 'backbone'], function($, Backbone) {
console.log('Type of $: ' + typeof $);
console.log('Type of Backbone: ' + typeof Backbone);
});
没有很多库,它们完全不兼容AMD(即不能通过RequireJs使用)。每个通过某些属性向全局范围公开的库都可以通过RequireJs使用。
但是如果您想使用CommonJs模块(通过module.exports
公开),那么我看到的方式有2种选择:
使用此结构:
define(function (require) {
var $ = require('jquery');
})
正如我测试的那样,这两个选项都适用于RequireJs优化器。
不过,我更喜欢在main.js文件中使用shim选项。