我应该使用CDN的Bootstrap还是在我的服务器上复制一份?

sha*_*are 131 twitter-bootstrap twitter-bootstrap-3

使用Twitter Bootstrap的最佳做法是什么,从CDN引用它或在我的服务器上制作本地副本?

由于Bootstrap不断发展,我担心如果我引用CDN,用户会随着时间的推移看到不同的网页,有些标签甚至可能会被破坏.什么是大多数人的选择?

Kyl*_*Mit 196

为什么不两者¯\ _(ツ)_ /¯? Scott Hanselman发表了一篇关于使用CDN提高性能的文章,但在CDN关闭的情况下优雅地回归本地副本.

特定于引导程序,您可以执行以下操作从具有本地回退的CDN加载:

<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>
Run Code Online (Sandbox Code Playgroud)

*您也可以做同样的测试使用YepNope或fallback.js
每*Flash的评论这个解决方案,更新的答案检查.visible类,而不是测试rgb(51, 51, 51)
*当测试如果一个样式表加载,你必须寻找一个风格有已应用,创建一个元素,并查看它是否已被应用.


关于最佳实践的问题,在生产环境中使用CDN有很多很好的理由:

  1. 它增加了可用的并行性.
  2. 它增加了缓存命中的可能性.
  3. 它确保有效载荷尽可能.
  4. 它减少了服务器使用的带宽量.
  5. 它确保用户获得地理上接近的响应.

对于您的版本控制问题,任何值得重视的CDN都可以让您定位特定版本的库,这样您就不会意外地在每个版本中引入重大更改.

  • 很棒的答案!只有一个注意事项:如果你使用的是Bootstrap 4,你应该使用"d-none"类而不是"hidden"来让故障转移工作. (4认同)

Ofi*_*ris 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认同)

Ham*_*raz 5

几乎所有公共 CDN 都非常可靠。但是,如果您担心 CDN 可能会停机的那一小部分时间,您可以从一个Bootstrap CDN加载 Bootstrap ,并在第一个 CDN 停机时回退到备用 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>
Run Code Online (Sandbox Code Playgroud)

关于你的第二个问题: 这篇文章中的链接是 bootstrap 和 jquery 的硬编码版本。因此,即使引导程序和 jquery 库不断开发并获得新功能,您的站点也会随着时间的推移保持不变。