最新发布

7.12 离线优先与请求队列
离线优先的本质是「把『本地数据库』当成唯一读写入口,把『网络同步』当成后台异步过程」——所以真正要设计的不是「缓存」,而是「队列的可靠性(重试、顺序、幂等、死信)、冲突解决、以及同步状态的可见性」。

7.11 tRPC
tRPC 的卖点是「端到端类型安全,且零额外定义」——你只写一次服务端函数(含 zod 输入校验),客户端直接 import 那个类型就有了完整的自动补全与类型检查,既不需要 schema 文件,也不需要 codegen;代价是「只在 TypeScript 全家桶同仓时成立」。

图零:浏览器里的图片工具箱,文件不上传
压缩、裁剪、加水印、抠图、拼接都在本地完成。不限张数、不限次数,图片不会传到服务器。

7.10 GraphQL / Apollo / urql
GraphQL 的客户端价值不在「少请求几个接口」,而在「声明式地描述『这个组件需要哪些字段』」+「规范化缓存让『改一个实体,所有引用它的地方自动更新』」;而它的坑集中在「两级错误(network vs graphQL)」「缓存配置(否则不更新或更新错)」「分页与缓存的配合」三处。

7.9 上传进度与请求取消
fetch 没有原生上传进度(要用 XMLHttpRequest 或手动消费 ReadableStream),取消请求用 AbortController(XHR 用 xhr.abort());大文件要分片上传(并发 + 断点续传 + 秒传)。

7.8 轮询与实时数据
实时数据有四种方案——轮询(简单但浪费)、SSE(服务端单向推送,浏览器自动重连)、WebSocket(双向、需要自己做心跳与重连)、长轮询(兼容性最好但服务器压力大);选择依据是「是否需要双向 + 实时性要求 + 基础设施成本」。

7.7 分页与无限滚动
分页有「页码分页」与「游标分页(cursor)」两类;列表页用 useInfiniteQuery + IntersectionObserver 做无限滚动最省事,而返回列表时恢复滚动位置是体验的关键细节。

7.6 乐观更新
乐观更新是「在请求返回之前先假设它会成功、立刻更新界面」,失败时再回滚——它显著提升「操作手感」,但只适合「大概率成功、可回滚」的操作。

7.5 缓存、失效与重试
缓存的核心是「这份数据什么时候算新鲜、什么时候该重新拉、没人用的时候什么时候回收」——对应 staleTime(新鲜期)、失效(invalidateQueries)与 gcTime(回收时间);重试则要「只重试值得重试的错误」。

7.4 服务端状态管理
服务端状态是「别人拥有的数据的本地快照」,它需要「缓存、去重、失效、重试、重新验证」——这些用 useEffect 手写会写出一堆样板,所以应该交给 TanStack Query / SWR。

7.3 加载态与错误态设计
异步 UI 有四种状态(idle / loading / success / error,通常还加 empty)——用状态机建模(而不是多个布尔值),并为每种状态设计明确、不闪烁的 UI。

最新评论
读过书不知道欧·亨利的人少。教科书上选文有
这小生活不错呀
不错,必须顶一下!
看着你还在坚持,很好
看来忙了也没时间更新博客了
NIce。学习了。。。。
网站不错!!!!
简洁实用,好文章!