7

すでにノックアウト JS を使用している既存の requireJS プロジェクトに、breezeJS を統合しています。私はいくつかの問題に遭遇しました。

<script>1 つ目は、読み込み済みの AMD 依存関係としてではなく、HTML ラッパーにタグとして含めない限り、そよ風が Q ライブラリを読み込むことができないことです。私のプロジェクトでは、コードを単一のスクリプト タグに抑えようとしているので、これは理想的ではありません。

2 つ目の問題は、breezeJS がノックアウトを読み込めないことです。main.js で、ノックアウトのパスを次のように定義しました。

knockout: '../libs/knockout/knockout-2.2.0',

(グローバルにアクセスしていないことを確実に知りたいので、これを行いますko)

しかし、プロジェクトにそよ風を追加したとき、そよ風はノックアウト ライブラリをロードできませんでした。そよ風のコードを見ると、ノックアウト ライブラリを としてロードするようにハードコーディングされていることがわかりますko

すべてのコードを変更したくないので、AMD をロードしたノックアウト ライブラリを としてグローバル ウィンドウ オブジェクトに追加できることがわかりましたwindow['ko']。しかし、これはかなりのボッジのように感じます。また、奇妙なことに、この方法でQを追加して<script>タグを削除しても機能しませんでした。グローバルを汚染する前であっても、アプリケーションのライフサイクルの早い段階でQが必要だと思うためです-require()呼び出しをmain.jsにネストしましたが、ビルドプロセスからのアプリケーションファイルの大部分なので、そのアプローチを放棄しました。

プロジェクトに Q とノックアウトとそよ風を含めて、まだ 1 行の<script>タグを使用するにはどうすればよいですか<script>

私は自分のプロジェクトでかなりの数の他のライブラリを使用していますが、統合がこれほど難しいライブラリはありません。

どんな助けでも大歓迎です

乾杯

ガブ

編集:これが私の完全な必須構成です:

require.config({
    /**
    * shims are for 3rd party libraries that have not been written in AMD format.
    * shims define AMD modules definitions that get created at runtime.
    */
    shim: {
        'jqueryUI': { deps: ['jquery'] },
        'jqueryAnimateEnhanced': { deps: ['jqueryUI'] },
        'jqueryScrollTo': { deps: ['jquery'] },
        'touchPunch': { deps: ['jquery'] },
        //'Q': { exports: 'Q' },
        //'breeze': { deps: ['Q', 'knockout'], exports: 'breeze' },
        'path': { exports: 'Path' },
        //'signalR': { deps: ['jquery'] },
    },

    paths: {
        //jquery
        jquery: '../libs/jquery/jquery-1.7.2.min',
        'jquery.adapter': '../libs/jquery/jquery.adapter',

        //jquery plugins
        horizontalNav: '../libs/jquery/plugins/horizontalNav/jquery.horizontalNav',
        jqueryUI: '../libs/jquery/plugins/jquery-ui/jquery-ui-1.9.2.custom',
        jqueryAnimateEnhanced: '../libs/jquery/plugins/animate-enhanced/jquery.animate-enhanced',
        touchPunch: '../libs/jquery/plugins/touch-punch/jquery.ui.touch-punch.min',
        //jqueryScrollTo: '../libs/jquery/plugins/jquery-scrollTo/jquery.scrollTo.min',
        //reveal: '../libs/jquery/plugins/reveal/jquery.reveal',
        //opentip: '../libs/jquery/plugins/opentip/opentip-jquery',

        //RequireJS
        domReady: '../libs/require/plugins/domReady',
        text: '../libs/require/plugins/text',
        async: '../libs/require/plugins/async',
        depend: '../libs/require/plugins/depend',
        json: '../libs/require/plugins/json',
        noext: '../libs/require/plugins/noext',

        //coffee-script
        'coffee-script': '../libs/coffee/coffee-script',
        cs: '../libs/require/plugins/cs',

        //Path
        path: '../libs/path/path.min',

        //Knockout
        knockout: '../libs/knockout/knockout-2.2.0',
        knockoutTemplateSource: '../libs/knockout/ko.templateSource',
        knockoutValidation: '../libs/knockout/ko.validation',

        //breeze
        Q: '../libs/breeze/q',
        breeze: '../libs/breeze/breeze.debug',

        //Signals (Observer pattern)
        signals: '../libs/signals/signals',

        //SignalR - Push notifications
        signalR: '../libs/signalR/jquery.signalR-0.5.2.min',

        //utils
        logger: 'common/logging/logger',
        tinycolor: '../libs/tinycolor/tinycolor',
        composing: 'common/composition/composing',

        //app specific
        BaseWidgetViewModel: 'app/view/core/BaseWidgetViewModel',

    }
});
4

