<Image> (舊版)
範例
從 Next.js 13 開始,next/image
元件已改寫,以提升效能和開發者體驗。為了提供向後相容的升級方案,舊的 next/image
已重新命名為 next/legacy/image
。
檢視**新的** next/image
API 參考
比較
與 next/legacy/image
相比,新的 next/image
元件有以下變更:
- 移除
<img>
周圍的<span>
包裝器,改用 原生計算的長寬比 - 新增支援標準
style
屬性- 移除
layout
屬性,改用style
或className
- 移除
objectFit
屬性,改用style
或className
- 移除
objectPosition
屬性,改用style
或className
- 移除
- 移除
IntersectionObserver
的實作,改用 原生延遲載入- 移除
lazyBoundary
屬性,因為沒有原生對應項 - 移除
lazyRoot
屬性,因為沒有原生對應項
- 移除
- 移除
loader
設定,改用loader
屬性 - 將
alt
屬性從選用改為必填 - 更改
onLoadingComplete
回呼,使其接收<img>
元素的參考
必填屬性
<Image />
元件需要以下屬性。
src
必須為下列其中一項
當使用預設的 loader 時,來源圖片也需考慮以下事項
- 當 src 為外部網址時,您也必須設定 remotePatterns
- 當 src 為動態圖片或非已知格式 (JPEG, PNG, WebP, AVIF, GIF, TIFF) 時,圖片將會以原始格式提供。
- 當 src 為 SVG 格式時,除非啟用
unoptimized
或dangerouslyAllowSVG
,否則將會被阻擋。
width 和 sizes
屬性。
當使用 layout="intrinsic"
或 layout="fixed"
時,width
屬性表示以像素為單位的 _渲染_ 寬度,因此它會影響圖片顯示的大小。
當使用 layout="responsive"
、layout="fill"
時,width
屬性表示以像素為單位的 _原始_ 寬度,因此它只會影響長寬比。
除了 靜態匯入的圖片 或 layout="fill"
的圖片之外,width
屬性是必需的。
height
height
屬性可以表示以像素為單位的 _渲染_ 高度或 _原始_ 高度,取決於 layout
和 sizes
屬性。
當使用 layout="intrinsic"
或 layout="fixed"
時,height
屬性表示以像素為單位的 _渲染_ 高度,因此它會影響圖片顯示的大小。
當使用 layout="responsive"
、layout="fill"
時,height
屬性表示以像素為單位的 _原始_ 高度,因此它只會影響長寬比。
除了 靜態匯入的圖片 或 layout="fill"
的圖片之外,height
屬性是必需的。
選用屬性
<Image />
元件除了必要的屬性外,還接受許多額外的屬性。本節說明 Image 元件最常用的屬性。有關較少使用的屬性的詳細資訊,請參閱進階屬性一節。
配置
影像在視埠大小變更時的配置行為。
佈局 (layout) | 行為 | srcSet | 尺寸 (sizes) | 包含容器和尺寸調整器 |
---|---|---|---|---|
intrinsic (預設) | 縮小以符合容器寬度,最大不超過影像大小 | 1x 、2x (基於 imageSizes) | 無 | 是 |
fixed | 大小固定為 width 和 height 的值 | 1x 、2x (基於 imageSizes) | 無 | 是 |
responsive | 縮放以符合容器寬度 | 640w 、750w 、... 2048w 、3840w (基於 imageSizes 和 deviceSizes) | 100vw | 是 |
fill | 在 X 和 Y 軸上放大以填滿容器 | 640w 、750w 、... 2048w 、3840w (基於 imageSizes 和 deviceSizes) | 100vw | 是 |
- 示範
intrinsic
配置(預設)- 當使用
intrinsic
時,影像會在較小的視埠中縮小尺寸,但在較大的視埠中維持原始尺寸。
- 當使用
- 示範
fixed
配置- 當使用
fixed
時,影像尺寸不會隨著視埠變化而改變(無響應式),類似於原生img
元素。
- 當使用
- 示範
responsive
配置- 當使用
responsive
時,影像會在較小的視埠中縮小尺寸,在較大的視埠中放大尺寸。 - 請確保父元素在其樣式表中使用
display: block
。
- 當使用
- 示範
fill
配置- 當使用
fill
時,影像會將寬度和高度都拉伸到父元素的尺寸,前提是父元素是相對定位的。 - 這通常會與
objectFit
屬性搭配使用。 - 請確保父元素在其樣式表中使用
position: relative
。
- 當使用
- 示範背景圖片
載入器
一個用於解析網址的客製化函式。在 Image 元件上將載入器設定為 prop 會覆寫在 next.config.js
的 images
區段 中定義的預設載入器。
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 倍的圖片。
深入瞭解 srcset
和 sizes
品質
最佳化圖片的品質,一個介於 1
和 100
之間的整數,其中 100
代表最佳品質。預設值為 75
。
優先順序
當設為 true 時,圖片將被視為高優先順序並預先載入。使用 priority
的圖片會自動停用延遲載入。
您應該在任何被偵測為最大內容繪製 (LCP)元素的圖片上使用 priority
屬性。設定多個優先順序圖片可能是適當的,因為不同圖片可能在不同的視窗大小下成為 LCP 元素。
僅應在圖片顯示在首屏時使用。預設值為 false
。
佔位符
圖片載入時使用的佔位符。可能的值為 blur
或 empty
。預設值為 empty
。
當設為 blur
時,blurDataURL
屬性將被用作佔位符。如果 src
是一個來自靜態匯入的物件,且匯入的圖片是 .jpg
、.png
、.webp
或 .avif
,則 blurDataURL
將會自動填入。
對於動態圖片,您必須提供 blurDataURL
屬性。諸如 Plaiceholder 之類的解決方案可以協助產生 base64
編碼。
當設為 empty
時,圖片載入時將沒有佔位符,只有空白。
試用看看
進階屬性
在某些情況下,您可能需要更進階的用法。<Image />
元件可選用以下進階屬性。
style 樣式
允許將 CSS 樣式傳遞到底層的圖片元素。
請注意,所有 layout
模式都會將其自身的樣式套用至圖片元素,而這些自動樣式會優先於 style
屬性。
同時請記住,必要的 width
和 height
屬性可能會與您的樣式產生交互作用。如果您使用樣式修改圖片的 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
來將此屬性指定給所有圖片
module.exports = {
images: {
unoptimized: true,
},
}
其他屬性
<Image />
元件上的其他屬性將會傳遞到底層的 img
元素,但以下例外:
srcSet
。請改用裝置尺寸。ref
。請改用onLoadingComplete
。decoding
。它永遠是"async"
。
設定選項
遠端模式
注意事項:以上範例將確保
next/legacy/image
的src
屬性必須以https://example.com/account123/
開頭,且不得包含查詢字串。任何其他協定、主機名稱、連接埠或不符的路徑都將回應 400 Bad Request。
以下是 next.config.js
檔案中使用主機名稱萬用字元模式的 remotePatterns
屬性範例:
module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: '**.example.com',
port: '',
search: '',
},
],
},
}
注意事項:以上範例將確保
next/legacy/image
的src
屬性必須以https://img1.example.com
或https://me.avatar.example.com
或任意數量的子網域開頭。它不能包含連接埠或查詢字串。任何其他協定或不符的主機名稱都將回應 400 Bad Request。
萬用字元模式可用於 pathname
和 hostname
,並具有以下語法:
*
匹配單個路徑區段或子網域**
匹配結尾處的任意數量的路徑區段或開頭處的任意數量的子網域
**
語法在模式中間不起作用。
注意事項:省略
protocol
、port
、pathname
或search
時,則隱含萬用字元**
。不建議這樣做,因為這可能會允許惡意行為者優化您不想要的網址。
以下是 next.config.js
檔案中使用 search
的 remotePatterns
屬性範例:
module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'assets.example.com',
search: '?v=1727111025337',
},
],
},
}
注意事項:以上範例將確保
next/legacy/image
的src
屬性必須以https://assets.example.com
開頭,且必須包含完全相同的查詢字串?v=1727111025337
。任何其他協定或查詢字串都將回應 400 Bad Request。
網域
警告:自 Next.js 14 起已棄用,建議改用嚴格的
remotePatterns
設定,以保護您的應用程式免受惡意使用者攻擊。僅在您擁有網域中所有內容的情況下才使用domains
。
與 remotePatterns
類似,domains
設定可用於提供允許外部圖片使用的主機名稱清單。
然而,domains
設定不支援萬用字元模式匹配,也無法限制協議、通訊埠或路徑名稱。
以下是在 next.config.js
檔案中 domains
屬性的範例
module.exports = {
images: {
domains: ['assets.acme.com'],
},
}
載入器設定
如果您想使用雲端供應商來最佳化圖片,而不是使用 Next.js 內建的圖片最佳化 API,您可以在 next.config.js
檔案中設定 loader
和 path
前綴。這允許您使用相對 URL 作為圖片的 src
屬性,並自動為您的供應商產生正確的絕對 URL。
module.exports = {
images: {
loader: 'imgix',
path: 'https://example.com/myaccount/',
},
}
內建載入器
包含以下圖片最佳化雲端供應商
- 預設:使用
next dev
、next start
或自訂伺服器時自動運作 - Vercel
:在 Vercel 上部署時自動運作,無需設定。了解更多 - Imgix
:loader: 'imgix'
- Cloudinary
:loader: 'cloudinary'
- Akamai
:loader: 'akamai'
- 自訂:
loader: 'custom'
透過在next/legacy/image
元件上實作loader
屬性來使用自訂的雲端供應商。
如果您需要不同的供應商,可以使用 next/legacy/image
的 loader
屬性。
使用
output: 'export'
時,圖片無法在建置時進行優化,只能按需優化。要在output: 'export'
中使用next/legacy/image
,您需要使用不同於預設值的載入器。在討論區中閱讀更多資訊。
進階
以下設定適用於進階使用案例,通常不需要設定。如果您選擇設定以下屬性,將會覆蓋未來更新中 Next.js 的任何預設值變更。
裝置尺寸 或 layout="fill"
時,會使用這些寬度,以確保為使用者的裝置提供正確的圖片。
如果未提供設定,則使用以下預設值。
next.config.jsmodule.exports = {
images: {
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
},
}
圖片尺寸
您可以在 next.config.js
檔案中使用 images.imageSizes
屬性指定圖片寬度列表。這些寬度會與 裝置尺寸 的陣列串接,以形成用於產生圖片 srcset 的完整尺寸陣列。
有兩個獨立列表的原因是,imageSizes 僅用於提供 sizes
屬性的圖片,這表示圖片小於螢幕的完整寬度。因此,imageSizes 中的尺寸都應該小於 deviceSizes 中的最小尺寸。
如果未提供設定,則使用以下預設值。
next.config.jsmodule.exports = {
images: {
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
},
}
可接受的格式
預設的圖片優化 API 會自動透過請求的 Accept
標頭偵測瀏覽器支援的圖片格式,以決定最佳的輸出格式。
如果 Accept
標頭符合多個已設定的格式,則會使用陣列中第一個符合的格式。因此,陣列的順序很重要。如果沒有符合的格式(或原始圖片是動畫),圖片優化 API 會 fallback 到原始圖片的格式。
如果未提供設定,則使用以下預設值。
next.config.jsmodule.exports = {
images: {
formats: ['image/webp'],
},
}
您可以啟用 AVIF 支援,並在以下設定中 fallback 到 WebP。
next.config.jsmodule.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-maxage
和 max-age
,則優先使用 s-maxage
。max-age
也會傳遞給任何下游客戶端,包括 CDN 和瀏覽器。
- 您可以設定
minimumCacheTTL
來增加快取持續時間,當上游圖片未包含 Cache-Control
標頭或其值非常低時。
- 您可以設定
deviceSizes
和 imageSizes
來減少可能產生的圖片總數。
- 您可以設定 格式 來停用多種格式,以利於單一圖片格式。
最小快取 TTL
您可以設定已快取最佳化圖片的存留時間 (TTL,以秒為單位)。在許多情況下,最好使用 靜態圖片匯入,它會自動雜湊檔案內容,並使用 immutable
的 Cache-Control
標頭永久快取圖片。
next.config.jsmodule.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.jsmodule.exports = {
images: {
disableStaticImages: true,
},
}
危險地允許 SVG
預設的 載入器 不會最佳化 SVG 圖片,原因有幾個。首先,SVG 是一種向量格式,這表示它可以無損地調整大小。其次,SVG 具有許多與 HTML/CSS 相同的功能,如果沒有適當的 內容安全策略 (CSP) 標頭,可能會導致漏洞。
因此,我們建議在 src
屬性已知為 SVG 時使用 unoptimized
屬性。當 src
以 ".svg"
結尾時,會自動執行此操作。
但是,如果您需要使用預設的圖片最佳化 API 提供 SVG 圖片,您可以在 next.config.js
中設定 dangerouslyAllowSVG
。
next.config.jsmodule.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.jsmodule.exports = {
images: {
contentDispositionType: 'inline',
},
}
動態圖片
預設的 載入器 會自動繞過動態圖片的圖片優化,並按原樣提供圖片。
動態檔案的自動偵測功能會盡力支援 GIF、APNG 和 WebP 格式。如果您想明確繞過特定動態圖片的圖片優化,請使用 unoptimized 屬性。
版本歷史記錄
版本 變更 v13.0.0
next/image
更名為 next/legacy/image
layout="fill"
時,會使用這些寬度,以確保為使用者的裝置提供正確的圖片。
如果未提供設定,則使用以下預設值。
module.exports = {
images: {
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
},
}
圖片尺寸
您可以在 next.config.js
檔案中使用 images.imageSizes
屬性指定圖片寬度列表。這些寬度會與 裝置尺寸 的陣列串接,以形成用於產生圖片 srcset
有兩個獨立列表的原因是,imageSizes 僅用於提供 sizes
屬性的圖片,這表示圖片小於螢幕的完整寬度。因此,imageSizes 中的尺寸都應該小於 deviceSizes 中的最小尺寸。
如果未提供設定,則使用以下預設值。
module.exports = {
images: {
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
},
}
可接受的格式
預設的圖片優化 API 會自動透過請求的 Accept
標頭偵測瀏覽器支援的圖片格式,以決定最佳的輸出格式。
如果 Accept
標頭符合多個已設定的格式,則會使用陣列中第一個符合的格式。因此,陣列的順序很重要。如果沒有符合的格式(或原始圖片是動畫),圖片優化 API 會 fallback 到原始圖片的格式。
如果未提供設定,則使用以下預設值。
module.exports = {
images: {
formats: ['image/webp'],
},
}
您可以啟用 AVIF 支援,並在以下設定中 fallback 到 WebP。
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-maxage
和 max-age
,則優先使用 s-maxage
。max-age
也會傳遞給任何下游客戶端,包括 CDN 和瀏覽器。
- 您可以設定
minimumCacheTTL
來增加快取持續時間,當上游圖片未包含Cache-Control
標頭或其值非常低時。 - 您可以設定
deviceSizes
和imageSizes
來減少可能產生的圖片總數。 - 您可以設定 格式 來停用多種格式,以利於單一圖片格式。
最小快取 TTL
您可以設定已快取最佳化圖片的存留時間 (TTL,以秒為單位)。在許多情況下,最好使用 靜態圖片匯入,它會自動雜湊檔案內容,並使用 immutable
的 Cache-Control
標頭永久快取圖片。
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
中停用靜態圖片匯入。
module.exports = {
images: {
disableStaticImages: true,
},
}
危險地允許 SVG
預設的 載入器 不會最佳化 SVG 圖片,原因有幾個。首先,SVG 是一種向量格式,這表示它可以無損地調整大小。其次,SVG 具有許多與 HTML/CSS 相同的功能,如果沒有適當的 內容安全策略 (CSP) 標頭,可能會導致漏洞。
因此,我們建議在 src
屬性已知為 SVG 時使用 unoptimized
屬性。當 src
以 ".svg"
結尾時,會自動執行此操作。
但是,如果您需要使用預設的圖片最佳化 API 提供 SVG 圖片,您可以在 next.config.js
中設定 dangerouslyAllowSVG
。
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
,允許瀏覽器在直接訪問時渲染圖片,而無需下載。
module.exports = {
images: {
contentDispositionType: 'inline',
},
}
動態圖片
預設的 載入器 會自動繞過動態圖片的圖片優化,並按原樣提供圖片。
動態檔案的自動偵測功能會盡力支援 GIF、APNG 和 WebP 格式。如果您想明確繞過特定動態圖片的圖片優化,請使用 unoptimized 屬性。
版本歷史記錄
版本 | 變更 |
---|---|
v13.0.0 | next/image 更名為 next/legacy/image |