Tech Notes
技术文章
记录开发中的思考、实践和踩坑过程。每一篇文章都是一次可复用的经验沉淀。

从 Promise.all 深入理解 Promise 链和微任务
这篇笔记记录一下我今天重新梳理 Promise 的过程。 起因是在看自己 Next.js 项目首页时,看到了一段代码: 这段代码本身不难理解。 它的意思是并发读取文章、项目、爱好和统计数量,全部完成以后再继续渲染页面。 但我继续想下去以后,发现 Promise 里有很多以前学过但没有真正想透的细节: 今天正好没什么事,
阅读文章最新文章
17 篇文章Redux 的原理和工作中常用方式
这篇笔记记录一下我对 Redux 的理解。 我刚开始学 Redux 时,最困惑的是它看起来很绕: 后来写多了以后发现,Redux 不是为了让简单事情变复杂,而是为了让状态变化变得可追踪。 它最核心的思路可以压缩成一句话: Redux 解决什么问题 React 组件里可以直接用 useState。 小项目这样写完全没问题
Agent 常用的三种开发思想
这篇笔记记录一下我对 Agent 开发方式的理解。 刚开始接触 Agent 时,我很容易把它想成一个很神奇的东西: 但真正做项目时会发现,如果只是把工具全塞给模型,然后说一句“你自己看着办”,效果经常不稳定。 后来我慢慢把 Agent 开发里的常见思路分成三类: 它们不是互相排斥的流派,更像三种组织智能行为的方式。 第
从盒子模型理解前端布局尺寸计算
这篇笔记记录一下我对 CSS 盒子模型的理解。 盒子模型是前端面试里非常常见的问题,但它不只是面试题。 写页面时很多奇怪的问题,最后都会回到盒子模型: 为什么设置了 width: 100px,实际占用不止 100px? 为什么两个元素之间距离比想象中大? 为什么加了 padding 后布局被撑破? 为什么 boxsiz
从 JWT 到 Session 理解两种登录状态保存方式
这篇笔记记录一下我对 JWT 和 Session 区别的理解。 以前我看到登录方案时,经常会听到两句话: 这句话有一定现实背景,但如果只这样记,很容易把问题想得太简单。 后来我发现,JWT 和 Session 最大的区别不是谁更新,而是: Session 是怎么工作的 Session 登录的典型流程是: 可以把服务端想
从 JWT 登录流程理解认证和权限管理
这篇笔记记录一下我对 JWT 认证方式的理解。 一开始我知道 JWT 经常用来做登录,但脑子里其实是糊的: 这句话当然没错,但它没有解释清楚几个问题: token 里面到底有什么? 后端为什么相信这个 token? token 被改了怎么办? 不同权限怎么管理? 退出登录和过期又怎么处理? 后来我发现,JWT 的核心不
从 Cookie 到 localStorage 理解浏览器本地存储
这篇笔记记录一下我对浏览器里几种常见本地存储方式的理解。 一开始我经常把这些名字混在一起: 它们看起来都能在浏览器里保存一点数据,但生命周期、是否会自动发送给服务器、适合放什么东西,其实差别很大。 后来我发现,可以先抓住一个问题: 再继续看它需要保存多久、是否只属于当前标签页、是否涉及安全信息。 先说结论 可以先记住几
在 Linux 服务器用 Docker 安装 Dify
这篇笔记记录一下我在 Linux 服务器上安装 Dify 的过程。 Dify 官方提供了 Docker Compose 配置。只要 Docker 能正常使用,网络也没有问题,安装本身很快。 我实际碰到的问题主要有两个: 当前用户权限不够,需要使用 sudo 或者切换到 root。 服务器访问 GitHub 和 Dock
用 Promise 封装 WebHID 单通道通信
这篇笔记记录一下我在工作中封装前端和固件通信逻辑的过程。 当时做的是一个通过 WebHID 和固件通信的前端项目。 固件那边发数据有一个特点:只有一条通信通道,而且数据是一包一包依次传过来的。我发送一条获取数据的命令后,必须把这次响应完整接收完,才能继续发送下一条命令。 不能多,也不能少,更不能两条命令同时发出去。 旧
用 `asyncio.to_thread` 包装不支持异步的工具
这篇笔记记录一下我在写 AI 工作流项目时,突然想通的一个问题。 当时项目里有很多异步函数,到处都能看到 async 和 await。但是有些工具调用并不是直接 await tool(),而是写成: 我一开始有点疑惑:为什么不直接 await? 后来才发现,不是所有工具都提供异步方法。有些库只有普通的同步函数。直接调用
用 `as const` 让 TS 提示具体可以填哪些值
这篇笔记记录一下我写单选组件时碰到的一个 TypeScript 问题。 当时我有一个单选组件,选项明明已经写在数组里了,但是填写默认值的时候,编辑器只知道它是 string,不会提示具体有哪些值可以选。 后来发现,关键是给传入的数组加上 as const。这样 TypeScript 不会把数组里的内容全部放宽成普通的
用自定义 Hook 复用 React 里的状态逻辑
这篇笔记记录一下我在工作中逐渐开始使用 React 自定义 Hook 的过程。 写 React 页面时,经常会碰到一些重复逻辑。 有些逻辑和 UI 交互有关,比如: 鼠标是否移动到某个元素上。 点击元素外部时关闭弹窗。 窗口宽度变化时更新布局。 页面滚动到某个位置后显示返回顶部按钮。 还有一些逻辑和数据处理有关,比如:
用阿里云和 frp 把家里的高性能主机开放到公网
这篇笔记记录一下我怎么用一台阿里云服务器和 frp,把家里的高性能主机开放到公网。 我的想法很简单: 云服务器有公网 IP,但是配置不高。 家里花四千块钱配一台主机,性能更强,硬盘也更容易扩展。 家里的宽带通常没有稳定公网 IP,或者路由器外面还有运营商 NAT。 用 frp 把两台机器连接起来,公网请求先到阿里云,再
实践用 GitHub 做自动化部署
这篇笔记记录一下我怎么用 GitHub Actions 做一个简单的自动部署。 我想要的效果其实很直接: 1. 我在本地改完代码,提交并推送到 GitHub。 2. GitHub 发现 main 分支有新代码,自动执行我写好的配置文件。 3. GitHub 连接服务器,让服务器拉取最新代码。 4. 服务器重新构建并启动
从 NestJS 到 FastAPI 理解装饰器和框架元数据
这篇笔记记录一下我学习 NestJS 和 FastAPI 时,对装饰器慢慢想通的过程。 我一开始学习 NestJS 时,有一个疑惑: JavaScript 看起来是一门比较灵活的语言,为什么也能像 Java 一样,在类和方法上面写一些类似注解的东西,然后就自动拥有路由、参数注入、权限判断这些功能? 比如: 后来学习 P
从 `div` 到 `Flex` 理解 React 小组件的价值
这篇笔记记录一下我刚开始写 React 时,对组件封装逐渐改变的理解。 我一开始写页面,总是在业务组件里直接写很多 div: 这样写当然没有问题。HTML 能正常渲染,CSS 也能实现想要的效果。 但是写多了以后,总感觉哪里不太对。 每次看业务代码,都要在一堆 div、className 和样式之间来回判断: 这个 d
从类组件到 Hook 理解 React 的数据驱动渲染
从类组件到 Hook 理解 React 的数据驱动渲染 这篇笔记记录一下我对 React 状态和页面渲染方式的思考。 刚开始学习 React 时,我知道一句很常见的话: 简单来说,就是不要到处手动修改页面,而是先修改数据,再让 React 根据数据重新计算页面应该长什么样。 后来我又接触了类组件、函数组件和 Hook,