3 に答える 3

3

質問への対応が(休日に)遅れて申し訳ありません。

RequireJS 以外のすべてのスクリプト タグを削除するという目標を理解し、感謝しています。この目標は、私の経験上、簡単には達成できません。

あなたは Breeze の欠陥を発見しました。Breeze は内部的に、アプリケーションの「require」関数とは異なる「require」関数を参照しています。アプリケーションの「require」機能またはその構成についてはわかりません。したがって、Q スクリプト タグを省略すると、Breeze は Q を見つけることができません。

それを修正する必要があります。その際はここにコメントを追加します。

一方、'Q' と 'KO' にはスクリプト タグを使用する必要があり、これらのタグは RequireJs のスクリプト タグの上に配置する必要があります。アプリケーション スクリプトには引き続き require を使用してください。

残念ながら、二重要求機能の問題とは関係のない他の問題があります。

まず、KO をグローバル名前空間から遠ざけるのに常に苦労すると思いますが、これは Breeze とは関係ありません。

KO の AMD 実装 (少なくとも私が最後に見たとき) では、KO はグローバル名前空間または require コンテナーのいずれかにあります。決して両方ではありません。残念ながら、多くの便利なプラグイン (bindingHandlers、debug.helpers) は、グローバル名前空間にあると想定しています。require で KO をロードすると、それらを使用できなくなります

Require の前にスクリプト タグで Knockout をロードしてから、構成中に Require コンテナーに shim KO することができます。構成は次のようになります。

define('knockout', [], function () { return window.ko; });

jQueryの開発者は、これが問題になることに気付きました。jQuery がグローバル名前空間にあると想定している優れたプラグインが多すぎます。純粋主義者ではなく、jQuery メンテナー (私の見解では正しい) は、jQuery をRequire コンテナーグローバル名前空間の両方に配置しました。

第二に、他の多くの便利なライブラリは Require をサポートしていません。コードは、これらのスクリプトが require 用に設計されているかのように記述できます。これを処理する最も簡単で明確な方法は、スクリプトタグで指定することだと思います。define次に、上記のように呼び出しで定義することにより、それらをコンテナーに追加できます。この shimming を使用すると、サービスの場所を Require に依存し、これらのライブラリの依存関係を挿入することで、独自のモジュールを一貫させることができます。

第三に、設定にバグがあると思います。私にはわからない理由で、あなたは Require ユニバースでKnockout モジュールを「ノックアウト」と呼ぶことにしました。

いいですが、アプリケーションの require コンテナを使用するように修正したときに、Breeze がそのモジュール名を予測するとは思わないでください。Breeze は、標準名「ko」で KnockoutJ を検索します。Breeze は、好みの名前「knockout」でそれを見つけません。

これは大したことではありません。「ノックアウト」という名前に慣れている場合は、同じインスタンスを両方の名前で使用できるようにすることができます。構成コードに追加すると、次のシム行が機能すると確信しています。

define('ko', ['knockout'], function (ko) { return ko; });

繰り返しますが、これは Breeze の require バグを修正した後にのみ有効になります。

John Papa は、Code Camper で多くの同様の問題に対処する必要がありました。彼がそこで何をしたか、特にmain.js.

于 2012-12-29T06:42:52.343 に答える
2

これは、Breeze v 1.2.4 で修正されているはずです。「require」の内部実装は使用しなくなりました。

于 2013-03-18T22:33:34.890 に答える
0

requireconfigが正しくないようです。require configのコードを投稿してもらえますか?気になります:

keep my code down to a single script tag

どうして?

編集:今私はそれを取得します。それでも、requireconfigが間違っているように聞こえます。

于 2012-12-18T17:51:16.077 に答える