CDNのBootstrapを使用するか、サーバーにコピーを作成する必要がありますか?


140

Twitter Bootstrapを使用するベストプラクティスは何ですか?CDNから参照するか、サーバーにローカルコピーを作成しますか?

Bootstrapは進化し続けているので、CDNを参照すると、ユーザーは時間の経過とともにさまざまなWebページを参照し、一部のタグは壊れる可能性があります。ほとんどの人の選択は何ですか?

回答:


204

なぜ両方Not \ _(ツ)_ /¯ではないのですか? Scott Hanselmanは、パフォーマンス向上のためにCDNを使用することに関する優れた記事を持っていますが、CDNがダウンした場合に備えて、ローカルコピーに適切にフォールバックします。ます。

ブートストラップに固有の方法は、次のようにして、ローカルフォールバックを使用してCDNからロードできます。

Plunkerでの作業デモ

<head>
  <!-- Bootstrap CSS CDN -->
  <link rel="stylesheet" href="~https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css">
  <!-- Bootstrap CSS local fallback -->
  <script>
    var test = document.createElement("div")
    test.className = "hidden d-none"

    document.head.appendChild(test)
    var cssLoaded = window.getComputedStyle(test).display === "none"
    document.head.removeChild(test)

    if (!cssLoaded) {
        var link = document.createElement("link");

        link.type = "text/css";
        link.rel = "stylesheet";
        link.href = "lib/bootstrap.min.css";

        document.head.appendChild(link);
    }
  </script>
</head>
<body>
    <!-- APP CONTENT -->

    <!-- jQuery CDN -->
    <script src="~https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
    <!-- jQuery local fallback -->
    <script>window.jQuery || document.write('<script src="lib/jquery.min.js"><\/script>')</script>

    <!-- Bootstrap JS CDN -->
    <script src="~https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
    <!-- Bootstrap JS local fallback -->
    <script>if(typeof($.fn.modal) === 'undefined') {document.write('<script src="lib/bootstrap.min.js"><\/script>')}</script>
</body>

アップデート

ベストプラクティス

ベストプラクティスに関する質問には、実稼働環境でCDNを使用する非常に十分な理由があります

  1. 利用可能な並列処理が増加ます。
  2. キャッシュヒットが発生する可能性が高くなります
  3. ペイロードは可能な限り小さくなりますます。
  4. サーバーが使用する帯域幅の量を減らします。
  5. これにより、ユーザーは地理的に近い応答を得ることができます。

バージョン管理の問題として、その重要な価値があるCDNを使用すると、ライブラリの特定のバージョンを対象にできるため、リリースごとに誤って重大な変更を導入することはありません。

使用する document.write

上のMDNによると document.write

:としてdocument.writeのドキュメントへの書き込みストリーム呼び出し、document.write閉じた状態(ロード)文書を自動的に呼び出してdocument.openドキュメントをクリアします

ただし、ここでの使用は意図的なものです。コードは、DOMが完全に読み込まれる前に、正しい順序で実行する必要があります。jQueryが失敗した場合は、jQueryに依存するブートストラップをロードする前に、ドキュメントにインラインで挿入する必要があります。

ロード後のHTML出力

出力例

ただし、どちらの場合でも、ドキュメントが開いている間に呼び出しているため、ドキュメント全体を置き換えるのではなく、コンテンツをインライン化する必要があります。最後まで待っている場合は、document.body.appendChild動的ソースを挿入するためにに置き換える必要があります。

余談:MVC 6では、リンクおよびスクリプトタグヘルパーを使用してこれを行うことができます


1
ハードコーディングrgb(51, 51, 51)は危険に思われます-誰かが色を変更し、それを更新するのを忘れた場合はどうなりますか?使用できるより安定したプロパティはありますか?
フラッシュ

@Flash、うん、私はそれが気難しいことに同意する。グローバルJavaScript変数で、または直接CSSを介してCSSの変更をテストすることは困難です。要素をテストして、CSSがそれらを記述する可能性が高い方法で要素がスタイル設定されているかどうかを確認する必要があり<body>ます。常に要素があります。 この答えは、.hiddendivを使用していくつかのマークアップを追加し、それが表示されるかどうかを確認するテストを実行します$('#bootstrapCssTest').is(':visible')。そのクラスは、時間の経過とともに重大な変更を行う可能性がはるかに低くなります。
KyleMit 2017

@ KyleMit、Google Material Iconsでこれを行うにはどうすればよいですか?
Rana Depto 2018

