当前位置: 首页 > news >正文

[Full Clock 技术复盘] 二、SvelteKit 实战避坑指南:PWA、SSR 样式断裂、持久化防抖

如 https://www.cnblogs.com/cup11/p/20207070 所述,接下来几天我将要发表关于全屏时钟的技术解析的文章。

Svelte + PWA

在 SvelteKit 2 不要用 vite-plugin-pwa,否则你还要去找各种文件;套了 i18n 你就更不知道生成文件的目录了,导致前端每次都会报错:

workbox-3105ea8d.js:1 Uncaught (in promise) non-precached-url: non-precached-url :: [{"url":"index.html"}]at O.createHandlerBoundToURL (workbox-3105ea8d.js:1:13313)at Object.createHandlerBoundToURL (workbox-3105ea8d.js:1:14966)at sw.js:1:1398at sw.js:1:558

在 SvelteKit 2 环境下,强烈建议使用官方内置的 $service-worker:https://svelte.js.cn/docs/kit/$service-worker

全智能处理,框架原生支持。

Svelte SSR 样式断裂

对于在用户端会重新渲染(与屏幕大小关联,或与用户自定义主题关联)的情况,SSR 渲染产物和用户实际期待画面会不一致。这时,会造成首屏样式的断裂。

解决方法:加 CSS transition,用户感觉还是自然进入自己设置的主题。

localStorage 缓存踩坑

之前为了优化 localStorage 被反复写入的情况,加了这样一段代码:

let settings = $state({ theme: 'dark', fontSize: 16 });$effect(() => {debouncedSave(settings); 
});function debouncedSave(data: any) {clearTimeout(timer);timer = setTimeout(() => {localStorage.setItem('settings', JSON.stringify(data));}, 300);
}

这个防抖乍看没什么问题,但是代码一旦上线,问题可就大了——设置数据永远不会被保存

为什么呢?因为 Svelte 的 $effect 只会追踪同步执行路径上被访问到的属性,记录其为依赖。既然数据读取发生在 setTimeout 的异步中,Svelte 自然也无从得知,便认为该$effect 没有依赖——这就麻烦大了。

解决方案:

$effect(() => {const snapshot = $state.snapshot(settings); debouncedSave(snapshot); 
});

$state.snapshot 访问了每一个属性,从而将其转换成了 JavaScript 对象。这样一来,就实现了依赖记录和追踪。

后记

若读者对此项目本身感兴趣,可阅读项目介绍:https://www.cnblogs.com/cup11/p/20207070

欢迎交流!

http://www.jsqmd.com/news/988262/

相关文章:

  • Rimworld Mod制作避坑指南:搞定XML里的List列表和Parent继承就成功了一大半
  • 告别连接报错:SpringBoot整合Gbase数据库的yml配置与Druid连接池详解
  • 别再只盯着Softmax了:聊聊OOD检测里那些‘不务正业’的好方法
  • 2026年6月最新版商丘第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一休咨询
  • 2026年 厂服/电子厂厂服/食品厂厂服/冬季夏季厂服/防静电厂服厂家推荐:高颜值品质与可靠防护的精选榜单 - 品牌发掘
  • MuleSoft企业级AI编排:LLM集成的协议、治理与韧性实践
  • LPC546xx微控制器实战:ARM Cortex-M4内核、AHB总线与低功耗设计解析
  • 4-流形中曲面共边与协和性研究:理论与应用
  • 闵行区龙之梦下水管道疏通|居顺联家政疏通服务全维度介绍 - 居顺联家政疏通
  • 别再死记硬背了!用Python画个图,5分钟搞懂马尔可夫链的周期性
  • Halcon License过期了怎么办?2023年最新续期与版本升级避坑指南
  • LPC82x MCU核心架构、外设配置与低功耗开发实战指南
  • 网络小白也能懂:用eNSP+Wireshark搭建你的第一个虚拟实验网(附VirtualBox/WinPcap避坑要点)
  • Vivado 2017.4里用FIFO Generator搭个AXI-Stream数据通道,手把手教你仿真验证
  • 极低维深度生成模型:QLVM原理与应用解析
  • 告别高斯模糊!用OpenCV手把手实现NL-means非局部均值滤波(附Python/C++代码对比)
  • 告别玄学调试:手把手教你用CCS3.3定位DSP28335的编译与链接错误
  • 2026年 浙江药品包装设计公司/品牌推荐排行榜:药企信赖的合规创意与防潮避光包装方案精选 - 品牌发掘
  • 别再死记硬背了!用一张图+真实项目案例,带你搞懂数字IC设计全流程(附EDA工具清单)
  • R语言ggplot2分面绘图避坑指南:当x轴是字符型变量时,如何用geom_blank完美调整y轴范围?
  • 从Hub到交换机:一次实验看懂广播域与冲突域,以及VLAN为何是网络优化的关键
  • 告别SQL乱码!DataGrip 2024.1版超实用格式化模板,一键复制粘贴
  • 减法执行法:用认知科学提升知识工作者生产力
  • 告别电平不匹配!用TXS0108E搞定1.2V到5V的I2C/SPI通信(附推挽与开漏模式选择指南)
  • 别再傻傻用真实邮箱了!手把手教你用Python脚本和Swaks工具安全测试邮件伪造(附避坑指南)
  • 别再为eNSP报错发愁了!手把手教你搞定VirtualBox 5.2.44、WinPcap和Wireshark的完整依赖环境
  • SAP CO-PA实战:用KE32快速搞定获利能力报告的新增维度(附完整事务代码清单)
  • 别再死记硬背二分答案了!用‘月度开销’这道题,带你彻底搞懂‘最大值最小化’的套路
  • 多模态AI中的世界模型:原理、实现与应用
  • 乐迪AT9S PRO遥控器如何完美搭配大疆NAZA-LITE飞控?一份超详细的通道映射与参数设置心得