开发者实践指南

围绕数据格式、编码、安全、基础设施和浏览器工具的原创实践文章。每篇文章都配有对应工具、风险说明和主要参考资料。

25 篇可独立访问的中文文章

Dev 2026-08-07 8 分钟

Node 生产 Dockerfile 里到底该有什么,不该有什么

网上大多数 Node Dockerfile 都把 node_modules 直接拷进镜像、用 root 运行、最后产出一个 900 MB 的层。本文只讲那几个真正影响构建时间、镜像体积和运行时安全的决定:基础镜像、多阶段构建、依赖层缓存、NODE_ENV 陷阱,以及为什么你的 docker-compose 不该照搬生产。

DockerfileNode.jsdocker-compose多阶段构建容器
Dev 2026-08-07 7 分钟

在用户之前发现缺失的翻译键和插值参数不匹配

缺失的翻译键会把原始键路径直接渲染给用户,插值参数不匹配会渲染出空串或崩溃。这两者在评审中都容易漏,因为开发者的语言包永远有全部键。本文讲如何结构化比较 locale JSON 文件、找出缺失键,并在发布前抓住参数不匹配。

i18n本地化翻译键插值ICU MessageFormat
Dev 2026-08-07 7 分钟

能真正压测 UI 的 mock 数据(而不是只把页面填满)

大多数 mock 数据是同一行复制十遍、只换个 id。它填满页面,却什么都测不到。本文讲如何生成能压测布局边界、长名字、缺失字段、空状态,以及会破坏格式化代码的日期和数字格式的 mock 数据,并通过字段推断让一个 JSON 样本一步变成贴近真实的数据集。

mock 数据JSON测试 fixture字段推断前端测试
Dev 2026-08-07 7 分钟

把 cURL 转成 fetch、Axios 或 Python,别丢了关键请求头

cURL 是 HTTP 调试的通用语,但把 cURL 命令直接粘进应用代码是范畴错误。本文讲转换到 fetch、Axios 和 Python requests 时什么能保留、什么会丢失,以及那些在转换中悄悄改变行为的请求头和 body 编码。

cURLfetchAxiosPython requestsHTTP
Visual 2026-08-07 8 分钟

SVG 优化器到底改了什么(以及哪些该手动改)

SVG 优化器会剥离编辑器残留、取整坐标、合并路径,大多数时候是对的。它也会破坏渐变、丢掉无障碍信息、压扁你需要的分组。本文讲哪些可以自动化、哪些不能,以及如何把一份干净的 SVG 变成 React 或 Vue 图标组件而不丢失关键部分。

SVGSVG 优化path data图标组件React
QR Code 2026-06-10 6 分钟

能经受印刷的二维码:纠错、尺寸与现场测试

二维码到底是怎么工作的——定位标志、Reed-Solomon 纠错、静态码与动态跳转的取舍,以及那些“印出来扫不动”背后的真实原因。

二维码QR CodeReed-Solomon纠错静态二维码动态二维码
Encoding 2026-06-09 7 分钟

Base64 不是加密:字母表、填充与真实传输故障

1989 年为了把二进制塞进 7-bit 邮件管道而发明的“偷渡”方案,三十多年后变成 JWT、data URI、签名 token 的通用底层。两套字母表、一个常见的解码失败、以及它绝对不是的几件事。

Base64Base64urlMIMERFC 4648JWT
Encoding 2026-06-08 7 分钟

避免二次编码:URI 百分号编码与表单规则的区别

为什么 %20 和 + 都表示空格、encodeURI 和 encodeURIComponent 不能换着用、HTML 表单规范怎么悄悄发明了第二套不兼容的变体。RFC 3986 vs application/x-www-form-urlencoded。

URL 编码百分号编码RFC 3986encodeURIComponent表单编码
Encoding 2026-06-07 10 分钟

码点不等于字符:Unicode 规范化与不可见故障

1991 年的一个被推翻的承诺、三种编码形式、surrogate pair 这种向后兼容补丁、以及为什么 string.length 在几乎每种语言里都在说谎。还有“全家福 emoji 为什么是 7 个 code point”这件最近才发生的怪事。

UnicodeUTF-8UTF-16Code PointNormalizationGrapheme Cluster
Encoding 2026-06-06 6 分钟

JSON 转义不只是反斜杠:Unicode、代理项与嵌入故障

六个必须转义的字符、一个可选转义符、以及一个 25 年没修的怪事——JSON 允许 lone surrogate、但它在 UTF-8 里没法表达。还有 U+2028 这个直到 2019 年才能在 JS 里直接用的字符。

JSONJSON 转义RFC 8259Surrogate PairUTF-8
Time 2026-06-05 7 分钟

秒、毫秒、2038 与时间戳背后的时区故障

为什么所有计算机都从 1970-01-01 开始计时;10 位与 13 位时间戳的区别;2038 年会发生什么;以及那些会比我们活得久的时区 bug。

Unix 时间戳EpochISO 8601Y2K38时区
Time 2026-06-04 7 分钟

Cron、时区与夏令时:五个字段为什么不是完整调度规则

五个字段,一个 1987 年的 Vixie cron,以及为什么你写的 '0 9 * * 1-5' 会在 DST 切换那天跑错日子。还有那条几乎没人凭直觉理解对的“day-of-month / day-of-week OR 陷阱”。

CronCrontab调度QuartzDST
Dev 2026-06-03 8 分钟

回溯、灾难性运行时间与正则表达式的能力边界

正则在 1951 年起源于数学,在程序员加进 backreference 那一刻就不再是数学。现代引擎都是那次妥协的产物——而“正则”和“模式语言”之间的边界从未被正式重画。

正则表达式RegexPCREReDoS回溯
Crypto 2026-06-02 9 分钟

