インラインJavascriptと外部JavaScriptのどちらを使用すればよいですか?


129

パフォーマンスとメンテナンスの容易さの観点から、外部スクリプトを含めるか、HTMLコードにインラインで記述する必要がある場合を知りたいです。

これの一般的な方法は何ですか?

現実のシナリオ-クライアント側のフォーム検証が必要なHTMLページがいくつかあります。このために、これらすべてのページに含めるjQueryプラグインを使用します。しかし、問題は、私が次のことを行うかどうかです。

  • このスクリプトをインラインで構成するコードを記述しますか?
  • これらすべてのhtmlページで共有される1つのファイルにすべてのビットを含めますか?
  • 各HTMLページごとに1つずつ、個別の外部ファイルに各ビットを含めますか?

ありがとう。

回答:


114

この回答が最初に投稿されたとき(2008)、ルールは単純でした。すべてのスクリプトは外部である必要があります。メンテナンスとパフォーマンスの両方。

(なぜパフォーマンスなのか?コードが分離していると、ブラウザで簡単にキャッシュできるからです。)

JavaScriptはHTMLコードに属しておらず、特殊文字(、など)が含まれていると<>問題が発生します。

今日、ウェブのスケーラビリティは変化しました。複数のHTTPリクエストを行う際のレイテンシのため、リクエスト数の削減は有効な検討事項となっています。これにより、答えがより複雑になります。ほとんどの場合、JavaScriptを外部に置くことをお勧めします。ただし、特定の場合、特に非常に小さなコードの場合、それらをサイトのHTMLにインライン化することは理にかなっています。


6
@ニック:ほとんどの問題は克服できます。ただし、そもそもそれらを生成しない方がよいでしょう。
Konrad Rudolph、

17
インライン化すると、パフォーマンスが向上する場合があります。google.comのソースをご覧ください。彼らは自分が何をしているか知っています。
カラム

13
@callum Googleは、99.999999%のウェブサイトとは異なるユースケースを持っています。もちろん、彼らは非常に注意深く測定し、小さな違いさえも重要です。しかし、特定のユースケースでインライン化が適切に機能することがわかったからといって(おそらくスクリプトが頻繁に変更されるためでしょうか)、そこから一般的なルールを導き出せるわけではありません。ルール(スクリプトを外部化するため)。
Konrad Rudolph

8
@KonradRudolph-同意しました、Googleのアプローチから派生する一般的な規則はありません。それはあなたの答えのルールを疑問視する価値があるかもしれないというヒントだと言っているだけです。とにかく、私がグーグルがそれをする理由はHTTPリクエストを減らすことであると私は思います、そしてこれはサイトの0.000001%以上に利益をもたらすかもしれません。帯域幅は高くなっていますが、往復時間は同じままです。シリアルHTTPリクエスト全体を削除する方が、外部JSのキャッシュの利点よりも優れている場合があります。もちろんJSのサイズにもよります。
カラム

5
@callumこれは真実ですが、キャッシングに関するポイントは依然として残っており、重要なままです。ラウンドトリップの削減は、訪問者が戻ってこない(そして、重要なページヒットが得られない)場合、またはコンテンツが頻繁に変更されてスクリプトファイルをキャッシュしてもメリットがない場合にのみ重要です。
Konrad Rudolph

31

保守性は間違いなくそれらを外部に保持する理由ですが、構成が1ライナーの場合(または一般に、それらのファイルを外部にすることで得られるHTTPオーバーヘッドよりも短い場合)、インラインで保持する方がパフォーマンス面で優れています。各HTTPリクエストは、実行時間とトラフィックの点でいくつかのオーバーヘッドを生成することを常に覚えておいてください。

当然のことながら、コードが数行より長く、実際には1つのページに固有ではない場合、このすべては無関係になります。そのコードを再利用できるようにしたい瞬間に、それを外部にします。そうでない場合は、そのサイズを確認して決定します。


5
それが私の懸念の1つです。数行のコードに対して個別のHTTPリクエストを行うことは無駄に思えます。
Dan Burzo 2008

コードのサンプル構成を投稿できますか?IMOが300文字未満で、ページ固有の場合は、インライン化します。
Horst Gutmann

これが最高の答えになるはずです
imo

@Danは、個別のリクエストが初めて発生することを覚えておいてください。ユーザーがページを複数回ロードすることが予想される場合、キャッシュされた外部(数行であっても)は、n = 2以上のページのロードでそれらの数行のバイトを待機するよりも明らかに高速です。
jinglesthula

@HorstGutmann保守性を備えたファイル外部支援をどのように持っていますか?私は個人的には可能な限り外部jsを好みますが、保守を容易にする目的がありますか?
jinglesthula

21

