亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

淺談網頁基本性能優化規則小結

2024-08-26 00:20:44
字體:
來源:轉載
供稿:網友

針對瀏覽器網頁的一些優化規則

頁面優化

靜態資源壓縮

借助構建工具(webpack、gulp)適當壓縮圖片、腳本及樣式等網頁靜態資源。

CSS雪碧圖、base64內聯圖片

將站內小圖標合并成一張圖,使用css定位截取對應圖標;適當使用內聯圖片。

樣式置頂、腳本置底

頁面是一個逐步呈現的過程,樣式置頂能更快呈現頁面給用戶;<script> 標簽置頂會阻塞頁面后面資源的下載。

使用外鏈的css和js

多個頁面引用公共靜態資源,資源復用減少額外的http請求。

避免空src的圖片

避免不必要的http請求。

<!-- 空src的圖片依然會發起http請求 --><img src="" style="margin: 0px; padding: 0px; outline: none; line-height: 25.2px; font-size: 14px; width: 660px; overflow: hidden; clear: both; font-family: tahoma, arial, "Microsoft YaHei";">	
<!-- 實際圖片尺寸為600x300,在html中縮放為了200x100 --><img src="/static/images/a.png" width="200" height="100" style="margin: 0px; padding: 0px; outline: none; line-height: 25.2px; font-size: 14px; width: 660px; overflow: hidden; clear: both; font-family: tahoma, arial, "Microsoft YaHei";">	
<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>Document</title>  <link ref="preload" href="style.css" as="style">  <link ref="preload" href="main.js" as="script">    <link ref="stylesheet" href="style.css"></head><body>    <script src="main.js"></script></body></html>

例子中預加載了css和js文件,在之后的頁面渲染中,一旦使用它們就會立即調用。

可指定as的類型加載不同類型的資源。

  1. style
  2. script
  3. video
  4. audio
  5. image
  6. font
  7. document
  8. ...

該方式也可跨域預加載資源,設置crossorigin屬性即可。

<link rel="preload" href="fonts/cicle_fina-webfont.woff2" as="font" type="font/woff2" crossorigin="anonymous">

CSS

選擇器

選擇器的優先級從高到低排列為:

  1. ID選擇器
  2. 類選擇器
  3. 標簽選擇器
  4. 相鄰選擇器
h1 + p{ margin-top: 15px; }

選擇緊接在h1元素后出現的段落,h1和p元素擁有共同的父元素。

子選擇器

h1 > strong {color:red;}

后代選擇器

h1 em {color:red;}

通配符選擇器

屬性選擇器

*[title] {color:red;}img[alt] {border: 5px solid red;}

偽類選擇器

選擇器使用經驗:

  1. 優先選擇類選擇器,可替代多層標簽選擇器;
  2. 慎用ID選擇器,雖然它效率高,但是在頁面中是唯一的,不利于團隊協作和維護;
  3. 合理利用選擇器的繼承性;
  4. 避免css表達式。
     

減少選擇器的層級

建立在上一條選擇器的優先級之上,應盡量避免多層次的選擇器嵌套,最好不要超過3層。

.container .text .logo{ color: red; }/*改成*/.container .text-logo{ color: red; }

精簡頁面樣式文件,去掉不用的樣式

瀏覽器會進行多余的樣式匹配,影響渲染時間,另外樣式文件過大也會影響加載速度。

利用css繼承減少代碼量

利用css的可繼承屬性,父元素設置了樣式,子元素就不用再設置。

常見的可以繼承的屬性比如:color,font-size,font-family等;不可繼承的比如:position,display,float等。

屬性值為0時,不加單位

css屬性值為0時,可不加單位,減少代碼量。

.text{ width: 0px; height: 0px; }/*改成*/.text{ width: 0; height: 0; }

JavaScript

使用事件委托

給多個同類DOM元素綁定事件使用事件委托。

