0

我在一个项目中使用 requirejs,我有 2 个模块:

  • a.js:是一个非 AMD 模块,我无法触摸它的代码
  • b.js:是我用define()函数编写的 AMD 模块。它需要a.js工作。
  • app.js:是同时使用a.js和的实际应用程序代码b.js

app.js 看起来像这样:

//source code for app.js
require(['a.js', 'b.js'],
function( a, b ) {
    a.x = 2;//this will fail because 'a' is not defined
});

现在的问题是:require()两个模块的最简单方法是什么app.js?我不能这样做:

//source code for app.js
require(['b.js', 'a.js'],
function( b ) {
    a.x = 2;//it works because module 'a' defines a global variable named 'a'
    b.x = 2;//this will fail because module 'b' is loaded before 'a' so it doesn't work
});
4

2 回答 2

2

正如您所说,由于a.js导出了一个名为 的全局变量a,因此您可以使用shim 配置选项RequireJS配置为以 AMD 方式公开它。任何需要的模块甚至都不知道它不是一个合适的模块。在您的情况下,配置将是这样的:a.js

requirejs.config({
    shim: {
        'a.js': {
            exports: 'a' // a.js defines 'window.a'
        }
    }
});
于 2013-03-16T11:59:29.187 回答
0

这是 AMD 装载机的标准票价。大多数情况下,不需要垫片。您的 app.js 来源是正确的,但您没有显示 b.js 的来源。由于您可以控制 b.js,因此应将其编写为依赖于 a.js 的 AMD 模块

// source code for b.js
// You have to use define, not require, and the dependency on a.js must be here rather than via a nested or internal require
define(['a.js'], function(a){
    // your code for b.js
});

当 app.js 准备好执行时,这将确保 a.js 在 b.js 之前加载。

于 2013-04-15T17:43:59.350 回答