SvelteKit 最新中文文檔教程(21)—— 最佳實踐之圖片

前言

Svelte,一個語法簡潔、入門容易,面向未來的前端框架。

從 Svelte 誕生之初,就備受開發者的喜愛,根據統計,從 2019 年到 2024 年,連續 6 年一直是開發者最感興趣的前端框架 No.1

image.png

Svelte 以其獨特的編譯時優化機制著稱,具有輕量級高性能易上手等特性,非常適合構建輕量級 Web 項目

為了幫助大家學習 Svelte,我同時搭建了 Svelte 最新的中文文檔站點。

如果需要進階學習,也可以入手我的小冊《Svelte 開發指南》,語法篇、實戰篇、原理篇三大篇章帶你系統掌握 Svelte!

歡迎圍觀我的“網頁版朋友圈”、加入“冴羽·成長陪伴社群”,踏上“前端大佬成長之路”。

圖片

圖片會對您的應用性能產生重大影響。為了獲得最佳效果,您應該通過以下方式優化它們:

  • 生成最優格式如 .avif.webp
  • 為不同的屏幕創建不同尺寸的圖片
  • 確保資源可以被有效緩存

手動完成這些工作很繁瑣。根據您的需求和偏好,您可以使用多種技術。

Vite 的內置處理

Vite 會自動處理導入的資源以提升性能。這包括通過 CSS url() 函數引用的資源。文件名中會添加哈希值以便緩存,小于 assetsInlineLimit 的資源會被內聯。Vite 的資源處理最常用于圖片,但對視頻、音頻等也很有用。

<script>import logo from '$lib/assets/logo.png';
</script><img alt="項目標志" src={logo} />

@sveltejs/enhanced-img

@sveltejs/enhanced-img 是在 Vite 內置資源處理基礎上提供的插件。它提供即插即用的圖片處理功能,可以提供更小的文件格式如 avifwebp,自動設置圖片的固有 widthheight 以避免布局偏移,為各種設備創建多種尺寸的圖片,并出于隱私考慮去除 EXIF 數據。它可以在任何基于 Vite 的項目中使用,包括但不限于 SvelteKit 項目。

[!NOTE] 作為構建插件,@sveltejs/enhanced-img 只能在構建過程中優化位于您機器上的文件。如果您的圖片位于其他位置(如從數據庫、CMS 或后端服務的路徑),請閱讀從 CDN 動態加載圖片。

警告@sveltejs/enhanced-img 包是實驗性的。它使用 1.0 之前的版本號,每個小版本發布可能會引入破壞性變更。

設置

安裝:

npm install --save-dev @sveltejs/enhanced-img

調整 vite.config.js

import { sveltekit } from '@sveltejs/kit/vite';
+++import { enhancedImages } from '@sveltejs/enhanced-img';+++
import { defineConfig } from 'vite';export default defineConfig({plugins: [+++enhancedImages(),+++sveltekit()]
});

由于轉換圖片的計算開銷,第一次構建會花費更長時間。但是,構建輸出會被緩存在 ./node_modules/.cache/imagetools 中,因此后續的構建會很快。

基本用法

在你的 .svelte 組件中使用 <enhanced:img> 而不是<img>,并通過 Vite 資源導入 路徑引用圖片文件:

<enhanced:img src="./path/to/your/image.jpg" alt="An alt text" />

在構建時,您的 <enhanced:img> 標簽將被 <img> 替換,并由 <picture> 包裝,提供多種圖片類型和尺寸。在不損失質量的情況下只能對圖片進行縮小,這意味著你應該提供所需的最高分辨率圖片——系統會為可能請求圖片的各種設備類型生成較小的版本。

你應該為 HiDPI 顯示器(又稱視網膜顯示器)提供 2x 分辨率的圖片。<enhanced:img> 會自動負責向較小的設備提供較小版本的圖片。

如果你想為 <enhanced:img> 添加樣式,你應該添加一個 class 并針對它進行設置。

動態選擇圖像

您也可以手動導入圖片資源并將其傳遞給 <enhanced:img>。當您有一組靜態圖片并想要動態選擇或遍歷它們時,這種方法很有用。在這種情況下,您需要同時更新 import 語句和 <img> 元素,如下所示,以表明您想要處理它們。

<script>import MyImage from './path/to/your/image.jpg?enhanced';
</script><enhanced:img src={MyImage} alt="some alt text" />

你也可以使用 Vite 的 import.meta.glob。請注意,你需要通過自定義查詢來指定 enhanced

