パフォーマンスのみを気にする場合、このスレッドのアドバイスのほとんどは完全に間違っており、JS コードなしではページが役に立たないと想定できる SPA 時代にはますます間違っています。SPA ページの読み込み時間を最適化し、さまざまなブラウザーでこれらの結果を検証するのに数え切れないほどの時間を費やしました。全面的に、html を再編成することによるパフォーマンスの向上は、非常に劇的なものになる可能性があります。
最高のパフォーマンスを得るには、ページを 2 段階のロケットと考える必要があります。これらの 2 つの段階は、大まかに<head>
と<body>
フェーズに対応しますが、代わりに と と考えて<static>
ください<dynamic>
。静的部分は基本的に文字列定数であり、可能な限り速く応答パイプに押し込みます。Cookie を設定する多くのミドルウェアを使用している場合、これは少しトリッキーになる可能性があります (これらは、http コンテンツを送信する前に設定する必要があります)。など)サーバー上。これは難しく聞こえるかもしれませんが、ほとんど些細なことなので、間違って説明しているだけです。ご想像のとおり、この静的部分には、インライン化および縮小されたすべての JavaScript が含まれている必要があります。それは次のようになります
<!DOCTYPE html>
<html>
<head>
<script>/*...inlined jquery, angular, your code*/</script>
<style>/* ditto css */</style>
</head>
<body>
<!-- inline all your templates, if applicable -->
<script type='template-mime' id='1'></script>
<script type='template-mime' id='2'></script>
<script type='template-mime' id='3'></script>
この部分を送信するのにほとんど費用がかからないため、サーバーに接続した後、クライアントは約 5 ミリ秒 + レイテンシでこれを受信し始めると予想できます。サーバーがかなり近いと仮定すると、この遅延は 20 ミリ秒から 60 ミリ秒の間になる可能性があります。ブラウザーは、このセクションを取得するとすぐに処理を開始します。通常、処理時間は転送時間の 20 倍以上を占めます。これが、サーバー側でこの<dynamic>
部分を処理するための償却ウィンドウになります。
ブラウザー (chrome、残りはおそらく 20% 遅い) がインライン jquery + signalr + angular + ng animate + ng touch + ng routes + lodash を処理するのに約 50ms かかります。それ自体はかなり驚くべきことです。ほとんどの Web アプリのコードは、これらの一般的なライブラリをすべてまとめたものよりも少ないですが、同じくらい多くのコードを持っているとしましょう。その場合、クライアントでのレイテンシ + 100 ミリ秒の処理を勝ち取ることができます (このレイテンシの勝ちは、2 番目の転送チャンクに由来します)。2 番目のチャンクが到着するまでに、すべての js コードとテンプレートを処理し、dom 変換の実行を開始できます。
このメソッドがインライン化の概念と直交していると異議を唱えるかもしれませんが、そうではありません。インライン化する代わりに、cdns または独自のサーバーにリンクすると、ブラウザは別の接続を開いて実行を遅らせる必要があります。この実行は基本的に無料であるため (サーバー側がデータベースと通信しているため)、これらのジャンプをすべて行うと、ジャンプをまったく行わない場合よりもコストがかかることは明らかです。外部 js がより高速に実行されるというブラウザーの癖があった場合、どの要因が支配的であるかを測定できます。私の測定では、余分なリクエストがこの段階でのパフォーマンスを低下させていることが示されています。
私はSPAアプリの最適化に多く取り組んでいます。データ量が重要であると考えるのは一般的ですが、実際にはレイテンシーと実行が支配的であることがよくあります。私がリストした最小化されたライブラリは、最大 300kb のデータを追加します。これは、gzip 圧縮されたわずか 68kb、または 2 メガビットの 3g/4g 電話で 200 ミリ秒のダウンロードです。これは、同じ電話で同じデータがあるかどうかを確認するのにかかる遅延とまったく同じです。モバイル遅延税 (電話からタワーへの遅延) がまだ適用されるため、プロキシ キャッシュされていたとしても、キャッシュ内に既に存在します。一方、最初のホップの待ち時間が短いデスクトップ接続は、通常、どちらにしても帯域幅が高くなります。
要するに、現時点 (2014 年) では、すべてのスクリプト、スタイル、およびテンプレートをインライン化するのが最善です。
編集 (2016 年 5 月)
JS アプリケーションが成長し続け、私のペイロードの一部が最大 3 メガバイト以上の圧縮されたコードをスタックするようになったため、少なくとも一般的なライブラリをインライン化する必要がないことが明らかになりつつあります。