4
正解です。注のみ:Bootstrap 4を使用している場合、フェイルオーバーを機能させるには、「非表示」ではなく「d-none」クラスを使用する必要があります。
18年

1
@JarrodW。-すばらしい質問です。私はいくつかの掘削をしなければなりませんでした。ここでそれを使用するのが良いでしょう-更新された回答を参照してください
KyleMit

9

特定のサイトに依存します。

多くのユーザーがいますか?帯域幅の使用について気にしますか?パフォーマンスに問題はありますか(CDN は応答を高速化できます)?

特定のバージョンにリンクできます。

//maxcdn.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css

または

//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css

そうすれば、ライブラリの更新について心配する必要がなくなります。更新を維持することをお勧めします。

開発者の選択に関する正確な統計が何であるかはわかりませんが、ここを見ると、何十億ものリクエストがBootstrap CDNに送信されていることがわかります。つまり、堅牢で安全に使用できます。


10
最後のリンクは壊れています。
Nuclearman、2015

@ Nuclearman、trends.builtwith.com / cdn / StackPath-BootstrapCDN、編集も送信しています。
its4zahoor

2

カイルミットの回答を編集しようとしましたが、フォーラムは間違ったインデントコードとしてマークされていましたが、そうではなかったので、以下のように投稿を追加しています。

質問は トピック(そしてだけでなく )、Bootstrapの新しいバージョンの応答を更新すると役立つ場合があります。

フレームワークは4番目のバージョンで要素を非表示にするための新しいクラスを追加したので、この場合.d-none.hiddenはなくを使用する必要があります。

libバージョンを除いて、他のすべてはその場合同じままです(もちろん!)


1

@KyleMitに感謝します。フォールバックの別の方法は、以下のように「ウィンドウ」オブジェクトを使用することです-

<script type="text/javascript" src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>
<script>
window.jQuery || document.write("<script src='js/jquery.min.js'><\/script>");
</script>

このように機能します-CDNリンクが機能する場合、「ウィンドウ」オブジェクトは「jQuery」プロパティを使用できます。それ以外の場合は、スクリプトの2番目の部分、つまりローカルコピーを指すdocument.writeが実行されます。

元の質問への回答-CDNを使用すると、サーバーや帯域幅に影響を与えずにすばやくダウンロードできるなど、多くの利点があります。ローカルコピーを持つことには、独自の利点があります(フォールバック構成として)。イントラネットでは、プロキシ設定、セキュリティポリシーにより、CDNリンクが機能しないか、CDNリンクがダウンしていると機能しない可能性があります。正解は、両方を用意することです。


1

ほとんどすべてのパブリックCDNはかなり信頼できます。ただし、CDNがダウンする可能性がある時間の一部が心配な場合は、1つのBootstrap CDNからBootstrapをロードし、最初のものがダウンした場合に代替CDNにフォールバックできます。

<html>
  <head>
    <!-- Bootstrap CSS CDN with Fallback -->
    <link rel="stylesheet" href="https://pagecdn.io/lib/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha256-YLGeXaapI0/5IgZopewRJcFXomhRMlYYjugPLSyNjTY=" crossorigin="anonymous">
    <script>
    var test = document.createElement("div")
    test.className = "hidden d-none"

    document.head.appendChild(test)
    var cssLoaded = window.getComputedStyle(test).display === "none"
    document.head.removeChild(test)

    if (!cssLoaded) {
        var link = document.createElement("link");

        link.type = "text/css";
        link.rel = "stylesheet";
        link.href = "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css";

        document.head.appendChild(link);
    }
    </script>
  </head>
  <body>
    <!-- APP CONTENT -->

    <!-- jQuery CDN with Fallback -->
    <script src="https://pagecdn.io/lib/jquery/3.2.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
    <script>window.jQuery || document.write('<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"><\/script>');</script>

    <!-- Bootstrap JS CDN with Fallback -->
    <script src="https://pagecdn.io/lib/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha256-CjSoeELFOcH0/uxWu6mC/Vlrc1AARqbm/jiiImDGV3s=" crossorigin="anonymous"></script>
    <script>if(typeof($.fn.modal) === 'undefined') {document.write('<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"><\/script>')}</script>
  </body>
</html>

2番目の懸念事項について: この投稿のリンクは、ハードコードされたバージョンのブートストラップとjqueryです。したがって、ブートストラップライブラリとjqueryライブラリが絶えず開発されて新しい機能が追加されたとしても、サイトは長期にわたって同じままです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.