4

3 つの Dojo ウィジェットを使用する 1 つの HTML ページをセットアップしました。Dojo 1.7.5 を使用してカスタム ビルドを作成しようとしています。ビルドは成功し、このビルド ファイルを使用して必要なファイルを含む dojo.js が残ります。

var dependencies = {
action: "release",
selectorEngine: "acme",
stripConsole: "none",
cssOptimize: "comments.keepLines",

layers: [
    {
        name: "dojo.js",
        dependencies: [
            "dijit.form.ValidationTextBox",
            "dijit.form.DropDownButton",
            "dijit.form.Button",
            "dijit.form.Form",
            "dijit._base",
            "dijit._Container",
            "dijit._HasDropDown",
            "dijit.form.ComboButton",
            "dijit.form.ToggleButton",
            "dijit.form._ToggleButtonMixin",
            "dojo.parser",
            "dojo.date.stamp",
            "dojo._firebug.firebug"
        ]
    }, {
        name: "../test/test.js",
        dependencies: [
            "test.test"
        ]
    }
],

prefixes: [
    [ "dijit", "../dijit" ],
    [ "dojox", "../dojox" ],
    [ "ourpeople", "../ourpeople" ]
]
};

私が答えを見つけることができないように見える質問:

  • 私はcssOptimizeを使用しています。使用されているすべてのcssファイルがインポートされた単一のcssファイルを期待していました。しかし、私はそのようなファイルを見つけることができません。これは道場がCSSを圧縮する方法ですか、それとも私の期待は間違っていますか? もしそうなら、リリースフォルダのどこにありますか?
  • 私のtest.jsには関数test1()が含まれており、ビルドされたjsから呼び出すと、test1が定義されていないと表示されます。私はその関数を道場なしで直接呼び出します。カスタム js の構築は、declare を使用する dojo クラスである場合にのみ機能すると想定していますか?
  • 最後の質問です。dojo._firebug.firebug などのいくつかの dojo ファイルをビルドに手動で含める必要がありました。最初のビルドの後、それらのファイルを取得するためにまだ xhr 呼び出しを使用していたからです。ファイルを手動で含めた後も、dojo から特定のリソース (dojo/nls/dojo_ROOT および dijit/form/nls/validate.js) への xhr 呼び出しが表示されます。これらのファイルはビルド プロセス中に作成されるため、ビルド プロファイルの依存関係に含めることはできません。私は単一のファイルで道場を配布しようとしているので、誰でもこの問題について何か考えがあります.

私は Dojo ビルド システムにかなり慣れていないので (特に)、おそらく Dojo ビルド システムが行うように設計されていないことを期待しているのかもしれません。ようこそ。

乾杯!

テスト.js:

function test1() {
    console.log("test1");
}

Index.php:

<script type="text/javascript" src="js/release/dojo/dojo/dojo.js"></script>
<script type="text/javascript" src="js/release/dojo/test/test.js"></script>

<script type="text/javascript">                     
    dojo.require("dijit.form.ValidationTextBox");
    dojo.require("dijit.form.Button");
    dojo.require("dijit.form.Form");            

    dojo.ready(function() {
        test1();
    });
</script>
4

1 に答える 1

6

私はcssOptimizeを使用しています。使用されているすべてのcssファイルがインポートされた単一のcssファイルを期待していました。しかし、私はそのようなファイルを見つけることができません。これは道場がCSSを圧縮する方法ですか、それとも私の期待は間違っていますか? もしそうなら、リリースフォルダのどこにありますか?

を使用するcssOptimizeと、Dojo ビルドは CSS ファイルを適切に最適化し、フラット化します。たとえば、Dijit の Claro テーマを使用している場合dijit/themes/claro/claro.css、ソースからロードすると、さらに多くのファイルをロードする一連の@importステートメントが含まれます。claro.cssを使用してビルドからロードするとcssOptimize、これらの個別のファイルを介して以前に参照されたすべてのスタイルを含む 1 つのファイルになります。

私のtest.jsには関数test1()が含まれており、ビルドされたjsから呼び出すと、test1が定義されていないと表示されます。私はその関数を道場なしで直接呼び出します。カスタム js の構築は、declare を使用する dojo クラスである場合にのみ機能すると想定していますか?

Dojo は、すべての JS ファイルが使用する「クラス」declareであるとは想定していませんが、各ファイルがグローバルを暗黙的に定義しないモジュールであると想定しています (いずれにせよ、モジュールではグローバルを避ける必要があるため)。ビルド プロセスは、AMD ではない、または認識しているモジュールに遭遇すると、それがレガシー Dojo モジュールであると想定し、ボイラープレートでラップして AMD に変換します。このボイラープレートは、グローバルを関数スコープにカプセル化することになるため、グローバルではなくなります。

Dojo 1.7 を使用していることを考えると、AMD 形式を使用してモジュールを定義および使用するのが理想的です。dojotoolkit.org には、AMD モジュールを紹介するチュートリアルがあり、Dojo 1.6 以前から移行する場合は、移行に役立つチュートリアルもあります。

最後の質問です。dojo._firebug.firebug などのいくつかの dojo ファイルをビルドに手動で含める必要がありました。最初のビルドの後、それらのファイルを取得するためにまだ xhr 呼び出しを使用していたからです。ファイルを手動で含めた後も、dojo から特定のリソース (dojo/nls/dojo_ROOT および dijit/form/nls/validate.js) への xhr 呼び出しが表示されます。これらのファイルはビルド プロセス中に作成されるため、ビルド プロファイルの依存関係に含めることはできません。私は単一のファイルで道場を配布しようとしているので、この問題について誰でも考えてください。

自動的にロードされている理由はわかりませんがdojo/_firebug/firebug、上記の発言/表示に基づいて、次のことをすぐに提案します。

  • モジュール/コードを AMD 形式に変換する
  • これを追加async: trueするdojoConfigと、ローダーが非同期モードで動作します。つまり、次のことを意味します。
    • 同期 XHR ではなく、スクリプト インジェクションによってモジュールをロードします。
    • 無条件にすべてをロードするわけではありませんdojo/_base
  • ビルドがデフォルトですべてを含むのを防ぐレイヤーに追加customBase: trueしますdojo/dojodojo/_base

モジュールに関しては、nls要求された NLS ファイルが表示されるのはある程度正常ですが、ビルドが適切に構成されている場合、通常はレイヤーごとに 1 つの NLS ファイルが存在し、それだけです (validateリードの別の要求が表示されているという事実)。すべての依存関係をカバーしていないと思います)。NLS が分離されたままになっている理由は、ロケールごとに 1 つの NLS バンドルがあり、すべてのロケールを 1 つのレイヤーに構築するのは意味がないためです。そうすると、関心のない 20 の言語のリソースにお金を払わなければならなくなります。

于 2014-07-31T22:49:04.893 に答える