跳至內容
API 參考元件<Image> (舊版)

<Image> (舊版)

範例

從 Next.js 13 開始,next/image 元件已改寫,以提升效能和開發者體驗。為了提供向後相容的升級方案,舊的 next/image 已重新命名為 next/legacy/image

檢視**新的** next/image API 參考

比較

next/legacy/image 相比,新的 next/image 元件有以下變更:

  • 移除 <img> 周圍的 <span> 包裝器,改用 原生計算的長寬比
  • 新增支援標準 style 屬性
    • 移除 layout 屬性,改用 styleclassName
    • 移除 objectFit 屬性,改用 styleclassName
    • 移除 objectPosition 屬性,改用 styleclassName
  • 移除 IntersectionObserver 的實作,改用 原生延遲載入
    • 移除 lazyBoundary 屬性,因為沒有原生對應項
    • 移除 lazyRoot 屬性,因為沒有原生對應項
  • 移除 loader 設定,改用 loader 屬性
  • alt 屬性從選用改為必填
  • 更改 onLoadingComplete 回呼,使其接收 <img> 元素的參考

必填屬性

<Image /> 元件需要以下屬性。

src

必須為下列其中一項

當使用預設的 loader 時,來源圖片也需考慮以下事項

  • 當 src 為外部網址時,您也必須設定 remotePatterns
  • 當 src 為動態圖片或非已知格式 (JPEG, PNG, WebP, AVIF, GIF, TIFF) 時,圖片將會以原始格式提供。
  • 當 src 為 SVG 格式時,除非啟用 unoptimizeddangerouslyAllowSVG,否則將會被阻擋。

width layoutsizes 屬性。

當使用 layout="intrinsic"layout="fixed" 時,width 屬性表示以像素為單位的 _渲染_ 寬度,因此它會影響圖片顯示的大小。

當使用 layout="responsive"layout="fill" 時,width 屬性表示以像素為單位的 _原始_ 寬度,因此它只會影響長寬比。

除了 靜態匯入的圖片layout="fill" 的圖片之外,width 屬性是必需的。

height

height 屬性可以表示以像素為單位的 _渲染_ 高度或 _原始_ 高度,取決於 layoutsizes 屬性。

當使用 layout="intrinsic"layout="fixed" 時,height 屬性表示以像素為單位的 _渲染_ 高度,因此它會影響圖片顯示的大小。

當使用 layout="responsive"layout="fill" 時,height 屬性表示以像素為單位的 _原始_ 高度,因此它只會影響長寬比。

除了 靜態匯入的圖片layout="fill" 的圖片之外,height 屬性是必需的。

選用屬性

<Image /> 元件除了必要的屬性外,還接受許多額外的屬性。本節說明 Image 元件最常用的屬性。有關較少使用的屬性的詳細資訊,請參閱進階屬性一節。

配置

影像在視埠大小變更時的配置行為。

