5

答えが見つからないように見える質問があります。私は現在、消費用のライブラリを構築しており、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

私がやりたいことは、require でパスをセットアップする必要なく、またはプロジェクトがどのようにセットアップされているかを知らなくても、他のファイルから signal.js ファイルとモジュールを要求できるようにすることです。開発時。

たとえば、私が otter.coffee ファイルでやろうとしたことは次のとおりです。

define ['/libs/signals/signals'], (signals) ->
    # I've also tried './libs/signals/signals' and 'libs/signals/signals'

requireがsignals.jsファイルを見つけることができないため、これは機能しないようです。

現在のファイルに関連するモジュールをロードするようにrequirejsを取得するにはどうすればよいですか? 依存関係としてrequireを要求できること、およびそのrequireのパスがファイルのパスに設定されることを読みましたが、それも機能していないようです。まだロードされていないというエラーがスローされます i:e -

define (require) ->
    signals = require './libs/signals/signals'

これを達成する方法はありますか?ライブラリの構造を変更する必要がありますか? 特定の構造を強制する必要がありますか? それを使用する人に、require config に特定のパスを含めるように依頼しますか?

よろしくお願いします!

編集-

ライブラリを main.js ファイル内で require 用にエイリアスすると、(require または define による) シグナルの require が機能しないことに気付きました (404 not found が発生し続けます)。ただし、ライブラリにエイリアスを付けないと、すべて正常に動作します..

たとえば、必要な main.js ファイルに..

...
paths: {
    'otter': 'scripts/otter/otter'
}
...

その後、シグナルの要求は失敗します。ただし、パスがなく、その直接パスを介してカワウソが必要な場合は、シグナルのリクエストが機能します。私はotter.jsでこのようなシグナルを必要としています...

define (require) ->
    signals = require './libs/signals/signals'

これはrequire.jsのバグですか?

4

1 に答える 1

2

RequireJS は、その仕事をするために 2 つの関数を使用します:define()require().

私の理解では、define()依存関係をリストし、モジュールのみをロードします。モジュールではない依存関係 (を使用しない人define()) のロードは で行われrequire()ます。

モジュールのみがモジュールをロードできるため、最初のモジュールをロードするには他の誰かが必要です。あなたの場合、最初に使用するsignals.jsotter.jsはモジュールである必要があり、2番目は使用する必要がありますrequire()require()aは、使用する前に常に必要だと思いdefine()ます。

otter.js:

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

require(['signals'], function(signals) {
  signals.initialize();
});

シグナル.js:

define(['module1'], function(module) {
  return {
    initialize: function() {
      module.doStuff();
    }
  }
});

subModule1.js:

define([], function() {
  return {
    doStuff: function() {
      console.log('hello world');
    }
  }
});

ps。現在のファイルに関連するモジュールのロードは許可されていないようです:内baseUrlすべてのモジュール パスを構成するためにプロパティrequirejs.config()が使用されます。

于 2012-07-11T15:33:25.627 に答える