<script>const imageModules = import.meta.glob('/path/to/assets/*.{avif,gif,heif,jpeg,jpg,png,tiff,webp,svg}',{eager: true,query: {enhanced: true}})
</script>{#each Object.entries(imageModules) as [_path, module]}<enhanced:img src={module.default} alt="some alt text" />
{/each}

固有尺寸

widthheight 是可選的,因為它們可以從源圖像中推斷出來,并且在預處理 <enhanced:img> 標簽時會自動添加。有了這些屬性,瀏覽器可以保留正確的空間,防止布局偏移。

如果你想使用不同的 widthheight,你可以用 CSS 來設置圖像樣式。由于預處理器會為你添加 widthheight,如果你想要其中一個尺寸自動計算,那么你需要指定這一點:

<style>.hero-image img {width: var(--size);height: auto;}
</style>

srcsetsizes

如果你有一個大圖像,比如占據設計寬度的主圖,你應該指定 sizes,這樣在較小的設備上就會請求較小版本的圖像。例如,如果你有一個 1280px 的圖像,你可能想要指定類似這樣的內容:

<enhanced:img src="./image.png" sizes="min(1280px, 100vw)"/>

如果指定了 sizes<enhanced:img> 將為較小的設備生成小尺寸圖片,并填充 srcset 屬性。

自動生成的最小圖片寬度為 540px。如果你需要更小的圖片或想要指定自定義寬度,可以使用 w 查詢參數:

<enhanced:imgsrc="./image.png?w=1280;640;400"sizes="(min-width:1920px) 1280px, (min-width:1080px) 640px, (min-width:768px) 400px"
/>

如果未提供 sizes,則將生成一個 HiDPI/Retina 圖像和一個標準分辨率圖像。您提供的圖像應該是您希望顯示分辨率的 2 倍,以便瀏覽器可以在具有高設備像素比的設備上顯示該圖像。

每個圖像的轉換

默認情況下,增強的圖像將被轉換為更高效的格式。但是,你可能希望應用其他轉換,如模糊、質量調整、扁平化或旋轉操作。你可以通過附加查詢字符串來執行每個圖像的轉換:

<enhanced:img src="./path/to/your/image.jpg?blur=15" alt="An alt text" />

查看 imagetools 倉庫以獲取完整的指令列表。.

從 CDN 動態加載圖片

在某些情況下,圖片在構建時可能無法訪問 —— 例如,它們可能存儲在內容管理系統或其他地方。

使用內容分發網絡(CDN)可以讓你動態優化這些圖片,并在尺寸方面提供更多靈活性,但可能需要一些設置開銷和使用成本。根據緩存策略,在從 CDN 收到 304 響應之前,瀏覽器可能無法使用資源的緩存副本。構建面向 CDN 的 HTML 允許使用 <img> 標簽,因為 CDN 可以根據 User-Agent 頭部提供適當的格式,而構建時優化必須生成帶有多個源的 <picture> 標簽。最后,某些 CDN 可能會延遲生成圖片,這可能會對低流量且圖片頻繁更改的網站的性能產生負面影響。

CDN 通常可以直接使用,無需任何庫。然而,有許多支持 Svelte 的庫可以讓使用變得更簡單。@unpic/svelte 是一個支持大量提供商的與 CDN 無關的庫。你可能還會發現一些特定的 CDN(如 Cloudinary)有 Svelte 支持。最后,一些支持 Svelte 的內容管理系統(CMS)(如 Contentful、Storyblok 和 Contentstack 都內置了圖像處理支持。

最佳實踐

  • 對于每種圖片類型,使用上述討論過的適當解決方案。你可以在一個項目中混合使用這三種解決方案。例如,你可以使用 Vite 的內置處理來為 <meta> 標簽提供圖片,使用 @sveltejs/enhanced-img 在主頁上顯示圖片,并使用動態方法顯示用戶提交的內容。
  • 考慮通過 CDN 提供所有圖片服務,無論你使用何種圖片優化類型。CDN 通過在全球分發靜態資源副本來減少延遲。
  • 原始圖片應具有良好的質量/分辨率,并且寬度應該是顯示寬度的 2 倍,以便支持 HiDPI 設備。圖片處理可以將圖片尺寸縮小以在服務較小屏幕時節省帶寬,但為了放大圖片而創造像素會浪費帶寬。
  • 對于遠大于移動設備寬度(大約400px)的圖片,例如占據頁面設計寬度的主圖,指定 sizes 以便在較小設備上提供較小的圖片。
  • 對于重要圖片,例如最大內容繪制(LCP)圖片,設置 fetchpriority="high" loading="eager" 以盡早優先加載。
  • 為圖片提供容器或樣式,使其受到約束,不會在頁面加載時跳動影響累積布局偏移(CLS)。widthheight 幫助瀏覽器在圖片仍在加載時預留空間,因此 @sveltejs/enhanced-img 將為你添加 widthheight
  • 始終提供良好的 alt 文本。如果你沒有這樣做,Svelte編譯器會發出警告。
  • 不要在 sizes 中使用 emrem 并更改這些度量的默認大小。當在 sizes@media 查詢中使用時,emrem 都被定義為用戶的默認 font-size。對于像 sizes="(min-width: 768px) min(100vw, 108rem), 64rem" 這樣的 sizes 聲明,控制圖片在頁面上布局方式的實際 emrem 如果被 CSS 更改可能會有所不同。例如,不要做類似 html { font-size: 62.5%; } 這樣的事情,因為瀏覽器預加載器預留的空間現在會比創建后的 CSS 對象模型的實際空間更大。

Svelte 中文文檔

點擊查看中文文檔:SvelteKit 圖片

系統學習 Svelte,歡迎入手小冊《Svelte 開發指南》。語法篇、實戰篇、原理篇三大篇章帶你系統掌握 Svelte!

此外我還寫過 JavaScript 系列、TypeScript 系列、React 系列、Next.js 系列、冴羽答讀者問等 14 個系列文章, 全系列文章目錄:https://github.com/mqyqingfeng/Blog

歡迎圍觀我的“網頁版朋友圈”、加入“冴羽·成長陪伴社群”,踏上“前端大佬成長之路”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901751.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901751.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901751.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

健康養生:開啟活力生活的密鑰

當我們在健身房看到年逾六旬卻身形矯健的老人&#xff0c;在公園偶遇精神矍鑠、步伐輕快的長者&#xff0c;總會驚嘆于他們的健康狀態。其實&#xff0c;這些都得益于長期堅持科學的養生之道。健康養生并非遙不可及的玄學&#xff0c;而是融入生活細節的智慧。? 在飲食的世界…

Linux信號三部曲:產生機制、處理方式與內核接口

Linux系列 文章目錄 Linux系列前言一、背景知識鋪墊1.1 信號的基本概念1.2 進程對信號的處理 二、信號的產生2.1 前臺進程和后臺進程2.2 鍵盤組合鍵2.3 kill 命令2.4 系統調用2.4.1 signal()接口2.4.2 kill()接口2.4.3 raise()接口2.4.4 abort()接口 總結 前言 Linux中&#x…

win7/win10/macos如何切換DNS,提升網絡穩定性

本篇教程教您如何在Windows10、Windows8.1、Windows7、MacOS操作系統切換DNS&#xff0c;以提升系統的穩定性&#xff0c;獲得更好的操作體驗。 Windows10及Windows8.1 1、右鍵單擊“此計算機”&#xff0c;然后選擇“屬性”。進入Windows系統界面后&#xff0c;選擇左側的“…

移動硬盤突然打不開緊急救援指南:從排查到完整恢復?

突發狀況的典型特征? 當移動硬盤突然打不開時&#xff0c;用戶常會遇到多種異常表現&#xff1a;接入電腦后硬盤指示燈雖亮但無法識別、系統反復提示“設備未連接成功”或彈出“磁盤結構損壞”的警告。部分情況下&#xff0c;資源管理器中的盤符雖可見&#xff0c;但雙擊后顯示…

華為OD機試真題——統計匹配的二元組個數(2025A卷:100分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析&#xff1b; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式&#xff01; 2025華為OD真題目錄全流程解析/備考攻略/經驗分享 華為OD機試真題《統計匹配…

半導體制造如何數字化轉型

半導體制造的數字化轉型正通過技術融合與流程重構&#xff0c;推動著這個精密產業的全面革新。全球芯片短缺與工藝復雜度指數級增長的雙重壓力下&#xff0c;頭部企業已構建起四大轉型支柱&#xff1a; 1. 數據中樞重構產線生態 臺積電的「智慧工廠4.0」部署著30萬物聯網傳感器…

[Spark]深入解密Spark SQL源碼:Catalyst框架如何優雅地解析你的SQL

本文內容組織形式 總結具體例子執行語句解析層優化層物理計劃層執行層 猜你喜歡PS 總結 先寫個總結&#xff0c;接下來會分別產出各個部分的源碼解析&#xff0c;Spark SQL主要分為以下五個執行部分。 具體例子 接下來舉個具體的例子來說明 執行語句 SELECT name, age FR…

【數據結構】4.單鏈表實現通訊錄

在上一篇文章我們學會了用單鏈表來實現各種方法&#xff0c;在這一篇文章我們將在單鏈表的基礎上實現通訊錄。 0、準備工作 實現通訊錄之前&#xff0c;我們還需要在單鏈表的基礎上添加2個文件&#xff0c;頭文件Contact.h和源文件Contact.c。Contact.c來實現通訊錄方法的聲明…

【bash】.bashrc

查看當前路徑文件數量 alias file_num"ls -l | grep ^- | wc -l"查看文件大小 alias file_size"du -sh"alias ll alias ll"ls -ltrh"cd的同時執行ll alias cdcdls; function cdls() {builtin cd "$1" && ll }自定義prompt…

微信小程序實戰案例 - 餐館點餐系統 階段 2 – 購物車

階段?2 – 購物車&#xff08;超詳細版&#xff09; 目標 把“加入購物車”做成 全局狀態&#xff0c;任何頁面都能讀寫在本地 持久化&#xff08;關閉小程序后購物車仍在&#xff09;新建 購物車頁&#xff1a;數量增減、總價實時計算、去結算入口打 Git?Tag v2.0?cart 1. …

從紅黑樹到哈希表:原理對比與典型場景應用解析(分布式以及布隆過濾器)

在數據結構的世界里&#xff0c;紅黑樹一直以「自平衡二叉查找樹」的身份備受贊譽。憑借紅黑節點的精妙設計&#xff0c;它能將插入、刪除、查找的時間復雜度穩定控制在 ( log ? n ) (\log n) (logn)&#xff0c;成為處理有序數據的經典方案。然而&#xff0c;當業務場景對「…

游戲報錯?MFC140.dll怎么安裝才能解決問題?提供多種MFC140.dll丟失修復方案

MFC140.dll 是 Microsoft Visual C 2015 運行庫的重要組成部分&#xff0c;許多軟件和游戲依賴它才能正常運行。如果你的電腦提示 "MFC140.dll 丟失" 或 "MFC140.dll 未找到"&#xff0c;說明系統缺少該文件&#xff0c;導致程序無法啟動。本文將詳細介紹 …

《電子類專業:通往科技未來的鑰匙》

一、電子類專業全景概覽 在當今科技飛速發展的時代,電子類專業無疑占據著現代科技體系中基礎與核心的重要地位。從我們日常生活中不可或缺的智能手機、電腦,到推動社會進步的人工智能、大數據技術,再到探索宇宙奧秘的航天航空設備,電子類專業的身影無處不在。它就像一把萬…

Java--批量刪除

前端部分 前端代碼主要負責收集用戶選擇的學生記錄的 id&#xff0c;并將這些 id 發送給后端的 DeleteMoreServlet 進行處理。 批量刪除按鈕綁定點擊事件 $(".deleteMore").on("click",function(){// ... }); 當用戶點擊 “批量刪除” 按鈕時&#xff…

2025年4月份生活有感

今天在5000B培訓的下午&#xff0c;一起入所來的小伙伴&#xff0c;有個申請了深圳大學的博士&#xff0c;已錄取。哎&#xff0c;想起了當年申博時候信心和決心不足&#xff0c;導致后面匆匆的拿了offer去工作。看到同事的選擇還是非常羨慕&#xff0c;想到自己5月份的婚禮&am…

數學建模學習資料免費分享:歷年賽題與優秀論文、算法課程、數學軟件等

本文介紹并分享自己當初準備數學建模比賽時&#xff0c;收集的所有資料&#xff0c;包括歷年賽題與論文、排版模板、算法講解課程與書籍、評分標準、數學建模軟件等各類資料。 最近&#xff0c;準備將自己在學習過程中&#xff0c;到處收集到的各類資料都整理一下&#xff0c;并…

關于 微服務負載均衡 的詳細說明,涵蓋主流框架/解決方案的對比、核心功能、配置示例及總結表格

以下是關于 微服務負載均衡 的詳細說明&#xff0c;涵蓋主流框架/解決方案的對比、核心功能、配置示例及總結表格&#xff1a; 1. 負載均衡的核心概念 負載均衡在微服務中用于將請求分發到多個服務實例&#xff0c;以實現&#xff1a; 高可用性&#xff1a;避免單點故障。性…

個人博客搭建過程

嘗試博客搭建,前面注冊部分很簡單&#xff0c;就不寫了&#xff0c;以我看到的一個博客為基礎&#xff0c;加上我自己的測試結束 1.官網 https://dash.infinityfree.com 前半部分參考&#xff1a; 使用Infinityfree免費虛擬主機搭建一個wordpress網站 2.創建賬戶或登錄您的…

Proxmox VE 網絡配置命令大全

如果對 Proxmox VE 全棧管理感興趣&#xff0c;可以關注“Proxmox VE 全棧管理”專欄&#xff0c;后續文章將圍繞該體系&#xff0c;從多個維度深入展開。 概要&#xff1a;Proxmox VE 網絡配置靈活&#xff0c;滿足虛擬化組網需求。基礎靠橋接實現虛擬機與物理網絡互聯&#x…

【QT入門到晉級】QT打動態庫包及引入動態庫包

前言 本篇為持續更新狀態&#xff0c;內容包含window、Linux下打動態庫包&#xff0c;以及引入動態庫包的方式。 一、window 1、動態庫打包 以百度的OCR接口調用打dll庫為例&#xff0c;以下為qtcreator創建動態庫過程&#xff1a; 1.1Qtcreator創建lib項目 創建成功后&…