JavaScriptの外部化は、yahooパフォーマンスルールの1つです。http//developer.yahoo.com/performance/rules.html#external

常にスクリプトを外部化する必要のある厳格なルールは一般的には適切ですが、場合によっては、スクリプトとスタイルの一部をインライン化することもできます。ただし、パフォーマンスを向上させることがわかっているものだけをインライン化する必要があります(これを測定したため)。


1
私はYahooもすべてのJavascriptを1つのHTTP呼び出しに追加することもお勧めすると思います-これは、開発中にスクリプトがすべて同じファイルにある必要があるという意味ではありません
Paul Shannon

また、上記のように、HTTP / 2は「1コール」のプラクティスも変更します。
jinglesthula、2018年

19

パフォーマンスのみに関心がある場合、このスレッドのほとんどのアドバイスは完全に間違っており、SPAの時代にはますます誤りになり、JSコードがなければページは役に立たないと見なすことができます。私は無数の時間を費やしてSPAページのロード時間を最適化し、さまざまなブラウザーでこれらの結果を検証しました。全体的に、htmlを再編成することによるパフォーマンスの向上は、非常に劇的な場合があります。

最高のパフォーマンスを得るには、ページを2段階のロケットと考える必要があります。これらの2つの段階はおおまかに<head><body>フェーズに対応していますが、代わりに<static>およびと考えてください<dynamic>。静的な部分は基本的に文字列定数であり、できる限り速く応答パイプを押し下げます。Cookieを設定するミドルウェア(httpコンテンツを送信する前に設定する必要があります)を多く使用する場合、これは少しトリッキーになる可能性がありますが、原則として応答バッファーをフラッシュするだけで、テンプレートコード(razor、php、など)サーバー上。これは難しいように聞こえるかもしれませんが、それは些細なことなので、間違って説明しています。ご想像のとおり、この静的な部分には、インライン化および縮小されたすべての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>

この部分をネットワーク経由で送信することはほとんどコストがかからないため、サーバーに接続した後、クライアントが約5ms +待機時間のどこかでこれを受信し始めることが期待できます。サーバーがかなり近いと想定すると、この待ち時間は20ミリ秒から60ミリ秒の間になる可能性があります。ブラウザーはこのセクションを取得するとすぐに処理を開始します。通常、処理時間は転送時間の約20倍以上を占めます。これは、サーバー側での<dynamic>部分の処理の償却ウィンドウになります。

インラインjquery +シグナル+角度+ ng +アニメーション+ ngタッチ+ ngルート+ロダッシュを処理するには、ブラウザー(クロム、残りは20%遅くなる可能性があります)に約50ミリ秒かかります。それ自体はかなり驚くべきことです。ほとんどのウェブアプリは、人気のあるすべてのライブラリを組み合わせた場合よりもコードが少なくなっていますが、同じくらいあるとすると、クライアントでレイテンシ+ 100ミリ秒の処理を獲得します(このレイテンシの獲得は、2番目の転送チャンクから発生します)。2番目のチャンクが到着するまでに、すべてのjsコードとテンプレートを処理し、dom変換の実行を開始できます。

このメソッドがインライン化の概念に直交していることに反対するかもしれませんが、そうではありません。インライン化する代わりに、cdnsまたは独自のサーバーにリンクする場合、ブラウザーは別の接続を開いて実行を遅延させる必要があります。この実行は基本的に無料であるため(サーバー側がデータベースと通信しているため)、これらのジャンプはすべて、ジャンプを実行しないよりもコストがかかることを明確にする必要があります。外部jsがより高速に実行されるというブラウザの癖があれば、どの要素が支配的かを測定できます。私の測定では、この段階で余分なリクエストによりパフォーマンスが低下することが示されています。

私はSPAアプリの最適化に多く取り組んでいます。人々はデータ量は大事だと考えるのが一般的ですが、実際にはレイテンシと実行が支配的であることがよくあります。私がリストした最小化されたライブラリーは、最大300kbのデータを追加し、それは68kbのgzip圧縮、つまり2mbit 3g / 4g電話での200msのダウンロードです。これは、同じ電話で同じデータがあるかどうかを確認するのにかかる待ち時間とまったく同じです。モバイルレイテンシ税(電話からタワーまでのレイテンシ)が引き続き適用されるため、プロキシキャッシュされていたとしても、すでにキャッシュ内にあります。一方、最初のホップのレイテンシが低いデスクトップ接続は、通常、とにかく帯域幅が広くなります。

つまり、現時点(2014年)では、すべてのスクリプト、スタイル、テンプレートをインライン化するのが最善です。

編集(2016年5月)

JSアプリケーションが成長し続け、一部のペイロードが最大3 MB以上の縮小コードにスタックするようになると、少なくとも一般的なライブラリをインライン化すべきではないことが明らかになってきています。


