SvelteKit 最新中文文档教程(20)—— 最佳实践之性能
前言
Svelte,一个语法简洁、入门容易,面向未来的前端框架。
从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:

Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构建轻量级 Web 项目。
为了帮助大家学习 Svelte,我同时搭建了 Svelte 最新的中文文档站点。
如果需要进阶学习,也可以入手我的小册《Svelte 开发指南》,语法篇、实战篇、原理篇三大篇章带你系统掌握 Svelte!
欢迎围观我的“网页版朋友圈”、加入“冴羽·成长陪伴社群”,踏上“前端大佬成长之路”。
性能
SvelteKit 开箱即用地做了很多工作来使您的应用程序尽可能高效:
- 代码分割,因此只加载当前页面所需的代码
- 资源预加载,防止出现"瀑布(waterfalls)"(文件请求其他文件的情况)
- 文件哈希,使您的资源可以永久缓存
- 请求合并,将从不同服务端
load函数获取的数据合并成单个 HTTP 请求 - 并行加载,不同的通用
load函数同时获取数据 - 数据内联,服务端渲染期间使用
fetch发出的请求可以在浏览器中重放而无需重新发出请求 - 保守的失效处理,因此
load函数仅在必要时重新运行 - 预渲染(如有必要,可按路由配置),使没有动态数据的页面可以立即提供服务
- 链接预加载,以便提前主动获取客户端导航所需的数据和代码
尽管如此,我们(尚)不能消除所有导致性能下降的因素。要获得最大性能,您应该注意以下建议。
诊断问题
Google 的 PageSpeed Insights 和(用于更高级分析的)WebPageTest 是了解已部署到互联网的网站性能特征的出色工具。
您的浏览器还包含有用的开发者工具,用于分析您的网站,无论是已部署还是在本地运行:
- Chrome - Lighthouse、Network 和 Performance 开发工具
- Edge - Lighthouse、Network 和 Performance 开发工具
- Firefox - Network 和 Performance 开发工具
- Safari - 提升网页性能
请注意,在 dev 模式下本地运行的网站会表现出与生产应用程序不同的行为,因此您应该在构建后在预览模式下进行性能测试。
检测
如果您在浏览器的网络标签中看到 API 调用耗时过长,想了解原因,您可以考虑使用 OpenTelemetry 或 Server-Timing 头 等工具来检测您的后端。
优化资源
图片
减小图片文件的大小通常是对网站性能影响最大的改变之一。Svelte 提供了 @sveltejs/enhanced-img 包,详见图片页面,可以让这个过程更容易。此外,Lighthouse 对识别性能影响最大的图片很有帮助。
视频
视频文件可能非常大,因此应特别注意确保它们经过优化:
- 使用 Handbrake 等工具压缩视频。考虑将视频转换为
.webm或.mp4等 web 友好的格式。 - 您可以使用
preload="none"对折叠区域以下的视频进行延迟加载(但请注意,这会在用户开始播放时减慢播放速度)。 - 使用 FFmpeg 等工具从静音视频中删除音轨。
字体
当用户访问页面时,SvelteKit 会自动预加载关键的 .js 和 .css 文件,但默认情况下不会预加载字体,因为这可能会导致下载不必要的文件(例如 CSS 中引用但实际上在当前页面上未使用的字体粗细)。话虽如此,正确预加载字体可以对网站的速度感知产生很大影响。在您的 handle hook 中,您可以使用包含字体的 preload 过滤器调用 resolve。
通过子集化字体,您可以减小字体文件的大小。
减少代码大小
Svelte 版本
我们推荐使用最新版本的 Svelte。Svelte 5 比 Svelte 4 更小更快,而 Svelte 4 又比 Svelte 3 更小更快。
包
rollup-plugin-visualizer 可以帮助识别哪些包对网站大小贡献最大。您还可以通过手动检查构建输出发现删除代码的机会(在您的 Vite 配置中使用 build: { minify: false } 使输出可读,但记得在部署应用程序之前撤销此更改),或通过浏览器开发工具的网络标签。
外部脚本
尽量减少在浏览器中运行的第三方脚本数量。例如,与其使用基于 JavaScript 的分析工具,不如考虑使用服务端实现,比如许多带有 SvelteKit 适配器的平台,包括 Cloudflare、Netlify 和 Vercel 所提供的解决方案。
要在 Web Worker 中运行第三方脚本(避免阻塞主线程),请使用 Partytown 的 SvelteKit 集成。
选择性加载
使用静态 import 声明导入的代码将自动与页面的其余部分打包在一起。如果某段代码仅在满足特定条件时才需要,请使用动态 import(...) 形式来选择性地延迟加载组件。
导航
预加载
您可以使用链接选项预先加载必要的代码和数据来加快客户端导航。当您创建新的 SvelteKit 应用程序时,<body> 元素上是默认有配置的。
非必要数据
对于加载缓慢且不需要立即使用的数据,从 load 函数返回的对象可以包含 promise 而不是数据本身。对于服务端 load 函数,这将导致数据在导航(或初始页面加载)后流式传输。
防止瀑布问题
最大的性能杀手之一是所谓的瀑布问题,即一系列按顺序发出的请求。这可能发生在服务端或浏览器中。
- 当您的 HTML 请求 JS,然后请求 CSS,然后请求背景图片和网络字体时,可能会在浏览器中出现资源瀑布。SvelteKit 通过添加
modulepreload标签或头部,将为您解决这类问题,但您应该查看开发工具中的网络标签以检查是否需要预加载其他资源。如果您使用网络字体,请特别注意这一点,因为它们需要手动处理。 - 如果通用
load函数发起 API 调用来获取当前用户,然后使用该响应中的详细信息来获取已保存项目的列表,然后使用该响应来获取每个项目的详细信息,浏览器最终将发出多个顺序请求。这对性能来说是致命的,尤其是对于物理位置远离您后端的用户。在可能的情况下使用服务端load函数来避免这个问题。 - 服务端
load函数也不能免疫瀑布问题(尽管它们的代价要小得多,因为它们很少涉及高延迟的往返)。例如,如果您查询数据库以获取当前用户,然后使用该数据进行第二次查询以获取已保存项目的列表,使用带有数据库连接的单个查询通常会更高效。
托管
为了最小化延迟,你的前端应该与后端位于同一数据中心。对于没有中央后端的站点,许多 SvelteKit 适配器支持部署到 edge,这意味着从离用户最近的服务器处理每个用户的请求。这可以显著减少加载时间。一些适配器甚至支持按路由配置部署。您还应该考虑从 CDN(通常是 edge 网络)提供图片服务 — 许多 SvelteKit 适配器的主机会自动完成这项工作。
确保您的主机使用 HTTP/2 或更新版本。Vite 的代码分割创建了许多小文件以提高缓存能力,这会带来出色的性能表现,但这建立在您的文件可以通过 HTTP/2 并行加载的前提下。
延伸阅读
在大多数情况下,构建高性能的 SvelteKit 应用程序与构建任何高性能的 Web 应用程序是一样的。您应该能够将这些来自通用性能资源(如 Core Web Vitals)的信息应用到任何您构建的 Web 体验中。
Svelte 中文文档
点击查看中文文档:SvelteKit 性能
系统学习 Svelte,欢迎入手小册《Svelte 开发指南》。语法篇、实战篇、原理篇三大篇章带你系统掌握 Svelte!
此外我还写过 JavaScript 系列、TypeScript 系列、React 系列、Next.js 系列、冴羽答读者问等 14 个系列文章, 全系列文章目录:https://github.com/mqyqingfeng/Blog
欢迎围观我的“网页版朋友圈”、加入“冴羽·成长陪伴社群”,踏上“前端大佬成长之路”。
相关文章:
SvelteKit 最新中文文档教程(20)—— 最佳实践之性能
前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...
在多系统环境中实现授权闭环,Tetra Pak 借助CodeMeter打造食品工业的安全自动化体系
一、 行业背景与安全新挑战 在食品加工自动化不断深化的背景下,食品安全、功能安全与知识产权保护的需求日益迫切。Tetra Pak 作为全球领先的食品加工和包装解决方案提供商,业务遍布 160 多个国家,涵盖从配料混合、碳酸化处理到全线自动包装。…...
复数概念的演进 3 —— 复数的意义
注:本文为 “从三次方程到复平面:复数概念的演进” 相关文章合辑。 因 csdn 篇幅限制分篇连载,此为第 3 篇。 生料合辑,同主题文章未整理去重。 机翻,未校。 Complex number and its discovery history 复数及其发…...
三菱PLC
三菱PLC通信协议及读写 引言 三菱PLC(Programmable Logic Controller,可编程逻辑控制器)是工业自动化领域中广泛使用的一款PLC品牌。三菱PLC支持多种通信协议,包括Modbus、Ethernet/IP、Melsec Net等。本文将详细介绍三菱PLC的通…...
B端可视化方案,如何助力企业精准决策,抢占市场先机
在当今竞争激烈的商业环境中,企业需要快速、准确地做出决策以抢占市场先机。B端可视化方案通过将复杂的企业数据转化为直观的图表和仪表盘,帮助企业管理层和业务人员快速理解数据背后的业务逻辑,从而做出精准决策。本文将深入探讨B端可视化方…...
0701表单组件-react-仿低代码平台项目
文章目录 1 react表单组件1.1 受控组件 (Controlled Components)示例代码: 1.2 非受控组件 (Uncontrolled Components)示例代码: 2 AntD表单组件实战2.1 开发搜索功能2.2 开发注册页2.3 开发登录页2.4 表单组件校验 结语 1 react表单组件 input表单组件…...
【adb】bat批处理+adb 自动亮屏,自动解锁屏幕,启动王者荣耀
准备adb 下载 需要确认是否安装了adb.exe文件,可以在: 任务管理器 -->详细信息–>找一下后台运行的adb 安装过anroid模拟器,也存在adb,例如:雷电安装目录 D:\leidian\LDPlayer9 单独下载adb 官方下载地址:[官方网址] 下载目录文件: 测试adb USB连接手机 首先在设置界…...
Distortion, Animation Raymarching
这节课的主要目的是对uv进行操作,实现一些动画的效果,实际就是采样的动画 struct texDistort {float2 texScale(float2 uv, float2 scale){float2 texScale (uv - 0.5) * scale 0.5;return texScale;}float2 texRotate(float2 uv, float angle){float…...
SpringBoot整合POI实现Excel文件的导出与导入
使用 Apache POI 操作 Excel文件,系列文章: 《SpringBoot整合POI实现Excel文件的导出与导入》 《SpringMVC实现文件的上传与下载》 《C#使用NPOI导出Excel文件》 《NPOI使用手册》 1、Apache POI 的介绍 Apache POI 是一个基于 Java 的开源库,专为读写 Microsoft Office 格…...
LeetCode 2537.统计好子数组的数目:滑动窗口(双指针)
【LetMeFly】2537.统计好子数组的数目:滑动窗口(双指针) 力扣题目链接:https://leetcode.cn/problems/count-the-number-of-good-subarrays/ 给你一个整数数组 nums 和一个整数 k ,请你返回 nums 中 好 子数组的数目。 一个子数组 arr 如果…...
矩阵基础+矩阵转置+矩阵乘法+行列式与逆矩阵
GPU渲染过程 矩阵 什么是矩阵(Matrix) 向量 (3,9,88) 点乘:计算向量夹角 叉乘:计算两个向量构成平面的法向量。 矩阵 矩阵有3行,2列,所以表示为M32 获取固…...
(EtherCAT 转 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
型号 协议转换通信网关 EtherCAT 转 EtherNet/IP MS-GW12 概述 MS-GW12 是 EtherCAT 和 EtherNet/IP 协议转换网关,为用户提供两种不同通讯协议的 PLC 进行数据交互的解决方案,可以轻松容易将 EtherNet/IP 网络接入 EtherCAT 网络中,方便…...
分享:批量提取图片文字并自动命名文件,ocr识别图片指定区域并重命名文件名工具,基于WPF和腾讯OCR识别的接口的视线方案
一、项目背景 在处理大量图片时,常常需要从图片中提取特定区域的文字信息,并依据这些信息对图片进行重命名。例如,在档案管理领域,大量纸质文件被扫描成图片后,需要从图片中提取关键信息(如文件编号、日期等)来重命名图片,以便后续的检索和管理;在电商领域,商家可能…...
Mysql读写分离(1)-服务器的设置(主从复制)
1.简介 随着网站访问和请求量的增加,单台数据库服务器的连接已耗尽,会出现连接请求还在等待,或是数据库服务器崩溃等现象,这时候我们考虑如何减少数据库的连接,可以通过优化代码、使用缓存、数据库读写分离等方式解决…...
STM32F103ZET6移植FATFS文件系统教程(W25Q32)
一、FATFS核心特性 跨平台支持 支持FAT12/FAT16/FAT32格式,兼容Windows文件系统; 采用标准C语言编写,代码量小且支持RTOS。 配置灵活性 通过宏定义实现功能裁剪,例如: FF_FS_READONLY:设为1时禁…...
STM32 模块化开发实战指南:系列介绍
本文是《STM32 模块化开发实战指南》系列的导读篇,旨在介绍整个系列的写作目的、适用读者、技术路径和每一篇的主题规划。适合从事 STM32、裸机或 RTOS 嵌入式开发的个人开发者、初创工程师或企业项目团队。 为什么要写这个系列? 在嵌入式开发中,很多人刚开始都是从点亮一个…...
AF3 create_alignment_db_sharded脚本create_shard函数解读
AlphaFold3 create_alignment_db_sharded 脚本在源代码的scripts/alignment_db_scripts文件夹下。 该脚本中的 create_shard 函数的功能是将一部分链(shard_files)中的所有对齐文件写入一个 .db 文件,并返回这些链的索引信息(字节…...
【Python语言基础】21、Python标准库
文章目录 1. 标准库1.1 标准库构成及特点1.2 常见分类和模块1.3 标准库使用 1. 标准库 Python 标准库就像是 Python 自带的 “百宝箱”,里面装了各种各样已经写好的工具,你在编程的时候可以直接拿来用,不用自己再费劲去编写。 什么是标准库 …...
数据库脱裤
假设你已经getshell 找到mysql账号密码。 网站要连接mysql,就需要把mysql的账号密码保存在一个php文件中,类似config.php、common.inc.php等,在shell中,读取这些文件,找到其中信息即可 下面是一些常见平台的配置文…...
信刻电子档案蓝光光盘刻录安全检测长期归档
信刻一直致力于为档案馆、各行业档案部门,提供跨网数据交换、电子档案数据磁光异质备份归档解决方案。所研制的电子档案光盘智能长期归档系统,满足国产环境下”刻、管、存、检、用”全生命周期管理应用需求,能够提供一份离线归档、一份近线存…...
vue3中,element-plus中el-input的v-model和value的用法示例
el-input的v-model,邦定响应式变量 <el-col :span"6"><el-form-item label"检验类别" prop"verifyType"><el-input v-model"applyAllInfo.applyBasicInfo.verifyTypeName" readonly /></el-form-item…...
文章记单词 | 第33篇(六级)
一,单词释义 poison [ˈpɔɪzn] n. 毒药;毒物;有害的思想(或心情等);vt. 毒死;毒害;下毒;在… 中放毒;污染;adj. 有毒的justification [ˌdʒʌ…...
深度学习算法:从基础到实践
简介 深度学习作为人工智能领域的一个重要分支,近年来在多个领域取得了显著的成就。本文将从基础概念出发,探讨深度学习算法的核心原理,并介绍一些实际应用案例。 深度学习算法的核心概念 深度学习算法基于人工神经网络,通过构…...
L2-052 吉利矩阵分
L2-052 吉利矩阵 - 团体程序设计天梯赛-练习集 所有元素为非负整数,且各行各列的元素和都等于 7 的 33 方阵称为“吉利矩阵”,因为这样的矩阵一共有 666 种。 本题就请你统计一下,把 7 换成任何一个 [2,9] 区间内的正整数 L,把矩…...
计算机网络中各种物理量的单位总结
在计算机网络中,数据速率的单位容易混淆,以下是清晰总结: 一、基本单位区分 比特(bit)与字节(Byte) 小写 b 表示 比特(bit),是数据传输的基本单位。 大写 B…...
Solidity私有函数和私有变量区别,私有变量可以被访问吗
web3面试题 私有函数和私有变量区别,私有变量可以被访问吗 ChatGPT said: 在 Web3 开发,尤其是使用 Solidity 编写智能合约时,关于私有函数和私有变量的区别是常见的面试题。下面是详细解析: ✅ 私有函数(Private Fu…...
解决JSON格式数据大小写问题,以及@JsonProperty 和@JSONField序列化的区别
1、JsonProperty注解方式 JsonProperty注解是annotation包下的一个注解,可以通过value属性定义注解修饰的属性名称,如果你用的是JsonProperty注解,那么你千万不要用JSONObject.toJSONString(实体)去转json,可能很多人在这里就蒙蔽…...
Python正则表达式有哪些常用匹配字符?
处理文本数据时,我们经常需要查找、提取或替换特定模式的字符串。这时候正则表达式就成了程序员最强大的武器之一。今天我们就来详细聊聊Python中那些最常用的正则表达式字符和它们的实际用法。 为什么要学正则表达式? 假设你遇到这些场景:…...
List、Set集合通过Stream流求和
目录 一、泛型为Integer、Long、Double、BigDecimal求和 二、泛型为实体类 对单个属性求和 对多个属性分别分组求和 并返回聚合后的对象 多字段乘积求和(基本数据类型) 多字段乘积求和(BigDecimal) 对对象中的多个字段求和…...
Linux:Makefile
编译器gcc 使用方式:gcc [ 选项 ] 要编译的⽂件 [ 选项 ] [ ⽬标⽂件 ] 编译分为以下几个步骤: 1.预处理(进⾏宏替换) 预处理功能主要包括宏定义,⽂件包含,条件编译,去注释等。 预处理指令是以#号开头的代码⾏。 实例: gcc –E hello.c –o hello…...