<ul id="container">  <li class="list">1</li>  <li class="list">2</li>  <li class="list">3</li></ul>
// 不合理的方式:給每個元素都綁定click事件$('#container .list').on('click', function() {  var text = $(this).text();  console.log(text);});// 事件委托方式:利用事件冒泡機制將事件統一委托給父元素$('#container').on('click', '.list', function() {  var text = $(this).text();  console.log(text);    });

需要注意的是,雖然使用事件委托時都可以將事件委托給document來做,但這是不合理的,一個是容易造成事件誤判,另一個是作用域鏈查找效率低。應該選擇最近的父元素作為委托對象。

使用事件委托除了性能上更優,動態創建的DOM元素也不需要再綁定事件。

DOMContentLoaded

可在DOM元素加載完畢(DOMContentLoaded)后開始處理DOM樹,不必等到所有圖片資源下載完后再處理。

// 原生javascriptdocument.addEventListener("DOMContentLoaded", function(event) {  console.log("DOM fully loaded and parsed");}, false);// jquery$(document).ready(function() {  console.log("ready!");});// $(document).ready()的簡化版$(function() {  console.log("ready!");});

預加載和懶加載

預加載

利用瀏覽器空閑時間預先加載將來可能會用到的資源,如圖片、樣式、腳本。

無條件預加載

一旦onload觸發,立即獲取將來需要用到的資源。

圖片資源預加載。(3種實現圖片預加載的方式)。

基于用戶行為的預加載

對于用戶行為可能進行的操作進行判斷,預先加載將來可能需要用到的資源。

  1. 當用戶在搜索輸入框輸入時,預先加載搜索結果頁可能用到的資源;
  2. 當用戶去操作一個Tab選項卡時,默認顯示其中一個,當要去點擊(click)其他選項時,在鼠標hover時,就可先加載將來會用到的資源;

懶加載

除頁面初始化需要的內容或組件之外,其他都可以延遲加載,如剪切圖片的js庫、不在可視范圍的圖片等等。

圖片懶加載。(判斷圖片是否在可視區域范圍內,若在,則將真實路徑賦給圖片)

避免全局查找

任何一個非局部變量在函數中被使用超過一次時,都應該將其存儲為局部變量。

function updateUI(){  var imgs = document.getElementsByTagName("img");  for (var i=0, len=imgs.length; i < len; i++){    imgs[i].title = document.title + " image " + i;  }  var msg = document.getElementById("msg");  msg.innerHTML = "Update complete.";}

在上面函數中多次使用到document全局變量,尤其在for循環中。因此將document全局變量存儲為局部變量再使用是更優的方案。

function updateUI(){  var doc = document;  var imgs = doc.getElementsByTagName("img");  for (var i=0, len=imgs.length; i < len; i++){    imgs[i].title = doc.title + " image " + i;  }  var msg = doc.getElementById("msg");  msg.innerHTML = "Update complete.";}

值得注意的一點是,在javascript代碼中,任何沒有使用var聲明的變量都會變為全局變量,不正當的使用會帶來性能問題。

避免不必要的屬性查詢

使用變量和數組要比訪問對象上的屬性更有效率,因為對象必須在原型鏈中對擁有該名稱的屬性進行搜索。

// 使用數組var values = [5, 10];var sum = values[0] + values[1];alert(sum);// 使用對象var values = { first: 5, second: 10};var sum = values.first + values.second;alert(sum);

上面代碼中,使用對象屬性來計算。一次兩次的屬性查找不會造成性能問題,但若需要多次查找,如在循環中,就會影響性能。

在獲取單個值的多重屬性查找時,如:

var query = window.location.href.substring(window.location.href.indexOf("?"));

應該減少不必要的屬性查找,將window.location.href緩存為變量。

var url = window.location.href;var query = url.substring(url.indexOf("?"));

函數節流

