开发者实践指南
围绕数据格式、编码、安全、基础设施和浏览器工具的原创实践文章。每篇文章都配有对应工具、风险说明和主要参考资料。
25 篇可独立访问的中文文章
Node 生产 Dockerfile 里到底该有什么,不该有什么
网上大多数 Node Dockerfile 都把 node_modules 直接拷进镜像、用 root 运行、最后产出一个 900 MB 的层。本文只讲那几个真正影响构建时间、镜像体积和运行时安全的决定:基础镜像、多阶段构建、依赖层缓存、NODE_ENV 陷阱,以及为什么你的 docker-compose 不该照搬生产。
在用户之前发现缺失的翻译键和插值参数不匹配
缺失的翻译键会把原始键路径直接渲染给用户,插值参数不匹配会渲染出空串或崩溃。这两者在评审中都容易漏,因为开发者的语言包永远有全部键。本文讲如何结构化比较 locale JSON 文件、找出缺失键,并在发布前抓住参数不匹配。
能真正压测 UI 的 mock 数据(而不是只把页面填满)
大多数 mock 数据是同一行复制十遍、只换个 id。它填满页面,却什么都测不到。本文讲如何生成能压测布局边界、长名字、缺失字段、空状态,以及会破坏格式化代码的日期和数字格式的 mock 数据,并通过字段推断让一个 JSON 样本一步变成贴近真实的数据集。
把 cURL 转成 fetch、Axios 或 Python,别丢了关键请求头
cURL 是 HTTP 调试的通用语,但把 cURL 命令直接粘进应用代码是范畴错误。本文讲转换到 fetch、Axios 和 Python requests 时什么能保留、什么会丢失,以及那些在转换中悄悄改变行为的请求头和 body 编码。
SVG 优化器到底改了什么(以及哪些该手动改)
SVG 优化器会剥离编辑器残留、取整坐标、合并路径,大多数时候是对的。它也会破坏渐变、丢掉无障碍信息、压扁你需要的分组。本文讲哪些可以自动化、哪些不能,以及如何把一份干净的 SVG 变成 React 或 Vue 图标组件而不丢失关键部分。
能经受印刷的二维码:纠错、尺寸与现场测试
二维码到底是怎么工作的——定位标志、Reed-Solomon 纠错、静态码与动态跳转的取舍,以及那些“印出来扫不动”背后的真实原因。
Base64 不是加密:字母表、填充与真实传输故障
1989 年为了把二进制塞进 7-bit 邮件管道而发明的“偷渡”方案,三十多年后变成 JWT、data URI、签名 token 的通用底层。两套字母表、一个常见的解码失败、以及它绝对不是的几件事。
避免二次编码:URI 百分号编码与表单规则的区别
为什么 %20 和 + 都表示空格、encodeURI 和 encodeURIComponent 不能换着用、HTML 表单规范怎么悄悄发明了第二套不兼容的变体。RFC 3986 vs application/x-www-form-urlencoded。
码点不等于字符:Unicode 规范化与不可见故障
1991 年的一个被推翻的承诺、三种编码形式、surrogate pair 这种向后兼容补丁、以及为什么 string.length 在几乎每种语言里都在说谎。还有“全家福 emoji 为什么是 7 个 code point”这件最近才发生的怪事。
JSON 转义不只是反斜杠:Unicode、代理项与嵌入故障
六个必须转义的字符、一个可选转义符、以及一个 25 年没修的怪事——JSON 允许 lone surrogate、但它在 UTF-8 里没法表达。还有 U+2028 这个直到 2019 年才能在 JS 里直接用的字符。
秒、毫秒、2038 与时间戳背后的时区故障
为什么所有计算机都从 1970-01-01 开始计时;10 位与 13 位时间戳的区别;2038 年会发生什么;以及那些会比我们活得久的时区 bug。
Cron、时区与夏令时:五个字段为什么不是完整调度规则
五个字段,一个 1987 年的 Vixie cron,以及为什么你写的 '0 9 * * 1-5' 会在 DST 切换那天跑错日子。还有那条几乎没人凭直觉理解对的“day-of-month / day-of-week OR 陷阱”。
回溯、灾难性运行时间与正则表达式的能力边界
正则在 1951 年起源于数学,在程序员加进 backreference 那一刻就不再是数学。现代引擎都是那次妥协的产物——而“正则”和“模式语言”之间的边界从未被正式重画。
AES 模式、IV 与认证:安全加密真正需要什么
2000 年 NIST 在五个候选算法中选中 Rijndael。二十五年后它几乎是地球上每一条加密连接背后的密码。本文讲清楚“用 AES”到底意味着什么——以及决定你用得对不对的那些 mode、IV 与 AEAD 细节。
JSON 只有六种类型:简单语法如何制造生产陷阱
Douglas Crockford 不是在 2001 年“发明”了 JSON——他是在 JavaScript 内部“发现”了它,然后给它写了规范。他**没做**的那些决定(不要注释、不要尾随逗号、不要日期、不要区分整型与浮点)才是 JSON 活过所有竞争者的原因——也是你的配置文件天天在和你打架的原因。
JSON 时代的 XML:命名空间、校验与关键安全边界
XML 二十年前在数据交换领域输给了 JSON——而你银行的 SOAP 网关、政府的电子报税、手机的 SAML 登录、五分钟前打开的 .docx 文件依然是 XML。让它输的那些妥协,恰恰是它至今还在的原因。
YAML 何时会改变含义:类型、缩进与 Properties 转换
为什么 'NO' 会变成 false;为什么挪威的国家代码(NO)一度让数据库出错;为什么你那份缩进配置文件离另一份完全不同的文档只差一个空格。还有那个比所有人都活得久的、古老到出奇的 Java .properties 格式。
SQL 可读只是起点:注入、NULL、方言与执行计划
SQL 在 1986 年被标准化,立刻就分裂成十几种互不兼容的方言。NULL 不等于 NULL;你写的 clause 顺序不是数据库执行的顺序;ANSI 标准基本是一种“礼貌性虚构”。本文讲清楚跨 PostgreSQL、MySQL、SQLite、T-SQL 等等读 / 格式化 SQL 时真正重要的那些点。
解码不等于验证:JWT 生产环境检查清单
RFC 7519,2015 年发布,三段 Base64url 编码用点拼接;同年的 'alg: none' bug 让它在安全史上留下了永久脚注。本文讲清楚 JWT 到底是什么、什么时候用它、什么时候用 session cookie 更好,以及 alg 字段被滥用的四种姿势。
UUID v4 与 v7:随机性、排序、隐私和数据库局部性
规范里有八个版本,生产中只会遇到三个;以及为什么 2026 年默认值应该从 v4 换成 v7。还有:随机 UUID 让你的数据库慢得比你以为的还多十倍——以及差点赢了的替代品 ULID。
MD5、SHA-256、HMAC 与密码哈希解决的是不同问题
MD5 已被攻破、SHA-1 已被攻破、SHA-256 还行,而以上**没有一个**是你存密码该用的算法。“快哈希用于完整性、慢哈希用于密码”——这是哈希领域最重要的一条事实,也是最常被跳过的。
为什么 HSL 会误导:为可访问界面选择正确色彩空间
Hex、RGB、HSL、HSV、CMYK、OKLCH——六种描述同一个光点的方法,以及为什么 HSL 偷偷骗了设计师四十年。还有 sRGB gamma 曲线、为什么你的暗色模式调色板是错的,以及为什么 2026 年应该是你切到 OKLCH 的那一年。
摩尔斯电码为什么仍然有效:时序、频率与人工容错
Samuel Morse 1830 年代发明的电码,在 Huffman 之前一百年就做出了一个 Huffman 编码——也是今天唯一一种仍在被人类裸眼传输的字符编码,也是为什么字母 E 是单点。还有:美式 Morse 与 ITU Morse 的差异,以及那些没人记得的 prosign。
Nginx location 与 proxy_pass:最容易破坏部署的斜杠规则
Igor Sysoev 在 2002 年开始写 nginx,因为 Apache 的“每连接一进程”模型撑不住一万并发(C10K 问题)。23 年后,nginx 比任何其他服务器都更广泛地承载着公网。当年那批配置陷阱仍然在咬人——location 匹配规则、proxy_pass 那个尾斜杠、以及没人能凭直觉理解的 alias vs root。
如何选择 Graphviz 布局引擎并生成可复现架构图
Graphviz 1991 年诞生于 AT&T 贝尔实验室,比 web 还早,今天依然是你能丢给它一万节点依赖图、并指望拿回一张像样图片的唯一图布局工具。七种布局引擎,一个 DOT 语言,以及 Mermaid 与 D2 没能取代它的原因。