文章摘要
在开发Immich过程中,团队遇到了一系列令人头疼的技术问题,包括Zitadel的脚本引擎不支持正则表达式命名捕获组、Microsoft Entra的OpenID发现文档未包含PKCE支持、EXIF元数据中的图像尺寸与实际不符、YAML空格处理不直观、Windows隐藏文件无法以“w”标志打开、Git自动转换LF为CRLF导致bash脚本中断、Cloudflare Workers中Fetch请求默认使用http而非https,以及某些手机应用在分享图片时静默删除GPS数据。这些问题给开发带来了诸多困扰。
文章总结
标题:诅咒的知识 | Immich
在构建Immich的过程中,我们学到了一些令人头疼的知识,这些知识我们宁愿从未知晓。
2025年6月4日
Zitadel的Actions功能令人困扰,因为其自定义脚本功能使用的JS引擎不支持正则表达式的命名捕获组。2025年5月30日
Microsoft Entra虽然支持PKCE,但并未在其OpenID发现文档中包含这一信息,导致客户端误以为PKCE不可用。2025年5月5日
EXIF元数据中的图像尺寸可能与实际尺寸不符,导致裁剪和调整大小时出现问题。2025年4月1日
YAML中的空格处理方式常常不符合直觉,容易引发问题。2024年9月20日
Windows中的隐藏文件无法使用“w”标志打开,结合SMB选项“隐藏点文件”,常常引发混淆。2024年8月7日
Git可以配置为在检出时自动将LF转换为CRLF,而CRLF会破坏bash脚本。2024年8月7日
在Cloudflare Workers中,Fetch请求默认使用http,即使明确指定https,也常常导致重定向循环。2024年7月21日
某些手机会在应用没有位置权限时,静默地从图像中删除GPS数据。2024年7月3日
PostgreSQL的NOTIFY功能在事务中执行,这意味着使用socket.io的postgres-adapter每5秒就会写入一次WAL。2024年7月3日
npm脚本每次运行时都会向npm注册表发起http调用,因此不适合用于执行健康检查。2024年6月28日
JavaScript社区中有一位用户,经常通过添加50个额外的包依赖来为项目提供“向后兼容性”,而这些包由他本人维护。2024年6月25日
bcrypt实现仅使用字符串的前72个字节,之后的字符会被忽略。2024年1月31日
JavaScript的Date对象中,年份和日期从1开始索引,而月份从0开始索引。2024年1月9日
在Node.js v20.8之前,在CommonJS项目中使用--experimental-vm-modules导入ES模块,再导入CommonJS模块会导致段错误并使Node.js崩溃。2023年12月28日
PostgreSQL的参数限制为65,535个,因此在大数据集上进行批量插入时可能会失败。2023年6月26日
某些Web功能(如剪贴板API)仅在“安全上下文”(即https或localhost)中有效。2023年2月23日
TypeORM的remove实现会修改输入对象,删除原始对象的id属性。
这些“诅咒”的知识在开发过程中给我们带来了不少麻烦,希望这些经验能帮助其他开发者避免类似的陷阱。
评论总结
关于额外软件包的浪费
- 观点:作者认为某些软件包的下载量巨大,浪费了带宽和磁盘空间,质疑其动机。
- 引用:
- "The author of those packages has racked up a fuckload of downloads. What a waste of total bandwidth and disk space everywhere."
- "I wonder if it's for clout."
关于手机隐私保护
- 观点:某些手机会在没有位置权限的情况下自动删除图片的GPS数据,认为这是一种保护机制。
- 引用:
- "Some phones will silently strip GPS data from images when apps without location permission try to access them."
- "That's no curse, it's a protection hex!"
关于Cloudflare问题
- 观点:对Cloudflare的fetch问题表示失望。
- 引用:
- "Disappointing to hear about the Cloudflare fetch issue."
关于日期格式的争议
- 观点:对dd/mm/yyyy和mm/dd/yyyy日期格式的争议,认为其中一种格式可能存在问题。
- 引用:
- "dd/mm/yyyy date formats are cursed...."
- "Perhaps it is mm/dd/yyyy (really?!?) that is cursed...."
关于项目日志的积极意义
- 观点:认为项目日志不仅具有宣泄作用,还能将问题转化为学习经验,建议所有项目都应采用类似机制。
- 引用:
- "The log is not just cathartic, but turns each frustrating speedbump into a positive learning experience."
- "By making it public, it becomes both a tool for both commiseration and prevention."
关于npm脚本的健康检查问题
- 观点:质疑npm脚本在每次运行时都会调用npm注册表的行为,认为这是不合理的。
- 引用:
- "npm scripts make a http call to the npm registry each time they run, which means they are a terrible way to execute a health check."
- "That would be insane behavior for a package manager."
关于操作系统和软件的隐藏文件与遥测问题
- 观点:指出Windows和macOS的隐藏文件机制以及许多软件的遥测功能,认为这些设计增加了不必要的复杂性。
- 引用:
- "Windows' NTFS Alternate Data Streams (ADS) allows hiding an unlimited number of files in already existing files."
- "Everything with opt-out telemetry: go, yarn, meilisearch, homebrew, vcpkg, dotnet, Windows, VS Code, Claude Code, macOS, Docker, Splunk, OpenShift, Firefox, Chrome, flutter, and zillions of other corporate abominations."