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.mzph.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项目 创建成功后&…