大廠外包工#
當外包的一週。週二臨危受命,要為組裡 AI 大賽寫一個 demo 出來,從 0 到 1 搭建了個後台信息管理系統框架,週二早上對齊開發內容(8 個頁面),demo 版 deadline 為週四(後又改為週五)
中後台在廠裡可是只有外包同學才會做的業務(ps. 沒有歧視工種,🐶保命
亞歷山大#
亞歷山大的原因在於,在廠裡這段時間做的事情過於零碎,對系統性能力提升沒有太大幫助,加上太長時間沒接觸過中後台項目了,過於生疏,而只留給自己 2-3 天,一直覺得是個完不成的任務
破局#
扛著壓力破局點,我於週二當天群裡承諾搭完框架,使得週三大家可以各司其職,順利開始開發起來,不耽誤進度。各自做好自己負責的頁面,週三週四完成 demo 版的 80% 工作,週四 / 週五老闆 / 大老闆的點名認可,讓我們幾個人非常有成就感,我也對自己比較滿意,有時候真就被逼出來的!
選型#
進行一個簡單羅列,不怕丟人:
- 基礎框架:
webpack5+React18+react-router-dom
- 組件系統:
antd
- 語言:
ts+sass
- 其他:
immer
、schedule-x
、dayjs
也能看得出來沒做更深思考,想到啥就 install 就完了,一切為了快,怎麼快怎麼來
唯一的收穫就是知道了通過配置webpack-dev-server --host 0.0.0.0
+devServer.host = 0.0.0.0
,項目運行起來後,同時顯示 iPv4/6 項目運行地址,局域網內其他機器可訪問本地服務
摸魚學習#
throttle vs debounce#
節流,一段時間內只觸發一次執行,多次觸發無效。滾動
防抖,一段時間後執行,多次觸發重新計時。輸入查詢防抖
如何找 package#
原來去 npm 按關鍵詞搜想要的 package 才是最快的,像這樣:
keywords:react schedule
借匹配結果,推薦幾款 schedule 組件:
再結合 Google search,你大概率能找到你想要且能用的 package
性能優化#
瀏覽器兼容#
Google 提供的core-web-vitals
package web-vitals API 或許在某些瀏覽器上並不能正確計算出相應指標值,此乃瀏覽器兼容性,這樣去懷疑確實也合理
Next.js learning#
借 Next.js 學習教程,了解到其在性能優化方面的考量
font 優化#
提供 next/font/google、next/font/local 將字體資源合併入靜態資源,無需加載,優化 CLS
img 優化#
提供Image
組件
- 不同設備、尺寸顯示響應性圖片
- 明確尺寸,優化 CLS
- 懶加載,僅加載視口內圖片(no manually)
import Image from 'next/image';
export default function Page() {
return <Image
src={'/hero-desktop.png'}
width={1000}
height={760}
className="hidden md:block"
alt="Screenshots of the dashboard project showing desktop version"
/>
}
link 優化#
提供 Link 組件,支持 CSR 導航,而非整頁刷新
import Link from 'next/link';
export default function Page() {
return <Link
key={link.name}
href={link.href}
className="flex h-[48px] grow items-center justify-center gap-2 rounded-md bg-gray-50 p-3 text-sm font-medium hover:bg-sky-100 hover:text-blue-600 md:flex-none md:justify-start md:p-2 md:px-3"
>{link.name}
</Link>
}
生產環境下,Link 標籤出現於視口中時有 prefetch 優化,提高 near-instant open 體驗
Page#
Next.js 特殊文件page.tsx
- path segments,基於路由的 code-split 支持,不同頁面間相互獨立互不影響
Layout#
Next.js 特殊文件layout.tsx
- shared UI partial re-render
Loading#
Next.js 特殊文件loading.tsx
- 路由級別異步組件 Suspense fallback
Error#
Next.js 特殊文件error.tsx
- 捕獲預期外的異常,定義一個 Error UI boundary
404NotFound#
Next.js 特殊文件not-found.tsx
- 鏈接 / 資源獲取不到時,定義一個 404 UI boundary。展示優先級高於error.tsx
,若未定義則展示error.tsx
靜態渲染 vs 動態渲染#
靜態:
- 更快的使用體驗
- 靜態內容利於緩存,減輕服務端負載
- SEO 良好
動態:
- 經常變化的數據
- 個性化數據,千人千面
- 實時信息
流式渲染#
頁面中不同 chunks 並行加載解析渲染,有效避免慢請求對頁面整體加載的影響,Next.js 中實現流式渲染的兩種方式:
loading.tsx
,Next.js 特殊文件,相當於 React Suspense 組件的 fallback UI,內容尚未加載出來前過渡組件,stream 整個頁面- React Suspense,組件 / 一組組件粒度的延遲渲染,根據條件動態渲染組件
什麼時候考慮?
- 用戶體驗,優先交互
- 模塊展示優先級
- 數據獲取
最佳實踐:
- whole page:
loading.tsx
可實現頁面級別加載過渡,但可能因為個別組件太慢而讓用戶等待時間過長,拖慢頁面內容渲染速度 - every component:組件個個接踵而至出現,體驗差點意思
- page section:需創建 wrapper 組件包裹多個組件
PPR - 實驗階段加載模型#
Pre Partial Render,部分預渲染,fallback 部分作為 static content 預渲染嵌入 HTML 中,dynamic content 隨用戶訪問對應路由,再動態懶加載嵌入
URL Search Params#
benefits:
- 鏈接可收藏、可分享
- 利於 SSR,服務端同樣能拿到參數進行數據獲取於渲染
- 攜帶用戶查詢參數,利於用戶行為分析
- URL Query 中傳遞取值而非單獨維護 component state
hooks:
- useSearchParams
- usePathname
- useRouter:編程式導航
CSC vs SSC#
客戶端渲染可用服務端渲染不可用:
- Event Listener
- hooks
- document、window 等 API
SEO#
TDK、Open Graph Metadata
有趣的事兒#
谷歌出品必屬精品!#