Next.js 30 天全端實戰:Day 12 - 效能優化:別讓大圖與字體拖垮你的 LCP
一、 前言
身為開發者,我們都希望網站載入「秒開」。但在實務中,最常讓網站變慢的元兇通常不是演算法寫太爛,而是幾張「沒處理過」的原圖。
傳統 標籤會帶來幾個問題:圖片太大浪費頻寬、載入時頁面跳動(CLS),以及格式過舊。今天我們來拆解 Next.js 如何透過內建組件,自動幫我們完成這些專業級的優化。
二、 本文:Image 與 Font 優化實戰
1. 為什麼要用 <Image /> 組件?
Next.js 的 next/image 是對原生 的強力封裝。它具備以下黑科技:
- 自動轉檔:根據瀏覽器支援度,自動將 JPG/PNG 轉成 WebP 或 AVIF。
- 響應式尺寸:自動根據裝置大小提供不同解析度的圖片,手機不再下載 4K 大圖。
- 防止版面移動 (CLS):強制設定寬高比例,確保圖片載入前預留空間,不會讓內容突然「跳一下」。
- 延遲載入 (Lazy Loading):預設只會載入出現在視窗內的圖片,節省流量。
2. 實戰示範:基礎用法與優先權
import Image from 'next/image';
export default function HeroSection() {
return (
<div className="hero">
<Image
src="/banner.jpg"
alt="首頁大圖"
width={1200}
height={600}
// 關鍵屬性:priority 會讓這張圖優先下載,適合用於首屏圖 (LCP)
priority
className="rounded-lg"
/>
</div>
);
}
3. 處理「不確定尺寸」的背景圖
如果你需要圖片填滿整個容器(例如背景),可以使用 fill 屬性。
<div className="relative h-64 w-full">
<Image
src="/background.jpg"
alt="背景圖"
fill
className="object-cover" // 配合 CSS 確保圖片不變形
/>
</div>
4. 字體優化:next/font
字體載入時的「閃爍」(FOIT/FOUT)也是影響體驗的大敵。next/font 會自動下載字體檔案並進行「自我託管 (Self-hosting)」,這意味著:
- 瀏覽器不再需要連線到 Google Fonts,減少一次 DNS 查詢。
- 字體檔案會跟著你的網頁一起部署,速度更快且隱私更佳。
// src/app/layout.tsx
import { Inter } from 'next/font/google';
const inter = Inter({ subsets: ['latin'] });
export default function RootLayout({ children }) {
return (
<html lang="en" className={inter.className}>
<body>{children}</body>
</html>
);
}```
## 三、 結論:把優化變成開發預設值
在 Next.js 中,優化不是「選配」,而是「標配」。透過這些內建組件,我們在寫程式的當下就已經完成了大部分的效能調優。
* 今日小結:
- 首屏可見的圖片(如 Banner)務必加上 `priority`。
- 使用 `next/font` 取代外部字體連結。
- 外部圖片必須在 `next.config.mjs` 中設定 `remotePatterns` 才能顯示。
* 開發者心得:雖然 `<Image>` 很強,但它在開發模式下有時會因為動態轉檔讓電腦變慢。別擔心,這在生產環境 (Production) 會透過快取變得極快。另外,如果是從外部 API 抓圖,記得先檢查圖片來源的穩定性,並設定適當的 `sizes` 屬性來幫助瀏覽器選擇正確的圖檔。
---
參考來源:
1. Next.js Documentation - Image Optimization (https://nextjs.org/docs/app/building-your-application/optimizing/images)
2. Next.js Documentation - Font Optimization (https://nextjs.org/docs/app/building-your-application/optimizing/fonts)