CSS 交付优化:如何延迟 css 加载?

IT技术 javascript html css google-pagespeed deferred-loading
2021-03-08 23:52:03

我正在尝试按照开发人员的谷歌文档优化 CSS 交付https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery#example

正如您在内联小 CSS 文件的示例中所见,关键 CSS 内联在头部,原始 small.css 是在页面加载后加载的

<html>
  <head>
    <style>
      .blue{color:blue;}
    </style>
    </head>
  <body>
    <div class="blue">
      Hello, world!
    </div>
  </body>
</html>
<noscript><link rel="stylesheet" href="small.css"></noscript>

我关于这个例子的问题:

如何在页面加载后加载一个大的 css 文件?

6个回答

如果您不介意使用 jQuery,这里有一个简单的代码片段可以帮助您。(否则评论,我会写一个纯js的例子

function loadStyleSheet(src) {
    if (document.createStyleSheet){
        document.createStyleSheet(src);
    }
    else {
        $("head").append($("<link rel='stylesheet' href='"+src+" />"));
    }
};

只需在您的$(document).ready()orwindow.onload函数中调用它,您就可以开始了。

对于#2,你为什么不试试呢?在浏览器中禁用 Javascript 并查看!

顺便说一句,一个简单的谷歌搜索可以让你走多远真是太神奇了;对于查询"post load css",这是第四次命中... http://www.vidalquevedo.com/how-to-load-css-stylesheets-dynamically-with-jquery

此脚本可能会延迟 CSS,但它会使用 jquery 文件渲染阻止页面。因此不建议将其作为一个好的解决方案。
2021-04-17 23:52:03
@Fred 你的代码有错误应该是 $("head").append('<link href="'+src+'" rel="stylesheet" type="text/css">');
2021-04-19 23:52:03
@KarimSamir 过去,您需要将它包装在 $ 中以将其实例化为 DOM 元素。不确定是否仍然如此。
2021-05-01 23:52:03
它只解决了主页的CSS交付规则到100/100。不适用于所有其他页面。任何的想法?其他页面仍然显示“消除首屏内容中阻止渲染的 JavaScript 和 CSS”问题。
2021-05-07 23:52:03
感谢 jquery 功能,我一定会使用它!对于 #2,禁用选项已从 Firefox 中的工具中删除,直到版本 23,我不得不使用 about:conf 条目。我确认使用 html 中的 noscript 加载了 css。
2021-05-14 23:52:03

对 Fred 提供的函数稍作修改,使其更高效且无需 jQuery。我正在为我的网站在生产中使用此功能

        // to defer the loading of stylesheets
        // just add it right before the </body> tag
        // and before any javaScript file inclusion (for performance)  
        function loadStyleSheet(src){
            if (document.createStyleSheet) document.createStyleSheet(src);
            else {
                var stylesheet = document.createElement('link');
                stylesheet.href = src;
                stylesheet.rel = 'stylesheet';
                stylesheet.type = 'text/css';
                document.getElementsByTagName('head')[0].appendChild(stylesheet);
            }
        }
此解决方案完美运行,但加载的 CSS 文件从未被缓存,这意味着在加载之前总是有一个“无样式”的闪存。我对非常基本的 CSS 使用了关键 CSS,但这两者之间的变化仍然非常大。有什么方法可以在动态加载文件时缓存文件?
2021-04-17 23:52:03
@authorandrew Chrome 80 工作正常,在 Firefox 74 上有你提到的缓存问题
2021-05-07 23:52:03

这是您使用新方法的方式:

<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="styles.css"></noscript>
  • link rel="preload" as="style"异步请求样式表。
  • 链接中onload属性允许在完成加载时处理 CSS。
  • 使用后将 onload 处理程序“归零”有助于某些浏览器避免在切换 rel 属性时重新调用处理程序。
  • noscript元素内的样式表的引用作为不执行 JavaScript 的浏览器的后备。

除了弗雷德的回答:

使用 jQuery & Noscript 的解决方案

<html>
  <head>
    <style>
      .blue{color:blue;}
    </style>
    <script type="text/javascript" src="../jquery-1.4.2.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function(){
        if($("body").size()>0){
                if (document.createStyleSheet){
                    document.createStyleSheet('style.css');
                }
                else {
                    $("head").append($("<link rel='stylesheet' 
                    href='style.css' 
                    type='text/css' media='screen' />"));
                }
            }
        });
    </script>
    </head>
  <body>
    <div class="blue">
      Hello, world!
    </div>
  </body>
</html>
<noscript><link rel="stylesheet" href="small.css"></noscript>

来自http://www.vidalquevedo.com/how-to-load-css-stylesheets-dynamically-with-jquery

使用纯 Javascript 和 Noscript

<html>
  <head>
    <style>
      .blue{color:blue;}
    </style>
    <script type="text/javascript">
          var stylesheet = document.createElement('link');
          stylesheet.href = 'style.css';
          stylesheet.rel = 'stylesheet';
          stylesheet.type = 'text/css';
          document.getElementsByTagName('head')[0].appendChild(stylesheet);
    </script>
    </head>
  <body>
    <div class="blue">
      Hello, world!
    </div>
  </body>
</html>
<noscript><link rel="stylesheet" href="small.css"></noscript>
我对第二个 javascript 与将 javascript 放在link头尾有何不同感到困惑
2021-04-16 23:52:03
@Jayen 你的说法是正确的。它看起来像当前接受的解决方案时关闭JavaScript是禁用(假设它是在不推迟装载的贸易有望少见)。
2021-04-24 23:52:03
</html>标签无效的 HTML之后没有任何东西吗?
2021-04-28 23:52:03
第一个解决方案需要 jQuery 库,而第二个不需要
2021-04-29 23:52:03
我不是问第一个和第二个之间的区别。第二个不等待DOMContentLoaded所以它似乎与<link href="style.css" rel="stylesheet" type="text/css">.
2021-05-14 23:52:03

试试这个片段

作者声称,它是由谷歌的团队的PageSpeed公布

<script>
    var cb = function() {
    var l = document.createElement('link'); l.rel = 'stylesheet';
    l.href = 'yourCSSfile.css';
    var h = document.getElementsByTagName('head')[0]; h.parentNode.insertBefore(l, h); };
    var raf = requestAnimationFrame || mozRequestAnimationFrame ||
              webkitRequestAnimationFrame || msRequestAnimationFrame;
    if (raf) raf(cb);
    else window.addEventListener('load', cb);
</script>
同样在这里。它只优化主页的CSS交付规则。不适用于所有其他页面。任何的想法?
2021-04-18 23:52:03
我觉得作者稍微修改了一下:见developers.google.com/speed/docs/insights/OptimizeCSSDelivery
2021-04-18 23:52:03
您是否检查过其他页面是否加载了其他样式表?虽然我发布了这个答案,但我从未使用过这种方法。我以旧时尚的方式加载我的 CSS,并尽量不去关注 Google 页面速度得分。缩小和优化您的 css 并努力获得更好的内容以提高排名。
2021-04-21 23:52:03
使用其中任何一个代码实际上会降低我的分数,而不是提高。在使用他们的“建议的延迟代码”之前 得分:77。使用后(其中之一)。分数:69。所以呃...不,谢谢。
2021-04-29 23:52:03
我应用了这个技术并且我的主页通过了Optimize CSS delivery规则,但是,这在详细信息页面中不起作用,我使用相同的脚本,因为这个脚本在布局文件中。
2021-05-01 23:52:03