如何加载假定不同baseUrl的模块

时间:2012-06-19 12:49:29

标签: javascript requirejs

我的文件结构如下:

/js
 |-module/myModule.js
 |-test.js
/vendor/
/spec
 |-main.js
 |-js/app.js

spec/main.js是我的切入点,我从/js, /vendor/spec

加载模块

加载vendorspec中的模块没有问题,因为这些模块是在假设baseUrl = '/'的情况下构建的。

/js中加载模块时遇到问题,因为这些模块是在假设baseUrl = '/js'的情况下构建的。

如何在不更改'/js'

中的脚本代码的情况下解决此问题

以下是一个描述内联描述问题的示例。


规格/ main.js

(function () {
    'use strict';
    require.config({
        baseUrl: '../'
    });
});

define([
    'spec/js/app' // it works
], function (app) {
    'use strict';
    app.initialize();
});

规格/ JS / app.js

(function(){
    'use strict';
    define([
        'js/module/myModule' // it works
    ], function () {
     // some code
    });
});

JS /模块/ myModule.js

(function(){
    'use strict';
    define([
        'test' // it does not works because
               // it assumes that baseUrl equals '/js' and not '/'
    ], function () {
     // some code
    });
});

1 个答案:

答案 0 :(得分:1)

首先,我错过了包装代码的匿名函数中的所有()。

例如,在这段代码中:

(function () {
    'use strict';
    require.config({
        baseUrl: '../'
    });
}()); // <-- missing ()

基本上,这段代码没有做任何事情,因为没有被执行。当您将代码包装在匿名函数中时(为了避免污染全局范围,使代码更容易最小化,...),您必须执行它!但是,当你写这篇文章时,这可能是一个错字。

我有几个解决方案,但我担心他们不能轻易解决你的问题,或者在100%的情况下解决问题(我不是说没有那个解决方案,我只是说我不喜欢不知道。

首先,您可以在require.config对象中定义 paths ,例如:

require.config({
    baseUrl: '../',
        paths : {
            test : 'js/test.js'
    }
});

这样你的代码就可以了。我知道这不是最好的解决方案,因为你必须在路径中为每个文件定义一个条目,我想你正在寻找更通用的解决方案。

使用路径,您始终可以在一个包(一组模块)的依赖项中设置前缀,这样您就可以在包中组织代码,并在该模块的任何依赖项中添加前缀。如果软件包有一个主文件,你可以根据需要将require.config的路径添加到PREFFIX,以链接到该模块当前位置的路径。

我能想到的另一个解决方案是在js中的模块中使用相对路径。如果你经常遇到这个问题,也许你应该从现在开始定义你的模块的依赖关系总是使用相对路径。所以

define([
        'test'
    ], function () {
        ...
);

会变成:

define([
        '../test'
    ], function () {
        ...
);

但是,因为我无法在任何真正的解决方案中考虑你的问题(为了解决这个问题而不改变你的js /文件代码中的任何东西),我建议你开始在你的包的依赖关系中使用相对路径,如果您习惯在不同项目中重用模块组。当然,以某种方式组织文件。

让我们看看是否有人为您的问题提供了真正的解决方案。