假設有一個搜索框,給搜索框綁定onkeyup事件,這樣每次鼠標抬起都會發送請求。而使用節流函數,能保證用戶在輸入時的指定時間內的連續多次操作只觸發一次請求。

<input type="text" id="input" value="" />
// 綁定事件document.getElementById('input').addEventListener('keyup', function() {  throttle(search);}, false);// 邏輯函數function search() {  console.log('search...');}// 節流函數function throttle(method, context) {  clearTimeout(method.tId);  method.tId = setTimeout(function() {    method.call(context);  }, 300);}

節流函數的應用場景不局限搜索框,比如頁面的滾動onscroll,拉伸窗口onresize等都應該使用節流函數提升性能。

最小化語句數

語句數量的多少也是影響操作執行速度的因素。

將多個變量聲明合并為一個變量聲明

// 使用多個var聲明var count = 5;var color = "blue";var values = [1,2,3];var now = new Date();// 改進后var count = 5,  color = "blue",  values = [1,2,3],  now = new Date();

改進的版本是只使用一個var聲明,由逗號隔開。當變量很多時,只使用一個var聲明要比單個var分別聲明快很多。

使用數組和對象字面量

使用數組和對象字面量的方式代替逐條語句賦值的方式。

var values = new Array();values[0] = 123;values[1] = 456;values[2] = 789;// 改進后var values = [123, 456, 789];
var person = new Object();person.name = "Jack";person.age = 28;person.sayName = function(){  alert(this.name);};// 改進后var person = {  name : "Jack",  age : 28,  sayName : function(){    alert(this.name);  }};

字符串優化

字符串拼接

早期瀏覽器未對加號拼接字符串方式優化。由于字符串是不可變的,就意味著要使用中間字符串來存儲結果,因此頻繁的創建和銷毀字符串是導致它效率低下的原因。

var text = "Hello";text+= " ";text+= "World!";

把字符串添加到數組中,再調用數組的join方法轉成字符串,就避免了使用加法運算符。

var arr = [],  i = 0;arr[i++] = "Hello";arr[i++] = " ";arr[i++] = "World!";var text = arr.join('');

現在的瀏覽器都對字符串加號拼接做了優化,所以在大多數情況下,加法運算符還是首選。

減少回流和重繪

在瀏覽器渲染過程中,涉及到回流和重繪,這是一個損耗性能的過程,應注意在腳本操作時減少會觸發回流和重繪的動作。

  1. 回流:元素的幾何屬性發生了變化,需要重新構建渲染樹。渲染樹發生變化的過程,就叫回流;
  2. 重繪:元素的幾何尺寸沒有變化,某個元素的CSS樣式(背景色或顏色)發生了變化。

觸發重排或重繪的操作有哪些?

  1. 調整窗口大小
  2. 修改字體
  3. 增加或者移除樣式表
  4. 內容變化,比如用戶在<input/>框中輸入文字
  5. 操作class屬性
  6. 腳本操作DOM(增加、刪除或修改DOM元素)
  7. 計算offsetWidth和offsetHeight屬性
  8. 設置style屬性的值

如何減少重排和重繪,提升網頁性能?

1、腳本操作DOM元素

  1. 將DOM元素設置為display:none,設置過程中會觸發一次回流,但之后可以隨意改動,修改完后再顯示;
  2. 將元素clone到內存中再進行操作,修改完后重新替換元素。

2、修改元素的樣式

  1. 盡量批量修改,而不是逐條修改;
  2. 預先設定好id、class,再設置元素的className。

3、為元素添加動畫時將元素CSS樣式設為position:fixed或position:absolute,元素脫離文檔流后不會引起回流。

4、在調整窗口大小、輸入框輸入、頁面滾動等場景時使用節流函數(上面已提到過)。

HTTP

瀏覽器緩存

合理設置瀏覽器緩存是網頁優化的重要手段之一。

Expires 和 Cache-Control

