2

jQuery を内部で使用する JavaScript ライブラリに取り組んでいます。ただし、その展開の時が来たら、環境に jQuery が既に含まれている (または含まれていない) かどうかを気にせずに、物事 (wrt 展開) を簡素化することを好み<head>ます。

私のライブラリは Coffescript のクラスとして実装されており、結果の .js ファイルには、スコープを分離するためのデフォルトの関数ラッパーが含まれています。

この問題に対するいくつかの解決策を考えることができます。

  1. jQuery が既に存在するかどうか、Web サイトの管理者に問い合わせてください。はいの場合は、ライブラリ自体を含めてください。そうでない場合は、jQuery + ライブラリを、おそらく単一のファイルに含めて連結します。展開は難しくなりますが、問題は解決される可能性があります。

  2. jQuery と私の lib コードを連結するファイルを作成し、常に Web サイト管理者にこのファイルを含めてもらいます。衝突を防ぐためvar myJ = jQuery.noConflict()に、jQuery コードの直後に実行します。

  3. 上記の (2) と同様に行いますがvar myJ = jQuery.noConflict()、カプセル化された Coffeescript クラス内で呼び出します。

要約すると、この課題の目的は次のとおりです。

  1. 使用している可能性があるものに関係なく、展開された Web サイトの破損を絶対に回避します。
  2. 導入はできるだけシンプルに
  3. 可能であれば、jQuery の不必要な転送を避ける

私の懸念は次のとおりです。

  • サイトに既に jQuery があるが、古いバージョンまたは新しいバージョンが必要な場合はどうなりますか?
  • 私のnoConflict()通話が彼らの側で何かを壊した場合はどうなりますか?

この状況に対処する最善の方法は何ですか? 何か不足していますか?

4

2 に答える 2

2

CoffeeScript には、トップレベルの関数ラッパーなしでコンパイルするための -b オプションがあります。この方法を使用すると、代わりに独自のトップレベル関数ラッパーを使用できます。

すなわち

(($) ->
    # ...
    # your code
    # ...
)(jQuery.noConflict())

次に、ビルド プロセスの一環として、jQuery をコンパイル済み出力の先頭に連結します。適切な Linux/Mac シェル コマンドは次のようになります。

(cat jQuery.js; coffee -pb yourSource.coffee) > yourCompiledFileWithjQuery.js

CoffeeScriptのpオプションは、コンパイルされた出力を stdout に出力するため、それを と組み合わせて、cat jQuery.jsその出力をyourCompiledFileWithjQuery.jsにリダイレクトできます。

これにより、コードが実行される直前に、jQuery が含まれることが保証されます。jQuery は $ の古い所有者への参照を保持するため、ライブラリまたは jQuery の別のバージョンが既にそれを使用している場合、jQuery.noConflict()呼び出しでそれらに返されます。

jQuery.noConflict()また、その jQuery への参照を返すため、それがコードの に渡される方法$です。

それが明確であることを願っています。

追加:

数日前にリリースされた CoffeeScript 1.3 の時点で、トップレベルの関数ラッパーの代わりにこれを使用できます。

do ($ = jQuery.noConflict()) ->
    # ...
    # your code
    # ...
于 2012-04-12T22:17:58.810 に答える
1

終了スクリプトをクロージャーとして使用する場合は、jQuery を引数として渡すだけで、それが未定義かどうかを確認できます。

(function($) {

  if (!$) {
    // load jQuery
  } else {
    // check jQuery version if needed or just use jQuery
    if ($.fn.jquery !== '1.7.2') {
        // load 1.7.2
    };
  };

})(window.jQuery || false);

jQuery が宣言されていない場合、jQuery のみがエラーを生成するため、window.jQuery を使用する必要があります。

于 2012-04-12T12:45:08.243 に答える