<動的>部分のサーバー側処理用の償却ウィンドウになっているものを取得できませんでした-サーバーは必要なものを処理し、レンダリングされたhtml(ヘッド+ボディ)全体、その他のサーバー処理のみを処理しますその後必要ですか?
BornToCode

@BornToCodeアイデアは、サーバー側が何かをするのと同時にクライアントに何かすることを与えることです。クライアントライブラリを解釈する必要があるため-それは実行する前に、そのプロセスを始める方が良いでしょう任意のサーバー上の計算を。償却ウィンドウは、クライアントがJSを処理するのにかかる時間です。2段ロケットをオーケストレーションすれば、そのウィンドウは無料で手に入ります。
Gleno、2015年


9

実際、インラインJavaScriptを使用するのはかなり確かなケースがあります。jsが十分に小さい場合(1行の場合)、次の2つの要因があるため、JavaScriptをインラインで使用する傾向があります。

  • 地域。一部のJavaScriptの動作を検証するために外部ファイルをナビゲートする必要はありません
  • AJAX。AJAXを介してページの一部のセクションを更新している場合、それらをバインドした方法によっては、そのセクションのすべてのDOMハンドラー(onclickなど)失われる可能性があります。たとえばjQueryliveまたはdelegateメソッドを使用してこれを回避することができますが、jsが十分に小さい場合は、インラインで配置するのが望ましいことがわかりました。


4

私は必要なコードを見て、必要なだけ多くの個別のファイルに分割します。すべてのjsファイルは、関数などの「論理セット」を1つだけ保持します。すべてのログイン関連機能用の1つのファイル。

次に、各htmlページでのサイト開発中に、必要なものだけを含めます。サイトを公開するときは、ページに必要なすべてのjsファイルを1つのファイルに結合することで最適化できます。


4

インラインjavasciptに提供できる唯一の防御策は、.net MVCで強く型付けされたビューを使用するときに、JavaScriptの中でc#変数を参照できることです。


3

3つの考慮事項:

  • どのくらいのコードが必要ですか(ライブラリはファーストクラスのコンシューマーである場合があります)?
  • 特異性:このコードは、この特定のドキュメントまたは要素のコンテキストでのみ機能しますか?
  • ドキュメント内のすべてのコードは、それを長くし、したがって遅くなる傾向があります。さらに、SEOの考慮事項により、内部スクリプトを最小限に抑えることが明らかになります...

2

Firebugを使用すると、外部スクリプトのデバッグも簡単になります。私は自分のJavaScriptを単体テストして、それをすべて外部に役立てることが好きです。PHPコードとHTMLでJavaScriptを見るのは嫌いです。


2

JavaScriptを外部に保つという点について:

ASP.NET 3.5SP1は最近、複合スクリプトリソースを作成する機能を導入しました(jsファイルの束を1つにマージします)。これのもう1つの利点は、Webサーバーの圧縮がオンになっているときに、1つのわずかに大きいファイルをダウンロードすると、多くの小さいファイルよりも圧縮率が高くなります(httpオーバーヘッド、ラウンドトリップなども少なくなります)。これにより、最初のページの読み込みが節約され、ブラウザキャッシュが上記のように作動します。

ASP.NETはさておき、このスクリーンキャストでは、利点について詳しく説明しています。http//www.asp.net/learn/3.5-SP1/video-296.aspx


2

外部スクリプトのもう1つの隠れた利点は、jslintのような構文チェッカーを介して簡単に実行できることです。これにより、多くの悲惨で発見が難しいIE6バグからあなたを救うことができます。


1

あなたのシナリオでは、ページ間で共有される1つのファイルに外部のものを書き込むのが良いように思えます。上記のすべてに同意します。


1

初期のプロトタイピング中は、コードをインライン化して高速な反復を可能にしますが、本番環境に到達するまでにすべてを外部に配置してください。

すべてのJavascriptを外部に配置できない場合、設計が悪いため、データとスクリプトをリファクタリングする必要があると私は敢えて言っても


1

Googleはそのページランキング測定値に読み込み時間を含めています。インライン化を多くすると、スパイダーがページをクロールするのに時間がかかります。これを含める必要がある場合は、ページランキングに影響する可能性があります。いずれにしても、異なる戦略がランキングに影響を与える可能性があります。


1

スクリプトを複数のページで共有する必要がないため、単一ページのWebサイトを作成するときにはインラインを使用する必要があると思います


-3

インラインjsは常に維持が難しいため、常に外部jsを使用するようにしてください。

さらに、大多数の開発者がjsを外部で使用することを推奨しているため、専門的には外部jsを使用する必要があります。

私は外部のjsを使用しています。


2
専門的に必要ですか?どうして?誰が言ったの?
Siyah
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.