Expires出自HTTP1.0,Cache-Control出自HTTP1.1,同時設置兩者時,Cache-Control 會覆蓋 Expires。

  1. Expires指定的是實際過期日期而不是秒數。但Expires存在一些問題,如服務器時間不同步或不準確。所以最好使用剩余秒數而不是絕對時間來表達過期時間。
  2. Cache-Control可設置max-age值,單位秒,指定緩存過期時間。如:Cache-Control: max-age=3600。

ETag 和 Last-Modified

ETag 和 Last-Modified都由服務器返回在response headers中,其中ETag的優先級比Last-Modified高,也就是說服務器會優先判斷ETag的值。

  1. ETag是附加到文檔上的任意標簽,可能是文檔的序列號或版本號,或者是文檔內容的校驗等。當文檔改變時ETag值也會隨之改變。與ETag相關的是 If-None-Match,當瀏覽器發起請求時,會在If-None-Match字段攜帶ETag的值發給服務器;
  2. Last-Modified是文檔在服務器端最后被修改的時間。與Last-Modified相關的是If-Modified-Since,當瀏覽器發起請求時,會在If-Modified-Since字段攜帶Last-Modified的值發送給服務器。

強緩存和協商緩存

緩存的類型強緩存和協商緩存。兩者區別是,強緩存不會向服務器發請求,而協商緩存會發請求,匹配成功返回304 Not Modified,匹配不成功返回200;瀏覽器會先校驗強緩存,若強緩存未命中,再進行協商緩存校驗。

如何配置瀏覽器緩存

  1. 在web服務器的返回響應中添加Expires和Cache-Control;
  2. 在nginx或apache的配置文件中配置Expires和Cache-Control。

為什么要減少HTTP請求

在性能優化中減少http請求的措施占了很大部分,比如:使用css雪碧圖代替多張圖片的請求、避免空src的圖片、使用內聯圖片、使用外鏈的css和js、緩存等。

從輸入URL到頁面加載完成的過程包括:

  1. DNS解析
  2. TCP連接
  3. HTTP請求與響應
  4. 瀏覽器渲染頁面
  5. 關閉連接

一個完整的http請求要經歷這些過程,它是耗時耗資源的,因此減少請求數就變得很有必要。

參考資料:

