Browserifyをゆっくりと自分のサイトに導入しようとしていますが、すべてのjsを書き換えたくはありません。Browserifyビルドにバンドルされているjqueryやその他のライブラリのインスタンスを複製したくありません。
Jqueryを外部依存関係としてリストするモジュールを構築する場合、グローバルjqueryインスタンスをどのように指すのですか?また、mylibs globalを削除することも目標です(下の例を参照)。そのため、モジュールでは使用しません。
これは私がやろうとしていることです(擬似コード)。これは私のサイトのリポジトリにあります-モジュールではありません。モジュールはBowerとともにインストールされます。
var mylibs.jQuery = $.noConflict(); // global used by lots of existing code
module.exports = {
jquery: mylibs.jQuery // can be imported by my module as require('jquery')
};
そのようなものが私が達成しようとしているものです。これは可能ですか?
browserify-shim を使用してこれを実現できます。次の内容を持つグローバルスコープのjQueryに依存する_mymodule.js
_という名前のモジュールがあると仮定します。
_var $ = require('jQuery');
console.log(typeof $);
_
Browserify-shimをインストールします。
_npm install browserify-shim --save-dev
_
Package.jsonファイルで、browserifyにbrowserify-shimを変換として使用するように指示します。
_{
"browserify": {
"transform": [ "browserify-shim" ]
}
}
_
Package.jsonファイルで、browserify-shimにグローバルスコープでjQueryをjQueryにマッピングするように指示します。
_{
"browserify-shim": {
"jQuery": "global:jQuery"
}
}
_
Browserifyを実行する
_browserify mymodule.js > bundle.js
_
Bundle.jsを調べると、require('jQuery')
が_(window.jQuery)
_に置き換えられていることがわかります。
Browserify-shimはノードモジュール間で推移的ではありません。最上位(独自のpackage.json内)モジュールを正しくシムするために使用できますが、他のnpmパッケージ(独自のpackage.jsonファイル)内のモジュールをシムすることはできません。
これは、jQueryモジュールに依存するノードモジュール(たとえば、ピア依存関係を持つプラグイン)を扱う場合は扱いにくいですが、jQueryライブラリは外部にある必要があります。
私の解決策は、擬似コードに概念が似ていますが、browserify自体の助けを借りて、カスタムの「プリロードシム」を作成することでした。
jquery
モジュールをbundle.js
の生成から除外しますが、それ以外の場合は通常どおりにバンドルをビルドします。
ビルド要件を満たすために、適切なnode/npmモジュールをインストールします。除外される「外部」モジュールはnotバンドルに含まれますが、コンパイル依存関係の解決を満たすために必要です。
browserify -x jquery .. > dist/bundle.js
Jquery.jsというファイルを作成し、次のコンテンツを含めます。
module.exports = window.jQuery; // or whatever
just前のファイルを含むshim.js
を生成します。
browserify -r jquery.js > dist/shim.js
次に、ファイルを編集して、モジュール名としてjQueryを使用します。
ブラウザーで、jquery(外部依存関係)、shim.js
、次にbundle.js
をロードします。
バンドルファイルが定義していないjqueryモジュールをロードしようとすると、shimファイルで定義された(以前の)モジュールにフォールバックし、カスタムコードを実行します。この場合、それは以前に定義されたグローバルをパイピングしています。
または:browserify-shim "global:"が試行することは、実際にはグローバルにのみです。
Browserifyモジュールを直接使用する-私は嫌がらせに再成長しているうなり声の代わりに-「より洗練された」ソリューションをもたらした可能性があります。