<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>代码重构 | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《Uncle Bob 的 ub-mode：给 AI 编程助手装上&quot;纪律开关&quot;》</title><link>https://channel.meo-ai.com/posts/729</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/729</guid><pubDate>Thu, 29 Oct 2026 01:22:56 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Uncle Bob 的 ub-mode：给 AI 编程助手装上&quot;纪律开关&quot;》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B&quot; title=&quot;#软件工程&quot;&gt;#软件工程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23AI%E7%BC%96%E7%A8%8B%E8%BE%85%E5%8A%A9&quot; title=&quot;#AI编程辅助&quot;&gt;#AI编程辅助&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TDD&quot; title=&quot;#TDD&quot;&gt;#TDD&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F%E9%97%A8%E7%A6%81&quot; title=&quot;#代码质量门禁&quot;&gt;#代码质量门禁&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;这是 Robert C. Martin（Uncle Bob）发布的一个 AI 智能体技能（agent skill），用于在 AI 编写或修改代码时强制执行严谨的软件工程纪律。它部分借鉴了 poteto-mode 的规则体系并加以精简，同时配套一组确定性的质量门禁工具（复杂度、重复率、变异测试），让&quot;先让它能工作，再让它正确，最后持续练习&quot;的原则可度量、可落地。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. &lt;b&gt;核心理念分三层&lt;/b&gt;：先让它能工作（懒惰协议、TDD、先减后加、领域建模、边界与类型纪律等），再让它正确（修复根因、测试行为而非实现、持续重构），最后落实到日常练习（记日志、守护上下文窗口、小而有序的提交）。&lt;br /&gt;2. &lt;b&gt;规则部分借鉴并精简自 poteto-mode&lt;/b&gt;：作者明确说明 ub-mode 是 &lt;a href=&quot;https://t.me/poteto&quot; target=&quot;_blank&quot; title=&quot;@poteto&quot;&gt;@poteto&lt;/a&gt; 规则集的删减版，与确定性工具搭配使用。&lt;br /&gt;3. &lt;b&gt;配套四个质量门禁工具仓库&lt;/b&gt;：crapper 计算圈复杂度与 CRAP 分数（要求 CRAP &amp;lt; 10），dryer 检测结构重复（相似度 ≥ 0.8 即需消除），mutator 做变异测试揪出&quot;测试杀不死的活口&quot;，uml-viewer 可视化组件、覆盖率与依赖方向。&lt;br /&gt;4. &lt;b&gt;安装方式极简&lt;/b&gt;：只需把 &lt;a href=&quot;http://SKILL.md/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;SKILL.md&quot;&gt;SKILL.md&lt;/a&gt; 复制到所用 AI 工具的 skills 目录（如 /.claude/skills/ub-mode/），然后输入 /ub-mode 即可调用。&lt;br /&gt;5. &lt;b&gt;目标很明确&lt;/b&gt;：把 Uncle Bob 倡导的软件工艺原则变成 AI 编码时可检查、可强制执行的硬约束，而不是口头建议。&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://github.com/unclebob/ub-mode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.com/unclebob/ub-mode&quot;&gt;https://github.com/unclebob/ub-mode&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.com/unclebob/ub-mode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Contribute to unclebob/ub-mode development by creating an account on GitHub.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;GitHub&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;GitHub - unclebob/ub-mode&quot; src=&quot;/static/https://cdn4.telesco.pe/file/UCJZ6O172muiQrjDs86JRYzCntG2IYYu_YcYM1Ie_1JgonITIEfmT1cxER_597SNQRoxhPTensGDoR9uUZvWN-9_v-V6fNqGMGYEOcbUJwWuXIvUghfooTEHUZnJxdAqgXD56j3Y2o-mO8YoyPoFxloXhlUfYXgTODQFpG24s1YXK6mNapa20UiNsohKt4t2o06_lrLHgKaZBHPaArtEYDTpeYpM8r5F99iNKNGf1JfzdNt5d9xlpZTKZZ9oISKONIpfjhO-ISEseAS2S2mZV3461-PFh88V65RnBRj6EzCleBvzLzX7rTJjKLSVAfciiTycTQT1zcHjLOes-7mBZQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;GitHub - unclebob/ub-mode&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Contribute to unclebob/ub-mode development by creating an account on GitHub.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《Thorsten Ball：我对软件开发未来的16条判断》</title><link>https://channel.meo-ai.com/posts/721</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/721</guid><pubDate>Fri, 23 Oct 2026 01:09:56 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Thorsten Ball：我对软件开发未来的16条判断》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B&quot; title=&quot;#软件工程&quot;&gt;#软件工程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23AI%E7%BC%96%E7%A8%8B&quot; title=&quot;#AI编程&quot;&gt;#AI编程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E5%AE%A1%E6%9F%A5&quot; title=&quot;#代码审查&quot;&gt;#代码审查&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95&quot; title=&quot;#单元测试&quot;&gt;#单元测试&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%BB%88%E7%AB%AF%E5%B7%A5%E5%85%B7&quot; title=&quot;#终端工具&quot;&gt;#终端工具&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Token%E8%AE%A1%E7%AE%97%E8%8C%83%E5%BC%8F&quot; title=&quot;#Token计算范式&quot;&gt;#Token计算范式&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%BC%80%E6%BA%90%E7%94%9F%E6%80%81&quot; title=&quot;#开源生态&quot;&gt;#开源生态&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E6%9C%AA%E6%9D%A5&quot; title=&quot;#软件开发未来&quot;&gt;#软件开发未来&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ThorstenBall&quot; title=&quot;#ThorstenBall&quot;&gt;#ThorstenBall&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;2026年9月19日，知名开发者、《Writing An Interpreter In Go》作者、现供职于 Sourcegraph/Amp 的 Thorsten Ball 在 X 发布长文，抛出 16 条关于软件开发未来的判断。核心观点是：当 AI 写代码的可靠性足够高时，为人类防错而设计的整套工程实践（代码审查、单元测试、终端、命令行工具）都会逐渐失去必要性，工程师的价值将从&quot;写代码的手艺&quot;迁移到&quot;理解业务、判断取舍、拿到反馈&quot;上，而这一切需要一代人的时间完成。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 代码审查已死——人类不会再逐行 review 模型产出的代码，只会审查&quot;系统与其组合方式&quot;。&lt;br /&gt;2. 单元测试可能会消失——他让模型写 900 行 Arduino C 代码零错误一次通过，&quot;摔不了跤就不需要护膝&quot;。&lt;br /&gt;3. 写代码这门手艺会消失，但&quot;造软件&quot;（解决业务问题、判断何时上线、获取反馈）会比以往更重要。&lt;br /&gt;4. 大多数 bug 将不再是代码 bug，而是&quot;你需求提错了&quot;的 bug。&lt;br /&gt;5. 终端已死——Shell、编辑器、CLI 工具会被 token 冲刷，命令行知识将像 Perl 一行流一样变成&quot;古老技艺&quot;。&lt;br /&gt;6. Token 是新的计算范式，我们正在进入&quot;后二进制时代&quot;，一切都会在它之上被重构。&lt;br /&gt;7. PM/设计/工程的铁三角和 Agile、Scrum 都会瓦解，只做&quot;人肉代理&quot;的工程师将不再有价值。&lt;br /&gt;8. 大小公司的工程差距会拉大——小团队比学大厂做法的初创公司跑得更快。&lt;br /&gt;9. &quot;好代码&quot;的标准（人类易读易维护）建立在人类要改代码的前提上，这个前提正在崩塌。&lt;br /&gt;10. 现有形式的开源不再合理——&quot;众眼监虫&quot;依然成立，但现在有了&quot;人工眼睛&quot;。&lt;br /&gt;11. 拿不到足够 token 的人会被排除在软件生产之外，token 是新的生产力门槛。&lt;br /&gt;12. 便宜模型未必有人用——更聪明的模型犯错少、轮次少，你未必愿意忍受它多错几次。&lt;br /&gt;13. 模型快到一定程度后，UI 会被实时生成，菜单、设置页、仪表盘这些&quot;面向人类的 API&quot;会大幅减少。&lt;br /&gt;14. 这场变革不会一夜发生——新旧范式更替需要一代人的时间，但反问是：&quot;10年后还有写代码的工作，可你想要那份工作吗？&quot;&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://x.com/thorstenball/status/2101305394190557466&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://x.com/thorstenball/status/2101305394190557466&quot;&gt;https://x.com/thorstenball/status/2101305394190557466&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://x.com/thorstenball/status/2101305394190557466&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Most predictions I see are still way too conservative.Here&apos;s mine&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;X (formerly Twitter)&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Thorsten Ball (@thorstenball) on X&quot; src=&quot;/static/https://cdn4.telesco.pe/file/Fz4kqtIOpFVZ09G5TEoSk5-tpwjDSjDESHW055897s39vYKqP2Rtlsk359JqflW_B1jJAYc7oA7hnv-zvzeLUqa0oCgHPupOHnLAl15cx_EupZUY36NwUgy2aFQpTJxS1zBPIZPJqgIUorHSXXhJUsSz5l9gkpG270kM_z36wZFJAW0Mqqszt8pt0zAWvBr7V0e-PVgj5TYGBVX-5FxR5AkazIdfttzE78prjKGHRzqGaRn5M4aS2iA17-V7O5mulQwh4M3ZmADaMwB03mOcTqa1dKKFIyxWvLmmKP4j6EgpqodADWgrPBgFtXMPdibkhC6vsV44yQEIdylehTLm7Q.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Thorsten Ball (@thorstenball) on X&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Most predictions I see are still way too conservative.&lt;br /&gt;&lt;br /&gt;Here&apos;s mine&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《十个防止 AI 代码泛滥的前端项目护栏》</title><link>https://channel.meo-ai.com/posts/705</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/705</guid><pubDate>Thu, 10 Sep 2026 23:23:08 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《十个防止 AI 代码泛滥的前端项目护栏》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF&quot; title=&quot;#前端&quot;&gt;#前端&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TypeScript&quot; title=&quot;#TypeScript&quot;&gt;#TypeScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React&quot; title=&quot;#React&quot;&gt;#React&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23AI%E7%BC%96%E7%A8%8B&quot; title=&quot;#AI编程&quot;&gt;#AI编程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F&quot; title=&quot;#代码质量&quot;&gt;#代码质量&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ESLint&quot; title=&quot;#ESLint&quot;&gt;#ESLint&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%B5%8B%E8%AF%95%E7%AD%96%E7%95%A5&quot; title=&quot;#测试策略&quot;&gt;#测试策略&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CI_CD&quot; title=&quot;#CI_CD&quot;&gt;#CI_CD&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E5%AE%A1%E6%9F%A5&quot; title=&quot;#代码审查&quot;&gt;#代码审查&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5&quot; title=&quot;#工程实践&quot;&gt;#工程实践&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;本文针对 AI 生成代码速度远超人类审查能力的前端项目，提供了一套实用的十项防护清单。核心思路是通过自动化工具链（类型系统、Linter、变异测试、CI 门禁）在代码合并前拦截机械性错误，而非依赖人工逐行审查。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. &lt;b&gt;用 OpenAPI 契约替代手写类型&lt;/b&gt;：通过 Hey API 等工具从 OpenAPI 规范直接生成 TypeScript 类型、客户端和 Zod 校验，避免 AI 臆造不存在的 API 字段（如 &lt;code&gt;user.fullName&lt;/code&gt;），让编译器在构建期就报错。&lt;br /&gt;&lt;br /&gt;2. &lt;b&gt;开启严格 TypeScript 配置&lt;/b&gt;：启用 &lt;code&gt;noUncheckedIndexedAccess&lt;/code&gt; 等严格标志，让数组索引访问返回 &lt;code&gt;T | undefined&lt;/code&gt;，迫使代码显式处理边界情况，减少 AI 常见的&quot;想当然&quot;代码。&lt;br /&gt;&lt;br /&gt;3. &lt;b&gt;把 Linter 当作行为过滤器&lt;/b&gt;：使用 SonarJS、react-you-might-not-need-an-effect、vitest/playwright 插件、jsx-a11y 等 ESLint 插件，自动拦截认知复杂度过高、不必要的 Effect、可访问性违规等问题。&lt;br /&gt;&lt;br /&gt;4. &lt;b&gt;设定架构层边界&lt;/b&gt;：使用 eslint-plugin-boundaries 或 dependency-cruiser 强制实施分层架构（如 UI 层不得直接访问 API 层），防止 AI 生成的代码逐渐退化为&quot;GitHub 平均水平&quot;的混乱结构。&lt;br /&gt;&lt;br /&gt;5. &lt;b&gt;将重复出现的错误转化为自定义 Linter 规则&lt;/b&gt;：当同一种 bug 第二次出现时，立即编写自定义 ESLint 规则禁止该模式。例如禁止在服务层函数中使用 &lt;code&gt;Math.round&lt;/code&gt; 和 &lt;code&gt;toFixed&lt;/code&gt;，避免双重取整导致的薪资计算错误。&lt;br /&gt;&lt;br /&gt;6. &lt;b&gt;把规则直接喂给 AI 模型&lt;/b&gt;：通过项目规则文件（如 &lt;code&gt;.cursor/rules&lt;/code&gt;、&lt;code&gt;CLAUDE.md&lt;/code&gt;）或技能文件（如 react-doctor），将项目约定、架构决策和禁止模式直接提供给 AI，让模型在生成代码时就遵循规范。&lt;br /&gt;&lt;br /&gt;7. &lt;b&gt;用变异测试验证测试有效性&lt;/b&gt;：使用 Stryker 故意破坏代码（翻转运算符、反转条件、交换返回值），检查现有测试是否能捕获这些变异。存活的变异体通常暴露&quot;只测形状不测内容&quot;的无效测试。一个项目约 4,700 个变异体在 6 分钟内完成扫描。&lt;br /&gt;&lt;br /&gt;8. &lt;b&gt;用 Knip 清理死代码&lt;/b&gt;：Knip 可以检测未使用的文件、导出和依赖，配合自定义可达性脚本填补其盲区，防止 AI 生成大量&quot;以防万一&quot;却无人调用的冗余代码。&lt;br /&gt;&lt;br /&gt;9. &lt;b&gt;用 jscpd 检测重复代码&lt;/b&gt;：AI 倾向于在不同地方生成几乎相同的逻辑，jscpd 能发现这些重复，提示抽象机会或错误的复制粘贴。&lt;br /&gt;&lt;br /&gt;10. &lt;b&gt;将所有检查强制设为 CI 门禁&lt;/b&gt;：上述所有工具（类型检查、Lint、测试、变异测试、重复检测）必须作为 CI 的强制通过项，而非可选建议，确保 AI 生成的代码无法绕过质量关卡。&lt;br /&gt;&lt;br /&gt;11. &lt;b&gt;成本与局限&lt;/b&gt;：这些护栏会产生噪音（误报）、规则过时和新人上手摩擦等成本，建议按&quot;类型 → Lint → 测试 → CI&quot;的顺序渐进式推行。同时需注意，这些检查只能捕获机械性错误，无法识别糟糕的品味或错误的抽象。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://evilmartians.com/chronicles/ten-anti-ai-slop-moves-for-frontend-projects-going-faster-than-humans-can-review&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://evilmartians.com/chronicles/ten-anti-ai-slop-moves-for-frontend-projects-going-faster-than-humans-can-review&quot;&gt;https://evilmartians.com/chronicles/ten-anti-ai-slop-moves-for-frontend-projects-going-faster-than-humans-can-review&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://evilmartians.com/chronicles/ten-anti-ai-slop-moves-for-frontend-projects-going-faster-than-humans-can-review&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Ten checks that catch what AI-written frontend code hides: contract codegen, boundary linting, mutation testing, and dead-code detectors.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;evilmartians.com&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;10 anti-AI slop moves for frontend projects going faster than humans can review—Martian Chronicles, Evil Martians’ team blog&quot; src=&quot;/static/https://cdn4.telesco.pe/file/M8U_Fe7M2gHOVcQM8XPpszalMyQIXRzmCokcCm_4dgcjkvIzQMlUYvsgmehUQC-NXCJGc3I8VY2eVIBkKPAVZkYiGTqLga5hRE0vlrIEN-NkyQMSO8-2Jvw2KDqQbQreg_haZqG_9bJF5WftGhdMmwjZOuCvSjmydEd5cT5fncbj22jwHNKyE0bKDJsBv9lYte-NCz1-Luv1TDht4195efFJApkQ1lPvOF_LBJz_mw8fvv9SPSbysOMKWZ8GCcH5JGEb56pCMV7ioa2QMiq3Xu84zYM95pDo-s18Pce77OetyKD2n7Yn8M6J_CVFGam6c__TEJncp_jGmxQsYu7KLQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;10 anti-AI slop moves for frontend projects going faster than humans can review—Martian Chronicles, Evil Martians’ team blog&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Ten checks that catch what AI-written frontend code hides: contract codegen, boundary linting, mutation testing, and dead-code detectors.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《Vitest 5.0 正式发布》</title><link>https://channel.meo-ai.com/posts/704</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/704</guid><pubDate>Thu, 10 Sep 2026 23:19:53 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Vitest 5.0 正式发布》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF&quot; title=&quot;#前端&quot;&gt;#前端&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23JavaScript&quot; title=&quot;#JavaScript&quot;&gt;#JavaScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Vitest&quot; title=&quot;#Vitest&quot;&gt;#Vitest&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%B5%8B%E8%AF%95%E6%A1%86%E6%9E%B6&quot; title=&quot;#测试框架&quot;&gt;#测试框架&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95&quot; title=&quot;#单元测试&quot;&gt;#单元测试&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96&quot; title=&quot;#性能优化&quot;&gt;#性能优化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23BrowserMode&quot; title=&quot;#BrowserMode&quot;&gt;#BrowserMode&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23MockAPI&quot; title=&quot;#MockAPI&quot;&gt;#MockAPI&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95&quot; title=&quot;#基准测试&quot;&gt;#基准测试&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%96%AD%E8%A8%80%E6%94%B9%E8%BF%9B&quot; title=&quot;#断言改进&quot;&gt;#断言改进&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96%E7%8E%87&quot; title=&quot;#代码覆盖率&quot;&gt;#代码覆盖率&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;Vitest 5.0 于 2026 年 9 月 3 日正式发布，本次大版本以性能优化为核心，同时带来 Trace View 追踪视图、嵌套项目配置、&lt;code&gt;vi.when&lt;/code&gt; 条件 Mock、基准测试重写等多项重要更新，并默认启用更严格的断言与 &lt;code&gt;clearMocks&lt;/code&gt; 行为，要求 Vite &amp;gt;= 6.4.0 和 Node.js &amp;gt;= 22.12.0。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. &lt;b&gt;性能大幅提升&lt;/b&gt;：通过共享 Vite 服务器、稳定的文件系统模块缓存、减少主进程与 worker 往返、加速 vm 池与浏览器模式等优化，整体测试速度提升 8%–53%，大型项目（1,280 模块）运行时间从 7.24s 降至 5.83s。&lt;br /&gt;&lt;br /&gt;2. **新增 &lt;code&gt;vitest doctor&lt;/code&gt; 诊断工具**：自动运行替代配置并推荐更快的选项，同时默认输出性能提示，帮助用户发现配置瓶颈。&lt;br /&gt;&lt;b&gt;Browser Mode 内置 Trace View&lt;/b&gt;ew**：开启 &lt;code&gt;browser.traceView&lt;/code&gt; 后，可记录交互、断言和 DOM 快照，支持逐步回放测试过程，便于调试 CI 失败。&lt;br /&gt;&lt;b&gt;嵌套项目与配置继承&lt;/b&gt;继承**：内联项目默认继承根配置（无需 &lt;code&gt;extends: true&lt;/code&gt;），被引用的配置文件可声明自己的 &lt;code&gt;projects&lt;/code&gt;，支持多级嵌套结构。&lt;br /&gt;&lt;br /&gt;5. **新 API &lt;code&gt;vi.when&lt;/code&gt;**：支持按参数定义不同的 Mock 返回值，支持深度相等和 &lt;code&gt;expect.any()&lt;/code&gt; 等非对称匹配器，并可限制调用&lt;b&gt;基准测试 API 重写&lt;/b&gt;API 重写**：&lt;code&gt;bench&lt;/code&gt; 变为测试上下文 fixture，可在常规 &lt;code&gt;test()&lt;/code&gt; 中使用，支持 fixtures、生命周期钩子、重试和断言，结果可存储并与基线&lt;b&gt;定位器错误显示 ARIA 树&lt;/b&gt;ARIA 树**：浏览器模式下定位失败时，同时打印 ARIA 快照和 HTML，帮助快速理解 &lt;code&gt;getByRole&lt;/code&gt; 等查询的匹配逻辑；定位器默认启用严格模式。&lt;br /&gt;&lt;br /&gt;8. **Mock &lt;code&gt;Temporal&lt;/code&gt; API**：假计时器现在同时模拟 &lt;code&gt;Temporal&lt;/code&gt; 和 &lt;code&gt;Date&lt;/code&gt;，适用于 &lt;code&gt;vi.useFakeTimers()&lt;/code&gt; 和 &lt;code&gt;vi.setSystemTime()&lt;/code&gt;。&lt;br /&gt;&lt;br /&gt;9. **更严格的断言行为**：未 await 的异步断言（&lt;code&gt;resolves&lt;/code&gt;、&lt;code&gt;rejects&lt;/code&gt; 等）现在会导致测试失败；&lt;code&gt;expect.poll&lt;/code&gt; 超时后拒绝并支持 &lt;code&gt;AbortSignal&lt;/code&gt; 取消。&lt;br /&gt;&lt;br /&gt;10. **&lt;code&gt;clearMocks&lt;/code&gt; 默认启用**：每个测试前自动清除 Mock 调用历史，避免测试间&lt;b&gt;报告器统一输出目录&lt;/b&gt;。&lt;br /&gt;&lt;br /&gt;11. **报告器统一输出目录**：所有报告器输出集中到 &lt;code&gt;.vitest&lt;/code&gt; 目录，减少 &lt;code&gt;.gitignore&lt;/code&gt; 配置；HTML 报告器支持 &lt;code&gt;singleFile&lt;/code&gt; 选项生成单文件报告。&lt;br /&gt;&lt;br /&gt;12. **其他实用改进**：新增 &lt;code&gt;--repeats&lt;/code&gt; 选项重复运行测试以排查 flaky 测试；&lt;code&gt;injectCjsGlobals&lt;/code&gt; 可禁用 CJS 全局注入；覆盖率工具切换到维护中的 &lt;code&gt;@vitest/istanbuljs&lt;/code&gt; 包。&lt;br /&gt;&lt;br /&gt;13. **破坏性变更**：要求 Vite &amp;gt;= 6.4.0 和 Node.js &amp;gt;= 22.12.0，升级前建议查阅迁移指南。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://vitest.dev/blog/vitest-5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://vitest.dev/blog/vitest-5&quot;&gt;https://vitest.dev/blog/vitest-5&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://vitest.dev/blog/vitest-5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Vitest 5.0 Release Announcement&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;vitest.dev&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Announcing Vitest 5.0&quot; src=&quot;/static/https://cdn4.telesco.pe/file/pVrT7Df8_yhALcjdMSbUXlZgBUnkLka7DoWlX0BhkZtBrRqSCZrphE1n9cwrXrwmFQ9nnTNX5oynSmNrAb2xH-ppzjn20jcze0Kp2GlUi59p1y25xNY62U72jnzS_5aOP6cLJASvUASy5ktk4AHU_wNqd0UVHjwvVIyIizEBdw9f2sgrruYRqN2YTeWz_Im1nBEOJUsi0BsGznnVx9_ce1llIGPkmPJ1caONhNlcFeZ-7-wqNB3Am6YwsU2TLz9lcs2nOH1RU4dQrwCVWvIw5uVxbyXrnem9JCUArwtunI_9LIC5h-nYxLBiIInNtQeercqg-0I_v_eyvWNu4aCh2g.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Announcing Vitest 5.0&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Vitest 5.0 Release Announcement&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《W键在前端：技术与产品的协同进化》</title><link>https://channel.meo-ai.com/posts/673</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/673</guid><pubDate>Fri, 10 Jul 2026 02:21:02 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《W键在前端：技术与产品的协同进化》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96&quot; title=&quot;#前端工程化&quot;&gt;#前端工程化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Electron&quot; title=&quot;#Electron&quot;&gt;#Electron&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Vite&quot; title=&quot;#Vite&quot;&gt;#Vite&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E9%87%8D%E6%9E%84&quot; title=&quot;#代码重构&quot;&gt;#代码重构&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Monorepo&quot; title=&quot;#Monorepo&quot;&gt;#Monorepo&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TailwindCSS&quot; title=&quot;#TailwindCSS&quot;&gt;#TailwindCSS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ShadcnUI&quot; title=&quot;#ShadcnUI&quot;&gt;#ShadcnUI&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ReactRouter&quot; title=&quot;#ReactRouter&quot;&gt;#ReactRouter&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96&quot; title=&quot;#性能优化&quot;&gt;#性能优化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Medal&quot; title=&quot;#Medal&quot;&gt;#Medal&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. **从&quot;巨兽组件&quot;说起**：作者用一张拥有30+ props的TextInput截图开场，生动展示了&quot;反模式&quot;组件的恐怖——职责混乱、默认值泛滥、DOM和自定义props杂糅，改一行代码要检查十个角落，开发体验堪比噩梦&lt;br /&gt;2. **宏观手术刀**：不硬啃旧组件，而是先换&quot;土壤&quot;——迁移Monorepo+PNPM解决版本混乱，引入Vite+HMR让Electron本地开发告别&quot;停启地狱&quot;，CEO亲自下场当普罗米修斯点火&lt;br /&gt;3. **Marie Kondo式删代码**：统一导入路径（包名+清晰路径+文件后缀），减少barrel文件，让AI能精准识别&quot;死代码&quot;。结果疯狂删代码：单PR删除上万行，团队享受&quot;五杀&quot;快感，还提炼出跨平台通用包（utils/hooks/types）&lt;br /&gt;4. **生产环境统一Vite**：干掉Rollup，用Glob Imports做代码分割，配合路由级动态加载，i18n文件懒加载，最终渲染包从巨大体积瘦身到2.7MB，构建速度快到QA都惊呼&quot;嗖嗖嗖&quot;&lt;br /&gt;5. **组件层&quot;换血&quot;**：用Tailwind+Shadcn/Radix UI（后迁Base UI）替代Grommet和Styled Components，给旧组件挂ESLint&quot;红牌&quot;禁止令，同时写迁移指南。React Router v5→v7的大升级也顺势完成，现在搭个新页面只需一天&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://medal.tv/blog/posts/w-key-in-frontend-synergizing-technology-and-product&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://medal.tv/blog/posts/w-key-in-frontend-synergizing-technology-and-product&quot;&gt;https://medal.tv/blog/posts/w-key-in-frontend-synergizing-technology-and-product&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://medal.tv/blog/posts/w-key-in-frontend-synergizing-technology-and-product&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Front End Engineer Rick Zhang shares how Medal&apos;s frontend team broke the deadlock between legacy code and new features by rebuilding their developer experience from the ground up. Through a monorepo migration, a full move to Vite and Rolldown, aggressive…&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;medal.tv&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;W-Key in Frontend: Synergizing Technology and Product | Medal&quot; src=&quot;/static/https://cdn4.telesco.pe/file/Ja8jh4CR_X5n1ZweFyHbHOk07dDOJlt1YEjJr4IwK-miJoQ7-XP0mn5MVL75muvn92MqXGqIxlsw4__v1RrBmkGaW8nTgADE7YHhACPnMF_so3dlhW2tahrRFuskkx13d_iaE5pDMKgqjqKN6wHyIOmJgbF8a2t-8iPwY393mvUegrIa2IfULNQdyMvXR04Om6MLAElsPSfQME303_B9Q8EsXJx6w40grYF_2XwFkrr94ZK6LZq52EfP3D-BbQ0vl2stbCn-tTACUzoGdP1-C8bU6xtWAb0lLCnGGbaDxIRCCM6sC73HUl48vh4DLQSLPBDMSOSHZpEjqDhNmr3-TQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;W-Key in Frontend: Synergizing Technology and Product | Medal&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Front End Engineer Rick Zhang shares how Medal&apos;s frontend team broke the deadlock between legacy code and new features by rebuilding their developer experience from the ground up. Through a monorepo migration, a full move to Vite and Rolldown, aggressive…&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《现代工程价值观：AI 时代的效率与品味》</title><link>https://channel.meo-ai.com/posts/660</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/660</guid><pubDate>Fri, 12 Jun 2026 01:47:25 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《现代工程价值观：AI 时代的效率与品味》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B&quot; title=&quot;#软件工程&quot;&gt;#软件工程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23AI%E7%BC%96%E7%A8%8B&quot; title=&quot;#AI编程&quot;&gt;#AI编程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E5%AE%A1%E6%9F%A5&quot; title=&quot;#代码审查&quot;&gt;#代码审查&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%9B%A2%E9%98%9F%E7%AE%A1%E7%90%86&quot; title=&quot;#团队管理&quot;&gt;#团队管理&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%8A%80%E6%9C%AF%E6%A0%88&quot; title=&quot;#技术栈&quot;&gt;#技术栈&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%BC%80%E5%8F%91%E8%80%85%E4%BD%93%E9%AA%8C&quot; title=&quot;#开发者体验&quot;&gt;#开发者体验&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%B7%A5%E7%A8%8B%E7%AE%A1%E7%90%86&quot; title=&quot;#工程管理&quot;&gt;#工程管理&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;作者 Christoph Nakazawa（cpojer）分享了他近半年完全依赖 AI 编码代理完成多个项目的实战经验，指出编程已从&quot;手写代码&quot;转向&quot;指挥系统生成代码&quot;。文章提炼了 AI 时代仍至关重要的五大工程价值观：强所有权、品味至上、严格约束与快速反馈、代码库即上下文、掌控技术栈，并强调管理需更技术化。作者用数据证明效率提升 3 倍，认为未来瓶颈不再是写代码，而是判断力与品味。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. **AI 编码已成常态**：作者过去数月多个项目（Vite+、fate、Codiff、Athena Crisis 等）90%-100% 由 AI 编写，代码质量甚至超越手写，且能在几分钟内完成过去数周的工作&lt;br /&gt;2. **Codex CLI 是最佳搭档**：使用 GPT 5.5 high 配合 Codex CLI，配合&quot;先写失败测试再修复&quot;的策略，能极大提高一次性正确率；多项目并行时建议每个项目独立窗口，利用空间记忆提升效率&lt;br /&gt;3. **强所有权比代码更重要**：AI 放大了&quot;懂行&quot;与&quot;不懂行&quot;的差距，小团队（2-3 人）+ 清晰边界 + 独立仓库比大团队协作更高效，审查应聚焦对齐而非代码细节争论&lt;br /&gt;4. **品味是防&quot;垃圾&quot;泛滥的护城河**：AI 能全天候生成大量平庸代码，工程师的核心价值转向判断&quot;什么值得做&quot;，团队应花更多时间思考方向而非盲目堆功能&lt;br /&gt;5. **严格约束 = 速度**：把代码规范、自动化测试、快速验证等&quot;护栏&quot;做得越严，AI 迭代越快（1 分钟 vs 60 分钟的差距）；工具必须支持增量检查，避免随代码量增长而变慢&lt;br /&gt;6. **代码库即唯一上下文**：将设计文档、产品行为、决策记录全部沉淀在仓库内，让 AI 和人类都能快速理解；代码越简洁、越易读，AI 修复和迭代越高效&lt;br /&gt;7. **自研技术栈重新划算**：过去依赖第三方库是因为手写代码慢，现在 AI 降低了自研成本，掌控核心依赖能避免被外部框架绑架，获得完全的产品体验控制权&lt;br /&gt;8. **保留选择权（Option Value）**：任何架构改动都应保留未来大幅调整的可能性，AI 虽让重构变快，但把自己逼进死胡同依然难以脱身&lt;br /&gt;9. **管理必须更技术化**：执行成本降低后，管理者不能只做方向把控，必须保持领域 expertise，能亲自改代码、做技术决策，&quot;技术型管理&quot;（Tech Lead Management）将成为主流&lt;br /&gt;10. **效率数据惊人**：近 30 天日均提交 770 次、修改 15k 行代码，是两年前的 3 倍；过去手写巅峰一天 1200 行，现在 AI 辅助可达 10 倍且质量更高&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://cpojer.net/posts/modern-engineering-values&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://cpojer.net/posts/modern-engineering-values&quot;&gt;https://cpojer.net/posts/modern-engineering-values&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://cpojer.net/posts/modern-engineering-values&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Modern engineering values.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;cpojer.net&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Modern Engineering Values&quot; src=&quot;/static/https://cdn4.telesco.pe/file/QweQSg_0hDrvvz2zXk-R-Ju-75cWc1HOdlKdeNp7Zb_GfqU6PR38V0YJ4u3jG6pGyyYo1fQxxQjKwDy47W5iTzD-tL1G16rw_JVFhjxmYQZ2meOFMRKxpxSADw8IvwtKcB8cVca2RXu9VvGQfbczjSRppl_NlJRt3WTmCAD6ejYmZyD8kmbxyshlGP35-xCATRJJdTsJtjExYXp7S6L_AkCKFBmmuLBSZAvmaCer349QQyD9RoJ1LawETQuW4n7tkbDEwv4xyCi5HbNP1fVJyp9aHNxIv1IHnnQkRoHosSIBqARiCMpk0CRGIpkxTkDZJKogKKkR7LiTcBimtujlEA.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Modern Engineering Values&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Modern engineering values.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《TypeScript 每个人都该知道的实用技巧》</title><link>https://channel.meo-ai.com/posts/657</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/657</guid><pubDate>Sat, 06 Jun 2026 12:23:20 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《TypeScript 每个人都该知道的实用技巧》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23TypeScript&quot; title=&quot;#TypeScript&quot;&gt;#TypeScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91&quot; title=&quot;#前端开发&quot;&gt;#前端开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F&quot; title=&quot;#代码质量&quot;&gt;#代码质量&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;这是一份精心整理的 TypeScript 实战模式合集，涵盖 15 个核心技巧，从基础类型安全到高级类型体操，帮助开发者写出更安全、更可维护、更愉悦的代码。每条建议都配有简洁示例，强调&quot;类型安全不等于运行时安全&quot;这一关键认知，适合各阶段 TS 开发者查漏补缺。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. 用 &lt;code&gt;unknown&lt;/code&gt; 替代 &lt;code&gt;any&lt;/code&gt;：强制做类型校验，守住类型安全的第一道防线，防止类型泄漏&lt;br /&gt;2. 让类型推断为你工作：减少不必要的显式注解，避免类型拓宽和维护负担，代码更简洁&lt;br /&gt;3. 用 &lt;code&gt;satisfies&lt;/code&gt; 代替 &lt;code&gt;as&lt;/code&gt;：既验证类型兼容性，又保留具体推断，比强制断言更安全&lt;br /&gt;4. 从值推导类型：用 &lt;code&gt;as const&lt;/code&gt; + &lt;code&gt;typeof&lt;/code&gt; 让运行时和编译时保持同步，告别手动维护两份定义&lt;br /&gt;5. 用可辨识联合建模不可能状态：用 &lt;code&gt;status&lt;/code&gt; 标签区分状态，比松散的可选属性对象更可靠、更易扩展&lt;br /&gt;6. 用 &lt;code&gt;never&lt;/code&gt; 做穷尽检查：在 switch 的 default 分支里赋值 &lt;code&gt;never&lt;/code&gt;，让未来漏改直接变成编译错误&lt;br /&gt;7. 配置和常量用 &lt;code&gt;as const&lt;/code&gt;：把对象属性收窄为字面量类型，比如 &lt;code&gt;&quot;dark&quot;&lt;/code&gt; 而不是宽泛的 &lt;code&gt;string&lt;/code&gt;&lt;br /&gt;8. 用类型谓语做可复用的收窄：把运行时检查写成 &lt;code&gt;value is User&lt;/code&gt; 形式，让编译器理解你的守卫逻辑&lt;br /&gt;9. 从现有类型构建新类型：掌握 &lt;code&gt;Pick&lt;/code&gt;、&lt;code&gt;Omit&lt;/code&gt;、&lt;code&gt;Partial&lt;/code&gt; 等工具类型，用变换思维代替重复定义&lt;br /&gt;10. 运行时校验外部数据：TypeScript 不验证 API 响应，配合 Zod 等库在边界做运行时校验&lt;br /&gt;11. 多数场景避免 &lt;code&gt;enum&lt;/code&gt;：字面量联合类型通常更易重构、更易序列化、运行时行为更可控&lt;br /&gt;12. 优先使用可推断的泛型：好的 API 设计让用户无需手动传泛型参数，靠上下文自动推断&lt;br /&gt;13. 开启严格编译选项：&lt;code&gt;strict&lt;/code&gt;、&lt;code&gt;noUncheckedIndexedAccess&lt;/code&gt; 等标志是 TS 真正发挥价值的地方&lt;br /&gt;14. 学习模板字面量类型：用 `` &lt;code&gt;/api/${string}&lt;/code&gt; `` 这类模式约束路由、事件名、CSS 工具类等字符串&lt;br /&gt;15. 类型安全 ≠ 运行时安全：TS 提升正确性，但不替代校验、不保证架构、不消除运行时错误&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://github.com/AllThingsSmitty/typescript-tips-everyone-should-know&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.com/AllThingsSmitty/typescript-tips-everyone-should-know&quot;&gt;https://github.com/AllThingsSmitty/typescript-tips-everyone-should-know&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.com/AllThingsSmitty/typescript-tips-everyone-should-know&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Practical TypeScript patterns for writing safer, more maintainable code. 🗃 - AllThingsSmitty/typescript-tips-everyone-should-know&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;GitHub&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;GitHub - AllThingsSmitty/typescript-tips-everyone-should-know: Practical TypeScript patterns for writing safer, more maintainable…&quot; src=&quot;/static/https://cdn4.telesco.pe/file/LErS1D_aC9DZOQ0dcYdTeEnseY55QWY3nTnnFt8v1kb_Z13PIUXkoctCIWZ8w5uw3mlXJSWn7SOoDDpfFTsOWiVX6gsPjPHPgxPKG0H8lySaUXDldcK4f_GaY-oKz8BMi9Kzbp0RON47d9LsUk-r1GmM8YmSIWd6pUNeGZbr8jKWs-RfYKy0vz6Ap25dzaKQl7V9PdI9MAX9fLJ1eHbMerRTlPbbiSUlFRHtGwqTUpReIyT_zur0HouriuOKPSSgvOAQhSldKAmcqEW7XzMR7Ip03hGXjwhEiRynO3knk4hb7wMBRoOEWhvR8GwKyZ2UfIyzqEkhLCorAptNg3WuSg.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;GitHub - AllThingsSmitty/typescript-tips-everyone-should-know: Practical TypeScript patterns for writing safer, more maintainable…&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Practical TypeScript patterns for writing safer, more maintainable code. &lt;i class=&quot;emoji&quot; style=&quot;background-image:url(&apos;//telegram.org/img/emoji/40/F09F9783.png&apos;)&quot;&gt;&lt;b&gt;🗃&lt;/b&gt;&lt;/i&gt; - AllThingsSmitty/typescript-tips-everyone-should-know&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《用TanStack_Start构建博客（上篇）》</title><link>https://channel.meo-ai.com/posts/601</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/601</guid><pubDate>Sat, 18 Apr 2026 08:38:00 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《用TanStack_Start构建博客（上篇）》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF&quot; title=&quot;#前端&quot;&gt;#前端&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TanStack_Start&quot; title=&quot;#TanStack_Start&quot;&gt;#TanStack_Start&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TanStack_Router&quot; title=&quot;#TanStack_Router&quot;&gt;#TanStack_Router&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Server_Functions&quot; title=&quot;#Server_Functions&quot;&gt;#Server_Functions&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E9%9D%99%E6%80%81%E9%A2%84%E6%B8%B2%E6%9F%93&quot; title=&quot;#静态预渲染&quot;&gt;#静态预渲染&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Markdown%E5%8D%9A%E5%AE%A2&quot; title=&quot;#Markdown博客&quot;&gt;#Markdown博客&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E9%AB%98%E4%BA%AE&quot; title=&quot;#代码高亮&quot;&gt;#代码高亮&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;本文通过实战案例演示如何使用 TanStack Start 框架构建一个 Markdown 博客系统。文章重点介绍了 Server Functions 解决同构加载器无法访问文件系统的问题、动态路由参数处理、以及使用 markdown-it 和 Shiki 实现带行号的高亮代码块，为开发者提供了完整的技术实现路径。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;- TanStack Start 是基于 TanStack Router 的轻量级服务端框架，支持 SSR、API 端点和 Server Functions&lt;br /&gt;- 使用 &lt;code&gt;import.meta.glob&lt;/code&gt; 动态扫描 Markdown 文件，配合 &lt;code&gt;gray-matter&lt;/code&gt; 解析文章元数据&lt;br /&gt;- Server Functions 是同构应用的关键——无论 loader 在服务端还是客户端运行，都能保证文件读取逻辑始终在服务端执行&lt;br /&gt;- 动态路由通过 &lt;code&gt;$slug.tsx&lt;/code&gt; 文件命名实现，配合 &lt;code&gt;createFileRoute&lt;/code&gt; 和 &lt;code&gt;head&lt;/code&gt; 函数设置页面标题&lt;br /&gt;- 使用 markdown-it + Shiki 实现代码高亮，通过自定义 transformer 支持 &lt;code&gt;line-numbers&lt;/code&gt; 语法标记，结合 CSS counter 渲染行号&lt;br /&gt;- 文章预告下篇将介绍静态生成和部署策略&lt;br /&gt;&lt;br /&gt;文章URL：&lt;a href=&quot;https://frontendmasters.com/blog/building-a-blog-in-tanstack-part-1-of-2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://frontendmasters.com/blog/building-a-blog-in-tanstack-part-1-of-2/&quot;&gt;https://frontendmasters.com/blog/building-a-blog-in-tanstack-part-1-of-2/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://frontendmasters.com/blog/building-a-blog-in-tanstack-part-1-of-2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;TanStack Start is one of the newest web frameworks, and its popularity is rising quickly. Start is a thin server-side layer that sits atop TanStack Router and provides features like server functions, API endpoints, and server-side rendering. I wrote a three…&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Frontend Masters&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Building a Blog in TanStack (Part 1 of 2)&quot; src=&quot;/static/https://cdn4.telesco.pe/file/SdcbHy_4OJWiubsSxzCgJ8NcIYv3G7kH2N2jNrB8t3TbMqiok_ID_AkaDmpPliaU4mXl1YiJIt3X3zT5g_gp8XQIkHth8B2EEC2I6G6apJbHqmdP2u2Iq-PnmtOwfh1fZkB1rppS9zlgzO9GOVVvwO0zRR2yAlmLqAU9C7EOxHZhSNDPt17w8I2KFUxv3OSj56leWB3dwsNJFepmI9N7zNXorIyCzBwmT7GCZHtrwEnltgmCDIt4nT8mhUDinBDAZx9s5sWD59uA5puezmNjeqKksJ_7mhc2d6iqHJLkaLTwRw1kfBYYT_nZECaijRBLRkP0cOM2iq8MiPqUgxhZeg.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Building a Blog in TanStack (Part 1 of 2)&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;TanStack Start is one of the newest web frameworks, and its popularity is rising quickly. Start is a thin server-side layer that sits atop TanStack Router and provides features like server functions, API endpoints, and server-side rendering. I wrote a three…&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《垂直代码库：告别按类型分层，拥抱按业务域组织》</title><link>https://channel.meo-ai.com/posts/599</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/599</guid><pubDate>Sat, 18 Apr 2026 08:12:54 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《垂直代码库：告别按类型分层，拥抱按业务域组织》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF&quot; title=&quot;#前端&quot;&gt;#前端&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E7%BB%84%E7%BB%87&quot; title=&quot;#代码组织&quot;&gt;#代码组织&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1&quot; title=&quot;#架构设计&quot;&gt;#架构设计&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Monorepo&quot; title=&quot;#Monorepo&quot;&gt;#Monorepo&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React&quot; title=&quot;#React&quot;&gt;#React&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B&quot; title=&quot;#软件工程&quot;&gt;#软件工程&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;本文主张前端代码库应从&quot;水平分层&quot;（按 components/hooks/utils 技术类型划分）转向&quot;垂直切片&quot;（按业务域/功能域组织）。作者以 Sentry 代码库十年演进为例，指出水平分层会导致代码分散、认知负荷高、耦合混乱；而垂直组织将同一业务域的组件、工具、类型内聚到一起，配合 Monorepo 的显式边界（exports/eslint-plugin-boundaries），能显著提升可维护性。虽然确定正确的垂直划分需要更多团队沟通，但这是支撑代码库长期演进的必要投资。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;- 水平分层的隐患：把代码按 components / hooks / utils / types 分类虽然上手简单，但随着项目膨胀，同一业务逻辑会被拆得七零八落——比如 PageFilters 的组件、类型、工具函数散落在三个目录，改一个小需求要跳来跳去， cognitive load 直接拉满&lt;br /&gt;- 垂直切片的核心思想：不按&quot;技术类型&quot;而按&quot;业务域&quot;分组，把同一个功能域（如 dashboard、profiling、billing）相关的组件、Hook、工具、类型全部收进一个目录；就像当年我们把 HTML/CSS/JS 从三层文件合并成组件一样，这次是更高维度的&quot;关注点内聚&quot;&lt;br /&gt;- 与团队结构天然对齐：现代产品团队通常是端到端的功能团队（dashboard 团队、replay 团队），垂直代码结构让 CODEOWNERS 和包边界直接对应团队职责，谁负责什么一目了然&lt;br /&gt;- 解决跨域复用焦虑：不是所有代码都严格属于某个页面，像 PageFilters 这种被多页面使用的通用能力，完全可以作为独立垂直域存在；关键是按&quot;逻辑关联&quot;而非&quot;物理位置&quot;来划分&lt;br /&gt;- 用边界守护架构：垂直化后还需降低耦合，推荐通过 Monorepo + package.json#exports 显式暴露公共 API，或借助 eslint-plugin-boundaries 禁止深路径导入，把&quot;私有实现&quot;真正保护起来&lt;br /&gt;- 没有银弹，但值得投入：确定合理的垂直域确实比&quot;丢进 utils&quot;更难，也可能出现不同团队重复造轮子；但作者认为这恰恰促进了团队沟通，而沟通本就是软件工程最难也最重要的部分&lt;br /&gt;&lt;br /&gt;文章URL：&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://tkdodo.eu/blog/the-vertical-codebase&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://tkdodo.eu/blog/the-vertical-codebase&quot;&gt;https://tkdodo.eu/blog/the-vertical-codebase&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://tkdodo.eu/blog/the-vertical-codebase&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Let&apos;s take a look at why the common, horizontal code structure is not ideal, where it breaks down, and what we can do about it.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;tkdodo.eu&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;The Vertical Codebase&quot; src=&quot;/static/https://cdn4.telesco.pe/file/UQNHQ5CBOo9YPc282-wjXkZj4PZ5DB5zFN6AcdBCGzJE5sJnuaw-V2V6sKibIvd5vfa9ekRtzuXoI6OnOZ_k1DF5YFoVfMgJHKVvA63WGg59BKOYzxTqmJaAxqyMw3QUQzlh3zNnw-BVDfmzabcFfGTp6KoV8nnXsMcAzd22mQ1iQg3o9vmfA9Scfo5p3viArCt5tGzxf-n2LhFYLOFxTKAPQtqhrcCjrFgB_maNEZlyJsUk_23V0odEQqqA-gZltg6z0v0kM7ke4letXnHXh4H8E2GYkTFJeFigVwwOpDsOhjT3Uq5wsaF5jXy-cAm6b1bXPEjfKWYiK3s8IC41Yg.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;The Vertical Codebase&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Let&apos;s take a look at why the common, horizontal code structure is not ideal, where it breaks down, and what we can do about it.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《从写代码到管 Agent：斯坦福首门 AI 软件开发课的启示》</title><link>https://channel.meo-ai.com/posts/570</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/570</guid><pubDate>Mon, 02 Mar 2026 08:48:45 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《从写代码到管 Agent：斯坦福首门 AI 软件开发课的启示》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23AI&quot; title=&quot;#AI&quot;&gt;#AI&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Agent&quot; title=&quot;#Agent&quot;&gt;#Agent&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B&quot; title=&quot;#软件工程&quot;&gt;#软件工程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%96%AF%E5%9D%A6%E7%A6%8F&quot; title=&quot;#斯坦福&quot;&gt;#斯坦福&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%81%8C%E4%B8%9A%E5%8F%91%E5%B1%95&quot; title=&quot;#职业发展&quot;&gt;#职业发展&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BA%BA%E6%9C%BA%E5%8D%8F%E4%BD%9C&quot; title=&quot;#人机协作&quot;&gt;#人机协作&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F&quot; title=&quot;#代码质量&quot;&gt;#代码质量&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结&lt;br /&gt;&lt;br /&gt;本文是对斯坦福讲师 Mihail Eric 访谈的解读，他是全美首门 AI 原生软件开发课程 CS146S 的负责人。文章分析了初级开发者面临的&quot;三重风暴&quot;（裁员潮、毕业生激增、AI 替代压力），提出 AI 时代工程师的核心竞争力已从写代码转向&quot;管理 Agent&quot;——即编排多个 AI Agent 完成复杂任务的能力。同时强调 Agent 友好的代码库需要充分的测试覆盖、一致的文档和清晰的设计模式，这些本质上也是对人友好的工程实践。文章还指出资深开发者往往因路径依赖抗拒 AI 工具，而初级工程师的&quot;无知无畏&quot;反而成为快速适应新范式的优势。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;- **初级开发者的三重困境**：COVID 后企业裁员 20-30%、CS 毕业生十年翻倍、雇主倾向&quot;少招人+AI&quot;策略，叠加导致新人求职难度激增&lt;br /&gt;- **Agent 编排是顶级技能**：能同时管理多个 Agent 的工程师属于顶尖 0.1%，但应从单个 Agent 开始逐步增加，避免盲目追求数量&lt;br /&gt;- **上下文切换是核心挑战**：管理多 Agent 需要频繁切换注意力并记住各任务进度，这与管理人类团队的能力高度相似&lt;br /&gt;- **Agent 友好代码库三要素**：充分的测试覆盖（作为显式合约）、README 与代码一致性、统一的设计模式，Agent 会在错误基础上快速复合错误&lt;br /&gt;- **品味决定软件质量**：功能性软件与卓越软件的分界在于&quot;最后一公里&quot;的打磨，顶尖工程师在发现可能性时加速而非完成任务即停止&lt;br /&gt;- **初级工程师的独特优势**：没有历史包袱，学习 AI 工具更快；&quot;无知无畏&quot;的特质使其敢于挑战行业难题，这是创业所需的完美品质&lt;br /&gt;- **避免过度工程化陷阱**：AI 让构建变得太容易，可能导致造出精美但无人需要的产品，需先验证需求再动手开发&lt;br /&gt;&lt;br /&gt;文章URL：&lt;a href=&quot;https://baoyu.io/blog/2026-02-27/from-writing-code-to-managing-agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://baoyu.io/blog/2026-02-27/from-writing-code-to-managing-agents&quot;&gt;https://baoyu.io/blog/2026-02-27/from-writing-code-to-managing-agents&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://baoyu.io/blog/2026-02-27/from-writing-code-to-managing-agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;斯坦福首门 AI 软件开发课讲师 Mihail Eric 谈初级开发者的三重困境、多 Agent 编排的真正难点、Agent 友好代码库的标准，以及为什么初级工程师的&apos;无知无畏&apos;在 AI 时代反而是超能力。&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;baoyu.io&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;从写代码到管 Agent：斯坦福首门 AI 软件开发课的讲师说，大多数工程师还没准备好&quot; src=&quot;/static/https://cdn4.telesco.pe/file/Qedcuvlj6-6V0EG7Ccej2fGwNGPSkYbNp-gMlnpYkKzxT8KzEo5071vepsWtaPLTpm3zhcmDPYP_qR2NOZBzcsgdUQ7EJr4M7RsfX59cMjjZ1ACQjRpCXMHREEh7rB-jUp7pnBWSy6eTC4ahfchkfHBHu0GVVucQepgx_MT3IgB2rf4eT-dgzXBUsRafZWtbUKtn9Zr4a8ZXeERKeEBOSHE0zjHVj7F2gOhg4p7mQECwv1aTuXIBp3ZltOBnUWDop49YqzIsI1r5A2ZN9DveYpgcyIAtiXjE_afhnS2aQ7yz2_A1wSogCOC42hdStVgyAwDj0j_Ec1L8Tm4LFF9OjA.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;从写代码到管 Agent：斯坦福首门 AI 软件开发课的讲师说，大多数工程师还没准备好&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;斯坦福首门 AI 软件开发课讲师 Mihail Eric 谈初级开发者的三重困境、多 Agent 编排的真正难点、Agent 友好代码库的标准，以及为什么初级工程师的&apos;无知无畏&apos;在 AI 时代反而是超能力。&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>