46

Meteorフレームワークを使用してプロジェクトを作成すると、すべてのファイルが一緒にパッケージ化されますが、「このファイルをそのファイルの前にロードしたい」と明示的に言う方法はないようです。

たとえば、2つのjavascriptファイルがあります:foo.jsbar.js

ファイルbar.jsには実際には内部のコードに依存するコードが含まれていますfoo.jsが、Meteorはプロジェクトを中断するbar.js前にロードしています。foo.js

  • node.jsでは、単にrequire('./bar')内部で使用しますfoo.js
  • ブラウザでは、ファイルを正しい順序でロードするために、を指すタグを付け、その後<script>foo.jsを指すタグを付けます。bar.js

Meteorでそれをどのように行うことができますか?

4

4 に答える 4

62

Meteorのドキュメントによると、ファイルは現在次の順序でロードされています。

  1. [project_root]/lib内のファイルが最初にロードされます
  2. ファイルはディレクトリの深さでソートされます。より深いファイルが最初にロードされます。
  3. ファイルはアルファベット順にソートされます。
  4. main。*ファイルは最後にロードされます。

出典: http ://docs.meteor.com/#structuringyourapp

于 2012-05-24T15:58:40.980 に答える
2

すべてのシナリオの解決策ではありませんが、理想的には、他のコードに依存するものはすべてMeteor.startup関数に配置され、すべてが既にロードされていることを確認します。

于 2012-05-23T20:11:51.340 に答える
-2

yepnope.jsのようなJSローダーをいつでも使用して、client.jsファイルに追加できます。これは私のために働きます。

于 2013-05-15T09:59:51.413 に答える
-2

共通の名前空間(jsグローバル)で構造化した一連のユーティリティ関数があります。

つまり

// utils/utils.js
Utils = {};

そしてサブフォルダで:

// utils/validation/validation.js
Utils.Validation = {};

// utils/validation/creditCard.js
Utils.Validation.creditCard = ... // validation logic etc

また、Utilsとそのサブオブジェクトを使用するコードがたくさんあります。

明らかに、この構造はMeteorロードサブフォルダーとして最初に機能しません。

期待どおりに機能させるには、意味のない名前で/ subfolder / subfolder / subfolderを作成してから、最も深いサブフォルダーにルートオブジェクトを配置し、それほど深くないサブフォルダーにオブジェクトを分岐する必要がありました。

私の好みやエラーが発生しやすいのは非常に直感的ではありません(フォルダ構造がさらに深いコンポーネントがあるとします)。

この問題に対処するために、私はdefersとpromiseを備えたQライブラリを使用しました。ソリューションは、定期的なコードの繰り返しとチェックを行うため、まだクリーンではありませんが、ディレクトリ構造を台無しにすることなく、ロード順序を完全に制御できます(meteorコードを必要に応じて整理できると言う人にこんにちは)。

例:

//utils.js
UtilsDefer = UtilsDefer || Q.defer();
UtilsDefer.resolve({
    // here some root utils stuff
});

//cards.js
// here we'll depend on Utils but don't want to care about directory structure
UtilsDefer = UtilsDefer || Q.defer(); // it will be a) already 
// resolved defer from utils.js, or b) new defer that will
// be resolved later in utils.js
UtilsDefer.then(function(Utils) {
    // do something with utils usage, or for instance add some fields here
    Utils.CreditCardDefer = Utils.CreditCardDefer || Q.defer();
    Utils.CreditCardDefer.resolve({
        // Credit card utils here
    })
});

//someOtherFile.js
// it will be pain to use sub-objects with this method though:
UtilsDefer = UtilsDefer || Q.defer();
UtilsDefer.then(function(Utils) {
    Utils.CreditCardDefer = Utils.CreditCardDefer || Q.defer();
    Utils.CreditCardDefer.then(function(CreditCard) {
        // do stuff with CreditCard _if_ you need to do it on startup stage   
    })
});

これはかなり狭いユースケースの例です。ほとんどの場合、ユーザーインタラクションコールバック内またはMeteor.startupすべてがすでに初期化されている場所でこれらのグローバルを処理することに満足するでしょう。それ以外の場合、非常に早い段階で初期化順序をきめ細かく制御したい場合は、それが解決策になる可能性があります。

于 2015-04-05T17:40:52.060 に答える