2013-12-14 175 views
0

我的项目中有非AMD骨干,非AMD下划线和非AMD jquery。我还有很多不兼容AMD的第三方库。R.js汇编非AMD模块

让他们与使用r.js的AMD模块一起编译的最佳方式是什么?我应该开始将所有这些包装到AMD模块中吗?

我在使用非AMD库和下划线和骨干的模块上运行了r.js,它生成了一个输出,但是在输出的任何地方有require("backbone")调用,它会返回undefined,我怀疑它是因为主干没有注册为AMD模块。

同时,对我来说很奇怪的是,如果我不运行r.js并只是使用require.js加载来定期运行网站,那么即使它们不是AMD模块,以下行也会返回正确的值:

var _ = require("underscore") 
var Backbone = require("backbone") 

我把那些路径配置成我的require.config中的别名。

+1

也许你可以显示你的requirejs.config是什么? –

回答

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暴露),然后我看到的样子,你有两个选择:

  1. 包装你CommonJS的模块,this
  2. 使用这种结构:

    define(function (require) { var $ = require('jquery'); })

两个选项工作尼斯RequireJs优化,因为我测试。

不过,我更喜欢在main.js文件中使用shim选项。