构建一个使用requirejs的消费库?

Jas*_* L. 5 javascript coffeescript requirejs

我有一个问题似乎无法找到答案.我正在构建一个供消费的库,我想使用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
Run Code Online (Sandbox Code Playgroud)

我想要做的是能够从我的任何其他文件中请求signals.js文件和我的任何模块,而无需在require中设置路径,或者我不必知道项目是如何设置的在开发时.

例如,我在otter.coffee文件中尝试做的是:

define ['/libs/signals/signals'], (signals) ->
    # I've also tried './libs/signals/signals' and 'libs/signals/signals'
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用,因为无法找到signals.js文件.

如何让requirejs相对于当前文件加载模块?我已经读过,我可以要求require作为依赖项,并且该require的路径将被设置为文件的路径,但这似乎也不起作用.它抛出一个未加载的错误i:e -

define (require) ->
    signals = require './libs/signals/signals'
Run Code Online (Sandbox Code Playgroud)

我有什么想法可以做到这一点?我需要更改库的结构吗?我是否必须强制使用特定结构?我是否要求使用它的人在他们的require配置中包含某些路径?

提前谢谢了!

编辑 -

我注意到如果我在main.js文件中将我的库别名为require,则需要(通过require或define)信号不起作用(继续找不到404).但是,如果我没有别名我的库一切正常..

例如,如果我的require main.js文件有..

...
paths: {
    'otter': 'scripts/otter/otter'
}
...
Run Code Online (Sandbox Code Playgroud)

那么信号的要求就失败了.但是,如果我没有路径并且我需要水獭通过它的直接路径,那么信号的需求就会起作用.我在otter.js中需要这样的信号......

define (require) ->
    signals = require './libs/signals/signals'
Run Code Online (Sandbox Code Playgroud)

这是require.js的错误吗?

yve*_*lem 2

RequireJS 使用两个函数来完成其工作:define()require()

我的理解是define()列出依赖项并仅加载模块;加载不是模块的依赖项(那些不使用的模块define())已完成require()

因为只有模块才能加载模块,所以必须有其他人来加载第一个模块。就您而言,第一个必须使用signals.js模块otter.js,第二个必须使用require(). 我想require()在任何使用之前总是需要a define()

水獭.js:

require.config({
  paths: {
    'signals': 'libs/signals/signals',
    'module1': 'modules/subModule1'
  }
});

require(['signals'], function(signals) {
  signals.initialize();
});
Run Code Online (Sandbox Code Playgroud)

信号.js:

define(['module1'], function(module) {
  return {
    initialize: function() {
      module.doStuff();
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

子模块1.js:

define([], function() {
  return {
    doStuff: function() {
      console.log('hello world');
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

附:似乎不允许加载相对于当前文件的模块:属性用于baseUrl配置requirejs.config().