我有一个问题似乎无法找到答案。我正在构建一个供消费的库,我想使用requirejs使其更加模块化。我有以下项目结构......
- example
- scripts
- otter
- libs
- signals
signals.js
- modules
subModule1.js
subModule2.js
otter.js
index.htm
- src
- libs (copied to example folder at build time)
- signals
signals.js
- modules
subModule1.coffee
subModule2.coffee
- otter.coffee
我想要做的是能够从我的任何其他文件中请求signals.js文件和我的任何模块,而无需在require中设置路径,或者我不需要知道如何项目是在开发时设置的。
例如,我在otter.coffee文件中尝试做的是:
define ['/libs/signals/signals'], (signals) ->
# I've also tried './libs/signals/signals' and 'libs/signals/signals'
这似乎不起作用,因为无法找到signals.js文件。
如何让requirejs相对于当前文件加载模块?我已经读过,我可以要求require作为依赖项,并且该require的路径将被设置为文件的路径,但这似乎也不起作用。它抛出一个未加载的错误i:e -
define (require) ->
signals = require './libs/signals/signals'
我有什么想法可以做到这一点?我需要更改库的结构吗?我是否必须强制使用特定结构?我是否要求使用它的人在他们的require配置中包含某些路径?
非常感谢提前!
编辑 -
我注意到如果我在main.js文件中将我的库别名为require,则需要(通过require或define)信号不起作用(继续找不到404)。但是,如果我没有别名我的库,一切正常..
例如,如果我的require main.js文件有..
...
paths: {
'otter': 'scripts/otter/otter'
}
...
然后信号需求失败。但是,如果我没有路径并且我需要水獭通过它的直接路径,那么信号的需求就会起作用。我在otter.js中需要这样的信号......
define (require) ->
signals = require './libs/signals/signals'
这是require.js的错误吗?
答案 0 :(得分:2)
RequireJS使用两个函数来完成其工作:define()
和require()
。
我的理解是define()
列出依赖关系,只加载模块;加载不是模块的依赖项(那些不使用define()
的依赖项)是使用require()
完成的。
因为只有模块可以加载模块,所以必须有其他人加载第一个模块。在您的情况下,要在signals.js
中使用otter.js
,第一个必须是模块,第二个必须使用require()
。我想在任何require()
使用之前总是需要define()
。
<强> otter.js:强>
require.config({
paths: {
'signals': 'libs/signals/signals',
'module1': 'modules/subModule1'
}
});
require(['signals'], function(signals) {
signals.initialize();
});
<强> signals.js:强>
define(['module1'], function(module) {
return {
initialize: function() {
module.doStuff();
}
}
});
<强> subModule1.js:强>
define([], function() {
return {
doStuff: function() {
console.log('hello world');
}
}
});
PS。似乎不允许加载相对于当前文件的模块:a baseUrl
property用于配置requirejs.config()
中的每个模块路径。