2

我有一个看起来像这样的文件结构:

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

spec/main.js是我的入口点,我从中加载模块/js, /vendor/spec

我可以毫无问题地加载 invendor和 in 的模块,spec因为这些模块是假设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
    });
});
4

1 回答 1

1

首先,我在包装您的代码的匿名函数中缺少所有 () 。

例如,在这段代码中:

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

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

我有几个解决方案,但恐怕它们无法轻松解决您的问题,或者在 100% 的情况下(我并不是说没有那个解决方案,我只是说我不知道它)

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

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

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

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

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

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

会成为:

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

但是,由于我无法为您的问题提供任何真正的解决方案(在不更改 js/ 文件代码中的任何内容的情况下解决此问题),如果您是,我建议您开始在包的依赖项中使用相对路径用于在不同项目之间重用一组模块。当然,以某种方式组织文件。

让我们看看是否有人对您的问题有真正的解决方案。

于 2012-06-20T09:30:31.267 回答