佈局 (layout)行為srcSet尺寸 (sizes)包含容器和尺寸調整器
intrinsic(預設)縮小以符合容器寬度,最大不超過影像大小1x2x(基於 imageSizes
fixed大小固定為 widthheight 的值1x2x(基於 imageSizes
responsive縮放以符合容器寬度640w750w、... 2048w3840w(基於 imageSizesdeviceSizes100vw
fill在 X 和 Y 軸上放大以填滿容器640w750w、... 2048w3840w(基於 imageSizesdeviceSizes100vw
  • 示範 intrinsic 配置(預設)
    • 當使用 intrinsic 時,影像會在較小的視埠中縮小尺寸,但在較大的視埠中維持原始尺寸。
  • 示範 fixed 配置
    • 當使用 fixed 時,影像尺寸不會隨著視埠變化而改變(無響應式),類似於原生 img 元素。
  • 示範 responsive 配置
    • 當使用 responsive 時,影像會在較小的視埠中縮小尺寸,在較大的視埠中放大尺寸。
    • 請確保父元素在其樣式表中使用 display: block
  • 示範 fill 配置
    • 當使用 fill 時,影像會將寬度和高度都拉伸到父元素的尺寸,前提是父元素是相對定位的。
    • 這通常會與 objectFit 屬性搭配使用。
    • 請確保父元素在其樣式表中使用 position: relative
  • 示範背景圖片

載入器

一個用於解析網址的客製化函式。在 Image 元件上將載入器設定為 prop 會覆寫在 next.config.jsimages 區段 中定義的預設載入器。

loader 是一個函式,根據以下參數返回圖片的網址字串

以下是一個使用客製化載入器的範例

import Image from 'next/legacy/image'
 
const myLoader = ({ src, width, quality }) => {
  return `https://example.com/${src}?w=${width}&q=${quality || 75}`
}
 
const MyImage = (props) => {
  return (
    <Image
      loader={myLoader}
      src="me.png"
      alt="Picture of the author"
      width={500}
      height={500}
    />
  )
}

尺寸

一個字串,提供關於圖片在不同斷點寬度的資訊。sizes 的值會極大地影響使用 layout="responsive"layout="fill" 的圖片效能。對於使用 layout="intrinsic"layout="fixed" 的圖片,它將被忽略。

sizes 屬性有兩個與圖片效能相關的重要用途

首先,瀏覽器使用 sizes 的值來決定要從 next/legacy/image 自動產生的來源集中下載哪個尺寸的圖片。當瀏覽器進行選擇時,它還不知道頁面上圖片的尺寸,因此它會選擇與螢幕顯示區大小相同或更大的圖片。sizes 屬性允許您告知瀏覽器圖片實際上會小於全螢幕。如果您未指定 sizes 值,則會使用預設值 100vw(全螢幕寬度)。

其次,會解析 sizes 值並用於修剪自動建立的來源集中的值。如果 sizes 屬性包含例如 50vw 等表示螢幕顯示區寬度百分比的尺寸,則會修剪來源集以不包含任何永遠不需要的太小的值。

例如,如果您知道您的樣式會導致圖片在行動裝置上為全寬,在平板電腦上為兩欄配置,在桌上型顯示器上為三欄配置,則應包含如下所示的 sizes 屬性

import Image from 'next/legacy/image'
const Example = () => (
  <div className="grid-element">
    <Image
      src="/example.png"
      layout="fill"
      sizes="(max-width: 768px) 100vw,
              (max-width: 1200px) 50vw,
              33vw"
    />
  </div>
)

這個 sizes 範例可能會對效能指標產生顯著影響。如果沒有 33vw 尺寸,則從伺服器選擇的圖片寬度將是所需寬度的 3 倍。由於檔案大小與寬度的平方成正比,因此如果沒有 sizes,使用者將下載比所需大小大 9 倍的圖片。

深入瞭解 srcsetsizes

品質

最佳化圖片的品質,一個介於 1100 之間的整數,其中 100 代表最佳品質。預設值為 75

優先順序

當設為 true 時,圖片將被視為高優先順序並預先載入。使用 priority 的圖片會自動停用延遲載入。

您應該在任何被偵測為最大內容繪製 (LCP)元素的圖片上使用 priority 屬性。設定多個優先順序圖片可能是適當的,因為不同圖片可能在不同的視窗大小下成為 LCP 元素。

僅應在圖片顯示在首屏時使用。預設值為 false

佔位符

圖片載入時使用的佔位符。可能的值為 blurempty。預設值為 empty

當設為 blur 時,blurDataURL 屬性將被用作佔位符。如果 src 是一個來自靜態匯入的物件,且匯入的圖片是 .jpg.png.webp.avif,則 blurDataURL 將會自動填入。

對於動態圖片,您必須提供 blurDataURL 屬性。諸如 Plaiceholder 之類的解決方案可以協助產生 base64 編碼。

當設為 empty 時,圖片載入時將沒有佔位符,只有空白。

試用看看

進階屬性

在某些情況下,您可能需要更進階的用法。<Image /> 元件可選用以下進階屬性。

style 樣式

允許將 CSS 樣式傳遞到底層的圖片元素。

請注意,所有 layout 模式都會將其自身的樣式套用至圖片元素,而這些自動樣式會優先於 style 屬性。

同時請記住,必要的 widthheight 屬性可能會與您的樣式產生交互作用。如果您使用樣式修改圖片的 width,您也必須設定 height="auto" 樣式,否則您的圖片會失真。

objectFit 物件擬合

定義當使用 layout="fill" 時,圖片將如何適配其父容器。

此值會傳遞至 src 圖片的 object-fit CSS 屬性

objectPosition 物件位置

定義當使用 layout="fill" 時,圖片在其父元素內的定位方式。

這個值會傳遞給套用至圖片的 object-position CSS 屬性

onLoadingComplete

在圖片完全載入且預留位置被移除後會呼叫的回呼函式。

onLoadingComplete 函式接受一個參數,該參數是一個物件,具有以下屬性:

loading

圖片的載入行為。預設為 lazy(延遲載入)。

當設為 lazy 時,會延遲載入圖片,直到它到達計算出的與視埠的距離。

當設為 eager 時,會立即載入圖片。

了解更多

blurDataURL

一個資料網址(Data URL),在 src 圖片成功載入之前用作預留位置圖片。僅在與 placeholder="blur" 結合使用時才會生效。

必須是 base64 編碼的圖片。它會被放大和模糊化,因此建議使用非常小的圖片(10px 或更小)。包含較大的圖片作為預留位置可能會損害應用程式效能。

試用看看

您也可以產生純色資料網址來匹配圖片。

lazyBoundary

一個字串(語法類似於 margin 屬性),作為邊界框用於檢測 viewport 與圖片的相交,並觸發延遲載入。預設值為 "200px"

如果圖片嵌套在根文件以外的可滾動父元素中,您還需要指定 lazyRoot 屬性。

了解更多

lazyRoot

一個指向可滾動父元素的 React Ref。預設值為 null(文件 viewport)。

Ref 必須指向一個 DOM 元素或一個將 Ref 轉發到底層 DOM 元素的 React 組件。

指向 DOM 元素的範例

import Image from 'next/legacy/image'
import React from 'react'
 
const Example = () => {
  const lazyRoot = React.useRef(null)
 
  return (
    <div ref={lazyRoot} style={{ overflowX: 'scroll', width: '500px' }}>
      <Image lazyRoot={lazyRoot} src="/one.jpg" width="500" height="500" />
      <Image lazyRoot={lazyRoot} src="/two.jpg" width="500" height="500" />
    </div>
  )
}

指向 React 組件的範例

import Image from 'next/legacy/image'
import React from 'react'
 
const Container = React.forwardRef((props, ref) => {
  return (
    <div ref={ref} style={{ overflowX: 'scroll', width: '500px' }}>
      {props.children}
    </div>
  )
})
 
const Example = () => {
  const lazyRoot = React.useRef(null)
 
  return (
    <Container ref={lazyRoot}>
      <Image lazyRoot={lazyRoot} src="/one.jpg" width="500" height="500" />
      <Image lazyRoot={lazyRoot} src="/two.jpg" width="500" height="500" />
    </Container>
  )
}

了解更多

unoptimized

當值為 true 時,來源圖片將按原樣提供,而不是更改品質、大小或格式。預設值為 false

import Image from 'next/image'
 
const UnoptimizedImage = (props) => {
  return <Image {...props} unoptimized />
}

從 Next.js 12.3.0 版開始,可以透過使用以下配置更新 next.config.js 來將此屬性指定給所有圖片

next.config.js
module.exports = {
  images: {
    unoptimized: true,
  },
}

其他屬性

<Image /> 元件上的其他屬性將會傳遞到底層的 img 元素,但以下例外:

設定選項

遠端模式
next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 'example.com',
        port: '',
        pathname: '/account123/**',
        search: '',
      },
    ],
  },
}

