4

私は自分のプロジェクトを構築し始めたところですが、エラーが発生した理由がわからないエラーがいくつか発生します。

my app.profile.js以下のファイルの内容を確認できます。コマンドプロンプトからこの行を実行する "build profile=../../app.profile.js -r"と、プロセスが完了した後にエラーは発生しません。私の問題は、これらのパッケージのリリース (ビルド) バージョンを、ビルドされていないバージョンが存在する場所にコピーすると、" Error: multipleDefine" のような JavaScript エラーが多すぎることです。dojo、dojox、dijit フォルダーだけをコピーしても、同じエラーが発生し続けます。

2 つの js ファイル (dojo/Deferred など) のビルドとアンビルドの違いを見ると、私が気付く唯一の違いは次のとおりです。

//built 
define("dojo/Deferred", [ 
        "./_base/lang", 
        "./promise/CancelError", 
        "./promise/Promise" 
], function( 

define([ 
        "./_base/lang", 
        "./promise/CancelError", 
        "./promise/Promise" 
], function( 

だから私は最初に少し立ち往生しています。できるだけ早くレイヤーを使用して http リクエストを減らしたいと思っていますが、私が言及した状況について助けが必要です。どんな助けでも大歓迎です、ありがとう。

app.profile.js:

var profile = { 
    basePath: "..", 
    layerOptimize: "shrinksafe.keepLines", 
    optimize: "shrinksafe", 
    releaseDir: "./release", 
    hasReport: true, 

    packages: [ 
        { 
            name: "dojo", 
            location: "./dojo" 
        }, 

        { 
            name: "dijit", 
            location: "./dijit" 
        }, 

        { 
            name: "app", 
            location: "./app" 
        }, 
        { 
            name: "dtk", 
            location: "./dtk" 
        }, 
        { 
            name: "dojox", 
            location: "./dojox" 
        } 
    ], 

    layers: { 
        "app/layers/core": { 
            include: [ 
                        "dojo/_base/declare", 
                        "dtk/core/ILifeCycle", 
                        "dtk/core/AppConfig", 
                        "dtk/core/TopicContext", 
                        "dtk/core/NavigationContext", 
                        "dojo/require", 
                        "dojo/_base/Deferred", 
                  "dojo/DeferredList", 
                        "dojo/_base/lang" 
            ] 
        }, 
        "app/layers/appcontext": { 
            include: [ 
                "dtk/core/AppContext" 
            ], 
            exclude: [ 
                "app/layers/core" 
            ] 

        } 

    } 
};
4

3 に答える 3

5

Dojo ビルダーは、ユーザーが指示しない限り、すべてのモジュール定義にモジュール ID を追加します。これにより、multipleDefine エラーが発生する可能性があります。

ビルダーのドキュメントから:

insertAbsMids (デフォルト = 未定義)

  • [真実]すべての AMD 定義アプリケーションにモジュール識別子引数が含まれていることを変換に確認させます。
  • [偽]変換は、定義アプリケーションのモジュール識別子引数に対して何もしません。特に、偽の値が原因で、変換がソース コードに存在するモジュール識別子引数を削除することはありません。

insertAbsMids :falseをプロファイルに追加するまで、まったく同じ問題がありました。

例えば:

var profile = {
    basePath: "./",
    releaseDir: "release",
    action: "release",

    layerOptimize: "shrinksafe",
    optimize: "shrinksafe",
    cssOptimize: "comments",
    mini: false,
    insertAbsMids: false,

    packages: [
        { name: "dijit", location :"dijit" },
        { name: "dojox", location :"dojox" },
        { name: "dojo", location :"dojo" }
    ]
}
于 2012-10-30T09:59:53.810 に答える
2

問題が AMD モジュール define(id, [deps], factory). で作成される ID にある場合、同様の問題があり、圧縮ファイルのすべての ID を手動で削除する必要がありました。

//built 
define([ 
        "./_base/lang", 
        "./promise/CancelError", 
        "./promise/Promise" 
], function()

または、代わりに id を使用してモジュールを要求する必要がありました。

たとえば、次のモジュールが必要でした。

require(["app/Dialog"])

追加されたIDとは異なりました。

require(["demo/app/Dialog"])

それが私がそれを機能させる唯一の方法でした。ID を削除する方法や、常に ID が必要な理由を知っている人はいますか? これがあなたの質問に関連しているかどうかはわかりませんが、違いを示したので。

于 2012-06-08T01:49:41.363 に答える
1

これによりレイヤーが構築され、dojox.image.Gallery を作成するために必要なすべてのモジュールが、discardLayerに記載されているコンポーネントに加えて要求されます。

    layers: [ {
                    name: "../dojox/discardLayer.js",
                    discard: true,
                    dependencies: [
                            "dojox.image.Gallery",
                            "dojox.image.SlideShow",
                            "dojox.image.ThumbnailPicker"
                    ]
            },{
                    name: "../drops/layer.js",
                    layerDependencies:  [ "../dojox/discardLayer.js" ],
                    dependencies: [
                            "dojox.image.Gallery"
                    ]

の代わりにexclude、キーを使用してみてくださいlayerDependencies。exlude は、dojo_release ツリーではなく、dojo_source ツリー内から app/layers/core を検索すると思います。したがって、ビルド時に不明なコンポーネントを除外しています。

上記のサンプルは、破棄された 3 つのコンポーネントを他の場所でオーバーライドできるようにするために使用したものですが、ニーズには合いません。

コアレイヤーには設定せ、代わりに単に依存関係として設定する必要がありdiscardます(これにより、すでに構築されているレイヤーへのすべての依存関係が除外されます)。

次に、使用している dojo のバージョンに応じて、dojo.require("layers.core"); dojo.require("layers.appcontext")またはを呼び出しrequire(["layers/core", "layers/appcontext"], function() { });て、それらのレイヤーが存在することをアサートする必要があります。

依存関係から何かを使用する前に、別の require 呼び出しで要件を取り込みますdojo.require("dijit.form.Button"); new dijit.form.Button({ ... });。レイヤーはコンポーネントをキャッシュされたハッシュ (dojo.cache) に入力し、それらが完全に宣言されていることを確認するために、要件を取り込みます。

于 2012-06-06T14:46:37.353 に答える