4

依存関係を読み込むために Require を使用する Web アプリケーションがあります。config.shimRequireオブジェクトを使用して含まれる一連の JS ライブラリがあります。

そのような 2 つのサンプル ライブラリは次のとおりです。

require.config({
  shim: {
    "libs/leaflet": {
        exports: "L"
    }  
    "libs/leaflet-dvf": {
        deps: ["libs/leaflet"],
        exports: "L"
    }
}

2 番目のライブラリにleaflet-dvfは、最初のleaflet. L2 番目は、最初のライブラリが定義するグローバル スコープ変数に依存する最初のプラグインです。

通常、Require を使用してアプリケーションを実行すると、すべて正常に動作します。シムからいずれかのライブラリを含めることができ、すべてがうまく機能します。問題はありません。

このコードを Require r.js Optimizer で実行すると問題が発生します。Optimizer は、単一の最適化された JS ファイルをビルドするときに、依存関係を誤って順序付けます。ビルドされたファイルでは、leaflet-dvfコードはコードの前に来leafletます。これにより、依存プラグインLが必要なグローバル スコープ変数を見つけることができないため、JS ランタイム エラーが発生します。

私のビルド構成は次のようになります。

({
  baseUrl: "../js",
  paths: {
    "requireLib": "../js/libs/require"
  },
  include: ["requireLib"],
  name: "Main",
  out: "bin/Main-built.js",
  optimize: "none",
  wrapShim: true
})

Rhino を使用して Optimizer を実行すると、出力ファイルが作成されます。Main-built.jsファイルでは、プラグインのコードが必要なライブラリの前に来ます。これにより、L undefined error.

最適化された JS ファイル内のライブラリ ファイルを適切に並べ替えるために、オプティマイザーが Shim の依存関係の順序を尊重するようにするにはどうすればよいですか?

4

1 に答える 1

1

しばらく前に、ノックアウト エクステンションで同様の問題が発生しましたが、シムが正しく機能しませんでした。これが私たちがそれを解決した方法です。

というモジュールを作成します: leafletLib

define(["libs/leaflet","libs/leadleft-dvf"],function(leftlet,dvf){

    return leaflet;
});

LeafletLib には、メイン ライブラリとすべての拡張機能があります。依存関係として leaflet または leaflet-dvf を持つモジュールでは、leafletLib を呼び出します。ちょっとハックですが、うまくいくかもしれません。

define(["leafletLib"],function(leafletLib){});
于 2016-04-06T21:37:06.700 に答える