ARCHIVE / 50 ARTICLES

从问题出发,不从标签出发。

输入错误信息、技术名或你正在做的事。找不到时,再按领域缩小范围。

前端与浏览器

从 HTML 到像素:浏览器渲染流水线怎么工作

浏览器不会直接把 HTML 画到屏幕上。本文拆解主线程上的解析、样式计算、布局和绘制,以及合成线程如何复用图层。

进阶
9 分钟
前端与浏览器

事件循环不只分宏任务和微任务

解释浏览器如何从任务队列取出工作、清空微任务、决定是否渲染,并说明微任务链为什么也会阻塞页面。

进阶
8 分钟
前端与浏览器

HTTP 缓存策略:强缓存、协商缓存与版本化资源

从 Cache-Control 的语义出发,为带哈希静态资源、HTML、接口数据和用户私有数据设计可预测的缓存策略。

进阶
10 分钟
前端与浏览器

Service Worker 离线缓存:先设计更新,再设计命中

介绍 Service Worker 生命周期、预缓存与运行时缓存策略,并处理版本升级、缓存清理和失败回退。

进阶
11 分钟
前端与浏览器

CORS 与预检请求:浏览器到底在保护谁

从同源策略解释简单请求、OPTIONS 预检、凭据模式和常见响应头配置错误。

进阶
8 分钟
前端与浏览器

Cookie 安全边界:SameSite、HttpOnly 与 CSRF

解释 Cookie 的发送规则、安全属性、跨站与跨源差异,并给出会话 Cookie 和 CSRF 防护建议。

进阶
9 分钟
前端与浏览器

用 CSP 把 XSS 从一次失误变成多层防线

从 Report-Only 开始部署内容安全策略,使用 nonce、strict-dynamic 和 Trusted Types 降低脚本注入风险。

进阶
11 分钟
前端与浏览器

Core Web Vitals 优化:从指标回到用户路径

介绍三项核心体验指标的组成、现场数据与实验室数据差异,以及每类问题的优先优化路径。

进阶
10 分钟
前端与浏览器

资源加载优先级:preload、preconnect 与懒加载怎么选

区分 preload、prefetch、preconnect、modulepreload 和 fetchpriority 的用途,并避免带宽竞争。

进阶
8 分钟
前端与浏览器

主线程长任务排查:不要只看一条红色火焰图

建立可复现的性能录制流程,识别长任务中的脚本执行、强制布局、垃圾回收和第三方代码。

进阶
10 分钟
前端与浏览器

Web Worker 实战:把计算移出主线程之前要算清成本

说明 Worker 的适用边界、消息协议、可转移对象、错误处理和生命周期管理。

进阶
9 分钟
前端与浏览器

IndexedDB 数据层:事务、索引与版本迁移

介绍对象仓库、索引、事务生命周期、版本升级和多标签页协调,构建可靠的本地数据层。

进阶
11 分钟
前端与浏览器

多标签页通信:BroadcastChannel、storage 与锁

比较多标签页通信方案,设计登出通知、状态同步和单实例后台任务。

进阶
8 分钟
前端与浏览器

页面生命周期:visibilitychange、pagehide 与 bfcache

解释页面可见性、冻结、销毁和往返缓存,可靠保存草稿与发送末尾统计。

进阶
9 分钟
前端与浏览器

容器查询:让组件响应自己的空间

使用尺寸与样式容器查询构建可复用卡片,并解释容器单位、命名和渐进增强。

进阶
7 分钟
前端与浏览器

CSS 层叠层:用 @layer 管理覆盖关系

解释层叠来源、层顺序和选择器权重的关系,为重置、第三方样式、组件和工具类规划稳定覆盖规则。

进阶
7 分钟
前端与浏览器

可访问组件:从键盘、焦点和语义开始

以按钮、对话框和异步状态为例,建立语义、键盘操作、焦点管理和辅助技术测试的组件基线。

进阶
12 分钟
服务端与数据

Node.js 事件循环:别让一段同步代码拖住所有请求

Node.js 擅长并发 I/O,但 JavaScript 仍运行在主线程上。本文用可观测指标、任务分片和 Worker Threads 说明如何处理 CPU 密集型工作。

进阶
9 分钟
服务端与数据

Express 异步错误处理:让异常只经过一个出口

把业务异常、参数错误和未知故障收敛到统一中间件,避免重复 try/catch、泄露堆栈和一条请求记录多次日志。

进阶
8 分钟
服务端与数据

API 分页:数据会变化时,用游标代替页码

offset 分页简单,但在数据持续新增或删除时会重复或漏掉记录。本文实现基于 created_at 与 id 的稳定游标分页。

进阶
10 分钟
服务端与数据

接口幂等:网络重试不应该创建两笔订单

客户端超时后重试是正常行为。对支付、下单等写接口,引入幂等键并在数据库事务中认领请求,才能避免重复副作用。

进阶
11 分钟
服务端与数据

JWT 登录设计:短访问令牌与可撤销刷新令牌

使用短期 Access Token 处理 API 授权,使用服务端可追踪的 Refresh Token 延长会话,并通过轮换检测令牌重放。

进阶
12 分钟
服务端与数据

用 Redis 做分布式限流:先定义你想限制什么

多实例服务不能依赖进程内计数器。本文讨论限流维度、Redis 原子操作、响应头和故障降级策略。

进阶
11 分钟
服务端与数据

OpenAPI 不只写文档:让契约参与请求校验

把 OpenAPI 作为可执行契约:定义统一错误结构、在边界校验输入、生成客户端类型,并在 CI 中检查破坏性变更。

进阶
9 分钟
服务端与数据

Node.js 文件上传:从流式处理到对象存储确认

安全的上传链路不止一个 multer 配置。本文覆盖流式接收、魔数检测、预签名直传、对象权限和上传确认。

