You may need to be faster. 效能優化大補帖

 

 

Oldmo  2019/08/04

在做效能優化之前...

 

 

先了解一件很重要的事

不是每個應用都需要優化

 

 

一個流量不高的網站,只需要基本用戶體驗不要太差就好。網站當然能快就快,但需要衡量進行優化的成本是否值得。

優化沒有所謂的終點

 

 

如果只是照著設計稿刻出UI,大部分的人都辦得到,要比別人更突出,就要看你的程式碼是否比別人乾淨、是否更容易維護,看你做出來的使用者體驗是否良好,而使用者體驗要良好,效能影響了相當大的一部分。

 

效能優化是一條沒有終點的路,沒有所謂的"到達最快狀態了",這是一條不斷追求更快的過程。

本日大綱

 

 

1. 淺談web效能優化

2. React 的效能優化

3. 實作時間

Web效能優化大補帖

 

 

Text

我們知道web可以簡單分為前後端,於是關於效能優化,我們分為 : 前端前端與後端交換資料的過程後端三個部分來看。

 

 

Text

今天我們主要聚焦在前端部分

 

 

Text

優化程式碼

 

 

1. minimize text: UglifyJS

https://github.com/mishoo/UglifyJS2

 

2.  minimize img

 

了解jpg、svg、gif、png四大型態的使用時機

Critical Render Path

關鍵轉譯路徑

 

 

 

從收到 HTML、CSS 和 JavaScript 位元組,再對程式碼進行必需的處理,到最後轉變為顯示像素的過程中還有許多中間步驟。將效能最佳化其實就是瞭解這些步驟中所有的活動,這就是所謂的 關鍵轉譯路徑

DOM

CSSOM

Render Tree

Layout

Layer

Paint

Compositing

Compositor Thread & Raster Thread (Renderer Process)

Main Thread (Renderer Process)

Display

Browser Process

Repaint

Reflow

我不在 Main Thread 執行喔!

Compositing

Repaint

Compositing

Reflow

DOM

CSSOM

Render Tree

Layout

Layer

Paint

Compositing

Compositor Thread & Raster Thread (Renderer Process)

Main Thread (Renderer Process)

Display

Browser Process

Repaint

Reflow

Compositing

Repaint

Compositing

Reflow

DOM

CSSOM

Render Tree

Layout

Layer

Paint

Compositing

Compositor Thread & Raster Thread (Renderer Process)

Main Thread (Renderer Process)

Display

Browser Process

DOM

CSSOM

Render Tree

Layout

Paint

HTML

CSS

JavaScript

Renderer Process

Renderer Process

Renderer Process

demo1.com

iframe

demo2.com

iframe

demo3.com

Reflow

Repaint

Compositing

Critical Render Path

關鍵轉譯路徑

 

 

 

效能要好,css file盡快引入,js在css後引入

因為js的執行會導致網頁載入的暫停

CSS

1.  需要時再引入css file

2. Above the fold loading(可以選擇web載入後再load css)

3. less specificity

(ex: body.article > #main > #content > #intro > p > b)

4. 減少css file數目(一個檔案會是一個獨立的request)

接下來換到js部分,一般我們要載入JS file會怎麼做?

JS

1.  Load script asynchronously

2.  Defer loading of script

3.  Minimize DOM manipulation

4.  Avoid long running  JavaScript

用<script>。

 

但你們知道script還有另外兩種用法嗎?

 

<script async>

<script>

HTML

HTML

HTML 閒置

JS load

JS exec

HTML

HTML

HTML 閒置

<script defer >

HTML

JS exec

JS load

JS exec

JS load

Time

JS load

JS exec

JS load

Time

Time

其他各種優化

<link rel="prefetch" href="/example.com">

<link rel="dns-prefetch" href="/example.com">

<link rel="preconnect" href="/example.com">

<link rel="prerender" href="/example.com">

測試網頁速度的工具

pagespeed insight

https://developers.google.com/speed/pagespeed/insights/?hl=zh-TW

or

Developer tools  pageSpeed

PWA(progressive web app)

Progressive Web App 是希望能夠讓 Web application 盡可能的在各種環境(網路環境、手機作業系統等)下都能順暢且不減功能性的運作,並讓你的 Web App 可以:

 

  • 直接被使用者安裝到桌面
  • offline 使用
  • 擁有推播功能
  • 開啟時看不到 URL Bar(類 Native app 的使用經驗)
  • 開啟時有 Splash Screen
  • (Dcard、SkyScanner example)

 

PWA特性

PWA中最重要的兩個東西:

manifest.json

Service worker

 

(範例分享)

效能優化 In React

效能優化 In React

在對react進行效能優化以前,需要先對react的Life Cycle有一定的了解,相信周杰老師已經講的十分清楚完善了。

 

也相信周杰老師也講了我們可以利用lifecycle進行哪些效能上的優化,包刮hook的應用,因此今天我們來講些不一樣的。

效能優化 In React

 

1. Server Side Rendering

 

2. lazy loading && code splitting

What is SSR?

其實我們現在說的SSR,並不是實質上的SSR。

 

.....WTF

先來了解三種render形式

server side rendering:  由後端去渲染頁面。

ex:比較舊式的ejs、handlebars、Django、blade。

優點: SEO

缺點: 效能不佳

 

client side rendering: 也就是現今流行的SPA單頁架構,使用者體驗往上提升了一級。

優點: 使用者體驗佳

缺點: SEO不佳(client-side render 搜尋引擎抓不到HTML)、需要等JS全跑完才會顯示頁面,專案一肥,效能沒處理好就直接gg

so, why not combine the two methods?

Isomorphic JavaScript 因此誕生,結合了上頁兩種render方法的優點,使用者體驗佳、減少首頁顯示時間,且爬蟲也抓得到,現今大家說的SSR即是這個方法。

CSR VS SSR

SSR 精隨: 前後端可以共用程式碼(React搭配一點nodejs)

 

原本設定上十分複雜,但近期各大框架皆推出SSR的框架,省去很多設定上的麻煩 ex: Next.js (React)、Nuxt.js (Vue)

 

 

工商時間: It邦幫忙鐵人賽  想挑戰 Next.js 大家願意的話再支持一下

Lazy loading && code splitting

有了webpack這類的打包工具,最後會把所有的JS檔打包成bundle,然而當專案規模過大,打包後的bundle也會變得肥大,導致載入時間過慢。

 

這時code-splitting(webpack支援)就派上用場啦,我們可以將bundle切分成很多份,並在需要時載入,避免了檔案過於肥大卻要一次載入的問題,以此提升網站的效能。

Code-splitting

其實剛剛講的code-splitting也就是lazy-loading的底層概念,我們把範圍縮小一點,剛剛看的是整個bundle後的file,這次看的則是 React 中的一個component。

 

 

lazy-loading

在react專案中,一般習慣將index.js當作root,將所有component import進來再丟去render。

 

問題來了,有些component對我們來說不是那麼重要,但她可能又十分肥大,延遲了我們的載入速度,此時我們可以用lazy-loading的小技巧,將不需要馬上呈現出來的東西以非同步的方式慢慢載入進來。

 

 

lazy-loading

使用案例一: react-router

 

https://scotch.io/tutorials/lazy-loading-routes-in-react​

 

 

lazy-loading

使用案例二: lazy-loading && Suspense

Done.

 

Time to practice.

deck

By oldmo860617

deck

  • 373