2017-01-26 2 views
2

同じIIFEで実行するために2つ以上の別々のファイルでjavascriptコードを定義する必要はありますか?私はgulpのようなビルドツールを使ってこれを実現しています。複数のファイルにまたがるIIFE

ちょうどそのような平凡な問題のようです。私は自分のコードを整理して独自のファイルに分割したいと思っています(ところで、別々のノックアウトビューモデル)。しかし、私は彼ら全員が同じ機能で走り、地球を汚染しないようにしたい。

+0

使用するツールを選択することは、スタックオーバーフローの範囲を超えています(意見に基づいています)。しかし、はい。これを行うためにファイルを連結できます。その目的のために、ノックアウト自体[これらのフラグメントを使用](https://github.com/knockout/knockout/tree/master/build/fragments)。 –

+0

はい!私はこれらの断片を見て、それが可能であることを知っていました。そして、すべてのファイルを一緒に連結し、それをIIFE(恐らくgulp-concatを使用して)で囲むことは非常に簡単です。しかし、問題はChromeで発展しています。私はまだchromeの開発ツールを使ってコードを変更することができます。生成されたjsファイル上でそれらを作成することはできません。元のファイルを変更できる必要があります。 – smulz

答えて

2

これを行う現代的な方法は、すべてをIIFEに入れようとするのではなく、モジュールを使用することです。現在、モジュールを使用するとは、RequireJS、SystemJS、Webpack、Browserifyなどのモジュールバンドラを使用することを意味します。中期的な将来、ブラウザで直接ES2015 +モジュールを使用したり、それらを1つのファイルにまとめます。 (あなたはバベルのようなtranspilersとES2015 +モジュール構文今日を使用することができますが、あなたはまだバンドラが必要です。)あなたは、現時点でRequireJSを使用しますが、そのdefine機能を使用していない言及した

。イラストの目的のために、およそモジュールを定義する方法(私はRequireの構文のファンではありませんが、Babelを使用してES2015の構文をトランスペアレントにすることができます):

define("my-component", ["ko"], function(ko) { 
    // ...define the component... 

    // Return it 
    return MyComponent; 
}); 

  1. アプリのトップレベルのモジュールが有する必要はなく、例えばように(モジュール名は、オプションであるモジュールがmy-component呼ばれる言うKOコンポーネントを定義モジュール名前)
  2. モジュールko(これはKnockoutを提供します)に依存しています。

    define(["my-component", "another-component"], function(MyComponent, AnotherComponent) { 
        // use MyComponent and AnotherComponent here 
    }); 
    
    :その依存関係は、あなたが私のアプリで

次にモジュールで定義されたトップレベルのものとして、あなたのモジュールにMyComponent

  • 戻り値を定義するために使用するコールバックの引数として提供されているかに注意してください

    簡単にするために、一般的にグループで使用される他のモジュールをグループ化してモジュールを作成することもできます。

    my-component.js:ES2015 +構文の代わりに

    import ko from "./ko"; 
    // ...define MyComponent... 
    export default MyComponent; 
    

    app.js

    import MyComponent from "./my-component"; 
    import AnotherComponent from "./another-component"; 
    
    // ...use them... 
    

    は明らかに、両方の例は、非常にを簡素化しており、あなたが行うことができ、より多くのがあります。

  • +0

    ありがとう!私はすべてのファイルをインポートするためにRequireJSを使用しています。私はdefine()関数を使用していません。純粋にjavascriptファイルをrequire()経由でブラウザに取り込むために使用しています。私はドキュメンテーションに相談して、これらのファイルをすべてIIFEに取り込もうとしましたが、短くなりました。 – smulz

    +0

    @smulz:申し訳ありませんが、私はより明確にすべきでした。あなたは*すべてを1つのIIFEにまとめません。代わりに、モジュール内でものを定義し(グローバルを作成しないでください)、必要なものをあるモジュールから別のモジュールに引き出すために 'require'と' define'を使います(RequireJSの場合)。これらのバンドルには、ビルド時に依存関係ツリーを歩き回り、すべての依存関係を持つ単一ファイルを作成する(不要なグローバルを作成しない)ツールがあります。たとえば、IIFEでやっていることを行う現代的な方法は、モジュール*を代わりに使用することです。 –

    +0

    @smulz:開発時に、バンドラーはファイルを個別に持ち込みますが、これは開発に便利です。パブリッシュする準備ができたら、ビルダーを実行して、バンドラーの依存関係ツリー検査を実行し、ファイルを1つの成果物に結合します。 –

    0

    これは2つの別の問題です。

    1. 複数のファイルにまたがることはできますか?いいえ!
    2. 複数のファイル内のクラス/関数/ etcはグローバルスコープをポーリングできません - はい!同じことを達成するために101個の方法があるその
    3. 非常に単純な例として

    FILE1

    var myNS = {}; 
    

    FILE2

    myNS.MyViewModel = function(){ ... } 
    

    FILE3

    myNS.OtherViewModel = function() { ... } 
    

    、。

    +0

    はい、これは私の最初のアプローチです。私は膨大な量のコードをリファクタリングして、すべてのオブジェクトのインスタンス化に "myNS"を追加するため、大きなファンではありませんでした。私は他の選択肢がないと思っています。 – smulz

    +0

    @smulz:あなたがしていること:モジュール。 –

    +0

    @smulzは明らかに、これは古風な答えです。 T.J.現代的な意味ではるかに正しいものです。 – Jamiec

    関連する問題