进阶
12 分钟
服务端与数据

Webhook 接收端:验签、去重和异步消费缺一不可

Webhook 是外部系统主动调用你的接口。接收端需要对原始字节验签、限制时间窗口、按事件 ID 去重并快速返回。

进阶
10 分钟
服务端与数据

PostgreSQL 事务边界:把不变量留在数据库里

事务不只是 begin 与 commit。本文从库存扣减示例解释业务不变量、原子更新、锁顺序和外部调用边界。

进阶
13 分钟
服务端与数据

PostgreSQL 索引:从执行计划反推访问路径

通过 EXPLAIN ANALYZE 识别扫描、过滤和排序成本,再围绕高频查询设计复合索引、部分索引和覆盖索引。

进阶
12 分钟
服务端与数据

PostgreSQL JSONB:灵活字段也需要建模边界

JSONB 适合变化快的附加属性,但高频过滤、关联和强约束字段应保留为普通列。本文给出常用查询与索引策略。

进阶
10 分钟
服务端与数据

MySQL 死锁:统一加锁顺序,并重试整个事务

死锁不是数据库失控,而是并发事务形成了循环等待。本文介绍报告分析、索引影响、锁顺序和有限重试。

进阶
12 分钟
服务端与数据

Redis 缓存一致性:先接受短暂旧数据,再设计失效

缓存不是第二个真相来源。以数据库为准,使用 Cache-Aside、版本化 key、随机 TTL 和请求合并控制一致性与稳定性。

进阶
12 分钟
服务端与数据

数据库连接池:连接越多,不代表吞吐越高

连接池过大会让数据库上下文切换和内存压力上升。本文从部署实例数反推池大小,并设置获取超时、语句超时和泄漏保护。

进阶
10 分钟
服务端与数据

Prisma 生产迁移:把危险变更拆成可回滚步骤

开发环境的自动迁移不等于生产发布流程。本文使用 expand-contract 分阶段新增字段、回填数据、切换代码并最终收紧约束。

进阶
11 分钟
服务端与数据

MongoDB 聚合与建模:先按读取路径决定嵌入还是引用

MongoDB 的灵活结构不等于无需建模。本文以订单统计为例,说明嵌入与引用、聚合管道顺序和 explain 分析。

进阶
12 分钟
工程效率与质量

Monorepo 不只是把仓库放在一起:用工作区守住模块边界

从目录职责、依赖方向和发布边界出发,搭建一个不会随着项目增长而失控的 Monorepo。

进阶
9 分钟
工程效率与质量

TypeScript 大项目提速:从一个 tsconfig 拆到 Project References

用 Project References 拆分类型检查边界,降低编辑器负担,并让 CI 只重建真正受影响的项目。

进阶
8 分钟
工程效率与质量

给 API 错误一个稳定契约:别再只返回 message

设计可被前端、日志和监控共同理解的错误结构,让失败既能展示给用户,也能快速定位。

进阶
7 分钟
工程效率与质量

不停机数据库迁移:用 Expand and Contract 拆掉危险变更

把字段重命名、约束收紧等破坏性操作拆成兼容阶段,降低应用与数据库同时切换的风险。

进阶
10 分钟
工程效率与质量

测试金字塔落地:按风险选测试,不按数量凑比例

从系统边界和故障成本出发选择测试层级,让测试套件既快又能发现真正的问题。

进阶
8 分钟
工程效率与质量

Playwright 稳定性实践:消灭等待、串扰和偶发失败

用可观察条件替代固定等待,隔离测试数据,并为偶发失败保留可诊断证据。

进阶
9 分钟
工程效率与质量

微服务契约测试:在部署前发现接口不兼容

由消费者描述真实依赖,再由提供者验证契约,减少联调环境中的意外破坏。

进阶
9 分钟
工程效率与质量

测试数据 Builder:让用例只表达与场景有关的差异

用合理默认值和链式覆盖生成测试对象,避免每次模型加字段都修改整套测试。

入门
6 分钟
工程效率与质量

CI 缓存别靠运气:设计可解释的缓存键与恢复策略

区分依赖缓存与构建产物缓存,设计完整缓存键,并避免旧缓存制造难以复现的结果。

进阶
8 分钟
工程效率与质量

金丝雀发布实战:用指标决定继续还是回滚

从小流量开始逐步放量,把健康指标、观察窗口和自动回滚写进发布流程。

进阶
10 分钟
工程效率与质量

更小也更可信的容器镜像:多阶段构建、固定版本与 SBOM

缩小运行镜像、固定基础镜像来源,并生成软件物料清单,让容器既轻量又可审计。

进阶
9 分钟
工程效率与质量

线上故障前 15 分钟:一份能真正执行的 Runbook

明确指挥、止损、证据保全和沟通节奏,避免故障现场所有人同时猜原因。

进阶
8 分钟
工程效率与质量

Pre-commit Hook 怎么配才不惹人关:只检查这次改动

把快速、确定的检查前移到本地,同时把完整验证留给 CI,兼顾反馈速度与质量门禁。

入门
6 分钟
工程效率与质量

可复现开发环境:让新成员半小时跑起项目

固定运行时版本、自动准备依赖服务,并用干净环境持续验证项目启动文档。

进阶
8 分钟
工程效率与质量

结构化日志落地:从 requestId 一路追到后台任务

统一字段、传递上下文并控制敏感信息,让日志真正支持跨服务检索和故障定位。

进阶
8 分钟
工程效率与质量

团队 CLI 设计:把散落脚本做成可靠的自助工具

统一参数、退出码和安全确认,让部署、数据修复等高频操作既容易发现又不容易误用。

进阶
8 分钟
没有匹配的文章。换一个更短的关键词试试。