jQueryは有害と見なされます

へー、私はいつもこれらの「Xは有害と考えられる」投稿の1つを書きたいと思っていました。



始める前に、次のことを言ってみましょう。jQueryはWebの進歩に信じられないほどの影響を与えたと思います 。 彼は、開発者が以前は考えられなかったようなことを行えるようにしました。 ブラウザの製造元に多くの機能をネイティブに実装するように強制しました(jQueryがなければ、おそらくdocument.querySelectorAllはありません)。 jQueryは、現代のバンに頼ることができず、IE8以上のような遺物をサポートすることを余儀なくされている人々によってまだ必要とされています。



しかし、私がこれらの貧しい人々に同情しても、彼らは少数派です。 現在、古いブラウザをわずかな市場シェアでサポートする必要のない多くの開発者がすでに存在します。 また、プロの開発者ではない人も忘れないでください。学生や研究者は、このクロスブラウザの互換性がすべて必要なだけでなく、多くの場合、1つのブラウザ以外はまったく必要ありません。 おそらく、学界では誰もがOpen Web Platformの新しいバンズを使用して楽しむことを期待していますか? そして、近くではなく、jQueryはどこにでもあります。 なんで? jQueryが知っているのはそれだけなので、最新のWebをフォローするだけの強さも時間もありません。 jQueryを使用する理由は必要ありません。使用するだけです。 この事実、およびこれらのすべてを既にネイティブで実行する機能にもかかわらず、私はこれがjQueryを回避する主な理由ではないと考えています。



はい、おそらくあなたはそれを必要としないでしょう...



確かに、私はjQueryが今日できることのほとんどすべてがネイティブJavaScriptも持っているという事実に注意を払う最初の人ではありません。 したがって、私は自分自身を繰り返さず、いくつかのリンクを提供します。





また、 ファイルサイズとネイティブメソッドの動作速度について議論する時間を無駄にしません。 これはすでに複数回噛まれています。 今日、私は何か他のものに注意を払いたいです。



...しかし、これはまだそれを使用することを拒否する理由ではありません



ネイティブオブジェクトのプロトタイプの拡張を避けるために、jQueryはこれらのオブジェクトで独自のラッパーを使用します。 過去には、ネイティブオブジェクトの拡張は大きなマイナスと考えられていましたが、他の拡張機能との潜在的な競合のためではなく、IE6でのメモリリークが継続するためです。 それ以来、$( 'div')を呼び出すと、要素またはノードのリストへのリンクではなく、jQueryオブジェクトが返されます。 つまり、jQueryオブジェクトには、ホーム要素またはノードのリストへの通常のリンクとはまったく異なるメソッドが含まれています。



それにもかかわらず、これらのリンクは常に実際のプロジェクトで出てきます。 jQueryがどのようにそれらから抽象化しようとしても、これらのリンクを単に$()でラップしたとしても、それらを常に操作する必要があります。 たとえば、jQuery .bind()メソッドを呼び出す場合のコールバックコンテキストは、jQueryコレクションではなくhome要素への参照になります。 また、異なるソースのライブラリを頻繁に使用することにも注意してください。ライブラリの中にはjQueryが必要なものとそうでないものがあります。 これはすべて、出力で、 ネイティブハウス要素、ノードのリスト、およびjQueryオブジェクトの地獄のような混合物を見つけるという事実につながります



開発者がjQueryオブジェクト(変数名の前に$を追加)およびネイティブ要素への参照を含む通常の変数の命名規則を順守している場合、これは確かに問題を軽減します(人々は規則を忘れがちですが、理想的な世界に住んでいると仮定します)。 ほとんどの場合、開発者はこのような規則を聞いたことがないため、コードの見知らぬ人を理解することは非常に困難です。 そのようなコードを編集しようとするたびに、「ああ、いまいましい、これはjQueryオブジェクトではありません。$()でラップするのを忘れていました」または「くそ、ハウス要素が$(..) 0]。」 恥ずかしさを避けるために、開発者は念のためにすべてを$()でラップすることがよくあります。 後のコードを読むと、同じ変数が$()で何度もラップされていることがわかります。 同じ理由で、jQueryを使用しないようにこのコードをリファクタリングすることは非常に困難になります。 要するに、私たちは絶望的な状況に陥ります。



変数の命名規則を厳密に守ったとしても、house要素のネイティブメソッドを呼び出すか、jQueryに依存しないコードから関数を実行する必要がある場合に、状況がよく発生します。 しばらくすると、オブジェクトをjQueryからネイティブオブジェクトに、またはその逆に変換することで、コードが既に上から下にパックされます。



しばらくして、そのようなプログラムにさらにいくつかの機能を追加することにし、ほとんどの場合、家の要素とコレクションへのすべての新しいリンクを$()で再度ラップするとします。 結局のところ、どのリンクが必要なのかを正確に知ることはできません。 繰り返しになりますが、これは将来のすべてのコードにも当てはまる絶望的な状況です!



jQuery依存関係を持つ任意のスクリプトを使用して、この依存関係を取り除きます。 彼らは逃げました。 主なタスクは、メソッドをネイティブメソッドに変換することではなく、一体何が起こっているのかを理解することです。



純粋なJSへの実用的なパス



もちろん、今日多くのライブラリにはjQueryが必要です。最近ツイートしたように、jQueryを完全に削除しようとする 、何らかのデジタルビーガニズムのように見えます。 それでも、これは、引き続き使用する必要があるという意味ではありません。 ライブラリは、jQueryを使用しないバージョンが登場したときに、いつでも置き換えることができます。



さらに、多くのライブラリは、jQueryの同義語として$変数の存在を必要としないように作成されています。 jQuery.noConflict()を呼び出して$変数を取得し 、最適な使用方法を見つけてください。 たとえば、 コマンドラインAPIに触発されたこれらのヘルパー関数をよく使用します



//   ,   CSS  {expr}. //      {container}- function $(expr, container) { return typeof expr === "string"? (container || document).querySelector(expr) : expr || null; } //      CSS  {expr}   . //      {container}- function $$(expr, container) { return [].slice.call((container || document).querySelectorAll(expr)); }
      
      







さらに、$ではなくjQueryを毎回入力する必要がある場合は、2回考えると思いますが、本当に必要ですか? もちろん私見。



また、jQuery APIは本当に好きだが、コードの肥大化を避けたい場合は、 Zeptoの使用を検討してください。



All Articles