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

Javascript CSS交付优化:如何延迟CSS加载?,javascript,html,css,google-pagespeed,deferred-loading,Javascript,Html,Css,Google Pagespeed,Deferred Loading,我正在尝试优化CSS交付遵循谷歌开发者文档 正如您在内联一个小CSS文件的示例中所看到的,在头中内联了关键CSS,在加载页面后加载原始的small.CSS <html> <head> <style> .blue{color:blue;} </style> </head> <body> <div class="blue"> Hello, world!

我正在尝试优化CSS交付遵循谷歌开发者文档

正如您在内联一个小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>

.blue{颜色:蓝色;}
你好,世界!
关于这个例子,我的问题是:


如何在加载页面后加载大型css文件?

如果您不介意使用jQuery,这里有一个简单的代码片段来帮助您。(否则,请发表评论,我将编写一个纯js示例

function loadStyleSheet(src) {
    if (document.createStyleSheet){
        document.createStyleSheet(src);
    }
    else {
        $("head").append($("<link rel='stylesheet' href='"+src+" />"));
    }
};
函数加载样式表(src){
if(document.createStyleSheet){
document.createStyleSheet(src);
}
否则{

$(“head”)。除了Fred的答案之外,还附加($(“):

使用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>
<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>

.blue{颜色:蓝色;}
$(文档).ready(函数(){
如果($(“正文”).size()>0){
if(document.createStyleSheet){
document.createStyleSheet('style.css');
}
否则{
$(“head”)。追加($(“”);
}
}
});
你好,世界!

使用纯Javascript和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>
<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>

.blue{颜色:蓝色;}
var stylesheet=document.createElement('link');
stylesheet.href='style.css';
stylesheet.rel='stylesheet';
stylesheet.type='text/css';
document.getElementsByTagName('head')[0].appendChild(样式表);
你好,世界!

对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);
            }
        }
//延迟样式表的加载
//只需将其添加到标记之前
//在包含任何javaScript文件之前(为了性能)
函数加载样式表(src){
if(document.createStyleSheet)document.createStyleSheet(src);
否则{
var stylesheet=document.createElement('link');
stylesheet.href=src;
stylesheet.rel='stylesheet';
stylesheet.type='text/css';
document.getElementsByTagName('head')[0].appendChild(样式表);
}
}
试试这个片段

谷歌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>

var cb=函数(){
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窗口。addEventListener('load',cb);

警告:
正文{背景图像:url(“http://example.com/image.jpg“”;}
在css文件中会使您的css文件仍然呈现阻塞

如果您尝试了上述所有解决方案,但仍然收到PageSpeed insights的渲染阻止警告,那么您的css文件中可能有此样式规则。经过数小时的测试,结果表明,此规则正是使我的css的所有
标记为PageSpeed insights的渲染阻止资源的原因。我发现了相同的iss我们一直在努力

我不知道为什么
body{background image:url(…)
对所有css文件都这样做,尽管我在文件中有不同的按钮、图标等图像资源


我通过从
.css
文件中移动此规则并将其放入内联样式中修复了此问题。不幸的是,您必须打破css计划,将此规则放入所有布局HTML文件中,而不是放入所有HTML布局中导入的一个css文件中,但PageSpeed insights中的90和绿色值得使用。

修正了我的问题,将所有css文件放在页面底部,在body标记之后。但这带来了一个新问题,页面在应用样式之前加载未设置样式的html长达明显的毫秒。为此,我修正了我的问题,引入了一个在页面上设置样式的启动屏幕。

这是使用新方法的方式:

<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="styles.css"></noscript>

  • linkrel=“preload”as=“style”异步请求样式表
  • 链接中的onload属性允许CSS在加载完成后进行处理
  • 一旦onload处理程序被使用,“null”有助于某些浏览器避免在切换rel属性时重新调用该处理程序
  • noscript元素内部样式表的引用可以作为不执行JavaScript的浏览器的回退

感谢jquery函数,我一定会使用它!对于#2,禁用选项已从firefox 23版之前的工具中删除,我必须使用about:conf条目。我确认css是使用noscript out from html加载的。@Fred您的代码中有一个错误,应该是$(“head”)。append(“”)@KarimSamir回到过去,你需要用$将其包装成DOM元素。不确定是否仍然是这样。它只解决了主页的CSS交付规则为100/100。在所有其他页面上都不起作用。有什么想法吗?其他页面仍然显示“消除折叠内容中的渲染阻塞JavaScript和CSS”"问题。此脚本可能会延迟CSS,但它会使用jquery文件阻塞页面。因此,不建议将其作为一个好的解决方案。我不明白为什么小CSS和大CSS会有任何不同。我还对
感到困惑。如果启用javascript,如何加载
小.CSS
。如果启用javascript,则通过javascript加载小.CSS达夫