當前位置:首頁 » 網頁前端 » 列舉web性能優化
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

列舉web性能優化

發布時間: 2023-04-02 21:46:15

Ⅰ 我們還能在哪些方面進行webpack性能優化

Bigo前端組計算平台前端組基於amis框架,參考之前的文章:https%3A%2F%2Fgithub.com%2Fbigo-frontend%2Fblog%2Fissues%2F17 ;有很好的研發效率提升,但是構建速度卻很慢,亟需進行優化。優化之後達到了將webpack構建速度提升80%左右的一個成績,以下是優化前後的對比

團隊做了3件事情來達到這凱臘樣的一個效果:

基於這次優化做了功課,看了一些資料,看看還有哪些可以優化的地方。

官網的定義:

webpack is a static mole bundler for modern JavaScript applications. When webpack processes your application, it internally builds a dependency graph which maps every mole your project needs and generates one or more bundles.

也就是說 webpack 是一個用於現代 JavaScript 應用程序的靜態模塊打包工具,從入口出發,找到入口文件所有的依賴,生成瀏覽器可以用的bundle文件。webpack的出現使得前端的工程化更加地豐富。從webpack在2013的第一次release(v1.0.0-beta2)開始,至今已經有8、9年的 歷史 了,是一個相當成熟的工具,其生態也比較完善,所以前端圈用webpack也是鉛差非常地廣泛。

盡量用較新的版本,新版本相較之前都會有一定的性能提升和優化,包括Node和Webpack。要注意的是 Node.js v8.9.10 - v9.11.1 ES6的 Set 和 Map 會有性能回退問題,現在LTS的node已經是 v14.16.0 ,所以假設 Node 版本已經較新,並且用的是 WP4 ( webpack4 )。目前還不建議對求穩的或者已經很龐大的項目立即升級到 WP5 ,其一是因為webpack生態裡面並不一定所有的插件都能跟的上最新的版本,可能會出現兼容性的問題;其二由於webpack5還並未被廣泛地應用,到新版本的穩定和成熟還是需要一定的時間,為避免不必要的bug,建議暫時使用 webpack4 。

對於開發者來說,每次在build的時候不希望花費較長的時間,優化構建速度能夠減少開發成本;對於用戶而言,優化bundle文件的數量和大小能減少用戶的流失率,提升用戶體驗。所以webpack的性能優化是一個非常關鍵的技術手段。

webpack構建大概可分為 loader解析 -> 依賴搜索 -> 打包 等三個階段,就這三個階段我們分別展開闡述如何去優化。

loader解析:

依賴搜索:

打包: Smaller = Faster

當然需要在 index.html 裡面引入cdn依賴,否則在runtime無法找到相應的模塊: 。

開發環境* *:** 同樣地,生產環境有些配置也不適用於開發環境,比如 TerserPlugin 就不需要,因為在開發環境中壓縮代碼是沒有意義的;devTools的最佳實踐是 eval-cheap-mole-source-map ,我現在的項目比較輕量,但是也能看出對比:

雖然是不到1000ms的差距,蒼蠅肉也是肉不是?而且將來代碼量越來越龐大的時候,差距就更明顯了。

當然還有其他的可以優化的方法,比如使用ES mole,能更好地利用webpack的tree shaking功能;Dll,為更改不頻繁的代碼生成單獨的編譯結果,但卻是一個配置比較復雜的過程;還有對圖片的壓縮等等。以上是對於webpack4性能優化基本的配置,期待webpack5成熟穩定的那槐孫皮一天。

Ⅱ 網站性能優化有哪些

