在AMD模块之前添加非AMD模块

时间:2013-03-16 10:26:37

标签: javascript requirejs amd

我正在使用requirejs进行项目,我有2个模块:

  • a.js:是一个非AMD模块,我无法触及其代码
  • b.js:是我用define()函数编写的AMD模块。它需要a.js才能工作。
  • app.js:是同时使用a.jsb.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
});

2 个答案:

答案 0 :(得分:2)

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

requirejs.config({
    shim: {
        'a.js': {
            exports: 'a' // a.js defines 'window.a'
        }
    }
});

答案 1 :(得分: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准备好执行时,这将确保在b.js之前加载a.js.