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

时间:2012-07-06 12:31:40

标签: coffeescript javascript 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

我想要做的是能够从我的任何其他文件中请求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的错误吗?

1 个答案:

答案 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()中的每个模块路径。