【问题标题】:R.js compilation of non-AMD modules非 AMD 模块的 R.js 编译
【发布时间】:2013-12-14 06:00:45
【问题描述】:

我的项目中有非 AMD 主干、非 AMD 下划线和非 AMD jquery。我还有很多不兼容 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 中将这些路径配置为别名。

【问题讨论】:

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

标签: requirejs underscore.js amd r.js


【解决方案1】:

您为什么认为主干、下划线或 jquery 与 AMD 不兼容?他们是这样!只是有点不开箱。您只需要在 ma​​in.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. 使用 this 包装您的 CommonJs 模块。
  2. 使用这个结构:

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

正如我测试的那样,这两个选项都与 RequireJs 优化器配合得很好。

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

【讨论】:

    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多