![qwik logo](https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2F1235f39312924ecbbb55c1fab9e8bb7c) # [Qwik](https://qwik.builder.io/) 下個世代的前端框架? --- [![](https://i.imgur.com/ehetgfP.png)](https://qwikschool.com/) 簡報內容皆擷取自官方課程 (免費) --- - [1] Why Qwik? - [2] What is Qwik? - [3] DEMO --- ## [1] Why Qwik? - 網頁歷史 - 未來趨勢 --- ### 主講人認為使用 Qwik 的推力 - 使用者體驗 (UX) - 開發者體驗 (DX) --- #### 影響 使用者體驗 (UX) 的因素 1. 等待讀取時間 2. 等待回應時間 (加入購物車後等待加入的時間) 3. 重複執行的事情所花費的時間 (重複填相同的表單,因為它沒有記住之前的記錄) --- #### 影響 開發者體驗 (DX) 的因素 1. 結構 2. 做越少的事情越好 3. 工具很容易理解 --- ### 從網頁歷史推測下階段的發展 ![](https://i.imgur.com/LSZWGuc.png) <font size="2"> 每階段初期出現新技術來拯救 UX,該技術隨時間更成熟後 DX 提升,但問題也隨網站規模變大而越趨嚴重,接著就會發展新技術來解決問題 </font> Note: static pages (文字&圖片 HTML only) / dynamic pages (SSR 多頁的應用程式) / MPA + JS (js (jquery)) / RIA (flash) / SPA (AJAX) / hybrid (new SSR + hydration (Next.js & Nuxt.js)) --- #### 前五十的電商網站的表現 ![](https://i.imgur.com/SCBh6Sd.png) --- #### Amazon ![](https://i.imgur.com/phJokJR.png) 世界最大的電商網站 --- ### 下一階段? ![](https://i.imgur.com/KePime3.png) Note: 最後三個階段的尾巴都是因為 app size 太大,導致使用者的等待時間過長才發展成下一個階段。 --- #### 未來趨勢 1 : App 越來越大 ![](https://i.imgur.com/aJDJStS.png) Note: 因為網站功能越來越強,但是 javascript 是單線程的語言,電腦變強對現況的改善並沒有幫助 --- #### 未來趨勢 2 : edge 技術 讓 app 更接近使用者 ![](https://i.imgur.com/WXXvPjD.png) Note: 讓使用者可以從更近的節點取得資料,所以未來發展的技術與其相容可以有更好的效果 --- ![](https://i.imgur.com/tZF3P04.png) --- ![](https://i.imgur.com/eP8Wi6t.png) Note: IWA,qwik 符合了前面提到的幾個特點,重點是每個階段的發生看起來都跟 UX 有很大的關聯 --- ### 網頁效能影響收益 ![](https://i.imgur.com/iTWZ17H.png) 毫秒的讀取時間即可影響收益 Note: 網站效能則是能提升 UX 的重大因子,從很多的研究報告顯示網站的效能大大的影響收益表現 --- ### Core Web Vitals (Google) ![](https://i.imgur.com/YS19OQn.png) [reference](https://web.dev/defining-core-web-vitals-thresholds/) Note: Google 發展出了這個東西來讓網站開發者可以作為網頁效能的判斷基準 --- #### LCP (Largest Contentful Paint) 渲染內容時間 - google: 少於 2.5 秒 - 解決方案 1. 圖片最佳化 2. 下載更少的程式碼 3. 讀取時執行更少的 JavaScript 4. SSR 5. "EDGE" caching & executing --- #### FID (First Input Delay) 網頁回應使用者行為(點按鈕之類的)的時間 - google: 少於 0.1 秒 - 解決方案 1. 下載更少的檔案 2. 執行更少的 JavaScript --- #### CLS (Cumulative Layout Shift) 網頁內容偏移量 - google: 少於 0.1 (偏移量) - 解決方案 1. 下載更少的檔案 2. 執行更少的 JavaScript --- ![](https://i.imgur.com/JLKMk89.png) --- ![](https://i.imgur.com/iiimpnm.png) Note: google 提出的方案都與後面兩點有關,qwik 則針對這兩點來解決 --- ### why Qwik? - Google - Wiz (frontend + backend), but not open source - 現在的框架著重於渲染,但 Qwik 更近一步處理讀取表現 --- ## [2] What is Qwik? 哪些強大的功能? --- ![](https://i.imgur.com/LpMt5xn.png) Note: 從 SPA 講到現在來比較差別 --- ### SPA (Single Page Application) 1. build 2. server 3. client --- ![](https://i.imgur.com/8mlMmjZ.png) --- index.html 看起來是空白的 ![](https://i.imgur.com/4Bf8sqn.png) --- 讀取完 js 之後才可以跟網頁互動 ![](https://i.imgur.com/adA7hrj.png) Note: 可以注意到,所有的內容不論是需不需要互動的內容都是從 JS 產生 --- ### SSR + Hydration ![](https://i.imgur.com/AQwtbeH.png) --- 由伺服器用 JSX 來渲染 html 內容 ![](https://i.imgur.com/jWcf7o1.png) --- ![](https://i.imgur.com/DefMKXM.png) hydration - 讓 html 變成可以互動的狀態 --- ### hydration 的問題 ![](https://i.imgur.com/A91EJkf.png) Note: hydration 的過程包含請求渲染完成的 html 後下載 JS 並執行,然而每次 route 切換時,需要整個過程重新跑一次,這個過程在桌機可能花費幾秒鐘,但在手機上的時間可能是好幾倍 (replay) --- ### Lazy loading? ![](https://i.imgur.com/HF9HXSk.png) Note: lazy loading 可以用來手動解決這個 JS 檔太大的問題 --- - hydration ![](https://i.imgur.com/fSSzvWb.png) --- 問題點: 1. 要手動撰寫 lazy loading 2. 仍然需要執行花費高的 hydration (主流框架目前遇到讀取問題而出現 lazy loading 的解決方案,並無法解決 hydration 帶來的問題) --- ### Resumability (JavaScript Streaming) 目前主流的前端框架都需要做 hydration (replay), 但 qwik 的做法像是串流平台播放影片的方式,只是傳送的資料是 JS 檔案,只針對需要的檔案下載 --- ![](https://i.imgur.com/bJ12yqC.png) --- ![](https://i.imgur.com/t3A5wdx.png) <font size="4"> hydration 的做法因為 html 是一片空白,所以每次都需要重新執行 hydration 才能知道整個應用程式的狀態 </font> Note: 對比 hydration 的作法 --- ![](https://i.imgur.com/x1YtEZT.png) <font size="4"> Qwik 則在 server 執行 JS 來渲染 html 並把所有的資訊 (狀態) 寫在 html,而不需要由 client 端渲染 </font> --- ### Dynamic tree shaking ![](https://i.imgur.com/NgJw6dc.png) <font size="4"> 把狀態寫在 html 上面能做到讓使用者只會請求他所需要的部分,幾乎可以把請求的數量與大小最小化 (目前主流框架也有 tree shaking 但僅限於 build 階段) </font> Note: 把狀態寫在 html 上面更能根據 html 提供的資訊來判斷哪些 js 是頁面所需要的,而這些狀態其實就是要執行的 js 的 url --- ### 請求 JS,速度?? --- ![](https://i.imgur.com/kb4oXGt.png) <font size="4"> client 端開啟 worker 來把所有現在頁面上可能會執行的 js 預先放到瀏覽器的 cache 裡面 </font> --- ![](https://i.imgur.com/z2KBZhd.png) <font size="4"> client 端會有一個 loader (大約 1kb) 來依照需求把 cache 的檔案拿來執行 </font> --- ![](https://i.imgur.com/M7rgeEw.png) --- ## [3] DEMO - [Qwik vs hydration](https://learn.hirez.io/products/a-qwik-introduction/categories/2152654619/posts/2166812749) - 1:11 qwik (讀取時沒有請求 js,需要的時候從 worker 取出 JS 並執行) - 2:54 比較 (用 3g 網路 & 無痕模式,比較 "兩個" 主流框架與 qwik 的速度,讀取頁面時直接在 input 上面打數字,比較要花多久時間才能與應用程式互動) Note: https://qwik-app-edge-kevinshu1995.vercel.app/ https://qwik-app-kevinshu1995.vercel.app/
{"metaMigratedAt":"2023-06-18T03:11:56.447Z","metaMigratedFrom":"YAML","title":"Qwik","breaks":true,"contributors":"[{\"id\":\"1db58682-ae66-4fa3-b482-aa32e54bc1d6\",\"add\":5575,\"del\":572}]"}
    247 views