一、提高伺服器並發處理能力
我們總是希望一台伺服器在單位時間內能處理的請求越多越好,這也成了web伺服器的能力高低的關鍵所在。伺服器之所以可以同時處理多個請求,在於操作系統通過多執行流體系設計,使得多個任務可以輪流使用系統資源,這些資源包括CPU、內存以及I/O等。這就需要選擇一個合適的並發策略來合理利用這些資源,從而提高伺服器的並發處理能力。這些並發策略更多的應用在apache、nginx、lighttpd等底層web server軟體中。
二、Web組件分離
這里所說的web組件是指web伺服器提供的所有基於URL訪問的資源,包括動態內容,靜態網頁,圖片,樣式表,腳本,視頻等等。這些資源在文件大小,文件數量,內容更新頻率,預計並發用戶數,是否需要腳本解釋器等方面有著很大的差異,對不同特性資源採用能充分發揮其潛力的優化策略,能極大的提高web站點的性能。例如:將圖片部署在獨立的伺服器上並為其分配獨立的新域名,對靜態網頁使用epoll模型可以在大並發數情況下吞吐率保持穩定。
三、資料庫性能優化和擴展。
Web伺服器軟體在資料庫方面做的優化主要是減少訪問資料庫的次數,具體做法就是使用各種緩存方法。也可以從資料庫本身入手提高其查詢性能,這涉及到資料庫性能優化方面的知識本文不作討論。另外也可以通過主從復制,讀寫分離,使用反向代理,寫操作分離等方式來擴展資料庫規模,提升資料庫服務能力。
四、Web負載均衡及相關技術
負載均衡是web站點規模水平擴展的一種手段,實現負載均衡的方法有好幾種包括基於HTTP重定向的負載均衡,DNS負載均衡,反向代理負載均衡,四層負載均衡等等。
對這些負載均衡方法做簡單的介紹:基於HTTP重定向的負載均衡利用了HTTP重定向的請求轉移和自動跳轉功能來實現負載均衡,我們熟悉的鏡像下載就使用這種負載均衡。DNS負載均衡是指在一個DNS伺服器中為同一個主機名配置多個IP地址,在應答DNS查詢時返回不同的解析結果將客戶端的訪問引到不同的機器上,使得不同的客戶端訪問不同的伺服器,從而達到負載均衡的目的。反向代理負載均衡也叫七層負載均衡,這是因為反向代理伺服器工作在TCP七層結構的第七層(應用層),它通過檢查流經的HTTP報頭,根據報頭內的信息來執行負載均衡任務。四層負載均衡是基於NAT技術的負載均衡,它將一個Internet上合法注冊的IP地址映射為多個內部伺服器的IP地址,對每次TCP連接請求動態使用其中一個內部IP地址,達到負載均衡的目的。此外,還有工作在數據鏈路層(第二層)的直接路由方式下的負載均衡,它通過修改數據包目標MAC地址來實現。以及,基於IP隧道的負載均衡,在這種方式下可以將實際伺服器根據需要部署在不同的地域,並根據就近訪問的原則來轉移請求,CDN服務便是基於IP隧道技術來實現的。
Web負載均衡在擴展web伺服器規模的同時也給web站點性能優化提供了一個更大更復雜也更靈活自由的平台,基於該平台性能優化的策略包括共享文件系統,內容分發與同步,分布式文件系統,分布式計算,分布式緩存等等。
五、web緩存技術
web緩存技術被認為是減輕伺服器負載、降低網路擁塞、增強萬維網可擴展性的有效途徑,其基本思想是利用客戶訪問的時間局部性(Temporal Locality)原理,將客戶訪問過的內容在Cache中存放一個副本,當該內容下次被訪問時,不必連接到駐留網站或重新計算生成,而是由Cache中保留的副本提供。Web緩存可以帶來如下的好處:
(1) 減少網路流量,從而減輕網路擁塞;這是因為緩存避免了一部分HTTP請求。
(2) 降低客戶訪問延遲,其主要原因有:①已緩存的內容,客戶可以緩存獲取而不是從伺服器獲取或重新計算生成,從而減小了傳輸延遲縮短了響應時間;②沒有被緩存的內容由於網路擁塞及伺服器負載的減輕而可以較快地被客戶獲取;
(3) 由於客戶的部分或者全部請求內容可以從通過緩存獲取,從而減輕了遠程伺服器負載。
(4) 如果由於伺服器故障或網路故障造成伺服器無法響應客戶請求,客戶可以從緩存中獲取緩存的內容副本,使得web站點服務的魯棒性(Robustness)得到了加強。
可以看出web緩存能給web站點帶可觀的性能提升。其實在用戶發出請求到一幅完整的網頁呈現在用戶面前這一過程中緩存無處不在,下面是web性能優化時常用的緩存技術,你會發現緩存被廣泛應用在各個環節。
瀏覽器緩存:瀏覽器一般會在用戶文件系統中創建一個目錄,用於存放緩存文件,並給每個緩存文件打上必要的標記,比如過期時間等。這些標記主要用於瀏覽器和伺服器之間的緩存協商。
Web伺服器緩存:一個URL在一段較長時間內對應一個唯一的響應內容,比如靜態內容或者更新不太頻繁的動態內容,web伺服器可將響應內容緩存起來,下次web伺服器便可以在收到請求後立即拿出事先緩存好的響應內容並返回給瀏覽器。
代理伺服器緩存:暴露在互聯網中與後端的web伺服器通過內部網路相連的前端伺服器稱為反向代理伺服器,建立在反向代理伺服器上的緩存稱為反向代理緩存。暴露在互聯網中與後端的web客戶端通過內部網路相連的前端伺服器稱為正向代理伺服器,建立在正向代理伺服器上的緩存稱為正向代理緩存。代理伺服器緩存位於客戶端和web伺服器之間,可以將它看做二者之間的一個中繼站。它的存在可以改善客戶端的訪問速度、提升web server的服務能力、安全性等等。
總共分析總結了五種技術,主要希望能夠對web server性能優化這塊提供一個整體的認識。後續會專門就web緩存技術發表一些自己的看法。

Ⅲ java web性能優化有哪些

最常見的優化方案:代碼優化最簡單的就是提高代碼的重用性,不管是前端代碼還是後端代碼,學會把公共性的代碼抽取出來,事物的控制,特別是當對資料庫進行增加刪除修改的時候,保持數據的一致性,資料庫的話加索引,視圖等等,sql語句關聯的時候注意盡量用高效的sql語句。一般的優化差不多就是這樣,當然,更多的要更難了。

Ⅳ 高性能Web站點的優化招數

