淺析CSS 的載入及載入順序

來源:互聯網
上載者:User
本文很適合基礎及小夥伴們,本文主要給大家介紹CSS 的載入及載入順序以及遇到的問題思路解析,文中還給大家補充介紹了關於html,css,js三者的載入順序問題,需要的朋友參考下吧,希望能協助到大家。

通常的css載入順序

一般情況下,我們css樣式表是放在頭部,同時為了減少請求,我們通常對css進行一個合并壓縮。 目前我們css一般是如下載入的:

<head>  <link rel="stylesheet" href="/all-of-my-styles.css"></head><body>  …content…</body>

這樣可以,但是有幾個效能問題,我們可以繼續最佳化:

問題:

所有的css都合并壓縮成一個檔案,放在頁面頭部載入。可能首屏我們僅僅用到一點點css,卻在頭部載入了所有的css,造成資源的不合理載入和浪費。假如css很大,嚴重影響網頁載入速度和首屏顯示速度。

換個思路

假如不合并,單個css壓縮引用,檔案大小是小了,但是請求數量多了一些。 權衡二者,並且進行效能測試對比,發現如下寫法確實比我們所有css放在頭部一次性載入,首屏顯示速度要快些:

<head></head><body>  <!-- HTTP/2 push this resource, or inline it, whichever's faster -->  <link rel="stylesheet" href="/site-header.css">  <header>…</header>  <link rel="stylesheet" href="/article.css">  <main>…</main>  <link rel="stylesheet" href="/comment.css">  <section class="comments">…</section>  <link rel="stylesheet" href="/about-me.css">  <section class="about-me">…</section>  <link rel="stylesheet" href="/site-footer.css">  <footer>…</footer></body>

但是還是有效能可以最佳化的地方!

例如:

我們首屏僅僅顯示了頭部和文章,其他模組首屏不顯示。那麼,其他模組的css我們可以完全非同步來載入。如何非同步載入呢?

請看下面

loadCSS 及 Preload

關於preload,推進2篇文章給大家看下:

1、通過rel="preload"進行內容預先載入: https://developer.mozilla.org/zh-CN/docs/Web/HTML/Preloading_content

2、preload 的w3文檔: https://www.w3.org/TR/preload/

對於一些不是首屏載入的css,我們可以如下寫法:

<link rel="preload" href="path/to/haorooms.css" as="style" onload="this.rel='stylesheet'">

防止瀏覽器禁止js,保險起見,也可以如下:

<link rel="preload" href="path/to/haorooms.css" as="style" onload="this.rel='stylesheet'"><noscript><link rel="stylesheet" href="path/to/haorooms.css"></noscript>

為了避免有些瀏覽器會重新調用處理常式rel='stylesheet'這個屬性,我們一般推薦如下寫法:

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

為了更好的相容rel=preload,可以使用loadCSS ,github地址: https://github.com/filamentgroup/loadCSS

因此, 不考慮瀏覽器安全色問題的情況下 (考慮相容問題,可以使用loadCss,這裡不多示範),我們對上面代碼再次進行最佳化:

<head>  <link rel="stylesheet" href="/首屏載入css.css">  <link rel="preload" href="/不是首屏載入的css.css" as="style" onload="this.onload=null;this.rel='stylesheet'"></head><body>  <header>…</header>  <main>…</main>  <section class="comments">…</section>  <section class="about-me">…</section>  <footer>…</footer></body>

PS:下面看下關於html,css,js三者的載入順序問題

<head lang="en">    <meta charset="utf-8">    <title></title>    <link rel="stylesheet" href="css/*.css">    <script src="js/*.js></script></head>

DOM文檔的載入順序是由上而下的順序載入;

1、DOM載入到link標籤

css檔案的載入是與DOM的載入並行的,也就是說,css在載入時Dom還在繼續載入構建,而過程中遇到的css樣式或者img,則會向伺服器發送一個請求,待資源返回後,將其添加到dom中的相對應位置中;

2、DOM載入到script標籤

由於js檔案不會與DOM並行載入,因此需要等待js整個檔案載入完之後才能繼續DOM的載入,倘若js指令檔過大,則可能導致瀏覽器頁面顯示滯後,出現“假死”狀態,這種效應稱之為“阻塞效應”;會導致出現非常不好的使用者體驗;

而這個特性也是為什麼在js檔案中開頭需要$(document).ready(function(){})或者(function(){})或者window.onload,即是讓DOM文檔載入完成之後才執行js檔案,這樣才不會出現尋找不到DOM節點等問題;

js阻塞其他資源的載入的原因是:瀏覽器為了防止js修改DOM樹,需要重新構建DOM樹的情況出現;

3、解決方案

前提,js是外部指令碼;

在script標籤中添加 defer=“ture”,則會讓js與DOM並行載入,待頁面載入完成後再執行js檔案,這樣則不存在阻塞;

在scirpt標籤中添加 async=“ture”,這個屬性告訴瀏覽器該js檔案是非同步載入執行的,也就是不依賴於其他js和css,也就是說無法保證js檔案的載入順序,但是同樣有與DOM並行載入的效果;

同時使用defer和async屬性時,defer屬性會失效;

可以將scirpt標籤放在body標籤之後,這樣就不會出現載入的衝突了。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.