当前位置: 首页 > 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.gsyq.cn/news/1500007.html

相关文章:

  • LPC546xx微控制器实战:ARM Cortex-M4内核、AHB总线与低功耗设计解析
  • 别再死记硬背了!用Python画个图,5分钟搞懂马尔可夫链的周期性
  • Halcon License过期了怎么办?2023年最新续期与版本升级避坑指南
  • LPC82x MCU核心架构、外设配置与低功耗开发实战指南
  • 极低维深度生成模型:QLVM原理与应用解析
  • Vivado 2017.4里用FIFO Generator搭个AXI-Stream数据通道,手把手教你仿真验证
  • 告别高斯模糊!用OpenCV手把手实现NL-means非局部均值滤波(附Python/C++代码对比)
  • 告别玄学调试:手把手教你用CCS3.3定位DSP28335的编译与链接错误
  • 2026年 浙江药品包装设计公司/品牌推荐排行榜:药企信赖的合规创意与防潮避光包装方案精选 - 品牌发掘
  • 别再傻傻用真实邮箱了!手把手教你用Python脚本和Swaks工具安全测试邮件伪造(附避坑指南)
  • 乐迪AT9S PRO遥控器如何完美搭配大疆NAZA-LITE飞控?一份超详细的通道映射与参数设置心得
  • 别光打印星星了!用C语言玩转数字金字塔,彻底搞懂for循环嵌套
  • 2026树脂混凝土管厂家推荐:性价比与口碑综合测评发布 - 资讯快报
  • 拆解Mybatis-Plus多租户插件:从TenantLineInnerInterceptor源码看SQL拦截与重写的艺术
  • 2026年MINI COOPER玻璃芯片车门迎宾灯深度测评:如何为你的MINI匹配最佳方案? - 资讯快报
  • 别再只盯着SQL注入了!手把手教你用Python Flask复现SSTI漏洞(附完整靶场环境)
  • 别再让程序卡死在HardFault!深入ARM Cortex-M异常栈帧,从Usage Fault讲起
  • 青雲国樾售楼处官方预约渠道|低密洋房户型、价格、配套一站式咨询 - 资讯快报
  • 深入S32K3安全机制:利用MC_RGM的Escalation功能构建稳健的汽车ECU复位策略
  • 大模型推理路径动态裁剪:语义确定性驱动的计算蒸发机制
  • 告别CCS3.3编译噩梦:手把手教你搞定内存模式、头文件路径和栈溢出错误
  • FineReport批量删除避坑指南:从复选按钮联动到回调函数,手把手教你搞定移动端数据清理
  • 2026年怎么选靠谱灯具生产厂家?巨西照明打造高端定制照明方案 - 资讯快报
  • MuleSoft企业级AI编排:LLM集成的治理、防护与生产落地
  • 信息学奥赛刷题必备:OpenJudge NOI 4.6 1455题‘An Easy Problem’保姆级解法(C++实现)
  • 从CPU流水线到厨房炒菜:用生活例子讲透时空图、吞吐率与加速比
  • 别再让用户重新登录了!Axios拦截器+JWT双Token方案,打造丝滑的401自动处理流程
  • 别再只盯着SQL注入了!手把手教你用BurpSuite检测Flask/Jinja2的SSTI漏洞(附实战案例)
  • 性能实测:MPI vs OpenMP,谁才是C语言并行快排的‘速度之王’?(含不同数据量测试)
  • 别再瞎调了!用ADS做PA负载牵引,这3个参数设置错了效率直接掉一半