2

私は2つのライブラリを使用しようとしています:

  • D3 (Javascript グラフィック ライブラリ)
  • NVD3 (グラフ固有の D3 拡張機能)

また、Require Optimizer を使用しようとしていますが、ここで問題が発生します。D3 は AMD に準拠しているため、Require を使用していることを検出すると、モジュールを定義し、グローバルd3変数をエクスポートしません。NVD3 は AMD をサポートしていませんが、Require にはその場合の「シム」があります。

ただし、NVD3 を "shim" し、その shim に D3 の依存関係を与えると、動作しません。NVD3 はd3、D3 が Require 環境で作成しないグローバル変数があることを期待しているためです。したがって、この問題を回避するために、単に D3 を必要とする新しいモジュール (d3Shim) を作成し、それをグローバル変数として登録します。

define(['d3'], function(d3) {
    return window.d3 = d3;
});

NVD3 を d3Shim に依存させたところ、通常の Require-land ですべてが機能しました。d3require-optimizer を使用してすべてを 1 つのファイルにマージしようとしたところ、変数がないために NVD3 が再び壊れ始めたことがわかりました。

オプティマイザーがシムに対してこれを行うことがわかりました。

*shimmed code here*
define(*shim path*, [], function(){});

したがって、どのような依存関係があるかは関係ありません。NVD3 コードは、d3shim モジュールがその魔法を実行する前に実行されます。

私の質問は、どちらのファイルも変更せずに、Require Optimizer でこれら 2 つのライブラリを使用できる方法はありますか? 必要に応じて、いつでも NVD3 のコードを編集して AMD モジュールにすることができますが、明らかな理由から、サードパーティのライブラリを編集するのは悪い習慣であるため、編集しないソリューションをお勧めします。

4

0 に答える 0