R.js汇编了非AMD模块

时间:2013-12-14 06:00:46

标签: requirejs underscore.js amd r.js

我的项目中有非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中将这些路径配置为别名。

1 个答案:

答案 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种选择:

  1. this包裹您的CommonJs模块。
  2. 使用此结构:

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

  3. 正如我测试的那样,这两个选项都适用于RequireJs优化器。

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

相关问题