1.這里的吞吐率特指Web伺服器單位時間內處理的請求。
2.壓力測試的前提:1>並發用戶數 2>總請求數 3>請求資源描述
3.用戶平均請求等待時間主要用戶衡量伺服器在一定並發用戶數的情況下,對於單個用戶的伺服器質量;而伺服器平均請求處理時間與前者相比,則用於衡量伺服器的整體服務質量,它其實就是吞吐率的倒數。
4.對http header中標記為Connection: Keep-Alive的請求,開啟web伺服器的長連接支持。減少系統調用accept的次數,即減少建立連接的開銷。
5.老調重彈,進程,內核級線程和用戶級線程在不同情況下的優劣。IO模型,mmap(內村映射),直接IO,例如sendfile syscall以及非同步IO等。多路IO復用(select, poll,epoll and kqueue etc)
6.伺服器並發策略
1> 一個進程處理一個連接,非阻塞IO。穩定性強,但context switch的開銷隨http request遞增而快速增長。
2> 一個內核級線程處理一個連接,非阻塞IO,多進程多線程混合方式。Context switch的問題依然存在。理論上可以支持更多的並發連接。
3>一個進程處理多個連接,非阻塞IO。(氏派epoll, kqueue)lighttpd, nginx。支持並發性能強勁。 上述情況的適用范圍不能一刀切,而且這里都是指單機並發,需根據實際情況(實際並發數)來選擇。通常,在並發用戶數較大的情況下,Web伺服器使用什麼樣的並發策略,是影響最大並發數的關鍵。 在實際應用中,動態內容緩存可能是使用得最多的技術,但是並不見得所有的動態內容都適合使用網頁緩存,緩存帶來的性能提升恰恰與有些動態數據實時交互的需求形成矛盾,這就是一個權衡。
1. 緩存動態生成的html代碼。
2. 把動態內容靜態化,直接緩存整個html文件。這樣就可以直接訪問緩存。這時的更新策略:
1>在數據更新時重新生成靜態化內容 2>定時重新生成靜態化內容
3. 使用SSI(server side include)進行局部靜態化。但web server的SSI功能會對靜態文件的吞吐率有負面影響。 減少http請求,充分利用瀏覽器的緩存。而webapp通過http協議(更具體位置就是http header)來與瀏覽器協商,那些東東瀏覽器可以使用其緩存即可。
1. Last-Modified/If-Modified-Since
2. ETag/If-None-Match
3.Expires + Cache-Control: max-age=<seconds>
1和2需要瀏覽器和webserver交互後,有伺服器端通知瀏覽器是否使鏈擾用瀏覽器緩存,而3則是在過期前直接使用瀏覽器緩存,這樣就直接kill掉了http request。同時還需注意,在使用SSI的內容中,由於整個殲喚賀頁面是伺服器動態生成的,所以Last-Modified標記在不同的Web伺服器中有不同的生成方法。 Web伺服器隱藏在代理伺服器之後。這種代理機制稱為反向代理(Reverse proxy),同時,實現這種機制的伺服器便成為反向代理伺服器。隱藏在反向代理伺服器之後的Web伺服器,我們習慣稱它為後端伺服器(Back-end server),當然,反向代理伺服器就被稱為前端伺服器(Front-end server)。
引入反向代理伺服器的目的之一就是基於緩存的加速。我們可以將內容緩存在反向代理伺服器上,所有緩存機制的實現仍然採用HTTP/1.1協議。
緩存命中率和後端吞吐率的理想技術模型
緩存丟失率=(活躍內容數/(實際吞吐率×平均緩存有效期))×100%
緩存命中率= 1-緩存丟失率 後端吞吐率= 活躍內容數/平均緩存有效期
緩存命中率= (1-(後端吞吐率/實際吞吐率))×100%
後端吞吐率 = (1 – 緩存命中率)×實際吞吐率
結論: 1. 活躍內容數和平均緩存有效期一定的情況下,緩存命中率與實際吞吐率成正比。
2. 實際吞吐率和平均緩存有效期一定的情況下,緩存命中率與活躍內容數成反比。
3. 活躍內容數和實際吞吐率一定的情況下,緩存命中率與平均緩存有效期成正比。
4. 活躍內容數一定的情況下,後端吞吐率與平均緩存有效期成反比。
5. 平均緩存有效期一定的情況下,後端吞吐率與活躍內容數成正比。
6. 緩存命中率的變化不一定會影響後端吞吐率。
7. 後端吞吐率的變化不一定會影響緩存命中率。
ESI – Edge Side Include類似與SSI,但不在webserver端組裝內容,而是在http代理伺服器上組裝內容,包括反向代理。在處理只有局部更新動態內容時AJAX是更好的原則,它不依賴與底層webserver的實現,但ESI的優勢在於再有多個後端伺服器的情況下,變可以避免多個後端的重復組裝,減少總工作量。 從以下幾個方面來看Web組件的差異:
1. 文件大小
2. 文件數量
3. 內容更新頻率
4. 預計並發用戶數
5. 是否需要腳本解釋器
6. 是否涉及大量CPU計算
7. 是否訪問資料庫
8. 訪問資料庫的主要操作是讀還是寫
9. 是否包含RPC
對每種類型的Web組件採取不同的優化方式(一種或多種):
1. 是否使用epoll模型
2. 是否使用sendfile() syscall
3. 是否使用非同步IO
4. 是否支持HTTP持久連接(http keep-alive)
5. 是否需要opcode緩存
6. 是否使用動態內容緩存以及有效期為多長
7. 是否使用Web伺服器緩存以及有效期為多長
8. 是否使用瀏覽器緩存以及有效期為多長
9. 是否使用反向代理緩存以及有效期為多長
10. 是否使用負載均衡策略
按照Web組件的不同類型將其放在不同的二級域名/機器/不同類型的WebServer
同時,還需考慮到不同的瀏覽器對同一個域名下的訪問有多大並發數限制,而使用多個域名。
IE6,7 2(http/1.1)
IE8 6(http/1.1)
Firefox2 2(http/1.1)
Firefox3 6(http/1.1)
發揮各自的潛力
對於動態內容:開啟opcode緩存,使用足夠快的CPU,足夠大的內存,多進程以及與資料庫保持高速連接
對於靜態內容:支持epoll,非阻塞IO,非同步IO,使用sendfile,單進程(對於IO密集型任務,多進程無法發揮優勢),使用高速磁碟,使用RAID
對於image, css and script分配合理設置其過期時間(expires) 1.合理的執行計劃,包括合理使用索引
2.使用慢查詢分析工具,找出執行很慢的sql並優化之。
3.合理的資料庫緩存,索引緩存,數據緩存等
4.更具實際需求選擇合理的資料庫引擎或資料庫
5.反範式化設計,對查詢帶來優化,但增加寫和更新的工作量。
6.放棄關系型資料庫,針對實際情況,讀寫要求極高時 資料庫擴展: 讀寫分離,按業務實施合理的垂直分區,對熱點表進行水平分區。 DNS負載均衡
需要DNS服務商提供該功能,且DNS記錄存在緩存,無法及時修改,帶來更新延遲。
反向代理負載均衡
HTTP重定向和DNS解析在請求的調度上體現在「轉發」上,而其則體現在「轉移」。
任何對於實際伺服器的http請求都必須經過調度器;調度器必須等待實際伺服器的http響應,並將它反饋給用戶。
由於調度策略在自己手中,就可以使用諸如按照權重進行調度等策略。也可以對個應用伺服器進行健康監控,對無效伺服器不在把請求轉移給它;還可以實現sticky sessions。
作為負載均衡調度器的反向代理伺服器在擴展上的制約,反向代理伺服器的處理能力制約了整個集群的處理能力,其次,容易出現單點故障
IP負載均衡
Netfilter+ IPVS
用iptables修改Netfilter規則,進行基於IP的tcp包轉發,也即調度。 IPVS(IP Virtual Server)也成為LVS(Linux Virtual Server)。
兩者結合的具體策略有 1. LVS + NAT
2. LVS + DR