《高性能網站建設vs高性能網站建設進階指南》
《Best Practices for Speeding Up Your Web Site》

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线播放亚洲激情| 国产精品九九九| 国产91对白在线播放| 日本在线观看天堂男亚洲| 韩国精品久久久999| 美女av一区二区三区| 日韩精品免费在线视频观看| 九九热精品视频国产| 91在线无精精品一区二区| 一级做a爰片久久毛片美女图片| 欧美特级www| 久久久久久中文字幕| 这里只有精品在线播放| 精品久久久视频| 日韩中文字幕欧美| 国产在线视频不卡| 日韩欧美在线视频| 国产成人精品久久二区二区91| 欧美在线免费看| 九九热这里只有精品6| 一区二区在线视频| 国模视频一区二区| 中文字幕日韩在线视频| 不卡av电影在线观看| 久久这里有精品视频| 久久亚洲精品一区| 26uuu另类亚洲欧美日本老年| 国产精品福利网| 奇米四色中文综合久久| 狠狠躁夜夜躁人人爽超碰91| 97成人在线视频| 91色琪琪电影亚洲精品久久| 亚洲精品第一页| 91欧美精品午夜性色福利在线| 日韩在线激情视频| 日韩免费av片在线观看| 中文字幕亚洲一区在线观看| 91久久在线观看| 日本不卡高字幕在线2019| 91精品国产综合久久香蕉| 久久亚洲精品一区| 狠狠色香婷婷久久亚洲精品| 亚洲自拍高清视频网站| 色综合视频一区中文字幕| 国产不卡在线观看| 国产日产久久高清欧美一区| 最新91在线视频| 日韩电影在线观看中文字幕| 久久av.com| 精品视频一区在线视频| 欧美成人精品xxx| 国产精品久久久久久久久久久久久久| 97人洗澡人人免费公开视频碰碰碰| 日韩精品极品在线观看播放免费视频| 欧美成人黄色小视频| 黄色一区二区在线观看| 欧美日韩免费一区| 日韩亚洲综合在线| 91国产一区在线| 国产精品极品美女在线观看免费| 成人免费看吃奶视频网站| 精品亚洲一区二区三区| 日韩av最新在线观看| 精品免费在线视频| 日韩av在线一区| 精品欧美激情精品一区| 欧美视频专区一二在线观看| 性欧美长视频免费观看不卡| 97视频在线观看免费高清完整版在线观看| 久久天天躁狠狠躁夜夜躁| 91久久综合亚洲鲁鲁五月天| 久久久www成人免费精品| 欧洲成人午夜免费大片| 亚洲成人在线视频播放| 亚洲精品电影网站| 国产精品揄拍一区二区| 亚洲精品美女在线观看播放| 亚洲电影免费观看高清| 亚洲国产欧美日韩精品| 亚洲欧美日韩一区二区三区在线| 久久久综合免费视频| 成人做爰www免费看视频网站| 日韩欧美在线一区| 91精品国产777在线观看| 精品久久国产精品| 91av在线国产| 国产精品18久久久久久麻辣| 日本精品va在线观看| 国产精品视频免费在线观看| 亚洲激情中文字幕| 最新69国产成人精品视频免费| 成人女保姆的销魂服务| 亚洲乱码国产乱码精品精| 欧美野外wwwxxx| 青青草成人在线| 97视频在线免费观看| 亚洲国产精品免费| 久久久久久国产精品三级玉女聊斋| 国产成人精品久久二区二区91| 在线精品国产欧美| 欧美日韩在线免费观看| 国产精品流白浆视频| 亚洲大胆美女视频| 中文日韩在线观看| 欧美在线激情视频| 91精品免费久久久久久久久| 亚洲综合av影视| 国产91久久婷婷一区二区| 欧美成人精品在线播放| 国产suv精品一区二区| 国产成人久久久| 欧美亚洲视频在线观看| 91精品国产91| 国产精品成久久久久三级| 日韩大片免费观看视频播放| 亚洲精品国产美女| 在线亚洲男人天堂| 日韩福利伦理影院免费| 国产日产久久高清欧美一区| 国产91在线播放九色快色| 国产精品偷伦视频免费观看国产| 国产精品一香蕉国产线看观看| 国产一区香蕉久久| 最近2019中文字幕一页二页| 国产成人在线一区二区| 91亚洲午夜在线| 91精品国产高清| 国产精品wwwwww| 日韩成人av一区| 91精品国产综合久久久久久蜜臀| 在线观看国产欧美| 在线国产精品播放| 欧洲亚洲女同hd| 精品亚洲一区二区三区四区五区| 欧美黑人国产人伦爽爽爽| 538国产精品视频一区二区| 久久久久久美女| 亚洲欧美在线第一页| 亚洲性av网站| 亚洲精品视频中文字幕| 日韩欧美成人免费视频| 亚洲欧美制服第一页| 在线视频亚洲欧美| 91久久久久久国产精品| 欧美日韩午夜视频在线观看| 国产成人精品久久二区二区| 欧美性videos高清精品| 亚洲天堂网站在线观看视频| 日韩中文综合网| 国产亚洲一级高清| 亚洲精品永久免费| 亚洲人成网站在线播| 亚洲人成电影在线观看天堂色| 伦伦影院午夜日韩欧美限制| 成人黄色av播放免费| 欧美在线国产精品| 久久久久国产视频| 日韩av影视综合网| 另类专区欧美制服同性| 国产精品女人网站| 国产精品美女www| 久久久久亚洲精品成人网小说| 福利一区福利二区微拍刺激| 亚洲国产91色在线|