AES 模式、IV 与认证:安全加密真正需要什么

2000 年 NIST 在五个候选算法中选中 Rijndael。二十五年后它几乎是地球上每一条加密连接背后的密码。本文讲清楚“用 AES”到底意味着什么——以及决定你用得对不对的那些 mode、IV 与 AEAD 细节。

AESRijndaelAES-GCM分组密码认证加密
Format 2026-06-01 10 分钟

JSON 只有六种类型:简单语法如何制造生产陷阱

Douglas Crockford 不是在 2001 年“发明”了 JSON——他是在 JavaScript 内部“发现”了它,然后给它写了规范。他**没做**的那些决定(不要注释、不要尾随逗号、不要日期、不要区分整型与浮点)才是 JSON 活过所有竞争者的原因——也是你的配置文件天天在和你打架的原因。

JSONRFC 8259ECMA-404JSON5NDJSONJSON Pointer
Format 2026-05-31 10 分钟

JSON 时代的 XML:命名空间、校验与关键安全边界

XML 二十年前在数据交换领域输给了 JSON——而你银行的 SOAP 网关、政府的电子报税、手机的 SAML 登录、五分钟前打开的 .docx 文件依然是 XML。让它输的那些妥协,恰恰是它至今还在的原因。

XMLXSDXPathXSLT命名空间XXE
Format 2026-05-30 9 分钟

YAML 何时会改变含义:类型、缩进与 Properties 转换

为什么 'NO' 会变成 false;为什么挪威的国家代码(NO)一度让数据库出错;为什么你那份缩进配置文件离另一份完全不同的文档只差一个空格。还有那个比所有人都活得久的、古老到出奇的 Java .properties 格式。

YAMLYAML 1.1YAML 1.2.propertiesNorway Problem配置
Format 2026-05-29 10 分钟

SQL 可读只是起点:注入、NULL、方言与执行计划

SQL 在 1986 年被标准化,立刻就分裂成十几种互不兼容的方言。NULL 不等于 NULL;你写的 clause 顺序不是数据库执行的顺序;ANSI 标准基本是一种“礼貌性虚构”。本文讲清楚跨 PostgreSQL、MySQL、SQLite、T-SQL 等等读 / 格式化 SQL 时真正重要的那些点。

SQLANSI SQLPostgreSQLMySQLNULLJOINSQL 注入
Encoding 2026-05-28 10 分钟

解码不等于验证:JWT 生产环境检查清单

RFC 7519,2015 年发布,三段 Base64url 编码用点拼接;同年的 'alg: none' bug 让它在安全史上留下了永久脚注。本文讲清楚 JWT 到底是什么、什么时候用它、什么时候用 session cookie 更好,以及 alg 字段被滥用的四种姿势。

JWTJWSJWERFC 7519OAuthOIDCalg: none
Dev 2026-05-27 9 分钟

UUID v4 与 v7:随机性、排序、隐私和数据库局部性

规范里有八个版本,生产中只会遇到三个;以及为什么 2026 年默认值应该从 v4 换成 v7。还有:随机 UUID 让你的数据库慢得比你以为的还多十倍——以及差点赢了的替代品 ULID。

UUIDRFC 9562RFC 4122UUIDv4UUIDv7ULID
Crypto 2026-05-26 10 分钟

MD5、SHA-256、HMAC 与密码哈希解决的是不同问题

MD5 已被攻破、SHA-1 已被攻破、SHA-256 还行,而以上**没有一个**是你存密码该用的算法。“快哈希用于完整性、慢哈希用于密码”——这是哈希领域最重要的一条事实,也是最常被跳过的。

哈希MD5SHA-256SHA-3HMACbcryptArgon2
Visual 2026-05-25 11 分钟

为什么 HSL 会误导:为可访问界面选择正确色彩空间

Hex、RGB、HSL、HSV、CMYK、OKLCH——六种描述同一个光点的方法,以及为什么 HSL 偷偷骗了设计师四十年。还有 sRGB gamma 曲线、为什么你的暗色模式调色板是错的,以及为什么 2026 年应该是你切到 OKLCH 的那一年。

颜色sRGBHSLOKLCHGammaWCAG色盲
Encoding 2026-05-24 8 分钟

摩尔斯电码为什么仍然有效:时序、频率与人工容错

Samuel Morse 1830 年代发明的电码,在 Huffman 之前一百年就做出了一个 Huffman 编码——也是今天唯一一种仍在被人类裸眼传输的字符编码,也是为什么字母 E 是单点。还有:美式 Morse 与 ITU Morse 的差异,以及那些没人记得的 prosign。

Morse摩尔斯电码ITU电报业余无线电Prosign
Dev 2026-05-23 11 分钟

Nginx location 与 proxy_pass:最容易破坏部署的斜杠规则

Igor Sysoev 在 2002 年开始写 nginx,因为 Apache 的“每连接一进程”模型撑不住一万并发(C10K 问题)。23 年后,nginx 比任何其他服务器都更广泛地承载着公网。当年那批配置陷阱仍然在咬人——location 匹配规则、proxy_pass 那个尾斜杠、以及没人能凭直觉理解的 alias vs root。

NginxC10K反向代理TLSHTTP/2缓存
Visual 2026-05-22 9 分钟

如何选择 Graphviz 布局引擎并生成可复现架构图

Graphviz 1991 年诞生于 AT&T 贝尔实验室,比 web 还早,今天依然是你能丢给它一万节点依赖图、并指望拿回一张像样图片的唯一图布局工具。七种布局引擎,一个 DOT 语言,以及 Mermaid 与 D2 没能取代它的原因。

GraphvizDOT布局MermaidD2可视化

Cookie 同意

我们使用 Cookie 来增强您的体验并展示相关广告。您可以自定义您的偏好。