Ⅳ web後端性能調優主要優化哪些東西

盡量簡潔的頁面設計,最大程度減少圖片的使用,通過放棄一些不必要的頁面特效來減少javascript的使用。
- 使用一些優化技巧,比如利用圖片的背景位移減少圖片的個數;image map技術;使用Inline images將css圖片捆綁到網頁中。
- 盡量合並js和css文件,減少獨立文件個數。

Ⅵ 如何優化Web網站性能

這個問題不難!是優化網站性能,不是提高用戶體驗,那麼能增加資金預算的話,硬體方面提高配置,比如用更快的CPU,加大內存,使用高速硬碟,增加帶寬等等。
軟體方面,對程序代碼和資料庫進行優化,網站頁面生成靜態頁,減少對資料庫和伺服器的壓力,使用存儲過程等等。

Ⅶ web前端面試經常問到的面試題有哪些

Web前端經常被問到的面試題及答案

一、HTML+CSS

1.對WEB標准以及W3C的理解與認識

標簽閉合、標簽小寫、不亂嵌套、提高搜索機器人搜索幾率、使用外
鏈css和js腳本、結構行為表現的分離、文件下載與頁面速度更快、內容能被更多的用戶所訪問、內容能被更廣泛的設備所訪問、更少的代碼和組件,容易維
護、改版方便,不需要變動頁面內容、提供列印版本而不需要復制內容、提高網站易用性;

2.xhtml和html有什麼區別

HTML是一種基本的WEB網頁設計語言,XHTML是一個基於XML的置標語言

最主要的不同:

XHTML 元素必須被正確地嵌套。

XHTML 元素必須被關閉。

標簽名必須用小寫字母。

XHTML 文檔必須擁有根元素。

3.Doctype? 嚴格模式與混雜模式-如何觸發這兩種模式,區分它們有何意義?

用於聲明文檔使用那種規范(html/Xhtml)一般為 嚴格 過度 基於框架的html文檔

加入XMl聲明可觸發,解析方式更改為IE5.5 擁有IE5.5的bug

4.行內元素有哪些?塊級元素有哪些?CSS的盒模型?

塊級元素:div p h1 h2 h3 h4 form ul

行內元素: a b br i span input select

Css盒模型:內容,border ,margin,padding

