私は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 ですべてが機能しました。d3
require-optimizer を使用してすべてを 1 つのファイルにマージしようとしたところ、変数がないために NVD3 が再び壊れ始めたことがわかりました。
オプティマイザーがシムに対してこれを行うことがわかりました。
*shimmed code here*
define(*shim path*, [], function(){});
したがって、どのような依存関係があるかは関係ありません。NVD3 コードは、d3shim モジュールがその魔法を実行する前に実行されます。
私の質問は、どちらのファイルも変更せずに、Require Optimizer でこれら 2 つのライブラリを使用できる方法はありますか? 必要に応じて、いつでも NVD3 のコードを編集して AMD モジュールにすることができますが、明らかな理由から、サードパーティのライブラリを編集するのは悪い習慣であるため、編集しないソリューションをお勧めします。