全部文章
11篇文章
状态管理
2026/5/18 · 29 min read
这篇文章想聊一聊状态管理(State Management)。它不是一篇库的横向对比。相比判断哪个工具更好,本文更想梳理一种感觉:应该如何看待状态,又该在哪里划定边界。 如今,AI 工具(Claude、ChatGPT、Cursor、Gemini、Copilot)已经深度融入我们的工作。开发速度呈指数级提升,但坦率地说,我感觉服务的完成度并没有同步跟上。功能越多,随之增加的 bug 也越多,我们也越...
领域模型
2026/4/18 · 45 min read
这篇文章想聊一聊领域(Domain)。 在开发过程中,我经常会遇到“领域(Domain)”这个词。但真要回答“领域到底是什么?”,却很难给出一个清晰明了的答案。(说实话,刚开始学开发时,我还以为领域就是指 www。) 查找领域相关资料时,自然会延伸到领域模型、领域对象、领域对象模型等概念。但一直让我觉得遗憾的是,很少有文章能讲清它们彼此有何不同,以及这些概念在并非后端的前端中意味着什么。本文会从各...
Toss Frontend Fundamentals 模拟考试第 2 期重构复盘
2026/3/28 · 20 min read
这篇文章想聊聊我参加 Toss Frontend Fundamentals 模拟考试第 2 期时所经历的重构过程。 我平时就对代码审查和重构很感兴趣,因此参与了 Toss 发布的一项形式颇为有趣的 Frontend Fundamentals 模拟考试。题目提供了一个会议室预订应用,要求对它进行重构。项目还附带了测试代码,为验证重构过程中功能是否遭到破坏提供了安全网。 最终,我用了两天时间完成重构,...
AI 前端工程师
2026/3/2 · 37 min read
这篇文章想从个人视角聊一聊:在 AI 时代,工程师该如何成长并生存下去。 在我还是初级工程师时,读过的文章中给我印象最深的一篇,是裴辉东的《前端工程师职业路线图:面向初级工程师的三条专业发展路径》。文章将前端工程师的职业发展分为三条路径:Web 专精(Software Engineer)/ 产品专精(Product Engineer)/ 运营专精(Full-Stack Engineer),还进一步...
抽象
2026/2/1 · 37 min read
这篇文章想谈谈编程中的抽象,以及如何从抽象的角度写出好代码。 在从事前端开发的过程中,我无数次纠结过:“这段逻辑到底该拆到什么程度?”“这个组件应该按什么粒度拆分?”起初,我以为只要把共同部分提取出来就是抽象:把重复代码写成函数,提取相似组件的共同点再合并到一起。但几次经历告诉我,这样写出的代码随着时间推移,反而可能变成难以下手的怪物。于是,我开始重新思考抽象究竟是什么。 本文将整理我对抽象本质的...
queryKey
2026/1/4 · 34 min read
这篇文章想聊一聊 TanStack Query 的 queryKey。 我在实际项目中使用 TanStack Query 时,曾多次彻底重构 queryKey 的管理方式。最初,我只是在组件里内联写上 ['user', userId] 这样的数组;后来每次做缓存失效都要在不同地方重复写相同的键,开始频繁出现拼写错误,于是又把它们迁移到 QUERYKEYS 这样的常量对象中。再后来读了 TkDodo...
错误处理
2025/11/17 · 36 min read
这篇文章想谈一谈:在前端,我们该如何捕获错误。 笔者在实际工作中编写错误处理代码时,经常会有一种说不清的不踏实感。有些错误用 try/catch 捕获,有些由 ErrorBoundary 捕获,还有些则交给 TanStack Query 的 onError。它们的职责范围既有细微重叠,又存在错位。结果就是,有时错误悄悄漏了出去,有时又传播到了本不希望它抵达的地方。 问题在于,我们很少把这些工具的运...
彻底掌握 React Fiber
2025/5/20 · 40 min read
这篇文章想聊聊堪称 React 心脏的 Fiber 架构。 笔者刚接触 React 时,只把 “Fiber” 当作面试中的高频问题。背下“把 React 的渲染工作拆分成工作单元来处理”这一句话,就以为那是全部。但真正开始阅读 React 源码后,我才意识到 Fiber 并非一个简单概念,而是一套掌管 React 渲染一切环节的运行时架构。 至今仍忘不了第一次打开 React 源码时受到的冲击。当...
Biome 能取代 ESLint 和 Prettier 吗?
2024/12/1 · 13 min read
这篇文章想聊聊一款名为 Biome 的工具。 我所在的团队成员使用 WebStorm、VSCode 等不同的 IDE,因此在维持统一的代码风格方面遇到了不少困难。不仅要为每种 IDE 分别管理配置文件,非常麻烦,代码评审中也经常因为格式差异而出现与逻辑无关的意见。 在这种情况下,ESLint 与格式化相关的规则被标记为 Deprecated,我们不得不寻找新的替代方案。Prettier + ESL...
Zustand,你到底为什么是 ProviderLess?
2024/8/18 · 28 min read
这篇文章想聊一聊 Zustand 是如何在没有 Provider 的情况下完成状态管理的。 使用 Zustand 时,我一直把无需 Provider 就能管理状态这件事视为理所当然。直到某天,我突然想到一个问题。在 React 生态中,大多数库都已把用 Provider 包裹应用变成了一种近乎仪式化的做法。TanStack React Query 必须由 QueryClientProvider 包...
理解压缩算法
2024/7/6 · 26 min read
这篇文章想聊聊软件中的压缩算法。 我曾负责改进一个公司内部项目的部署流程。它需要把体积很大的构建产物上传到 S3,我也由此切身体会到:构建目录的大小会直接影响上传时间与存储成本。于是一个问题自然出现了:怎样才能更高效地压缩并上传这些文件? 真正开始研究后,我发现压缩格式比想象中多得多:zip、gzip、zstd、bzip2、xz 等等。名字都很相似,但要找到一份清楚说明它们有何不同、分别适合什么场...
状态管理
2026/5/18 · 29 min read
这篇文章想聊一聊状态管理(State Management)。它不是一篇库的横向对比。相比判断哪个工具更好,本文更想梳理一种感觉:应该如何看待状态,又该在哪里划定边界。 如今,AI 工具(Claude、ChatGPT、Cursor、Gemini、Copilot)已经深度融入我们的工作。开发速度呈指数级提升,但坦率地说,我感觉服务的完成度并没有同步跟上。功能越多,随之增加的 bug 也越多,我们也越...
领域模型
2026/4/18 · 45 min read
这篇文章想聊一聊领域(Domain)。 在开发过程中,我经常会遇到“领域(Domain)”这个词。但真要回答“领域到底是什么?”,却很难给出一个清晰明了的答案。(说实话,刚开始学开发时,我还以为领域就是指 www。) 查找领域相关资料时,自然会延伸到领域模型、领域对象、领域对象模型等概念。但一直让我觉得遗憾的是,很少有文章能讲清它们彼此有何不同,以及这些概念在并非后端的前端中意味着什么。本文会从各...
Toss Frontend Fundamentals 模拟考试第 2 期重构复盘
2026/3/28 · 20 min read
这篇文章想聊聊我参加 Toss Frontend Fundamentals 模拟考试第 2 期时所经历的重构过程。 我平时就对代码审查和重构很感兴趣,因此参与了 Toss 发布的一项形式颇为有趣的 Frontend Fundamentals 模拟考试。题目提供了一个会议室预订应用,要求对它进行重构。项目还附带了测试代码,为验证重构过程中功能是否遭到破坏提供了安全网。 最终,我用了两天时间完成重构,...
AI 前端工程师
2026/3/2 · 37 min read
这篇文章想从个人视角聊一聊:在 AI 时代,工程师该如何成长并生存下去。 在我还是初级工程师时,读过的文章中给我印象最深的一篇,是裴辉东的《前端工程师职业路线图:面向初级工程师的三条专业发展路径》。文章将前端工程师的职业发展分为三条路径:Web 专精(Software Engineer)/ 产品专精(Product Engineer)/ 运营专精(Full-Stack Engineer),还进一步...
抽象
2026/2/1 · 37 min read
这篇文章想谈谈编程中的抽象,以及如何从抽象的角度写出好代码。 在从事前端开发的过程中,我无数次纠结过:“这段逻辑到底该拆到什么程度?”“这个组件应该按什么粒度拆分?”起初,我以为只要把共同部分提取出来就是抽象:把重复代码写成函数,提取相似组件的共同点再合并到一起。但几次经历告诉我,这样写出的代码随着时间推移,反而可能变成难以下手的怪物。于是,我开始重新思考抽象究竟是什么。 本文将整理我对抽象本质的...
queryKey
2026/1/4 · 34 min read
这篇文章想聊一聊 TanStack Query 的 queryKey。 我在实际项目中使用 TanStack Query 时,曾多次彻底重构 queryKey 的管理方式。最初,我只是在组件里内联写上 ['user', userId] 这样的数组;后来每次做缓存失效都要在不同地方重复写相同的键,开始频繁出现拼写错误,于是又把它们迁移到 QUERYKEYS 这样的常量对象中。再后来读了 TkDodo...
错误处理
2025/11/17 · 36 min read
这篇文章想谈一谈:在前端,我们该如何捕获错误。 笔者在实际工作中编写错误处理代码时,经常会有一种说不清的不踏实感。有些错误用 try/catch 捕获,有些由 ErrorBoundary 捕获,还有些则交给 TanStack Query 的 onError。它们的职责范围既有细微重叠,又存在错位。结果就是,有时错误悄悄漏了出去,有时又传播到了本不希望它抵达的地方。 问题在于,我们很少把这些工具的运...
彻底掌握 React Fiber
2025/5/20 · 40 min read
这篇文章想聊聊堪称 React 心脏的 Fiber 架构。 笔者刚接触 React 时,只把 “Fiber” 当作面试中的高频问题。背下“把 React 的渲染工作拆分成工作单元来处理”这一句话,就以为那是全部。但真正开始阅读 React 源码后,我才意识到 Fiber 并非一个简单概念,而是一套掌管 React 渲染一切环节的运行时架构。 至今仍忘不了第一次打开 React 源码时受到的冲击。当...
Biome 能取代 ESLint 和 Prettier 吗?
2024/12/1 · 13 min read
这篇文章想聊聊一款名为 Biome 的工具。 我所在的团队成员使用 WebStorm、VSCode 等不同的 IDE,因此在维持统一的代码风格方面遇到了不少困难。不仅要为每种 IDE 分别管理配置文件,非常麻烦,代码评审中也经常因为格式差异而出现与逻辑无关的意见。 在这种情况下,ESLint 与格式化相关的规则被标记为 Deprecated,我们不得不寻找新的替代方案。Prettier + ESL...
Zustand,你到底为什么是 ProviderLess?
2024/8/18 · 28 min read
这篇文章想聊一聊 Zustand 是如何在没有 Provider 的情况下完成状态管理的。 使用 Zustand 时,我一直把无需 Provider 就能管理状态这件事视为理所当然。直到某天,我突然想到一个问题。在 React 生态中,大多数库都已把用 Provider 包裹应用变成了一种近乎仪式化的做法。TanStack React Query 必须由 QueryClientProvider 包...
理解压缩算法
2024/7/6 · 26 min read
这篇文章想聊聊软件中的压缩算法。 我曾负责改进一个公司内部项目的部署流程。它需要把体积很大的构建产物上传到 S3,我也由此切身体会到:构建目录的大小会直接影响上传时间与存储成本。于是一个问题自然出现了:怎样才能更高效地压缩并上传这些文件? 真正开始研究后,我发现压缩格式比想象中多得多:zip、gzip、zstd、bzip2、xz 等等。名字都很相似,但要找到一份清楚说明它们有何不同、分别适合什么场...