5.CSS引入的方式有哪些? link和@import的區別是?

內聯 內嵌 外鏈 導入

區別 :同時載入

前者無兼容性,後者CSS2.1以下瀏覽器不支持

Link 支持使用javascript改變樣式,後者不可

6.CSS選擇符有哪些?哪些屬性可以繼承?優先順序演算法如何計算?內聯和important哪個優先順序高?

標簽選擇符 類選擇符 id選擇符

繼承不如指定 Id>class>標簽選擇

後者優先順序高

7.前端頁面有哪三層構成,分別是什麼?作用是什麼?

結構層 Html 表示層 CSS 行為層 js

8.css的基本語句構成是?

選擇器{屬性1:值1;屬性2:值2;……}

9.你做的頁面在哪些流覽器測試過?這些瀏覽器的內核分別是什麼?

Ie(Ie內核) 火狐(Gecko) 谷歌(webkit) opear(Presto)

二、Javascript

1.javascript的typeof返回哪些數據類型

Object number function boolean underfind

2.例舉3種強制類型轉換和2種隱式類型轉換?

強制(parseInt,parseFloat,number)

隱式(== – ===)

3.split() join() 的區別

前者是切割成數組的形式,後者是將數組轉換成字元串

4.數組方法pop() push() unshift() shift()

Push()尾部添加 pop()尾部刪除

Unshift()頭部添加 shift()頭部刪除

5.事件綁定和普通事件有什麼區別

6.IE和DOM事件流的區別

1.執行順序不一樣、

2.參數不一樣

3.事件加不加on

4.this指向問題

7.IE和標准下有哪些兼容性的寫法

Var ev = ev || window.event

document.documentElement.clientWidth || document.body.clientWidth

Var target = ev.srcElement||ev.target

8.ajax請求的時候get 和post方式的區別

一個在url後面 一個放在虛擬載體裡面

有大小限制

安全問題

應用不同 一個是論壇等只需要請求的,一個是類似修改密碼的

9.call和apply的區別

Object.call(this,obj1,obj2,obj3)

Object.apply(this,arguments)

10.ajax請求時,如何解釋json數據

使用eval parse 鑒於安全性考慮 使用parse更靠譜

11.b繼承a的方法

12.寫一個獲取非行間樣式的函數

function getStyle(obj,attr,value)

{

if(!value)

{

if(obj.currentStyle)

{

return obj.currentStyle(attr)

}

else

{

obj.getComputedStyle(attr,false)

}

}

else

{

obj.style[attr]=value

}

}

Ⅷ Web前端性能優化的實用技巧匯總

今天小編要跟大家分享的文章是關於Web前端性能優化的實用技巧匯總。javascript在瀏覽器中運行的性能,可以認為是開發者所面臨的最嚴重的可用性問題。這個問題因為javascript的阻塞性而變得復雜,事實上,多數瀏覽器使用單一進程來處理用戶界面和js腳本執行,所以同一時刻只能做一件事。js執行過程耗時越久,瀏覽器等待響應的時間越長。

一.提高載入性能


1.IE8,FF,3.5,Safari4和Chrome都允許並行下載js文件,當script下載資源時不會阻塞其他script的下載。但是js下載仍然會阻塞其他資源的下載,如圖片。盡管腳本下載不會互相影響,但頁面仍然必須等待所有塌塵岩js代碼下載並執行完才能繼續。因兄雹此仍然存在腳本阻塞問題.推薦將所有js文件放在body標簽底部以減少對整個頁面的影響。


2.減少頁面外鏈腳本文件的數量將會提高頁面性能:


http請求會帶來額外的開銷,因此下載單個300k的文件將比下載10個30k的文件效率更高。


3.動態腳本載入技術:


無論何時啟動下載,文件的下載和執行都不會阻塞頁面其他進程。