注意事項:以上範例將確保 next/legacy/imagesrc 屬性必須以 https://example.com/account123/ 開頭,且不得包含查詢字串。任何其他協定、主機名稱、連接埠或不符的路徑都將回應 400 Bad Request。

以下是 next.config.js 檔案中使用主機名稱萬用字元模式的 remotePatterns 屬性範例:

next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: '**.example.com',
        port: '',
        search: '',
      },
    ],
  },
}

注意事項:以上範例將確保 next/legacy/imagesrc 屬性必須以 https://img1.example.comhttps://me.avatar.example.com 或任意數量的子網域開頭。它不能包含連接埠或查詢字串。任何其他協定或不符的主機名稱都將回應 400 Bad Request。

萬用字元模式可用於 pathnamehostname,並具有以下語法:

  • * 匹配單個路徑區段或子網域
  • ** 匹配結尾處的任意數量的路徑區段或開頭處的任意數量的子網域

** 語法在模式中間不起作用。

注意事項:省略 protocolportpathnamesearch 時,則隱含萬用字元 **。不建議這樣做,因為這可能會允許惡意行為者優化您不想要的網址。

以下是 next.config.js 檔案中使用 searchremotePatterns 屬性範例:

next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 'assets.example.com',
        search: '?v=1727111025337',
      },
    ],
  },
}

