异步加载 CSS 文件,消除渲染阻塞,WordPress 可以通过修改 functions.php 实现。
延迟加载非关键 CSS
复制下面的代码段,粘贴到你的 functions.php 文件末尾
// To defer loading of non-critical CSS
function aimeesign_defer_css_rel_preload($html, $handle, $href, $media){
if ( !is_admin() ) {
# 不添加延迟加载的列表 (style-1,style-2...修改为你不想延迟加载的文件名)
$styles_to_exclude = array('style-1.css','style-2.css');
foreach($styles_to_exclude as $exclude_style){
if(true == strpos($html, $exclude_style ) )
return $html;
}
return $html = '<link rel="preload" href="' . $href . '" as="style" id="' . $handle . '" media="' . $media . '" onload="this.onload=null;this.rel=\'stylesheet\'">'
. '<link rel="stylesheet" href="' . $href . '" id="' . $handle . '" media="print" onload="this.media=\'all\'">' . '<noscript>' . $html . '</noscript>';
}
}
add_filter( 'style_loader_tag', 'aimeesign_defer_css_rel_preload', 10, 4 );
加载出来的效果大致如下:
<link rel="preload" href="#" as="style" id="#" media="#" onload="this.onload=null;this.rel='stylesheet'">
<link href="#" id="#" media="print" onload="this.media='all'">
<noscript><link rel="stylesheet" href="#" id="#" media="all"></noscript>
- 它的工作原理:
link rel="preload" as="style"
异步请求样式表,但仅支持 Chrome, Safari, Edge 等浏览器,添加第二个 <link> 是为了使其作用于 Firefox 浏览器 - 链接中的
onload
属性允许在完成加载时处理 css noscript
标签确保如果浏览器不支持 “javascript”,它仍然可以向用户显示文件的内容,为了防止使用旧浏览器的用户看到没有实际样式的网页,使用noscript
标签作为延迟加载 css 的后备很重要。
延迟所有 CSS 加载
复制下面的代码段,粘贴到你的 functions.php 文件末尾
// To defer loading of non-critical CSS
function aimeesign_defer_css_rel_preload( $html, $handle, $href, $media ) {
if ( !is_admin() ) {
$html = '<link rel="preload" href="' . $href . '" as="style" id="' . $handle . '" media="' . $media . '" onload="this.onload=null;this.rel=\'stylesheet\'">'
. '<link rel="stylesheet" href="' . $href . '" id="' . $handle . '" media="print" onload="this.media=\'all\'">' . '<noscript>' . $html . '</noscript>';
}
return $html;
}
add_filter( 'style_loader_tag', 'aimeesign_defer_css_rel_preload', 10, 4 );
这种方法的好处是,一劳永逸,后面即使会新增其他的样式文件加载,依然不会造成渲染阻塞的问题。
参考文章:
写下你的评论