functionlaodScript(url,callback){


varscript=document.createElement('script');_


_cript.type='text/javascript'__f(script.readyState){//ie


____cript.onreadystatechange=function(){_____


if(script.readyState=='loaded'||script.readyState=='complete'){_______


_cript.onreadystatechange=null;_______


callback()_____


____


__


}else{//其他瀏覽器___


script.onload=function(){_____


_allback()


___}_


}_


script.src=url;_


document.getElementsByTagName('head')[0].appendChild(script);


}
//使用


loadScript('./a.js',function(){_


loadScript('./b.js',function(){___


loadScript('./c.js',function(){_____


console.log('載入完成')___


})_


})


})


4.無阻塞載入類庫——LABjs,使用方法如下:





//鏈式調用時文件逐個下載,.wait()用來指定文件下載並執行完畢後所調用的函數


$LAB.script('./a.js')_


.script('./b.js')_


.wait(function(){__


_pp.init();


})
//為了保證執行順序,可以這么做,此時a必定在b前執行


$LAB.script('./a.js').wait()_


.script('./b.js')_


.wait(function(){___


_pp.init();


})


二.數據存取與JS性能


1.在js中,數據存儲的位置會對代碼整體性能產生重大影響。數據存儲共有4種方式:字面量,變數,數組項,對象成員。他們有著各自的性能特點。


2.訪問字面量和局部變數的速度最快,相反,訪問數組和對象相對較慢


3.由於局部變數存在於作用域鏈的起始位置,因此訪問局部變數的比訪問跨域作用變數更快


4.嵌套的對象成員會明顯影響性能,應盡量避免


5.屬性和方法在原型鏈位置越深,訪問他的速度越慢


6.通常我們可以把需要多次使用的對象成員,數組元素,跨域變數保存在局部變數中來改善js性能


三.DOM編程


1.訪問DOM會影響瀏覽器性能,修改DOM則更耗費性能,因為他會導致瀏覽器重新計算頁面的幾何變化。<通常的做法是減少訪問DOM的次數,把運算盡量留在JS這一端。


注團御:如過在一個對性能要求比較高的操作中更新一段HTML,推薦使用innerHTML,因為它在絕大多數瀏覽器中運行的都很快。但對於大多數日常操作而言,並沒有太大區別,所以你更應該根據可讀性,穩定性,團隊習慣,代碼風格來綜合決定使用innerHTML還是createElement()


2.HTML集合優化


HTML集合包含了DOM節點引用的類數組對象,一直與文檔保持連接,每次你需要最新的信息時,都會重復執行查詢操作,哪怕只是獲取集合里元素的個數。


①_優化一——集合轉數組collToArr


functioncollToArr(coll){_


for(vari=0,a=[],len=coll.length;i

a._ush(coll[i]);


__


returna


}


②緩存集合length


③訪問集合元素時使用局部變數(即將重復的集合訪問緩存到局部變數中,用局部變數來操作)


3.遍歷DOM


①使用只返回元素節點的API遍歷DOM,因為這些API的執行效率比自己實現的效率更高:


td{border:1pxsolid#ccc;padding:5px;margin:auto;}
td>p{text-align:left;}
td>pspan{text-align:center;display:block;}


屬性名
被替代屬性


children
childNodes


childElementCount
childNodes.length


firstElementChild
firstChild


lastElementChild
lastChild


nextElementSibling
nextSibling


previousElementSibling
previousSibling


_諮≡衿_PI——querySelectorAll()


querySelectorAll()方法使用css選擇器作為參數並返回一個NodeList——包含著匹配節點的類數組對象,該方法不會返回HTML集合,因此返回的節點不會對應實時文檔結構,著也避免了HTML集合引起的性能問題。


let_rr=_ocument.querySelectorAll('div.warning,_iv.notice>_')


4.重繪和重排


瀏覽器在下載完頁面的所有組件——html,js,css,圖片等之後,會解析並生成兩個內部數據結構——_OM樹,渲染樹.一旦DOM樹和渲染樹構建完成,瀏覽器就開始繪制頁面元素(paint).


①重排發生的條件:


添加或刪除可見的DOM元素位置變化元素尺寸改變內容改變頁面渲染器初始化瀏覽器窗口尺寸變化出現滾動條時會觸發整個頁面的重排_嘏瘧囟ㄖ鞀


5.渲染樹變化的排列和刷新


大多數瀏覽器通過隊列化修改並批量執行來優化重排過程,然而獲取布局信息的操作會導致隊列強制刷新。


offsetTop,offsetWidth...


scrollTop,scrollHeight...


clientTop,clientHeight...


getComputedStyle()


一些優化建議:將設置樣式的操作和獲取樣式的操作分開:


//設置樣式


body.style.color='red'


body.style.fontSize=པpx'


//讀取樣式


letcolor=body.style.color


let_ontSize=_ody.style.fontSize


另外,獲取計算屬性的兼容寫法:


functiongetComputedStyle(el){_


varcomputed=(document.body.currentStyle?el.currentStyle:document.defaultView.getComputedStyle(el,'');_


returncomputed


}


6.最小化重繪和重排


①.批量改變樣式


/*使用cssText
*/el.style.cssText='border-left:1px;_order-right:2px;_adding:20px'


②.批量修改dom的優化方案——使元素脫離文檔流-對其應用多重改變-把元素帶迴文檔


functionappendDataToEl(option){


vartargetEl=option.target||document.body,___


createEl,___


data=option.data||[];_//讓容器脫離文檔流,減少重繪重排_


vartargetEl_display=targetEl.style.display;_


targetEl.style.display='none'
_


//*****創建文檔片段來優化Dom操作****_


varfragment=document.createDocumentFragment();_//給元素填充數據_


for(vari=0,max=data.length;i

createEl=
document.createElement(option.createEl);___


for(varitemindata[i]){_____


if(item.toString()==='text'){_______


createEl.appendChild(document.createTextNode(data[i][item]));________ontinue;___________


_f(item.toString()==='html'){_______


createEl.innerHTML=item,data[i][item];_______


continue;_____


}_____


_reateEl.setAttribute(item,data[i][item]);_______


//****將填充好的node插入文檔片段****___


fragment.appendChild(createEl);___


//****將文檔片段統一插入目標容器****_


targetEl.appendChild(fragment);_


//顯示容器,完成數據填充_


targetEl.style.display=
targetEl_display;


}
//使用


varwrap=document.querySelectorAll('.wrap')[0];


vardata=[_


_name:'xujaing',text:'選景',title:'xuanfij'},_


{name:'xujaing',text:'選景',title:'xuanfij'},_


{name:'xujaing',text:'選景',title:'xuanfij'}];


appendDataToEl({_


target:wrap,_


createEl:'div',


_ata:data


});


上面的優化方法使用了文檔片段:_蔽頤前鹽牡燈尾迦氳澆詰闃惺保導噬媳惶砑擁鬧皇歉悶蔚淖詠詰悖皇瞧偽舊懟?梢允溝_om操作更有效率。


②.緩存布局信息


//緩存布局信息


letcurrent=el.offsetLeft;


current++;


el.style.left=current+'px'


if(current>300){_


stop();


}


④.慎用:hover


如果有大量元素使用:hover,那麼會降低相應速度,CPU升高


⑤.使用事件委託(通過事件冒泡實現)來減少事件處理器的數量,減少內存和處理時間


functiondelegation(e,selector,callback){_


e=e||window.event;_


vartarget=e.target||e.srcElement;
_if(target.nodeName!==selector||
target.className!==selector||target.id!==selector){___


return;


_}_


if(typeofe.preventDefault==='function'){__


_.preventDefault();___


e.stopPropagation();


}else{___


e.returnValue=false;


e.cancelBubble=true;_


}
__allback()}


四.演算法和流程式控制制


1.循環中減少屬性查找並反轉(可以提升50%-60%的性能)


//for循環


for(vari=item.length;i--){_


process(item[i]);


}


//while循環


varj=item.length;


while(j--){_


process(item[i]);


}


2.使用Duff裝置來優化循環(該方法在後面的文章中會詳細介紹)


3.基於函數的迭代(比基於循環的迭代慢)


items.forEach(function(value,index,array){__rocess(value);})


4.通常情況下switch總比if-else快,但是不是最佳方案


五.字元串和正則表達式


1.除了IE外,其他瀏覽器會嘗試為表達式左側的字元串分配更多的內存,然後簡單的將第二個字元串拷貝到他的末尾,如果在一個循環中,基礎字元串位於最左側,就可以避免重復拷貝一個逐漸變大的基礎字元串。2.使用[sS]來匹配任意字元串3.去除尾部空白的常用做法:


if(!String.prototype.trim){_


String.prototype.trim=function(){___


returnthis.replace(/^s+/,'').replace(/ss*$/,'')_


}


}


六.快速響應的用戶界面


1.瀏覽器的UI線程:用於執行javascript和更新用戶界面的進程。


2.在windows系統中定時器解析度為15毫秒,因此設置小於15毫秒將會使IE鎖定,延時的最小值建議為25ms.


3.用延時數組分割耗時任務:


functionmultistep(steps,args,callback){_


vartasks=steps.concat();
__etTimeout(function(){___


vartask=tasks.shift();___


task.apply(null,args||[]);_//調用Apply參數必須是數組
___


if(tasks.length>0){_____


setTimeout(arguments.callee,25);


___else{_____


_allback();___


__


},25);


}


4.記錄代碼運行時間批處理任務:


functiontimeProcessArray(items,process,callback){_


vartodo=item.concat();__etTimeout(function(){___


varstart=+newDate();
__o{_____


_rocess(todo.shift());___


}while(todo.length>0&&(+newDate()-start<50));
____f(todo.length>0){_____


_etTimeout(arguments.callee,25);


___else{____


_allback(items);_


}_


_,25)


}


5.使用WebWorker:它引入了一個介面,能使代碼運行且不佔用瀏覽器UI線程的時間。一個Worker由如下部分組成:


①一個navigator對象,包括app

Ⅸ Web前端新手要掌握的性能優化

今天小編要跟大家分享的文章是關於Web前端新手要掌握的性能優化知識。本文將分享一些前端性能優化的常用手段,包括減少請求次數、減小資源大小、各種緩存、預處理和長連接機制,以及代碼方面的性能優化等方面。下面來和小編一起看一看吧!

base64:尤其是在移動端,小圖標可以base64(webpack),大圖片慎用(如果載入速度過於慢的,而且很重要的圖片,可以用base64)


1、減少HTTP的請求次數和傳輸報文的大小


「CSSSprite(雪碧圖、圖片精靈)技術」


使用字體圖標(IconFont)或者SVG等矢量圖


+減少HTTP請求次數或者減少請求內容的大小


+渲染更快:因為它們是基於代碼渲染的,而對於點陣圖(png/jpg/gif)是需要先把圖片編碼在渲染


+不容易是幀變形


+也可以使用webp格式圖片,這種格式要小一些(但是需要伺服器端支持這種格式的請求處理)


「圖片懶載入(延遲載入)技術」


+第一次載入頁面的時候不去請求真實的圖片,提高第一次渲染頁面的速度,請求圖片的額外消耗盡可能不要處理


+當頁面載入完,把出現在用戶視野區域中的圖片做真實載入,沒有出現的先不載入(節約流浪,也能減少對伺服器的請求壓力)


o對於數據我們也盡可能分批載入(不要一次請求過多的數據,例如分頁技術)


音視頻文件取消預載入(preload='none'),這樣可以增加第一次渲染頁面的速度,當需要播放的時候在載入


客戶端和伺服器端的數據傳輸盡可能基於JSON格式完成,XML格式比JSON格式要大一些(還可以基於二進制編碼或者文件流格式,這種格式比文件傳輸好很多)


「把頁面的css/js等文件進行合並壓縮」


合並:爭取css和js都只導入一個(webpack可以實現並合並壓縮哦)


壓縮:基於webpack可以壓縮,對於圖片自己找工具先壓縮,可以使用伺服器的GZIP壓縮


圖片BASE64(用BASE64碼代表圖片,減少HTTP,增加瀏覽器渲染速度,所以真是項目中,尤其是移動端,如果圖片載入緩慢,BASE64一下就好了,;但是base64會導致文件中心的代碼超級惡心,不利於維護和開發,所以減渣瞎少使用);webpack中科院配置圖片


2、設置各種緩存、預處理和長連接機制


不經常更改的靜態資源做緩存處理(一般做的是304或者ETAG等協商緩存)


「建立Cache-Control和ExpiresHTTP的強緩存」


DNS緩存或者預處理(DNSPrefetch),減少DNS的查找


設置本地的離線存儲(manifest)或者把一些不經常更改的數據做本地臨時存儲(webstorage,indexdb)等


有錢就做CDN(地域分布式伺服器),或者加伺服器


「建立Connection:keep-aliveTcp長連接」


使用HTTP2版本協議(現在用的一般都是http1.1),可以多條tcp通道共存=>管道化鏈接


一個項目分為不同的域(不同的伺服器),例如:資源web伺服器、數據伺服器,圖片伺服器,視頻伺服器等,合理利用伺服器資源,但是導致過多的DNS解析


Cache-Control的優先順序高於Expires


基於本地存儲,做數據的存儲


3、代碼方面的性能優化


減少對閉包的使用(因為過多使用閉包會產生很多如蘆空不銷毀的內存,處理不好的話,會導致內存溢出「棧溢出」),減少閉包的嵌套(減少作用域鏈的查找層級)


對於動畫來說:能用css解決的不用js(能夠用transform處理的,不用傳統的css樣式,因為transform開啟硬體加速,不會引發迴流,或者使用定位的元素也會好很多,因為定位的元素脫離文檔流,不會對其他元素的位置造成影響),能用
requestAnimationFrame解決的不用定時器


+用requestAnimationFrame還有一個好處,當頁面處於休眠無訪問狀態,動畫會自己暫停,知道回復訪問才開始,而定時器是不論什麼狀態,只要頁面不管,就一直處理


避免使用iframe(因為iframe會嵌入其他頁面,嘩漏這樣父頁面渲染的時候,還要同時把子頁面也渲染了,渲染進度會變慢)


減少直接對DOM的操作(原因是減少DOM的迴流和重繪...),當代項目基本基於mvvm,mvc數據驅動視圖渲染的,對DOM的操作框架本身完成,性能要好很多


低耦合高內聚(基於封裝的方式:方法封裝,插件,組件,框架,類庫等封裝,減少頁面中的冗餘代碼,提高代碼使用率)


盡可能使用事件委託


避免出現死循環或者嵌套循環(嵌套循環會成倍增加循環的次數)


項目中盡可能使用非同步編程來模擬出多線程的效果,避免主線程阻塞(非同步操作基於Promise設計模式來管理)


JS中不要使用with


避免使用css表達式


函數的防抖和節流


減少使用eval(主要原因是防止壓縮代碼的時候,由於符號書寫不合規,導致代碼混亂)


圖片地圖:對於多次調取使用的圖片(尤其是背景圖),盡可能把它提取成為公共的樣式,而不是每一次重新設置background


減少filter濾鏡的使用


盡可能減少選擇器的層級


盡可能減少table布局


手動回收堆棧內存(賦值為null)


「棧溢出:死遞」


functionfunc(){


func();


}func();


解決方案:


functionfunc(){


setTimeout(func,0);


}func();


相互引用:引用類型之間的相互調用,形成嵌套式內存


letobj1={


name:'obj1',};


letobj2={


name:'obj2',


x:obj1}


obj1.x=obj2;


以上就是小編今天為大家分享的關於Web前端新手要掌握的性能優化知識的文章,希望本篇文章能夠對正在從事web前端工作的小夥伴們有所幫助,想要了解更多web前端知識記得關注北大青鳥web培訓官網,最後祝願小夥伴們工作順利,成為一名優秀的web前端工程師。


Ⅹ web性能優化有哪些

常用的優化有兩部謹物鎮分
第祥粗一:面向內容的優化
1. 減少 HTTP 請求
2. 減少 DNS 查找
3. 避免重定向
4. 使用 Ajax 緩存
5. 延遲載入組件

6. 預先載入組件
7. 減少 DOM 元素數量
8. 切分組件到多個域

9. 最小化 iframe 的數量
10. 不要出現http 404 錯誤
第二:面向 Server
1. 縮小 Cookie
2. 針對 Web 組件使用域名無螞消關性的