注意事項:以上範例將確保 next/legacy/imagesrc 屬性必須以 https://assets.example.com 開頭,且必須包含完全相同的查詢字串 ?v=1727111025337。任何其他協定或查詢字串都將回應 400 Bad Request。

網域

警告:自 Next.js 14 起已棄用,建議改用嚴格的 remotePatterns 設定,以保護您的應用程式免受惡意使用者攻擊。僅在您擁有網域中所有內容的情況下才使用 domains

remotePatterns 類似,domains 設定可用於提供允許外部圖片使用的主機名稱清單。

然而,domains 設定不支援萬用字元模式匹配,也無法限制協議、通訊埠或路徑名稱。

以下是在 next.config.js 檔案中 domains 屬性的範例

next.config.js
module.exports = {
  images: {
    domains: ['assets.acme.com'],
  },
}

載入器設定

如果您想使用雲端供應商來最佳化圖片,而不是使用 Next.js 內建的圖片最佳化 API,您可以在 next.config.js 檔案中設定 loaderpath 前綴。這允許您使用相對 URL 作為圖片的 src 屬性,並自動為您的供應商產生正確的絕對 URL。

next.config.js
module.exports = {
  images: {
    loader: 'imgix',
    path: 'https://example.com/myaccount/',
  },
}

內建載入器

包含以下圖片最佳化雲端供應商

  • 預設:使用 next devnext start 或自訂伺服器時自動運作
  • Vercel:在 Vercel 上部署時自動運作,無需設定。了解更多
  • Imgixloader: 'imgix'
  • Cloudinaryloader: 'cloudinary'
  • Akamailoader: 'akamai'
  • 自訂:loader: 'custom' 透過在 next/legacy/image 元件上實作 loader 屬性來使用自訂的雲端供應商。

如果您需要不同的供應商,可以使用 next/legacy/imageloader 屬性。

使用 output: 'export' 時,圖片無法在建置時進行優化,只能按需優化。要在 output: 'export' 中使用 next/legacy/image,您需要使用不同於預設值的載入器。在討論區中閱讀更多資訊。

進階

以下設定適用於進階使用案例,通常不需要設定。如果您選擇設定以下屬性,將會覆蓋未來更新中 Next.js 的任何預設值變更。

裝置尺寸 layout="fill" 時,會使用這些寬度,以確保為使用者的裝置提供正確的圖片。

如果未提供設定,則使用以下預設值。

next.config.js
module.exports = {
  images: {
    deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
  },
}

圖片尺寸

您可以在 next.config.js 檔案中使用 images.imageSizes 屬性指定圖片寬度列表。這些寬度會與 裝置尺寸 的陣列串接,以形成用於產生圖片 srcset 的完整尺寸陣列。

有兩個獨立列表的原因是,imageSizes 僅用於提供 sizes 屬性的圖片,這表示圖片小於螢幕的完整寬度。因此,imageSizes 中的尺寸都應該小於 deviceSizes 中的最小尺寸。

如果未提供設定,則使用以下預設值。

next.config.js
module.exports = {
  images: {
    imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
  },
}

可接受的格式

預設的圖片優化 API 會自動透過請求的 Accept 標頭偵測瀏覽器支援的圖片格式,以決定最佳的輸出格式。

如果 Accept 標頭符合多個已設定的格式,則會使用陣列中第一個符合的格式。因此,陣列的順序很重要。如果沒有符合的格式(或原始圖片是動畫),圖片優化 API 會 fallback 到原始圖片的格式。

如果未提供設定,則使用以下預設值。

next.config.js
module.exports = {
  images: {
    formats: ['image/webp'],
  },
}

您可以啟用 AVIF 支援,並在以下設定中 fallback 到 WebP。

next.config.js
module.exports = {
  images: {
    formats: ['image/avif', 'image/webp'],
  },
}

注意事項:AVIF 編碼通常需要多花費 50% 的時間,但與 WebP 相比,它可以壓縮縮小 20%。這表示第一次請求圖片時,速度通常會比較慢,而後續快取的請求會比較快。

快取行為 載入器的快取演算法。對於所有其他載入器,請參閱您的雲端供應商的說明文件。

圖片會根據請求動態優化,並儲存在 <distDir>/cache/images 目錄中。優化的圖片檔案將會提供給後續的請求,直到到期為止。當發出與已快取但過期的檔案相符的請求時,會立即提供過期的圖片。然後,圖片會在背景中再次優化(也稱為重新驗證),並使用新的到期日儲存到快取中。

