簡単なものから始めましょう:JS圧縮がどのように気分を損なうか。 そして、それを元に戻す方法:)
UPD はWebサイトアクセラレーションコンテストを開始しました 。 賞品:モニター、ウェブカメラ、マウス。 すべてが超高速です。
Javascript圧縮
一般に、JavaScriptファイルの圧縮により、通常のgzipに比べてサイズが5〜7%しか削減されないことをすぐに言及する価値があります。とnginx (またはLightSpeed)の構成ですが、トピックに戻ります:JavaScriptファイルを最小化したいのですが、これを行う最善の方法は何ですか?
2年前、 現在のツールのレビューが行われましたが、その間、状況はあまり変わりませんでした( Googleコンパイラが登場しない限り)。 しかし、すべて順番に。
- 簡単なものから始めましょう。 JSMin (またはそのクローン、 JSMin + )。 非常に普遍的に機能します( 有限状態マシンの原理により)。 ほとんどの場合、最小化されたファイルも実行されます。 追加のゲイン(以降、比較的単純なgzip)-高度なバージョンの場合、最大7% かなり。 プロセッサは適度に消費しますが(高度なバージョンであるJSMin +はより強力で、メモリはかなり)、変数のスコープを分析しないため、変数の長さを削減できません。 原則として、ほとんどすべてのスクリプトに適用できますが、微妙な違いが生じる場合があります。 たとえば、条件付きコメントが削除される(これが処理される)か、さまざまな構造が誤って認識される(たとえば、
+ +
++
に変換され、これによりロジックが中断される)、これも処理されますが、より困難です。 - YUIコンプレッサー 。 スクリプトを圧縮するための最も有名な(最近まで、最も強力な)ツール。 Rhinoエンジンに基づいています(私たちが知る限り、エンジンのルーツはDojoフレームワークの近く、つまり非常に長い時間前です)。 スクリプトを完全に圧縮し、スコープで機能します(変数の長さを減らすことができます)。 圧縮率はgzipで最大8%ですが、プロセッサは(Java仮想マシンを使用しているため)正常に動作するため、オンラインで使用する場合は注意が必要です。 また、変数の長さが短いため、さまざまな問題が発生する可能性があります(JSMinよりも潜在的に多くの問題があります)。
- Google Closure Compilerは最近登場しましたが、すでに国民の信頼を得ています。 同じRhinoエンジンに基づいています(そう、月の下に新しいものはありません)が、ソースコードのサイズを縮小するためのより高度なアルゴリズムを使用しています( すべての詳細で優れた概要 )、gzipに対して最大12%です。 ただし、ここでは三重に注意する価値があります。特に積極的な変換の場合、ロジックのかなりの部分を切り取ることができます。 ただし、 jQueryはすでにこのツールを使用しています 。 プロセッサのコストに関しては、明らかにYUIよりも重いです(この事実は検証されていません)。
- とパッカー 。 このツールは、通信チャネルの開発と処理能力の遅れにより、すでに過去のものになっています。そのための圧縮(gzipに似たアルゴリズム)はJavaScriptエンジンを使用して実行されます。 これにより、非常に大幅な(gzipなしで最大55%)コードサイズの削減が実現しますが、アーカイブの解凍には最大500〜1000ミリ秒の追加コストがかかります。 当然、これは、プロセッサの容量が制限されている場合(hi、IE)、接続速度が非常に高い場合(+ gzipがほぼ常に使用およびサポートされている場合)無関係になります。 さらに、この最適化方法は、最小化後にさまざまなバグが最も発生しやすくなります。
概要はこちらです。JavaScriptが開発されたサーバー上だけでなく、最適化後もJavaScriptを確認してください。 すべてのベスト-同じ単体テストを使用します。 説明したツールについて多くを学びます:)これが重要でない場合は、gzip(最大圧縮で最高の静的)を使用してJavaScriptを提供します。
Javascriptアソシエーションの問題
JavaScriptファイルの圧縮を理解した後、それらを結合するトピックに触れるとよいでしょう。 平均的なサイトには、5〜10個のJavaScriptファイルと、何らかの形でプラグインライブラリを呼び出すことができるコードのインラインスニペットがあります。 その結果、10〜15個のコードを組み合わせることができます(これの利点は、ユーザー側のダウンロード速度からDDoSの下でのサーバーフェールオーバーまで、海であり、ここでは各接続が静的であってもカウントされます)。
しかし、ラムに戻ります。 ここで、「サードパーティ」スクリプトを組み合わせる自動化について説明します。 それらへの完全なアクセス権を持っている(そしてWeb開発を理解している)場合、問題を修正する(または組合からいくつかの問題スクリプトを除外する)ことはたいしたことではありません。 それ以外の場合(スクリプトのセットが何らかの方法でエラーなしでマージされることを望まない場合)、次のアプローチはあなたのためだけです。
そのため、10〜15個のコードがあります(それらの一部は埋め込みコードの形式で、一部は外部ライブラリの形式であり、これらを一緒に「マージ」することもできます)。 それらの独立したパフォーマンスを保証する必要があります。 何で構成されていますか?
ファイルにJavaScriptエラーがある場合、ブラウザーはエラーでこのファイルの実行を停止します(最も古いものの一部は、この場合、ページ上のすべてのJavaScriptファイルの実行も停止しますが、これについてはまったく話していません)。 したがって、共通ファイルにマージする最初のライブラリでエラーが発生した場合、すべてのブラウザーで、マージ後にクライアントロジックがバラバラになります。 悲しい
さらに、インラインコードのデバッグは非常に難しいことに注意してください。 (たとえば、コードの前後にマージされたファイルを呼び出すことにより)マージから除外するか、使用する場合はファイルのマージを完全にキャンセルできます。
下位互換性
それについて何ができますか? 最も簡単な方法:問題のあるファイル(この場合、エラーは結合の段階でのみ発生する可能性があり、別のファイルはバングで解決できます)を結合のロジックから除外します。 これを行うには、エラーが発生している場所を追跡し、そのようなケースごとに結合する構成を収集する必要があります。
しかし、もう少し簡単にできます。 JavaScriptの場合、
try-catch
コンストラクトを使用できます。 ええ、あなたはアイデアをキャッチしましたか? まだ?
try {}
でマージするファイルのコンテンツ全体を囲み、
catch(e) {}
次の方法で外部ファイルの接続を呼び出します。
{ ... JavaScriptライブラリの内容... } catch(e){ document.write(「元のJavaScriptファイル呼び出し」); //またはconsole.log(「ユニオンからJavaScriptファイルを除外する」); }
同時に、問題がない場合、ユーザーには1つのファイルのみがロードされます。 エラーが発生した場合、すべての外部の問題のあるファイルは同じ順序で接続されます。 これにより、下位互換性が提供されます。
パフォーマンスの問題
明らかに、このアプローチは「最も正しい」ものではありません。 JavaScriptエラーを特定し、それらを除去し、すべてのユーザーに単一のファイルをアップロードするのが最も論理的です。 しかし、これは常に可能とは限りません。 また、
try-catch
設計はブラウザでの実行に対して重いこと(初期化時間に10〜25%を追加)を考慮する必要があります。注意してください。
しかし、記述されたアプローチは、JavaScriptファイルを具体的に組み合わせてデバッグするために素晴らしく使用できます。結局、どのファイルが「ストリーミング」されているかを正確に判断できます(数十個のファイルがある場合、これは非常に便利です)。
短い要約
JavaScriptファイルをさらに最小化した後、必ず機能を確認してください。 また、JavaScriptファイルの結合の正確性のデバッグは簡単に自動化でき、特定のスクリプトをデバッグできない場合は下位互換性を設定することもできます。