9

この質問がよく似たバリエーションで出てきたことは知っていますが、私のニーズに完全に適合する解決策はないようです。私は次の問題を抱えています:

開発では、複数のJSファイル(「オブジェクト」ごとに1つのファイル)を使用します。これらのJSファイルには、相互にいくつかの依存関係があります。一部は他のファイルに依存しているため、最初にそれらをロードする必要があります。現在、RequireJSを使用して各JSファイルを正しい順序でロードしているので、各ファイルのモジュールを定義します。上品でダンディ。しかし、今度は、すべてのJSファイルを1つの大きなJSファイルに連結します。これは、モジュール自体である必要があります。私はそれを行うためにRequireJSオプティマイザーr.jsを使用しています。私の問題:すべてのJSファイルは大きなJSファイルに連結されていますが、各オブジェクトのモジュール定義はに含まれています。1つの大きなファイルに1つの大きなモジュールはありませんが、1つの大きなファイルに多くのモジュールがあります。

その後、私は連結のためにうなり声を上げようとしましたが、これは正常に機能しますが、ファイルの依存関係を無視します。すべてのファイルをアルファベット順に連結するか、gruntfileで順序をハードコーディングする必要があります。

どうすればこれを解決できますか?

私の問題の実例として:私は次のファイル(擬似コード)を持っています:

FileA
- define FileA module
- depends on FileB
- FileA Logic

FileB
- define FileB module
- FileB Logic

そして、私はこの出力が欲しいです:

LibFile
- define LibFile module
- FileB Logic, FileA Logic

しかし、私はこれをr.jsで取得します(FileAとFileBからのモジュール定義がコピーされます):

LibFile
- define FileB module
- FileB Logic
- define FileA module
- depends on FileB
- FileA Logic

そして、私はうなり声でこれを手に入れます(間違った順序):

LibFile
- FileA Logic
- FileB Logic

その質問は少しばかげているかもしれませんが、私は誰もが使用しているように見えるツールではこれを解決できません...私もgrunt-requirejsプラグインを試しました。しかし、それは私が解決できなかったいくつかのエラーを投げます。

ありがとう、ピポ

4

1 に答える 1

7

私はそれを答えに移すつもりです。そのため、コードは少し明確になっています。

私はこれらをメモリで行っているので(今はテストできないため)、いくつかの小さなことが完全に正確ではない可能性があります。

もちろん、モジュールのパッケージ方法によって異なりますが、1つの方法は、すべての小さなモジュールを大きなモジュールに登録することです。

ファイルA.js

define([], function() {
    // do something
    return A;
});

ファイルB.js

define(['path/to/A'], function(A){
    // do something with A and more
    return B;
});

次に、それらを一緒にパッケージ化します。

mylib.jsをファイルする

define(['path/to/A', 'path/to/B'], function(A, B){
    return {
        A : A,
        B : B
    }
}

次に、ビルドプロファイルをポイントするmylib.jsと、1つの大きなファイルに結合されます。これは1つのすべてをカプセル化するモジュールではありませんが、他のすべてを参照するエントリモジュールがあります。その後、次のように使用できます。

require.config({
    paths : {
        'path/to/mylib' : 'real/path/to/mylib/on/server'
    }
});
require(['path/to/mylib'], function(Lib) {
    // do something using Lib.A or Lib.B
}

注意すべきことの1つは、大きなモジュールファイルのIDです。デフォルトでは、RequireJSビルドは(appDirIIRCからの)物理パスに一致するIDを提供し、依存関係をロードするときにそれと一致する必要があります。簡単に言えば、結果 mylib.jsのファイルに名前を受け取ったメインモジュールがある'path/to/mylib'場合は、それを照合して同じIDでロードするrequire.config.pathsか(を使用して)、マップなどで遊ぶ必要があります(一部にはRequireJS 2.0が必要です)。

以下は、私があなたに「大きなモジュール」のことをしたい理由を尋ねた理由です

その他の注意点は、すべての内側の小さいモジュールも物理パスに一致するIDを受け取り、mylib.jsがロードされている場合は、大きいパッケージモジュールを使用するときにこれらのIDを使用できます(これにより、からだけでなくアクセスできるようになりますLib.A)。

require(['path/to/A'], function(A) {
    // do something using A
}
于 2012-06-09T02:48:09.010 に答える