可以透過讀取 x-nextjs-cache(部署在 Vercel 上時為 x-vercel-cache)回應標頭的值來判斷圖片的快取狀態。可能的值如下:

  • MISS - 路徑不在快取中(最多只會在第一次訪問時發生一次)
  • STALE - 路徑在快取中,但已超過重新驗證時間,因此將會在背景中更新
  • HIT - 路徑在快取中,且尚未超過重新驗證時間

到期時間(或稱最大存留時間)由 minimumCacheTTL 設定或上游圖片的 Cache-Control 標頭定義,以較大者為準。具體來說,使用的是 Cache-Control 標頭的 max-age 值。如果同時找到 s-maxagemax-age,則優先使用 s-maxagemax-age 也會傳遞給任何下游客戶端,包括 CDN 和瀏覽器。

  • 您可以設定 minimumCacheTTL 來增加快取持續時間,當上游圖片未包含 Cache-Control 標頭或其值非常低時。
  • 您可以設定 deviceSizesimageSizes 來減少可能產生的圖片總數。
  • 您可以設定 格式 來停用多種格式,以利於單一圖片格式。

最小快取 TTL

您可以設定已快取最佳化圖片的存留時間 (TTL,以秒為單位)。在許多情況下,最好使用 靜態圖片匯入,它會自動雜湊檔案內容,並使用 immutableCache-Control 標頭永久快取圖片。

next.config.js
module.exports = {
  images: {
    minimumCacheTTL: 60,
  },
}

最佳化圖片的到期時間(或最大存留時間)由 minimumCacheTTL 或上游圖片的 Cache-Control 標頭定義,以較大者為準。

如果您需要針對每個圖片更改快取行為,您可以設定 headers 來設定上游圖片(例如 /some-asset.jpg,而不是 /_next/image 本身)的 Cache-Control 標頭。

目前沒有機制可以讓快取失效,因此最好將 minimumCacheTTL 保持在較低的值。否則,您可能需要手動更改 src 屬性或刪除 <distDir>/cache/images

停用靜態匯入

預設行為允許您匯入靜態檔案,例如 import icon from './icon.png',然後將其傳遞給 src 屬性。

在某些情況下,如果此功能與其他需要匯入行為不同的外掛程式衝突,您可能希望停用此功能。

您可以在 next.config.js 中停用靜態圖片匯入。

next.config.js
module.exports = {
  images: {
    disableStaticImages: true,
  },
}

危險地允許 SVG

預設的 載入器 不會最佳化 SVG 圖片,原因有幾個。首先,SVG 是一種向量格式,這表示它可以無損地調整大小。其次,SVG 具有許多與 HTML/CSS 相同的功能,如果沒有適當的 內容安全策略 (CSP) 標頭,可能會導致漏洞。

因此,我們建議在 src 屬性已知為 SVG 時使用 unoptimized 屬性。當 src".svg" 結尾時,會自動執行此操作。

但是,如果您需要使用預設的圖片最佳化 API 提供 SVG 圖片,您可以在 next.config.js 中設定 dangerouslyAllowSVG

next.config.js
module.exports = {
  images: {
    dangerouslyAllowSVG: true,
    contentDispositionType: 'attachment',
    contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;",
  },
}

此外,強烈建議設定 contentDispositionType 來強制瀏覽器下載圖片,並設定 contentSecurityPolicy 來防止嵌入圖片中的腳本執行。

contentDispositionType

預設的 載入器 會將 Content-Disposition 標頭設定為 attachment,因為 API 可以提供任意遠端圖片,所以這能提供額外的保護。

預設值為 attachment,這會強制瀏覽器在直接訪問時下載圖片。當 dangerouslyAllowSVG 為 true 時,這一點尤其重要。

您可以選擇設定 inline,允許瀏覽器在直接訪問時渲染圖片,而無需下載。

next.config.js
module.exports = {
  images: {
    contentDispositionType: 'inline',
  },
}

動態圖片

預設的 載入器 會自動繞過動態圖片的圖片優化,並按原樣提供圖片。

動態檔案的自動偵測功能會盡力支援 GIF、APNG 和 WebP 格式。如果您想明確繞過特定動態圖片的圖片優化,請使用 unoptimized 屬性。

版本歷史記錄

版本變更
v13.0.0next/image 更名為 next/legacy/image