<?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>《修复 React 中的 Hydration Mismatch 错误与 UI 闪烁》</title><link>https://channel.meo-ai.com/posts/731</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/731</guid><pubDate>Thu, 29 Oct 2026 22:20:12 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《修复 React 中的 Hydration Mismatch 错误与 UI 闪烁》&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%E5%BC%80%E5%8F%91&quot; title=&quot;#前端开发&quot;&gt;#前端开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23NextJS&quot; title=&quot;#NextJS&quot;&gt;#NextJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23HydrationMismatch&quot; title=&quot;#HydrationMismatch&quot;&gt;#HydrationMismatch&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23LocalStorage&quot; title=&quot;#LocalStorage&quot;&gt;#LocalStorage&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23SSR&quot; title=&quot;#SSR&quot;&gt;#SSR&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23UI%E9%97%AA%E7%83%81&quot; title=&quot;#UI闪烁&quot;&gt;#UI闪烁&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React19&quot; title=&quot;#React19&quot;&gt;#React19&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;文章以 Next.js 全栈电影应用为例，系统讲解了服务端渲染（SSR）中 Hydration Mismatch 错误的成因与多种修复方案：包括挂载前渲染 null/骨架屏、用 &lt;code&gt;useEffect&lt;/code&gt; 读取 localStorage 保持 SSR、用内联脚本在 hydration 前同步状态以避免闪烁，以及 React 19.3 新增的 &lt;code&gt;use(browser())&lt;/code&gt; API。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. Hydration 是水合过程：React 用 SSR 时的同一组件树在客户端内存中重新渲染，并校验其输出与服务端 HTML 是否一致，不一致就报 Hydration Mismatch 错误。&lt;br /&gt;2. 错误常见诱因是渲染依赖了仅客户端可用的信息，比如 localStorage——服务端拿不到，导致两端输出不同。&lt;br /&gt;3. 通用解法一：&lt;code&gt;useEffect&lt;/code&gt; 中设置 &lt;code&gt;isClient&lt;/code&gt;，挂载前返回 &lt;code&gt;null&lt;/code&gt; 或骨架屏，保证两端输出一致；代价是真实内容不进服务端 HTML，对 SEO 和大型布局不友好。&lt;br /&gt;4. 通用解法二：给元素加 &lt;code&gt;suppressHydrationWarning&lt;/code&gt;，但它只压警告不修问题，且仅一层有效，不宜滥用。&lt;br /&gt;5. 在侧边栏场景中，作者改用 &lt;code&gt;useEffect&lt;/code&gt; 里读 localStorage 并 &lt;code&gt;setState&lt;/code&gt;，先用默认值 &lt;code&gt;false&lt;/code&gt; 完成 SSR，挂载后再更新状态，既保留 SSR 又消除不匹配（但会有短暂闪烁）。&lt;br /&gt;6. 防闪烁的进阶方案：用 &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt; 注入内联脚本，在 hydration 前直接把 localStorage 状态应用到 DOM，并把值挂到 &lt;code&gt;window&lt;/code&gt; 上供 React 初始渲染读取，保证脚本和 React 修改同一批 class。&lt;br /&gt;7. 主题切换用 &lt;code&gt;useIsClient&lt;/code&gt; 延迟渲染（官方推荐做法，小控件可接受）；移动端遮罩层则用 CSS &lt;code&gt;group-[.left-0]:block&lt;/code&gt; 跟随侧边栏 class，避免条件渲染造成的不匹配。&lt;br /&gt;8. React 19.3 引入的 &lt;code&gt;use(browser())&lt;/code&gt; 可以跳过组件的服务端渲染并留下最近的 &lt;code&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt; 兜底，是 &lt;code&gt;useEffect&lt;/code&gt; 方案的替代写法。&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://www.gmoniava.com/blog/hydration-mismatch-errors-and-how-to-fix-them&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://www.gmoniava.com/blog/hydration-mismatch-errors-and-how-to-fix-them&quot;&gt;https://www.gmoniava.com/blog/hydration-mismatch-errors-and-how-to-fix-them&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://gmoniava.com/blog/hydration-mismatch-errors-and-how-to-fix-them&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Understanding hydration mismatch errors and what to do about them.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Gmoniava&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;What Is a Hydration Mismatch Error and How Do You Fix It?&quot; src=&quot;/static/https://cdn4.telesco.pe/file/qmMf-k8xSJajmqkr2p5SzyaN5xBif4nPyK_mUjzV2mOGaho7_JF3xRmgxC71y0tLeeaSA8kVb5iWz6GciEdPPZ2gzV5629YN-uDIIDgIfJHeWvSvDaQA1pTvfcjOaIMTyHpV5vg8DDMtwGyXQXFq8V1RCIvhevyFPEHWNguZZki6BexABOUUsb7iYBfkfvpjAyppwgmOr6oSwfVs_TYbeVyk4uzEn-QbSAHGwpkoSOW7sIoG0oTD30GoXDhxFoIJO8toAOlVvppiELv3IsIgGekpDQj3nFJq9qNVdaSHWXUH4R1SJydZDSG9J9MSFRpiTXqNb_CiiONmx9NkEXQ3ig.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;lazy&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;What Is a Hydration Mismatch Error and How Do You Fix It?&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Understanding hydration mismatch errors and what to do about them.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《设计系统应该默认就是快的》</title><link>https://channel.meo-ai.com/posts/730</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/730</guid><pubDate>Thu, 29 Oct 2026 09:14:04 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《设计系统应该默认就是快的》&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%E5%BC%80%E5%8F%91&quot; title=&quot;#前端开发&quot;&gt;#前端开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F%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=%23%E6%80%A7%E8%83%BD%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%E9%A2%84%E7%AE%97&quot; title=&quot;#性能预算&quot;&gt;#性能预算&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23WebComponents&quot; title=&quot;#WebComponents&quot;&gt;#WebComponents&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%BB%84%E4%BB%B6%E6%B8%B2%E6%9F%93%E4%BC%98%E5%8C%96&quot; title=&quot;#组件渲染优化&quot;&gt;#组件渲染优化&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;这篇文章通过实测十大主流开源设计系统（Mantine、Ant Design、Material UI、React Spectrum、Carbon、Fluent、Web Awesome、UI5、Spectrum Web Components、Ionic），论证了性能应当与设计系统团队所重视的可达性（accessibility）平起平坐：底层组件的每一个性能修复，都会同时惠及所有基于该设计系统构建的应用。测试发现性能优劣并不取决于框架本身，而在于具体实现细节，作者还深入剖析了 Ionic、Ant Design、UI5、React Spectrum 等慢速组件的根因，并给出了可行的修复建议，最后提供了基于 Playwright 的自动化性能测试方案与「Fast by Default（默认即快）」的理念。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 浏览器的 JavaScript 主线程是所有层共用的，设计系统组件越慢，留给应用代码的余地就越小——修复一个设计系统组件的性能，等于同时提升所有依赖它的应用。&lt;br /&gt;2. 作者选取了十个基于不同框架（React、Lit、FAST、Stencil、SAP 自研框架）的设计系统，在 4 倍 CPU 降速、Chrome 155 环境下实测了两大典型场景：打开含 249 个国家的下拉选择器、一次性全选 100 个复选框。&lt;br /&gt;3. 实测结果差异巨大：国家选择器从最快 Fluent 的 61ms 到最慢 Ionic 的 1,266ms（比第二名慢 5 倍以上）；复选框从 Fluent 的 29ms 到 Ant Design 的 421ms——同一框架（如 React 或 Lit）内部差距同样悬殊，性能问题出在实现而非框架。&lt;br /&gt;4. 十个设计系统中只有 Spectrum Web Components 在每个 PR 上自动跑组件级性能基准，多数团队只检查包体积——但包体积与组件在页面上的响应速度并无直接关系。&lt;br /&gt;5. 作者逐一剖析了慢速根因：Ionic 因 Stencil 在无 shadow DOM 的场景下用 &lt;code&gt;appendChildSlotFix&lt;/code&gt; 模拟插槽、每次新增选项都要遍历全部既有子节点三次（O(n²)）；React Spectrum 因 React Aria 逐个清空高度再读取尺寸造成「布局抖动」；UI5 因隐藏弹层中预置全部 249 个选项，打开瞬间浏览器要一次性完成约 1500 个元素的样式计算；Ant Design 的慢则主要来自 100 个复选框同时触发的颜色渐变动画。&lt;br /&gt;6. 性能瓶颈各有解法：长列表用虚拟滚动（Ant Design 的做法值得借鉴，还为屏幕阅读器保留了高亮项的隐藏副本）；动画改由合成器线程运行的 opacity 渐变替代主线程上的颜色渐变；Stencil 可直接修复插槽回退内容的第三次检查，作者实测去掉后加 2000 个元素快约 7 倍。&lt;br /&gt;7. 作者分享了用 Playwright + Chrome DevTools 协议（CPU 降速 4 倍 + Long Animation Frames 长帧 API）编写组件性能测试的完整代码，包含「总耗时预算 300ms」和「最长无响应帧不超过 100ms」两条性能预算（performance budget），以及一条「选项翻倍时耗时增长不超过 2.5 倍」的防 O(n²) 回归测试。&lt;br /&gt;8. 落地的最佳实践是「默认就提供快的行为」：超过性能预算的列表自动切换虚拟化、复选框仅在被直接点击时才播放动画，并在文档中写明每个组件的测试数据规模上限，发布说明中给出修复前后的量化数据（如「500 个选项下打开从 300ms 降到 150ms」）。&lt;br /&gt;9. 以上测试代码已开源在 GitHub 仓库 design-system-performance-tests 中，可直接复制改造用于自己的设计系统，并附带 GitHub Actions 工作流实现每个 PR 自动跑性能测试。&lt;br /&gt;10. 文章结尾宣传了作者的新书《Fast by Default: Practical Performance Engineering》（Manning 早期访问版），把这套思路延伸到后端与移动端。&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://denodell.com/blog/design-systems-should-be-fast-by-default&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://denodell.com/blog/design-systems-should-be-fast-by-default&quot;&gt;https://denodell.com/blog/design-systems-should-be-fast-by-default&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://denodell.com/blog/design-systems-should-be-fast-by-default&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;If a design system’s components are slow to interact with, so are any apps built with it. I timed large dropdowns and checkbox lists in some popular design systems, worked out how to make the slow ones faster, and wrote tests that fail when they’re too slow.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Den Odell&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Design Systems Should Be Fast by Default&quot; src=&quot;/static/https://cdn4.telesco.pe/file/prwDcUJjanfw3iDWSDKbwkdZNnwMgqXd8jse5-sGrIQFZEQ-bM__2cCdCrCKuuMxJn8qbhJIz27feWIXXSJ4RzrlsYlA0KbHp-HDqYfd-XCo_hd1SFHnRsM0VKHnl6faIKdO3Ga2GjMP5NPqFysbIFdTXxI4IQ8sbshAgYrFsSX8KuwMxYAFyVjPKL7AMRowWXal7pJwDx3cCUyRUqdEyPKWxsgr5-_k1pGbKifxUOOqggDzd_sFGafjxxdFuTkkb3JRwMGQhTANx-8Mlia_Qqw7mYYIoG7WpJLcJT2ZKFKG6vPWDSvUSsh84ousi-MwLEF8zrTeP8bDLgBQ0p6tXQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;lazy&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Design Systems Should Be Fast by Default&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;If a design system’s components are slow to interact with, so are any apps built with it. I timed large dropdowns and checkbox lists in some popular design systems, worked out how to make the slow ones faster, and wrote tests that fail when they’re too slow.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《用 React Suspense 面板调试 Suspense》</title><link>https://channel.meo-ai.com/posts/718</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/718</guid><pubDate>Thu, 15 Oct 2026 03:04:58 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《用 React Suspense 面板调试 Suspense》&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%E5%BC%80%E5%8F%91&quot; title=&quot;#前端开发&quot;&gt;#前端开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React&quot; title=&quot;#React&quot;&gt;#React&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23React_Developer_Tools&quot; title=&quot;#React_Developer_Tools&quot;&gt;#React_Developer_Tools&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Suspense%E9%9D%A2%E6%9D%BF&quot; title=&quot;#Suspense面板&quot;&gt;#Suspense面板&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%8A%A0%E8%BD%BD%E8%B0%83%E8%AF%95&quot; title=&quot;#加载调试&quot;&gt;#加载调试&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E9%AA%A8%E6%9E%B6%E5%B1%8F&quot; title=&quot;#骨架屏&quot;&gt;#骨架屏&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%B8%83%E5%B1%80%E6%8A%96%E5%8A%A8&quot; title=&quot;#布局抖动&quot;&gt;#布局抖动&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;本文演示了如何用 React Developer Tools 8.0 新增的 Suspense 面板，排查一个仪表盘页面中&quot;销售统计卡延迟约 2 秒才出现&quot;和&quot;内容到达时快速操作区被顶下去&quot;两个问题。通过时间轴回放、Inspect Suspense Nodes、Suspended by 和强制回退功能，作者定位到负责延迟的边界和 Promise，并把骨架屏改成与真实内容形状、尺寸一致，从而消除了布局抖动。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. Suspense 面板在 React Developer Tools 8.0 中默认启用，配合 React 19.2+ 的开发模式构建能显示最完整的信息。&lt;br /&gt;2. 面板分为四个区域：工具栏（Inspect Suspense Nodes 可直接从页面点选边界）、Minimap（页面边界的可视化地图，颜色区分渲染环境）、时间轴（每步对应一次初始绘制或边界揭示，可回放页面状态）、检查器（查看 Suspended by、props 和渲染来源）。&lt;br /&gt;3. 通过逐步回放时间轴，发现布局抖动发生在统计卡片揭示的那一刻，因为卡片比灰色占位块高，把上方的 QuickActions 顶了下去——嵌套边界只控制揭示顺序，并不为内容预留空间。&lt;br /&gt;4. 用 Inspect Suspense Nodes 从页面内容反查所属边界，比在大页面里挨个找 Minimap 区域更快；找不到时记得关闭 Unique Suspenders 过滤器。&lt;br /&gt;5. Suspended by 显示边界等待的对象、耗时和解析结果，能把排查范围缩小到数据、代码或资源，但无法解释为什么会慢。&lt;br /&gt;6. 检查器里的&quot;暂停所选组件&quot;按钮可以随时把边界强制切回 fallback，方便把骨架屏和真实内容并排对比，无需改代码或限速网络。&lt;br /&gt;7. 修复方法：让骨架屏复刻真实布局——直接渲染四张真实卡片和标签，只把查询得到的数值换成等高的占位行；重放时间轴后快速操作区不再移动。&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://certificates.dev/blog/debugging-suspense-with-the-react-suspense-panel&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://certificates.dev/blog/debugging-suspense-with-the-react-suspense-panel&quot;&gt;https://certificates.dev/blog/debugging-suspense-with-the-react-suspense-panel&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://certificates.dev/blog/debugging-suspense-with-the-react-suspense-panel&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;The Suspense panel in React Developer Tools shows which boundary suspended, what it was waiting for, and the order your page revealed its content.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;certificates.dev&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Debugging Suspense with the React Suspense Panel&quot; src=&quot;/static/https://cdn4.telesco.pe/file/itIF6r_rZleGi-fBncWFr72okFckSxBPXJUJczpkYzxfVukfPGKXh8Sl71oBavizHu14V54c5HhFpd2NerwLibPJXEmuRNvNQfqSt8BidMr7WWh7j_MjwmxxbNKMg44x7HK3PCUJgT10hHUOHEsHQSs-YxVgNU9gl4F3bof4-TvD2Cn1KoKwxh989HEQjEa4v0H8YiNOHhIQV_PfPdHmRSEbrmhU_bGqYGc0Yu9RaBLQFqekrn7bGsc7wQuMieaZjFrxK3V_GHjPtK36YtS2CuiJGynwmCHfBswJpY586KHsSrjWH4ynicZECpWVIie5iovehQiP14sljpU-EzOU0A.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;lazy&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Debugging Suspense with the React Suspense Panel&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;The Suspense panel in React Developer Tools shows which boundary suspended, what it was waiting for, and the order your page revealed its content.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《在 GitHub Copilot 应用中流畅渲染超大 Pull Request》</title><link>https://channel.meo-ai.com/posts/713</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/713</guid><pubDate>Sat, 26 Sep 2026 23:54:52 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《在 GitHub Copilot 应用中流畅渲染超大 Pull Request》&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=%23%E5%89%8D%E7%AB%AF%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=%23PullRequest&quot; title=&quot;#PullRequest&quot;&gt;#PullRequest&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%99%9A%E6%8B%9F%E5%8C%96%E6%B8%B2%E6%9F%93&quot; title=&quot;#虚拟化渲染&quot;&gt;#虚拟化渲染&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%E6%B5%8B%E9%87%8F%E8%B0%83%E5%BA%A6&quot; title=&quot;#测量调度&quot;&gt;#测量调度&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%BB%9A%E5%8A%A8%E9%94%9A%E5%AE%9A&quot; title=&quot;#滚动锚定&quot;&gt;#滚动锚定&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%80%A7%E8%83%BD%E7%9B%91%E6%8E%A7&quot; title=&quot;#性能监控&quot;&gt;#性能监控&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;文章介绍了 GitHub Copilot 应用如何重构 Pull Request 视图，使其能够流畅处理包含 2,200 个文件、超过 100 万行代码变更和 400 多条内联评论的超大型 PR。核心挑战在于评论高度的动态性——与代码行不同，评论高度取决于 Markdown 换行、可展开区块、回复框和图片加载等渲染时才能确定的因素。团队通过分离确定性与动态几何、实现智能测量调度器、采用滚动锚定技术，并建立自动化测量循环来解决这一问题，最终实现了百万行 diff 的流畅浏览体验。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. &lt;b&gt;代码与评论的几何分离&lt;/b&gt;：代码行高度固定且可预先计算，而评论高度动态变化。团队将文档高度分为确定性代码高度（精确前缀和）和动态块高度（估算后测量），两者独立管理，避免评论调整时重建整个代码几何。&lt;br /&gt;&lt;br /&gt;2. &lt;b&gt;智能测量调度器&lt;/b&gt;：放弃每块一个 ResizeObserver 的方案（会触发反馈循环），改为单一的空闲和滚动门控测量通道。仅在视口附近约 2400px 范围内进行测量，屏幕上的块优先批量读取，离屏块最多做一次有限渲染，超过视口高度的块跳过测量。&lt;br /&gt;&lt;br /&gt;3. &lt;b&gt;滚动锚定技术&lt;/b&gt;：当测量高度与估算不符时，通过身份而非像素来校正——记录用户锚定的行或块，应用高度增量后，将同一锚点解析到新像素位置并滚动，确保用户视线不跳动。区分用户滚动与程序滚动，避免侧边栏切换等操作误触发保护机制。&lt;br /&gt;&lt;br /&gt;4. &lt;b&gt;数据管道优化&lt;/b&gt;：流式传输结构优先于内容，文件树和元数据在文档加载时即可渲染；语法高亮在主线程外运行，行先以纯文本显示；释放文档时保留最近几个 diff 的缓存，平衡内存与返回时的加载速度。&lt;br /&gt;&lt;br /&gt;5. &lt;b&gt;自动化测量循环&lt;/b&gt;：建立&quot;变更→测量→改进&quot;的无人值守循环，包括无头探针车道（声明式流程 + 生产环境插桩）和自动驾驶仪（驱动真实桌面应用），通过健康信号（如无未填充间隙、评论块非空）自动检测问题，实现机械式调试而非人工复现。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://github.blog/engineering/user-experience/rendering-huge-pull-requests-in-the-github-copilot-app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.blog/engineering/user-experience/rendering-huge-pull-requests-in-the-github-copilot-app/&quot;&gt;https://github.blog/engineering/user-experience/rendering-huge-pull-requests-in-the-github-copilot-app/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.blog/engineering/user-experience/rendering-huge-pull-requests-in-the-github-copilot-app&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;How we rebuilt the diff surface in the GitHub Copilot app to open a million-line pull request with hundreds of inline review comments.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;The GitHub Blog&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Rendering huge pull requests in the GitHub Copilot app&quot; src=&quot;/static/https://cdn4.telesco.pe/file/Q0e6XCy4GREe5APpCJ0_bG8D7plewPDXZ0hOGWczxwxKYLRaDieMV2SFTC2_VsffSvc68IJy_EE7N0hWt6obHCbDcB7AqLxgmsf_SnKQlcb0FtcO1Z4Ss5KpTVtFGlctYtgOkZOu_7kKZxiMZoqHhr2Yod-hCeNOSxlP7QSUPkDiYNsakYKauC-cRnRgLdmaKpYUAmmSnsWRBcrcWDVTCQ1DqrdWm7ekEr60xsIWQdmCENdNNmv0EV3s_Lt-nl09t2wBa3avHjdmaD1dRPJSLolpITbqM9JdutIsD7Q0624iueRS7ZhEg2ZKOTeB-jXwp-KIrev8BevUBEPog2DNKA.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;lazy&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Rendering huge pull requests in the GitHub Copilot app&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;How we rebuilt the diff surface in the GitHub Copilot app to open a million-line pull request with hundreds of inline review comments.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《框架还重要吗？》</title><link>https://channel.meo-ai.com/posts/708</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/708</guid><pubDate>Sun, 20 Sep 2026 02:45:28 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《框架还重要吗？》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23%E7%BC%96%E7%A8%8B&quot; title=&quot;#编程&quot;&gt;#编程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Web%E5%BC%80%E5%8F%91&quot; title=&quot;#Web开发&quot;&gt;#Web开发&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%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6&quot; title=&quot;#前端框架&quot;&gt;#前端框架&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;a href=&quot;/search/result?q=%23%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF&quot; title=&quot;#技术趋势&quot;&gt;#技术趋势&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23VibeCoding&quot; title=&quot;#VibeCoding&quot;&gt;#VibeCoding&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;这是一篇探讨在 AI 编程时代 Web 框架是否仍然重要的深度分析文章。作者 Brooks Lybrand 作为拥有三年开源框架开发经验的前端工程师，针对&quot;模型已经足够好，框架选择不再重要&quot;的流行观点进行了系统性反驳，论证了框架在提供抽象、结构和约束方面的核心价值，并呼吁行业继续创新和构建新框架。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. **对&quot;React 已赢&quot;论的质疑**：作者指出当前流行观点认为由于 LLM 训练数据中 React 代码最多，模型最熟悉 React，因此无需尝试其他框架。但他认为这种逻辑存在矛盾——如果框架真的不重要，那连 React 都不需要，直接用 Web Components 或让 AI 生成原生代码即可。&lt;br /&gt;&lt;br /&gt;2. **框架的本质价值**：作者将框架的价值精炼为三点：**提供抽象（Abstractions）、结构（Structure）和约束（Constraints）**。这些价值不仅适用于人类开发者，对 AI 编程同样关键——良好的抽象能避免 AI 重复造轮子或创建混乱的临时方案；清晰的结构帮助 AI 生成可维护的代码；明确的约束（如类型检查、测试）能防止 AI 在迭代中破坏系统。&lt;br /&gt;&lt;br /&gt;3. **AI 时代框架的隐性存在**：引用 React 核心团队成员 Ricky Hanlon 的观点&quot;你要么使用框架，要么构建框架&quot;，作者强调即使不显式选择框架，AI 在生成代码时也会隐式地创建框架。与其让 AI 生成一个缺乏维护、充满临时补丁的&quot;隐性框架&quot;，不如使用经过实战检验、文档完善的开源框架。&lt;br /&gt;&lt;br /&gt;4. **开发者体验（DX）的重构**：通过分析 HMR（热模块替换）、TypeScript 和 &lt;code&gt;useEffect&lt;/code&gt; 等具体技术，作者说明某些传统 DX 功能对人类开发者的价值正在转变，但对 AI 编程仍至关重要。例如 TypeScript 的类型约束能有效防止 AI 在复杂应用中引入错误，而 &lt;code&gt;useEffect&lt;/code&gt; 这类强大但易误用的抽象则应该避免让 AI 随意使用。&lt;br /&gt;&lt;br /&gt;5. **框架战争的终结与新机遇**：作者认为 2013-2024 年的&quot;框架战争&quot;已经结束，人们不再渴望为框架争论，但这不意味着框架不再重要。他指出当前框架领域仍存在明显不足，特别是缺乏真正全栈、基于 Web 标准、易于 AI 协作且代码可理解的 JavaScript 框架。&lt;br /&gt;&lt;br /&gt;6. **对未来的呼吁**：尽管承认 AI 正在重塑软件开发，且没人知道其长期影响，作者仍坚持认为认为&quot;所有问题都已解决&quot;是一种颓废的态度。他呼吁继续构建新框架，探索更好的抽象和模式，而不是停留在&quot;现有框架足够好&quot;的舒适区。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://brookslybrand.com/posts/do-frameworks-matter-anymore/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://brookslybrand.com/posts/do-frameworks-matter-anymore/&quot;&gt;https://brookslybrand.com/posts/do-frameworks-matter-anymore/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;gt; 个人觉得有点片面化，remix 脱离 react 转而用 preact 自创轮子</content:encoded></item><item><title>《用 AI 定制框架替换 Next.js：一个静态网站的“超个性化”重构实验》</title><link>https://channel.meo-ai.com/posts/707</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/707</guid><pubDate>Mon, 14 Sep 2026 01:14:08 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《用 AI 定制框架替换 Next.js：一个静态网站的“超个性化”重构实验》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23Web%E5%BC%80%E5%8F%91&quot; title=&quot;#Web开发&quot;&gt;#Web开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B&quot; title=&quot;#前端工程&quot;&gt;#前端工程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23AI%E8%BE%85%E5%8A%A9%E7%BC%96%E7%A8%8B&quot; title=&quot;#AI辅助编程&quot;&gt;#AI辅助编程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23NextJs&quot; title=&quot;#NextJs&quot;&gt;#NextJs&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99&quot; title=&quot;#静态网站&quot;&gt;#静态网站&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A1%86%E6%9E%B6&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=%23Vercel%E9%83%A8%E7%BD%B2&quot; title=&quot;#Vercel部署&quot;&gt;#Vercel部署&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;作者 Max Leiter 用 Claude Code（Fable 5 架构、Opus 实现）在约 3 小时内把个人博客从 Next.js 迁移到了一个为站点量身定制的静态构建框架。新方案把全站编译成纯 HTML，按需加载少量 Preact islands，结果页面体积、Lighthouse 分数、构建时间全面大幅优于 Next.js；代价是放弃了框架生态的无数隐性优化，后续维护与安全问题也由自己承担。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. 作者让 AI “按需造一个比 Next.js 更快的专属框架”，核心思路是只保留这个网站真正用到的 Next.js 功能，而不是继续背着整个框架跑。&lt;br /&gt;&lt;br /&gt;2. 新框架本质上是一个构建脚本：读取文章目录，用 React 在服务端渲染每条路由为静态 index.html，再按 Vercel Build Output API 输出，M2 MacBook 上热构建只要约 0.5 秒。&lt;br /&gt;&lt;br /&gt;3. 性能提升非常夸张：首页 JS 从 208 KB 降到 2.3 KB（约 -99%），移动端 LCP 从 2.4 秒降到 1.3 秒，整页重量从 1153 KB 降到 78 KB，Lighthouse 直接冲到 100 分。&lt;br /&gt;&lt;br /&gt;4. 博客文章页同样收益明显：HTML 更小、JS 只剩 2.3 KB，移动端 LCP 从 2.2 秒降到 1.1 秒，页面重量从 405 KB 降到 57 KB，软导航也改成更轻的 partial/prerender 方案。&lt;br /&gt;&lt;br /&gt;5. 交互没有消失，而是改成“islands”模式：桌面窗口管理器和命令面板用 Preact 组件按需水合，命令面板首次按 Cmd+K 才加载，Preact 兼容层只有约 7 KB，比 React 的 52 KB 轻很多。&lt;br /&gt;&lt;br /&gt;6. 构建链路保留原有体验：MDX 仍在构建期用同一套 remark/rehype 插件编译，shiki 在构建时同时输出两套主题的代码高亮，所以切换主题不需要额外 JS。&lt;br /&gt;&lt;br /&gt;7. AI 还写了一个“parity harness”，对旧站 101 条路由做快照，对比 head、正文和代码块，结果抓出了 8 篇未发布文章泄漏进 RSS、以及一张 404 的 OG 图这类真实问题。&lt;br /&gt;&lt;br /&gt;8. 整个实验花费约 669 美元，API 运行 8 小时 27 分，代码新增 20914 行、删除 2022 行，大约用掉 Claude Code 20x 订阅额度的 10%。&lt;br /&gt;&lt;br /&gt;9. 作者认为这种做法的意义在于“只 vendor 你真正需要的东西”：框架被压缩到约 5000 行，人和模型都更容易审查，也能减少供应链攻击面。&lt;br /&gt;&lt;br /&gt;10. 缺点也很直白：Next.js 里成百上千个小优化和边界处理 AI 未必都知道或能复现；没有现成的 agent 工具链集成；安全修复不再自动从上游来；而且网站一旦有问题，bug、安全、功能需求都归你自己管。&lt;br /&gt;&lt;br /&gt;11. 文章还记录了两个浏览器层面的坑：Chrome 的跨文档 view transitions 会因 head 里的外部 module script 静默跳过入场动画，所以 runtime 必须内联；Safari 对 Speculation Rules 的 feature detection 需要同时检查 API 支持和 document.prerendering。&lt;br /&gt;&lt;br /&gt;12. 作者最后判断：未来可能会出现更多“vendoring”和 agentic rewrite，也就是所谓“slop forks”；更激进的猜测是，框架本身可能会消亡，因为框架真正值钱的是沉淀下来的庞大知识，而这些知识未来可能被蒸馏成 skills 或某种新标准。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://maxleiter.com/blog/thank-u-next&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://maxleiter.com/blog/thank-u-next&quot;&gt;https://maxleiter.com/blog/thank-u-next&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://maxleiter.com/blog/thank-u-next&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Replacing Next.js with a vibe-coded &amp;quot;framework&amp;quot;&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Max Leiter&apos;s website&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;thank u, next | Max Leiter&quot; src=&quot;/static/https://cdn4.telesco.pe/file/kdFAJcXQWvQ2Hj_EO_jXHHu2J1wxQFmIrOIai3MRmDev1LDm5NObdkw9VgPPK3jmGCVtjEshJuSDFb44jM17_RzpPl7XeG0dWZdV94wpyMni3pCIfuAIuWxSLYgtTMV7Ai4WbjKhd5NSW55lby8LaqIfZBwyIvm2PC9DyUqNV4QLsd3jzBGVCYlpAVn5vz0B1xnj_Oba_VkRiPQXzEpyY2BDSpSd1ncfHuZ3I9QzKfPmtGh9n2T167qhPgO2L6qvP_smC8glhYfXnFX1AToNywb10Bs3dvKsv6o6tHSuD9y7THN-_qUuKx7BVOUTLvr7eCxAi6n1grRoYoCFt8B2Cw.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;thank u, next | Max Leiter&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Replacing Next.js with a vibe-coded &quot;framework&quot;&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《浏览器主线程很昂贵：高性能前端优化实战指南》</title><link>https://channel.meo-ai.com/posts/706</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/706</guid><pubDate>Thu, 10 Sep 2026 23:29:33 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《浏览器主线程很昂贵：高性能前端优化实战指南》&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=%23Web%E6%80%A7%E8%83%BD&quot; title=&quot;#Web性能&quot;&gt;#Web性能&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%B5%8F%E8%A7%88%E5%99%A8%E5%8E%9F%E7%90%86&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=%23%E6%B8%B2%E6%9F%93%E7%AE%A1%E7%BA%BF&quot; title=&quot;#渲染管线&quot;&gt;#渲染管线&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23WebWorker&quot; title=&quot;#WebWorker&quot;&gt;#WebWorker&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%8A%A8%E7%94%BB%E4%BC%98%E5%8C%96&quot; title=&quot;#动画优化&quot;&gt;#动画优化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BA%A4%E4%BA%92%E4%BC%98%E5%8C%96&quot; title=&quot;#交互优化&quot;&gt;#交互优化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98&quot; title=&quot;#性能调优&quot;&gt;#性能调优&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;本文深入剖析了浏览器主线程作为稀缺资源的工作原理，指出前端性能问题的根源往往不是代码速度慢，而是主线程被长时间占用导致界面冻结。文章系统性地介绍了两大类优化策略：在主线程上&quot;精打细算&quot;（拆分、批处理、优先级排序、延迟执行），以及&quot;完全不用主线程&quot;（利用合成器线程、Web Worker、消除不必要的工作），并通过大量交互式 Demo 帮助读者直观理解每种技术的实际效果。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. &lt;b&gt;主线程是性能瓶颈的核心&lt;/b&gt;：主线程同时负责运行 JavaScript、样式计算、布局、绘制和事件处理，所有工作排队串行执行。60Hz 屏幕每帧预算约 16.6ms，实际可用仅约 10ms，超过 50ms 的任务会导致界面卡顿。&lt;br /&gt;&lt;br /&gt;2. &lt;b&gt;拆分（Splitting）&lt;/b&gt;：将大任务切割成小片段，通过 &lt;code&gt;setTimeout&lt;/code&gt; 或 &lt;code&gt;requestAnimationFrame&lt;/code&gt; 让出主线程，让浏览器在间隙处理渲染和输入。注意过度拆分会产生额外开销，且 &lt;code&gt;JSON.parse&lt;/code&gt; 等原子操作无法拆分。&lt;br /&gt;&lt;br /&gt;3. &lt;b&gt;批处理（Batching）&lt;/b&gt;：将频繁触发的事件（如滚动、输入）合并执行，使用防抖（debounce）和节流（throttle）减少重复劳动。React 的虚拟 DOM 本质上也是一种批处理机制。&lt;br /&gt;&lt;br /&gt;4. &lt;b&gt;优先级排序（Prioritizing）&lt;/b&gt;：通过自定义队列（基于 &lt;code&gt;MessageChannel&lt;/code&gt;）实现任务插队机制，确保用户当前关注的操作（如点击预览图片）优先执行，采用&quot;空闲时预处理，紧急时优先处理&quot;的策略。&lt;br /&gt;&lt;br /&gt;5. &lt;b&gt;延迟执行（Deferring）&lt;/b&gt;：非必要工作延后处理，包括代码分割、使用 &lt;code&gt;IntersectionObserver&lt;/code&gt; 实现虚拟列表（只渲染可视区域内容）、离屏时暂停动画等，避免一次性处理全部数据。&lt;br /&gt;&lt;br /&gt;6. &lt;b&gt;利用合成器线程&lt;/b&gt;：使用 &lt;code&gt;transform&lt;/code&gt; 和 &lt;code&gt;opacity&lt;/code&gt; 代替 &lt;code&gt;top&lt;/code&gt;、&lt;code&gt;left&lt;/code&gt;、&lt;code&gt;width&lt;/code&gt; 等触发布局的属性做动画，让动画在合成器线程运行，即使主线程繁忙也能保持流畅。&lt;br /&gt;&lt;br /&gt;7. &lt;b&gt;FLIP 动画技术&lt;/b&gt;：对于必须改变布局的动画（如列表重排），先测量初始和最终位置，通过反转和播放 &lt;code&gt;transform&lt;/code&gt; 来实现平滑过渡，将布局计算限制为仅一次，动画过程交给合成器。&lt;br /&gt;&lt;br /&gt;8. &lt;b&gt;Web Worker 处理重计算&lt;/b&gt;：将图片处理、大数据解析等纯计算任务转移到 Worker 线程，通过 &lt;code&gt;postMessage&lt;/code&gt; 的 Transferable 对象（如 &lt;code&gt;ArrayBuffer&lt;/code&gt;）实现零拷贝数据传输，避免主线程冻结。&lt;br /&gt;&lt;br /&gt;9. &lt;b&gt;消除不必要的工作&lt;/b&gt;：当数据流入速度超过处理能力时，采用丢弃（旧日志）、合并（只保留最新值）、跳过（缓存 memoization）三种策略，从源头减少工作量。&lt;br /&gt;&lt;br /&gt;10. &lt;b&gt;避免布局抖动（Layout Thrashing）&lt;/b&gt;：不要交替读写布局属性（如 &lt;code&gt;offsetWidth&lt;/code&gt;），应先批量读取再批量写入，强制浏览器反复计算布局会严重阻塞主线程。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://kciter.so/posts/the-expensive-main-thread/en/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://kciter.so/posts/the-expensive-main-thread/en/&quot;&gt;https://kciter.so/posts/the-expensive-main-thread/en/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://kciter.so/posts/the-expensive-main-thread/en&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;What comes to mind when you hear &amp;quot;frontend optimization&amp;quot;? For most of us it&apos;s things like reducing network requests, shrinking the bundle,…&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;kciter.so&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;The Browser&apos;s Main Thread Is Expensive | kciter.so&quot; src=&quot;/static/https://cdn4.telesco.pe/file/M7yU5vwQA68lMlS1cfdCD6jbRYwY9CREzH7USkG-XnIJ-92aRhup9RXNnO-g64Vxfap3MjPkx0cCo96NP-RjpcI4H_rJwlcDlA62JBGitYmRKNXswN5xB4H1dzZdCGIfT0fIBu6d73jdr1NkSwaqfMPt5I0Z9eoElaT8S5nD0XHwSDcuryH0fAIblnFZ66jz_7tyCgmbw6VRF3GGck-RnU6dkTlCk1pUUVszRfFsL5eDWC_yqgUk3CO4OnE3hvOs2QOUFVDFoBUS1AFVf8mIT7eUh_DxBPiyesG1EIm1evmcWVms-2Fe3vtSm7qBfY004nIb5_5hD1C9jR0NfF-HHQ.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 Browser&apos;s Main Thread Is Expensive | kciter.so&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;What comes to mind when you hear &quot;frontend optimization&quot;? For most of us it&apos;s things like reducing network requests, shrinking the bundle,…&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>《CSS 单位完全参考手册》</title><link>https://channel.meo-ai.com/posts/703</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/703</guid><pubDate>Wed, 02 Sep 2026 13:28:01 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《CSS 单位完全参考手册》&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%E5%BC%80%E5%8F%91&quot; title=&quot;#前端开发&quot;&gt;#前端开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CSS&quot; title=&quot;#CSS&quot;&gt;#CSS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%93%8D%E5%BA%94%E5%BC%8F%E8%AE%BE%E8%AE%A1&quot; title=&quot;#响应式设计&quot;&gt;#响应式设计&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Web%E6%8E%92%E7%89%88&quot; title=&quot;#Web排版&quot;&gt;#Web排版&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%AE%B9%E5%99%A8%E6%9F%A5%E8%AF%A2&quot; title=&quot;#容器查询&quot;&gt;#容器查询&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%A7%86%E5%8F%A3%E5%8D%95%E4%BD%8D&quot; title=&quot;#视口单位&quot;&gt;#视口单位&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%AD%97%E4%BD%93%E7%9B%B8%E5%AF%B9%E5%8D%95%E4%BD%8D&quot; title=&quot;#字体相对单位&quot;&gt;#字体相对单位&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CSS%E6%95%B0%E5%AD%A6%E5%87%BD%E6%95%B0&quot; title=&quot;#CSS数学函数&quot;&gt;#CSS数学函数&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;这是一本由 Mykola Ptushchuk 编写的交互式 CSS 单位参考手册，涵盖从基础像素到现代容器查询单位的所有 CSS 度量单位。全书共 7 章，每个单位都配有实时浏览器演示，可在线调整参数观察实际效果，并提供完整 PDF 下载。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. 全书结构清晰，覆盖七大单位家族：从绝对单位（px）、字体相对单位（em/rem/ch/cap 等）、视口单位（vw/vh 及小/大/动态视口变体）、容器查询单位（cqi/cqw 等）、百分比、数学函数，到角度单位，形成完整的 CSS 度量体系地图。&lt;br /&gt;&lt;br /&gt;2. 视口单位家族详解：现代移动端浏览器 UI 会动态收缩/展开，因此视口单位分为默认（等价于大视口）、小视口（sv，假设浏览器控件展开）、大视口（lv，假设控件收起）和动态视口（dv，实时状态）四大家族，解决了 &lt;code&gt;100vh&lt;/code&gt; 在移动端全屏布局中常见的&quot;被地址栏遮挡&quot;难题。&lt;br /&gt;&lt;br /&gt;3. 容器查询单位让组件真正可移植：&lt;code&gt;cqi&lt;/code&gt;/&lt;code&gt;cqw&lt;/code&gt; 等单位测量的是组件所在的&quot;查询容器&quot;而非整个视口，使同一个卡片组件在 300px 侧边栏和 700px 主栏中能自动呈现不同布局，无需媒体查询或额外类名，实现了&quot;组件响应自身上下文&quot;而非&quot;响应整个页面&quot;的范式转变。&lt;br /&gt;&lt;br /&gt;4. 字体相对单位不止 em/rem：除了常见的 &lt;code&gt;em&lt;/code&gt;（当前元素字体大小）和 &lt;code&gt;rem&lt;/code&gt;（根元素字体大小），还有 &lt;code&gt;ch&lt;/code&gt;（数字 0 的字宽，适合设置最佳阅读行宽如 &lt;code&gt;65ch&lt;/code&gt;）、&lt;code&gt;cap&lt;/code&gt;（大写字母高度，适合图标与标题对齐）、&lt;code&gt;lh&lt;/code&gt;（当前行高作为长度）等精细排版单位，以及对应的根元素变体（rch/rex/rcap 等，2026 年 1 月才在 Firefox 中补齐，至此全浏览器支持）。&lt;br /&gt;&lt;br /&gt;5. CSS 数学函数是单位的粘合剂：&lt;code&gt;calc()&lt;/code&gt; 可混合不同单位（如 &lt;code&gt;100% - 240px&lt;/code&gt;），&lt;code&gt;clamp()&lt;/code&gt; 实现流体排版（如 &lt;code&gt;clamp(2rem, 5vw + 1rem, 4rem)&lt;/code&gt;），&lt;code&gt;min()/max()&lt;/code&gt; 取极值，还有三角函数（&lt;code&gt;sin/cos/tan&lt;/code&gt;）可用于无 JS 的圆形布局，指数函数（&lt;code&gt;pow/sqrt&lt;/code&gt;）可构建模块化字号比例系统。&lt;br /&gt;&lt;br /&gt;6. 实用选型建议：正文用 &lt;code&gt;rem&lt;/code&gt; 尊重用户偏好，组件内部比例用 &lt;code&gt;em&lt;/code&gt; 保持缩放一致性，&lt;code&gt;line-height&lt;/code&gt; 推荐无单位写法（如 &lt;code&gt;1.5&lt;/code&gt;）以便作为乘数继承，&lt;code&gt;clamp()&lt;/code&gt; 的流体值中务必包含 &lt;code&gt;rem&lt;/code&gt; 项以确保缩放无障碍性。&lt;br /&gt;&lt;br /&gt;7. 交互式学习体验：每个单位都配有可拖拽、可滑动的实时演示，直接在浏览器中观察单位变化效果，将抽象概念转化为直观体验，并支持下载完整 PDF 离线阅读。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://cssunits.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://cssunits.com/&quot;&gt;https://cssunits.com/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://cssunits.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;A complete interactive reference to every CSS measurement unit. From the basics of px and rem to the nuances of svh, dvh, and cqw.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;CSS Units&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;CSS Units — The Complete Reference&quot; src=&quot;/static/https://cdn4.telesco.pe/file/AT6h8pjfCkp_NRrPaD5TkS-87t7UrKQHXNF-NoWZhC1pDd2HlAyJu29y8zrNUSI82Uu4vmjOKmJ65DbVIkgB6uqrGGa-ZuTI3f-39CT-anyXVvjvGsSdF_tocD3xH_AiGgJd3mLLtOLdqEeHS5nz7RYNXG7MzBU1uUM26Jj87nW5fExS5Wf2N0XTxn_zUVx8joWV_wnZmH10otZqAeKHqBiqwtXjV-99EFtl3BiB1VU9OPiiBARJAypdJ9hDcE8Ys3fDSdSXMKR8GPU6Ruy0DvDyvBoyp59ibi5_PX-X4KQrI0-ZueMxN-GdN_e5wlBs2MbhxplSQWiuq8cov38NdQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;CSS Units — The Complete Reference&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;A complete interactive reference to every CSS measurement unit. From the basics of px and rem to the nuances of svh, dvh, and cqw.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《视觉回归测试：你可能还没跑起来的最重要测试》</title><link>https://channel.meo-ai.com/posts/702</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/702</guid><pubDate>Mon, 31 Aug 2026 01:33:14 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《视觉回归测试：你可能还没跑起来的最重要测试》&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%E6%B5%8B%E8%AF%95&quot; title=&quot;#前端测试&quot;&gt;#前端测试&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%A7%86%E8%A7%89%E5%9B%9E%E5%BD%92%E6%B5%8B%E8%AF%95&quot; title=&quot;#视觉回归测试&quot;&gt;#视觉回归测试&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95&quot; title=&quot;#自动化测试&quot;&gt;#自动化测试&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%B4%A8%E9%87%8F%E4%BF%9D%E8%AF%81&quot; title=&quot;#质量保证&quot;&gt;#质量保证&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Web%E5%BC%80%E5%8F%91&quot; title=&quot;#Web开发&quot;&gt;#Web开发&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;文章系统介绍了视觉回归测试（Visual Regression Testing）的概念、重要性、工作原理、主流工具及实践建议。核心观点是：即使功能测试覆盖率100%，应用仍可能在视觉上&quot;看起来完全损坏&quot;。视觉回归测试通过截图对比基线，捕捉传统测试无法发现的视觉缺陷，在AI生成代码时代尤为重要。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. 为什么视觉测试不可或缺：单元测试、集成测试和E2E测试只验证功能逻辑，不检查实际视觉呈现。CSS类名测试是代码异味，因为即使类名正确，实际渲染仍可能因样式冲突、加载失败等出问题。&lt;br /&gt;&lt;br /&gt;2. 工作原理超直观：在真实浏览器中渲染页面/组件并截图，与基线快照对比。匹配则通过，不匹配则在CI/CD中标记失败，需人工审核确认是否为预期变更。&lt;br /&gt;&lt;br /&gt;3. 能抓住哪些&quot;隐形&quot;Bug：组件一处修改意外影响其他使用位置、CSS变更导致的布局错位、响应式问题、跨浏览器渲染差异、字体/图片加载失败等。作者曾靠它避免了一个SVG图标在20处地方颜色错误的生产事故。&lt;br /&gt;&lt;br /&gt;4. 三大主流工具怎么选：Percy（适合全页截图，与Playwright/Cypress/Puppeteer兼容，UI体验好但用量大时贵）；Chromatic（Storybook生态，组件级截图，免费 tier 友好）；Vitest Browser Mode（内置截图测试，但缺少审核UI，适合组件级）。&lt;br /&gt;&lt;br /&gt;5. 接入CI/CD很轻松：通常在现有E2E测试中插入一行代码即可，如Playwright中调用&lt;code&gt;percySnapshot()&lt;/code&gt;或Chromatic的&lt;code&gt;takeSnapshot()&lt;/code&gt;，无需重构测试架构。&lt;br /&gt;&lt;br /&gt;6. 避免&quot; flaky 测试&quot;的实用技巧：确保页面完全加载后再截图；用CSS隐藏动画区域；对动态数据（如日期、&quot;5天前&quot;）设置忽略区域；避免对内容过多的整页盲目截图，要有选择性地测试。&lt;br /&gt;&lt;br /&gt;7. AI时代的刚需：随着AI生成代码的普及，视觉回归测试将变得更加关键，能帮助团队快速发现AI改动带来的意外视觉副作用。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://howtotestfrontend.com/resources/visual-regression-testing-introduction-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://howtotestfrontend.com/resources/visual-regression-testing-introduction-guide&quot;&gt;https://howtotestfrontend.com/resources/visual-regression-testing-introduction-guide&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://howtotestfrontend.com/resources/visual-regression-testing-introduction-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Your tests can pass while your app looks broken. Visual regression testing catches the UI bugs that unit, integration and E2E tests miss - and here is how to set it up with Percy, Chromatic or Vitest Browser Mode&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;How To Test Frontend&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Visual Regression Testing: The Most Important Test You&apos;re Not Running&quot; src=&quot;/static/https://cdn4.telesco.pe/file/CGxxW8nFXdB1gDL_CmmjoycXKoB0saZWUUhDJkscoSgYoiSkQwGh5RLAsUsSHyUowqYgZU8yVxp1QoCCLPoHo83cfiGoPoZpF_vbxN3zTDgy8euVFCg-s4mBuWJy3HcLjxeWXsDpvCX26HZ3a--_JOe5_bEecG1TUOYgseIPLQBLI5UzsKFer4Cb9iAMmLvfirC3bIcvYOJ91sVYWVVj1LJ1QdENqkQNVsQR10Aq-g8cfhKasffOcUzWNw0YcqSZpGJpQC58xesUdhvHtK2cXQChLKCqtbQVDD9ar6aOjVCkfkZoJb_W86D4ZBj4eXcrEVXuJgvp5YtnAcvaC6sjow.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Visual Regression Testing: The Most Important Test You&apos;re Not Running&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Your tests can pass while your app looks broken. Visual regression testing catches the UI bugs that unit, integration and E2E tests miss - and here is how to set it up with Percy, Chromatic or Vitest Browser Mode&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《你的模块在骗你：ESM 与 CommonJS 的本质差异与陷阱全解析》</title><link>https://channel.meo-ai.com/posts/701</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/701</guid><pubDate>Fri, 28 Aug 2026 01:13:02 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《你的模块在骗你：ESM 与 CommonJS 的本质差异与陷阱全解析》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&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=%23NodeJS&quot; title=&quot;#NodeJS&quot;&gt;#NodeJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ESM&quot; title=&quot;#ESM&quot;&gt;#ESM&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CommonJS&quot; title=&quot;#CommonJS&quot;&gt;#CommonJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%A8%A1%E5%9D%97%E7%B3%BB%E7%BB%9F&quot; title=&quot;#模块系统&quot;&gt;#模块系统&lt;/a&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;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;本文深入剖析了 ESM 和 CommonJS 两种模块系统在底层机制上的根本差异——ESM 通过&quot;活绑定&quot;（live bindings）在模块间共享变量引用，而 CommonJS 通过 &lt;code&gt;module.exports&lt;/code&gt; 返回一个普通值（通常是对象）。这一差异导致了同名导入在两种系统下行为截然不同：ESM 的命名导入能观察到导出模块的变量重新赋值，CommonJS 的解构赋值则只复制了属性的当前值。文章进一步系统讲解了评估顺序、缓存机制、循环依赖处理、跨系统互操作、双包实例风险等关键话题，并提供了 9 条实践规则和调试清单。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. 活绑定 vs 值复制：最经典的陷阱 — ESM 的 &lt;code&gt;import { status }&lt;/code&gt; 是活绑定，导出模块重新赋值后导入方自动看到新值；CommonJS 的 &lt;code&gt;const { status } = require()&lt;/code&gt; 是解构赋值，只复制了对象属性的当前值，后续变化不可见。只有保留整个对象 &lt;code&gt;const state = require()&lt;/code&gt; 才能观察到属性变更。&lt;br /&gt;&lt;br /&gt;2. ESM 的导入会被提升，CommonJS 按执行顺序 — ESM 静态导入在模块体执行前就已经解析、链接并评估依赖，所以 &lt;code&gt;import&lt;/code&gt; 写在代码中间也不影响执行顺序；CommonJS 的 &lt;code&gt;require()&lt;/code&gt; 是普通函数调用，走到哪行才执行哪行。&lt;br /&gt;&lt;br /&gt;3. 两种系统有独立的缓存 — ESM 和 CommonJS 各自维护自己的模块缓存，URL 查询参数（如 &lt;code&gt;?mode=one&lt;/code&gt;）会让同一文件被当作不同模块实例加载两次。条件导出（&lt;code&gt;&quot;import&quot;&lt;/code&gt; / &lt;code&gt;&quot;require&quot;&lt;/code&gt;）指向不同文件时，也会产生两个独立的模块实例。&lt;br /&gt;&lt;br /&gt;4. 循环依赖的处理方式天差地别 — CommonJS 允许在模块未完全初始化时就返回 &lt;code&gt;exports&lt;/code&gt; 对象，因此循环依赖中的模块能看到对方&quot;半成品&quot;状态；ESM 则先创建绑定再执行模块体，如果在初始化前读取对方绑定会抛出 &lt;code&gt;ReferenceError: Cannot access before initialization&lt;/code&gt;。&lt;br /&gt;&lt;br /&gt;5. 跨系统互操作的隐藏复杂性 — ESM 导入 CJS 时，&lt;code&gt;module.exports&lt;/code&gt; 作为 &lt;code&gt;default&lt;/code&gt; 导出最可靠，命名导出是 Node 静态分析的&quot;快照&quot;，不会跟踪后续属性变更；CJS 通过 &lt;code&gt;require()&lt;/code&gt; 加载 ESM 时返回的是命名空间对象，需通过 &lt;code&gt;.default&lt;/code&gt; 访问默认导出。&lt;code&gt;__esModule&lt;/code&gt; 只是工具链约定，不是语言特性。&lt;br /&gt;&lt;br /&gt;6. 双包实例风险（Dual-Package Hazard） — 当 &lt;code&gt;&quot;import&quot;&lt;/code&gt; 和 &lt;code&gt;&quot;require&quot;&lt;/code&gt; 指向不同构建文件时，同一个类会被实例化为两个不同的构造函数，&lt;code&gt;instanceof&lt;/code&gt; 会返回 &lt;code&gt;false&lt;/code&gt;，共享状态（如计数器、注册表）也会分裂成两份。&lt;br /&gt;&lt;br /&gt;7. 发布库的最佳实践 — 用 &lt;code&gt;.mjs&lt;/code&gt;/&lt;code&gt;.cjs&lt;/code&gt; 明确文件格式；&lt;code&gt;package.json&lt;/code&gt; 中 &lt;code&gt;&quot;type&quot;&lt;/code&gt; 字段决定 &lt;code&gt;.js&lt;/code&gt; 的解析方式；相对 ESM 导入必须带文件扩展名；用 &lt;code&gt;&quot;exports&quot;&lt;/code&gt; 条件导出为不同系统提供入口，但要警惕实例分裂。&lt;br /&gt;&lt;br /&gt;8. 调试模块问题的检查清单 — 从导入文件的格式、解析到的入口点、返回值形状、本地变量持有的是绑定还是副本、评估是否完成、是否存在循环依赖、模块身份是否一致、是否经过构建工具转换、是否通过打包后的 tarball 测试等 9 个维度系统排查。&lt;br /&gt;&lt;br /&gt;9. 九条实践规则 — 新项目优先用 ESM；库优先用命名导出；可变导出视为共享进程状态；CJS 属性会变时保留对象而非解构；移除循环依赖而非绕开；条件/延迟加载用动态 &lt;code&gt;import()&lt;/code&gt;；包边界显式声明文件格式；假设不同导出目标是不同实例；通过包名而非源码路径测试。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://blog.gaborkoos.com/posts/2026-08-14-Your-Modules-Are-Lying-to-You/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://blog.gaborkoos.com/posts/2026-08-14-Your-Modules-Are-Lying-to-You/&quot;&gt;https://blog.gaborkoos.com/posts/2026-08-14-Your-Modules-Are-Lying-to-You/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://blog.gaborkoos.com/posts/2026-08-14-Your-Modules-Are-Lying-to-You&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;ESM and CommonJS expose values through different contracts. Learn how bindings, object references, evaluation order, caching, cycles, and interop shape module behavior in Node.js.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Gaborkoos&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Your Modules Are Lying to You&quot; src=&quot;/static/https://cdn4.telesco.pe/file/in4_ukS7CHW4JkfaPzwpRy_xaEUC6hkaOVOeiHHAbDOPUAM9KYDjbtXHuDaIouRG3zaMHPRB2Xu2qesYdWEYrIPtHZOa15cjevFUQNZ9J-vxMLlIGozxzVZvTMF02G3duAhiQGsye5zIsJ2rLQ7CjxzqB6v159SeR6OoFkDr7d0XWjW9O8nIhXUN3LD2vA_ITTv-Z8yLdWH0so5tnKcCcKHWVcNftxEOTZNy_8m7ROyd-9gYP_u2tFtY3C2eMfrjtmofAxeXIc1uJ3b9Q_xsUZjSmE9thIKYKkILvZXrFDmrwlYRw8FdCnRaQKMigZGtFXJ_vq3A13DKEuzV8mBlLQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Your Modules Are Lying to You&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;ESM and CommonJS expose values through different contracts. Learn how bindings, object references, evaluation order, caching, cycles, and interop shape module behavior in Node.js.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《Oxlint 原生集成 React Compiler：Lint 速度提升 3 倍，Rust 工具链再进一步》</title><link>https://channel.meo-ai.com/posts/700</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/700</guid><pubDate>Fri, 28 Aug 2026 01:11:29 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Oxlint 原生集成 React Compiler：Lint 速度提升 3 倍，Rust 工具链再进一步》&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%E5%BC%80%E5%8F%91&quot; title=&quot;#前端开发&quot;&gt;#前端开发&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=%23Rust&quot; title=&quot;#Rust&quot;&gt;#Rust&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Oxlint&quot; title=&quot;#Oxlint&quot;&gt;#Oxlint&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=%23%E7%BC%96%E8%AF%91%E5%99%A8&quot; title=&quot;#编译器&quot;&gt;#编译器&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;Oxlint 在 v1.79.0 中正式原生集成了 React Compiler 的 22 条 lint 规则，无需 Babel 管道即可在 Rust 层直接运行。这意味着开发者可以在 lint 阶段就捕获 React Compiler 的 bailout（回退）情况，而 lint 任务耗时从约 29.2 秒骤降至 9.1 秒（3.2 倍加速），若去掉其他 JS 插件甚至可达 11 倍。作者强调：使用 React Compiler 时，启用全部 lint 规则是&quot;不可争议的前提条件&quot;，因为一次 bailout 就可能导致性能严重退化（如作者主页动画卡顿）。同时，oxc 的 Rust 版 React Compiler 构建时转换也已接近可用，比原版快约 2 倍。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. React Compiler 的 Rust 重写已成官方版本 — React 团队近期发布了 Rust 重写的 React Compiler，作为新的 canonical 版本。作者已在 AI 建站工具 Outlyne 中使用近一年，彻底告别手动 &lt;code&gt;useCallback&lt;/code&gt;/&lt;code&gt;useMemo&lt;/code&gt;。&lt;br /&gt;&lt;br /&gt;2. 作者已全面迁移到 oxc 生态 — Rollup → Rolldown、ESLint → Oxlint、Prettier → oxfmt、Jest → Vitest，整体工具链已 Rust 化，但 React Compiler 的 lint 插件一直是瓶颈。&lt;br /&gt;&lt;br /&gt;3. 旧方案的痛点：Babel 管道拖慢 lint 3 倍 — 此前通过 Oxlint 的 JS 插件支持运行 React Compiler linter，需要先跑 Babel 再跑 Compiler 核心构建 AST，导致 lint 任务耗时从 9 秒暴涨到 29 秒。&lt;br /&gt;&lt;br /&gt;4. Oxlint v1.70.0 起引入原生支持 — 新增 nursery 规则 &lt;code&gt;react/react-compiler&lt;/code&gt;，直接在 Rust 中运行 React Compiler，无需 Babel。v1.79.0 正式发布 22 条 Compiler 驱动的规则，覆盖 React 规则的验证。&lt;br /&gt;&lt;br /&gt;5. 推荐配置：correctness + 枚举剩余规则 — 启用 &lt;code&gt;correctness&lt;/code&gt; 类别可覆盖 12 条规则，再手动列出其余 10 条。若启用 &lt;code&gt;restriction&lt;/code&gt; 类别则自动再纳入 5 条，&lt;code&gt;suspicious&lt;/code&gt; 纳入 4 条，&lt;code&gt;perf&lt;/code&gt; 纳入 1 条。&lt;br /&gt;&lt;br /&gt;6. 速度实测：3.2 倍到 11 倍提升 — 原生规则下 lint 从 29.2s → 9.1s；若同时去掉无原生替代的 JS 插件（如 perfectionist），可进一步降至 2.6s，实现 11 倍加速。&lt;br /&gt;&lt;br /&gt;7. 构建时转换也在推进中 — oxc 已合并原生构建时 transform，但 Rolldown/Vite 曾因二进制体积增加 17% 而暂时回退。oxc-transform-react v0.0.1 已发布，比原版 Rust Compiler 快约 2 倍，source map 已修复，支持 fast refresh，作者已在生产环境测试。&lt;br /&gt;&lt;br /&gt;8. 迁移门槛极低 — 只需 lint 层面改动，不影响构建步骤。可用 &lt;code&gt;npx @oxlint/migrate&lt;/code&gt; 自动迁移 ESLint flat config，或让 LLM 帮忙。甚至可以先并行跑 Oxlint 和 ESLint，只替换 React Compiler 插件就能提速。&lt;br /&gt;&lt;br /&gt;9. 一个常见陷阱：props 重新赋值 — &lt;code&gt;function MyComponent({ value }) { value = value ?? fallback; }&lt;/code&gt; 这种写法会让整个组件被 Compiler 跳过（bailout），导致性能退化。建议用解构重命名解决，同时开启 &lt;code&gt;eslint/no-param-reassign&lt;/code&gt; 规则。&lt;br /&gt;&lt;br /&gt;10. 作者的底线原则 — &quot;React Compiler without linting all bailouts considered unsafe&quot;（不 lint 所有 bailout 的 React Compiler 视为不安全）。一次 bailout 曾导致其首页动画 placeholder 卡顿、视觉破碎。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://blog.master.dev/react-compiler-linting-just-got-a-rust-native-speedup-in-oxlint/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://blog.master.dev/react-compiler-linting-just-got-a-rust-native-speedup-in-oxlint/&quot;&gt;https://blog.master.dev/react-compiler-linting-just-got-a-rust-native-speedup-in-oxlint/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://blog.master.dev/react-compiler-linting-just-got-a-rust-native-speedup-in-oxlint&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Update! This is a re-written version of this recently-published post about linting code bound for the React Compiler with Oxlint. Oxlint just published a new guide to this, so this post reflects that new information. The React team made a big splash recently…&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;blog.master.dev&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;React Compiler Linting Just Got a Rust-Native Speedup in Oxlint&quot; src=&quot;/static/https://cdn4.telesco.pe/file/OHlqH-nASgtGQNAV2eyB9xdd-CSmi98_4byEKKriABrv2zpIIbyCnHYoXbjAJPoWoargdinvYMvp-vq5rpoc1NQr0orSUr7Yc1sX8xbuhJhmzo9LDEPQzxqNROwphk_CLw6n3VphTOo39OCrNqk5FprnPOxxOl1ljsEWRj5d4WNQB2O91cJHMyRsZsDBh_M1gE7H3ejveCspwUdiohAyOUQ6mvC0AeDELacUgZtAYV43KcykJnONzH2Jh5bmt3WXPrqybry8haYf2FSeO4EQfNWYft-EQMgj4DoBhLntiihSLHh8xcXC5ViHruldAEqtMDPHIuIAKS2rPpSM1fzd-w.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;React Compiler Linting Just Got a Rust-Native Speedup in Oxlint&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Update! This is a re-written version of this recently-published post about linting code bound for the React Compiler with Oxlint. Oxlint just published a new guide to this, so this post reflects that new information. The React team made a big splash recently…&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《TanStack AI 进入 RC 阶段：从 humble chat() 到完整 AI 生态》</title><link>https://channel.meo-ai.com/posts/699</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/699</guid><pubDate>Fri, 28 Aug 2026 01:09:36 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《TanStack AI 进入 RC 阶段：从 humble chat() 到完整 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%E5%BC%80%E5%8F%91&quot; title=&quot;#前端开发&quot;&gt;#前端开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23AI%E6%A1%86%E6%9E%B6&quot; title=&quot;#AI框架&quot;&gt;#AI框架&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TanStack&quot; title=&quot;#TanStack&quot;&gt;#TanStack&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=%23%E5%BC%80%E6%BA%90&quot; title=&quot;#开源&quot;&gt;#开源&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;TanStack AI 正式从早期原型迈入 RC（Release Candidate）阶段，标志着其从一个简单的 LLM 聊天方法，成长为覆盖聊天、媒体生成、MCP、沙箱、Agent 编排等全场景的 AI 开发框架。核心设计哲学是&quot;不锁定用户&quot;——在传输层、提供商、前后端技术栈上都保持中立，同时通过极致的类型安全和统一的 API 模式降低学习成本。项目由三人业余时间维护，完全开源，无商业路线图。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. 从小 chat() 到大生态 — 最初只有 4 个提供商和一个自定义协议，如今已支持 24+ 提供商，采用 AG-UI 官方协议（被 20+ Agent 框架跨语言支持），并扩展到媒体生成、MCP、沙箱、Agent Harness 等领域。&lt;br /&gt;&lt;br /&gt;2. 中间件是架构的核心超能力 — 几乎所有高级功能（持久化、沙箱 Agent、内存、遥测）都以中间件形式接入 chat() 方法，Durability 则通过适配器插入流式响应。Lazy Tool Calling 用一个布尔标志就能降低 Token 成本。&lt;br /&gt;&lt;br /&gt;3. 传输层零锁定 — 提供 SSE、WebSocket、HTTP Stream、Cap&apos;n Web 等原生传输原语，客户端通过自定义连接适配器消费流，让你对传输层有端到端的完全控制权。&lt;br /&gt;&lt;br /&gt;4. 一套 API 模式打遍所有模态 — 无论是文本生成、图像生成、视频生成、音频生成、转录还是实时音频，API 结构几乎完全相同。学一次模式，换适配器即可，不用学 20 套不同 API。&lt;br /&gt;&lt;br /&gt;5. 类型安全是 DNA 级别 — 不支持的模型选项、缺少必填属性、把某提供商专属工具传给不支持的模型……统统在编译期报错。目标是让你在再复杂的应用里也能自信上线。&lt;br /&gt;&lt;br /&gt;6. chat() 方法是全能核心 — 支持直接对话 LLM 和沙箱 Agent Harness；内置持久化与 Durability（刷新页面、切换对话后能从断点实时续流）；支持 Codex 等 Agent 在远程/本地沙箱中运行；还有 Code Mode（Agent 在 isolate 中写代码并执行，优化性能和成本）。&lt;br /&gt;&lt;br /&gt;7. 媒体生成是一等公民 — 实时音频、TTS、图像/视频/音频/音乐生成、转录等全部稳定可用，覆盖 100+ 模型。支持流式直传客户端或一次性生成，两者切换无缝。&lt;br /&gt;&lt;br /&gt;8. RAG 与记忆 — 通过 Cohere、OpenRouter 等提供商支持嵌入和重排序；支持所有主流厂商的 Agent 记忆，让 Agent 跨对话记住用户偏好和关键事实。&lt;br /&gt;&lt;br /&gt;9. 沙箱与 Agent Harness 不挑提供商 — 不强制你用 Daytona、E2B 或 Vercel Sandboxes，基础设施随你选。支持 Codex、Claude Code、Grok、OpenCode 等 20+ ACP 兼容 Agent，甚至能自建本地编码 Agent。&lt;br /&gt;&lt;br /&gt;10. MCP 支持带类型生成 — 不仅能连接外部 MCP 服务器，还能通过 CLI 为远程 MCP 暴露的工具生成类型，保持端到端类型安全。支持连接池和生命周期管理。&lt;br /&gt;&lt;br /&gt;11. 持久化与 Durability 是亮点 — 提供存储原语，你只需实现 Store 并通过一致性测试套件验证，接入持久化中间件后，用户一个月后回来也能从断点续聊。Durability 适配器可将流块持久化到内存、Durable Streams 等，用户重连后不会漏掉任何内容——全部配置约 20 行代码。&lt;br /&gt;&lt;br /&gt;12. 未来路线图 — 核心架构已锁定，接下来重点在 Agent 工作流与编排（并行运行、定时任务、复杂工作流协调），以及继续补齐提供商生态。完全开源，无商业 upsell，欢迎社区贡献。&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://tanstack.com/blog/tanstack-ai-rc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://tanstack.com/blog/tanstack-ai-rc&quot;&gt;https://tanstack.com/blog/tanstack-ai-rc&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://tanstack.com/blog/tanstack-ai-rc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;TanStack AI enters the release candidate phase. The architecture is locked in, with 24 providers, AG-UI, media generation, MCP, sandboxes, and persistence.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;TanStack&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;TanStack AI Enters the RC Phase | TanStack Blog&quot; src=&quot;/static/https://cdn4.telesco.pe/file/WQe3VBUr3GnLhe6EisewlH9jLGS2iJFLD4PG_9iXtzUs5TXWOCOh3KflQsRIJZuCaI1VmCZ9qpHHjnQZLcRGxXi1g7pn3DcCYdySG16D0J4Eczr36dNOaEevbrfhhZ-SxbR9yC7_x8QmVqBM_CJrVrhHVRqLjaJHHjlzd-I5ll3yKgtVp7lcT2Gt5tyHMrq9dg_GFZNoIw8MlVhhvqfhMSPMDEthwebTk_81dcau-vGlFb-I7T9k3h8MQkbA6ywEUZm8jjRFF5Fpu6c9tHFdT6wtHanTVa5OL8N6Q9_5yZSfkHzDrvOKt7CitsNn_xFc1M-lx-uelUaDqoGXkwGlnQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;TanStack AI Enters the RC Phase | TanStack Blog&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;TanStack AI enters the release candidate phase. The architecture is locked in, with 24 providers, AG-UI, media generation, MCP, sandboxes, and persistence.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《5 个实用的 npx 辅助工具》</title><link>https://channel.meo-ai.com/posts/691</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/691</guid><pubDate>Sat, 15 Aug 2026 12:45:43 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《5 个实用的 npx 辅助工具》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23Web%E5%BC%80%E5%8F%91&quot; title=&quot;#Web开发&quot;&gt;#Web开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23NodeJs&quot; title=&quot;#NodeJs&quot;&gt;#NodeJs&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7&quot; title=&quot;#命令行工具&quot;&gt;#命令行工具&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Npx&quot; title=&quot;#Npx&quot;&gt;#Npx&lt;/a&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=%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=%23Markdown&quot; title=&quot;#Markdown&quot;&gt;#Markdown&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%9B%BE%E7%89%87%E4%BC%98%E5%8C%96&quot; title=&quot;#图片优化&quot;&gt;#图片优化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86&quot; title=&quot;#依赖管理&quot;&gt;#依赖管理&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%8B%BC%E5%86%99%E6%A3%80%E6%9F%A5&quot; title=&quot;#拼写检查&quot;&gt;#拼写检查&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. cspell：一个拼写检查器，适合快速排查拼写错误，建议搭配配置文件使用自定义白名单，运行方式如 &lt;code&gt;npx cspell **/*.md&lt;/code&gt;&lt;br /&gt;2. markdown-link-check：专门检查 Markdown 文件中的链接是否有效，能帮助防止链接失效，推荐配合配置文件使用&lt;br /&gt;3. image-guard：作者自己开发的工具，用于自动化近无损图片压缩，也适合在命令行中快速压缩图片，运行 &lt;code&gt;npx image-guard&lt;/code&gt; 即可&lt;br /&gt;4. npm-check-updates：快速检查 &lt;code&gt;package.json&lt;/code&gt; 中的依赖是否有更新版本，适合在新仓库工作或手动处理依赖更新时使用&lt;br /&gt;5. knip：功能比 npm-check-updates 更广，还能检查未使用的文件和导出，但文件和导出检查可能会有误报，运行 &lt;code&gt;npx knip&lt;/code&gt; 即可&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://meiert.com/blog/5-npx-helpers/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://meiert.com/blog/5-npx-helpers/&quot;&gt;https://meiert.com/blog/5-npx-helpers/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://meiert.com/blog/5-npx-helpers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Joy on the command line.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Jens Oliver Meiert&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;5 Useful npx Helpers&quot; src=&quot;/static/https://cdn4.telesco.pe/file/VowQpiSoIknIA-ta7NiVkMYhMJhcw9LECn5TcPwNYHnVYMuWmyjt_-ASs8o7FOVaHPlk8EwV9lPmP7OBkGVhuVESVWuJCYYPyIol8FgvYtZ-nP4hy8LeNyGLpL8Xd-lXhv4l39_T7w162qp706-Yw5zP6VBUuSNL1GB5ir4u1JF3dO6umj20ZEVmfCWiUF8UbHsET-B-W3U6O8KpIimdDFgKd6CJApDVrrzpwg45aReTGaVyXH99duX316hv0MS4wmhzAvffd38QqsPA7e3zWANASg9oQcQ_Q1DIu_-EZ8vEZeSTsnezEBmH-4TFvwV2RacOvDbiLE6H2HIjKB1McA.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;5 Useful npx Helpers&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Joy on the command line.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《Domenic 的 Agentic 编码工作流：2026 年 7 月实战指南》</title><link>https://channel.meo-ai.com/posts/690</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/690</guid><pubDate>Mon, 03 Aug 2026 00:54:30 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Domenic 的 Agentic 编码工作流：2026 年 7 月实战指南》&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=%23AI_Agent&quot; title=&quot;#AI_Agent&quot;&gt;#AI_Agent&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Claude_Code&quot; title=&quot;#Claude_Code&quot;&gt;#Claude_Code&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ChatGPT&quot; title=&quot;#ChatGPT&quot;&gt;#ChatGPT&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Tailscale&quot; title=&quot;#Tailscale&quot;&gt;#Tailscale&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Git_Worktrees&quot; title=&quot;#Git_Worktrees&quot;&gt;#Git_Worktrees&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23DevOps&quot; title=&quot;#DevOps&quot;&gt;#DevOps&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%BF%9C%E7%A8%8B%E5%BC%80%E5%8F%91&quot; title=&quot;#远程开发&quot;&gt;#远程开发&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;Domenic 分享了他脱离企业环境后搭建的一套 AI 辅助开发工作流：以一台常驻开机的 Linux VM 为中枢，通过 Tailscale 构建跨设备私有网络，让 ChatGPT/Claude 桌面应用作为瘦客户端远程操控 Agent。核心亮点包括零审批的&quot;YOLO&quot;安全策略、Git worktrees 实现多 Agent 并行开发、Portless 自动暴露安全预览服务器、VS Code Remote-SSH 审查代码，以及 chezmoi 同步配置。最终效果惊人——他能在火车上用手机连接 VM，让前沿模型修复生产 bug 并直接合并 PR。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1.  Linux VM + Tailscale 是地基：Agent 训练数据几乎全是 Bash/Unix 工具，Windows 下寸步难行。用 Ubuntu Server 搭一台可抛弃的 VM，配合 Tailscale 的魔法 SSH 和 HTTPS 证书，无论在哪台设备、哪个 Wi-Fi 下都能无缝接入，还能让 Agent 启动的开发服务器拥有安全上下文。&lt;br /&gt;2.  ChatGPT 桌面应用体验完胜 Claude：ChatGPT 原生支持远程 SSH 会话，断线重连优雅、worktree 管理清爽（默认放在 &lt;code&gt;~/.codex/worktrees/&lt;/code&gt;）；Claude 桌面应用则在 SSH/Remote Control 混合逻辑、会话同步、worktree 目录污染项目等方面表现糟糕，目前只能退而求其次用 Claude Code + tmux。&lt;br /&gt;3.  Git Worktrees 解锁并行开发：在 VM 上让多个 Agent 同时 hack 同一个仓库而不互相踩脚，ChatGPT 和 Claude 都支持一键勾选 worktree 模式。Agent 会自动处理 &lt;code&gt;origin/main&lt;/code&gt; 同步、依赖安装和 &lt;code&gt;.env&lt;/code&gt; 复制，人类完全不用操心。&lt;br /&gt;4.  Portless 让预览服务器&quot;零摩擦&quot;：不用改 &lt;code&gt;npm run dev&lt;/code&gt; 绑定 &lt;code&gt;0.0.0.0&lt;/code&gt;，也不用记端口。&lt;code&gt;tportless&lt;/code&gt; 包装器自动把 localhost 服务代理到 Tailscale 专属域名（如 &lt;code&gt;https://agents-base.tail234567.ts.net:8443/&lt;/code&gt;），多 Agent 并行时端口自动隔离，且外网无法访问。&lt;br /&gt;5.  &quot;危险模式&quot;下的生存策略：把 &lt;code&gt;~/.codex/config.toml&lt;/code&gt; 和 &lt;code&gt;~/.claude/settings.json&lt;/code&gt; 都设为&quot;永不询问权限&quot;，配合 sudo 和 &lt;code&gt;gh&lt;/code&gt; CLI 登录，让 Agent 能自主装工具、发 PR、合并代码。风险靠&quot;频繁推送到 GitHub 私有仓库&quot;来对冲——VM 炸了代码也在云端。&lt;br /&gt;6.  手机修生产 Bug 已成现实：完整闭环——聚会发现 bug → 火车上打开 ChatGPT App → 远程连接 VM 启动修复 → 收到推送通知里的预览链接验证 → 手机审阅 diff 并合并 PR → 到家前 GitHub Actions 已部署上线。这就是未来。&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://domenic.me/agentic-coding-setup/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://domenic.me/agentic-coding-setup/&quot;&gt;https://domenic.me/agentic-coding-setup/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://domenic.me/agentic-coding-setup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;With the right tools, coding agents can run autonomously, in parallel, and be reachable from anywhere. Here&apos;s how I&apos;ve stitched them together.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Domenic Denicola&lt;/div&gt;
  
  &lt;div class=&quot;link_preview_title&quot;&gt;My Agentic Coding Setup, July 2026&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;With the right tools, coding agents can run autonomously, in parallel, and be reachable from anywhere. Here&apos;s how I&apos;ve stitched them together.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《前端状态管理的真相与迷思》</title><link>https://channel.meo-ai.com/posts/686</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/686</guid><pubDate>Mon, 27 Jul 2026 02:05:27 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=%23Web%E5%BC%80%E5%8F%91&quot; title=&quot;#Web开发&quot;&gt;#Web开发&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%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86&quot; title=&quot;#状态管理&quot;&gt;#状态管理&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Redux&quot; title=&quot;#Redux&quot;&gt;#Redux&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Zustand&quot; title=&quot;#Zustand&quot;&gt;#Zustand&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Jotai&quot; title=&quot;#Jotai&quot;&gt;#Jotai&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23MobX&quot; title=&quot;#MobX&quot;&gt;#MobX&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CRDT&quot; title=&quot;#CRDT&quot;&gt;#CRDT&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%A6%BB%E7%BA%BF%E4%BC%98%E5%85%88&quot; title=&quot;#离线优先&quot;&gt;#离线优先&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%AE%9E%E6%97%B6%E5%8D%8F%E4%BD%9C&quot; title=&quot;#实时协作&quot;&gt;#实时协作&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF%E6%9E%B6%E6%9E%84&quot; title=&quot;#前端架构&quot;&gt;#前端架构&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;作者犀利指出，React生态中流行的&quot;状态管理&quot;库（Redux、Zustand、MobX等）本质上只是状态传播与通知系统，而非真正的状态管理。真正的状态管理必须包含时间维度与顺序概念，能正确应用变更并解决冲突。作者推荐转向Y.js、Zero、Fluid等基于CRDT或OT的时序感知系统，它们天然支持离线优先与实时协作，才是前端数据层的未来方向。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 那些我们天天用的Redux、Zustand、MobX，本质上更像&quot;消息广播员&quot;而不是&quot;状态管家&quot;——它们能通知组件更新，却搞不定时间顺序和冲突解决&lt;br /&gt;2. React自己也不是状态管理系统，整个前端圈把这个词用得太随意，导致大家一直在用错误的工具硬撑复杂场景&lt;br /&gt;3. 真正的状态管理必须懂&quot;时间&quot;和&quot;顺序&quot;，就像分布式系统用向量时钟给事件排队，没有时间概念就谈不上管理&lt;br /&gt;4. 值得庆幸的是，Y.js、Zero、Fluid这类基于CRDT和操作变换的工具已经相当成熟，它们天生会处理冲突，离线和实时协作都是顺手的事&lt;br /&gt;5. 当我们把数据层从&quot;发通知&quot;升级到&quot;管时序&quot;后，离线优先和实时协作不再是昂贵的附加功能，而是正确架构带来的自然馈赠&lt;br /&gt;&lt;br /&gt;URL：&lt;br /&gt;&lt;a href=&quot;https://infrequently.org/2026/07/state-management&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://infrequently.org/2026/07/state-management&quot;&gt;https://infrequently.org/2026/07/state-management&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://infrequently.org/2026/07/state-management&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;It is by no means the gravest linguistic crime of the React epoch,1 but &amp;quot;state management&amp;quot; grates like nails on chalkboard. A Socratic dialogue I keep having about it goes something like this:&quot;&gt;
  &lt;i class=&quot;link_preview_right_image&quot; style=&quot;background-image:url(&apos;https://cdn4.telesco.pe/file/ikJwW7XtmRLraCtYYCU98eth1-gW6tZABXURyVahlK4DeVCx2q4ZW-GpUv8pXhNBJynRgGNB-8pkhsrRb1oOdMPFQ9GcwYYYJyKx2_246dZIbRuP0VVRejifERHTEtfMqvEthY27WJRAS-5Wqp9SkPcVI_XNkHWmd9yRkmPOS34i-e-SS9uL9QOozGTnezpHvhfM5LMkxZSmNck0D9I18sQk-Zm2znuBFHlMYkTb-9fCqRfwK06uTvUVyuukqZ0-Tl-WjUVPiPkQ5dnPfXTv0vtZR_nYDtwwUmkU8y5MXoNTGMq_ZpaG-xLuD_jur7PA4b1tP0iV01K4Xg9BXiefFQ.jpg&apos;)&quot;&gt;&lt;/i&gt;
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Infrequently Noted&lt;/div&gt;
  
  &lt;div class=&quot;link_preview_title&quot;&gt;The Absolute State of Management&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;It is by no means the gravest linguistic crime of the React epoch,1 but &quot;state management&quot; grates like nails on chalkboard. A Socratic dialogue I keep having about it goes something like this:&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《Color.js：认真对待颜色这件事》</title><link>https://channel.meo-ai.com/posts/684</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/684</guid><pubDate>Fri, 24 Jul 2026 15:51:25 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Color.js：认真对待颜色这件事》&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=%23Web%E5%BC%80%E5%8F%91&quot; title=&quot;#Web开发&quot;&gt;#Web开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ColorJS&quot; title=&quot;#ColorJS&quot;&gt;#ColorJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23CSS_Color_Level_4&quot; title=&quot;#CSS_Color_Level_4&quot;&gt;#CSS_Color_Level_4&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E9%A2%9C%E8%89%B2%E7%A9%BA%E9%97%B4%E8%BD%AC%E6%8D%A2&quot; title=&quot;#颜色空间转换&quot;&gt;#颜色空间转换&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%89%B2%E5%9F%9F%E6%98%A0%E5%B0%84&quot; title=&quot;#色域映射&quot;&gt;#色域映射&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23DeltaE&quot; title=&quot;#DeltaE&quot;&gt;#DeltaE&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TreeShakeable&quot; title=&quot;#TreeShakeable&quot;&gt;#TreeShakeable&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23NPM%E5%BA%93&quot; title=&quot;#NPM库&quot;&gt;#NPM库&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE&quot; title=&quot;#开源项目&quot;&gt;#开源项目&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Lea_Verou&quot; title=&quot;#Lea_Verou&quot;&gt;#Lea_Verou&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E9%A2%9C%E8%89%B2%E6%8F%92%E5%80%BC&quot; title=&quot;#颜色插值&quot;&gt;#颜色插值&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;由CSS颜色规范编辑者Lea_Verou和Chris_Lilley打造的专业颜色处理库，支持Lab/LCh、OKLab/OKLCh、Display_P3等海量颜色空间，完整兼容CSS_Color_Level_4。提供真正的色域映射、多种DeltaE色差算法和色度适应方法，API清晰易用且支持链式操作。模块化设计可tree-shake，零依赖，已被Sass、Open_Props、axe等知名项目采用，NPM累计下载超2.46亿次。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 出身&quot;正规军&quot;——两位作者正是CSS颜色规范的编辑者，对颜色科学的理解刻在DNA里，不是随便写写的玩具库&lt;br /&gt;2. 颜色空间全家桶——Lab/LCh、OKLab/OKLCh、sRGB家族、Display_P3、Jzazbz、REC.2100等统统支持，转换随心所欲&lt;br /&gt;3. 科学严谨不糊弄——真正的色域映射而非粗暴裁剪，多种DeltaE色差计算和色度适应算法，专业度拉满&lt;br /&gt;4. API好用又灵活——面向对象+静态函数双模式，链式操作丝滑流畅，还能按需引入模块做tree-shake，包体积可控&lt;br /&gt;5. 业界认可度超高——浏览器用它测试CSS_Color_4/5实现，Sass、Open_Props、axe都在用，NPM下载量突破2.46亿&lt;br /&gt;6. 生态还在扩张中——除了核心库，还在孵化Color_Elements网页组件、Color_Apps工具集和Color_Palettes配色研究项目&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://colorjs.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://colorjs.io&quot;&gt;https://colorjs.io&lt;/a&gt;</content:encoded></item><item><title>《前端框架基准测试平台》</title><link>https://channel.meo-ai.com/posts/683</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/683</guid><pubDate>Fri, 24 Jul 2026 15:50:48 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=%23Web%E5%BC%80%E5%8F%91&quot; title=&quot;#Web开发&quot;&gt;#Web开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23FrameworkBenchmarks&quot; title=&quot;#FrameworkBenchmarks&quot;&gt;#FrameworkBenchmarks&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23PerformanceTesting&quot; title=&quot;#PerformanceTesting&quot;&gt;#PerformanceTesting&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23JavaScriptFrameworks&quot; title=&quot;#JavaScriptFrameworks&quot;&gt;#JavaScriptFrameworks&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=%23Vue&quot; title=&quot;#Vue&quot;&gt;#Vue&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Svelte&quot; title=&quot;#Svelte&quot;&gt;#Svelte&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23SolidJS&quot; title=&quot;#SolidJS&quot;&gt;#SolidJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Preact&quot; title=&quot;#Preact&quot;&gt;#Preact&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Qwik&quot; title=&quot;#Qwik&quot;&gt;#Qwik&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Lit&quot; title=&quot;#Lit&quot;&gt;#Lit&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Angular&quot; title=&quot;#Angular&quot;&gt;#Angular&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23BundleSize&quot; title=&quot;#BundleSize&quot;&gt;#BundleSize&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23BuildTime&quot; title=&quot;#BuildTime&quot;&gt;#BuildTime&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23LighthouseScores&quot; title=&quot;#LighthouseScores&quot;&gt;#LighthouseScores&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23HMR&quot; title=&quot;#HMR&quot;&gt;#HMR&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23NPMStats&quot; title=&quot;#NPMStats&quot;&gt;#NPMStats&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23StackMatch&quot; title=&quot;#StackMatch&quot;&gt;#StackMatch&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;这是一个全自动化的前端框架基准测试平台，由开发者Alicia Sykes维护。项目用同一个天气应用在React、Vue、Svelte等12+个主流框架中实现，每晚自动跑分对比包体积、Lighthouse评分、加载速度、CPU内存占用、构建时间及HMR热更新速度。还整合了GitHub和NPM社区数据，并自带Stack Match智能推荐工具。所有原始数据开源可下载，帮你告别选型纠结！&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 同一个天气应用，12+种框架实现——React、Vue、Svelte、Solid.js、Qwik、Lit等主流选手全部到场，公平对决&lt;br /&gt;2. 每晚自动跑分，数据新鲜出炉——包体积、Lighthouse性能分、FCP/LCP/TTI加载指标、CPU内存占用、构建时间、HMR速度全覆盖&lt;br /&gt;3. 社区数据一目了然——GitHub Stars、NPM月下载量、依赖数量、维护者人数、TS支持情况、许可证信息全整理好了&lt;br /&gt;4. 自带Stack Match智能推荐工具——填填项目偏好，就能get最适合你的框架，选型不再拍脑袋&lt;br /&gt;5. 完全开源透明——所有原始数据以JSON格式开放下载，测试用Playwright统一验证，结果可信可复现&lt;br /&gt;&lt;br /&gt;URL：[&lt;a href=&quot;https://framework-benchmarks.as93.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://framework-benchmarks.as93.net/&quot;&gt;https://framework-benchmarks.as93.net/&lt;/a&gt;](https://framework-benchmarks.as93.net/)&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://framework-benchmarks.as93.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;A comprehensive comparison of modern frontend frameworks&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Framework Benchmarks&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Framework Benchmarks&quot; src=&quot;/static/https://cdn4.telesco.pe/file/qhLWj8AtS4OzFQUYDRUEf53TdwKQp2CXn2B0is2aXhMWVg5Ybd1rk9SHZBeBXPsBmDTQee_uB1AgYNxHabLEURpmm2VKK90oC75jkdplMkFcjQu9d6wBNe55qHrUqQTLsGqT8F4lZkyOiD9_Tq9dM4JnB2Fx-UXVbAaj2djbtNFVCikYTgJ-1s-ypfyqnbe65kZmMu_KKF3JLkc86uenpnlIs3CORuQJp3CMmGxfZ8K-fTMWd6dDGKEhuFPCPluQLgTOrp8dB_GIYDapHDk6X_ONKMEk8f92gtSA-xtbFdWts6kZyUxMN-SQ913f-OHgxpkPlTfqrBerD6eAMJeIwg.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  
  &lt;div class=&quot;link_preview_description&quot;&gt;A comprehensive comparison of modern frontend frameworks&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《Brainless：复刻AI编码助手终端UI的shadcn组件库》</title><link>https://channel.meo-ai.com/posts/681</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/681</guid><pubDate>Sun, 19 Jul 2026 14:13:17 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Brainless：复刻AI编码助手终端UI的shadcn组件库》&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=%23shadcn&quot; title=&quot;#shadcn&quot;&gt;#shadcn&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%BB%88%E7%AB%AFUI&quot; title=&quot;#AI终端UI&quot;&gt;#AI终端UI&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ClaudeCode&quot; title=&quot;#ClaudeCode&quot;&gt;#ClaudeCode&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Codex&quot; title=&quot;#Codex&quot;&gt;#Codex&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;Brainless 是一个 shadcn/ui 组件注册表，提供一套可复用的 React 组件，精准还原 Claude Code、OpenAI Codex 和 Grok 等 AI 编码助手的终端风格界面。开发者可通过 &lt;code&gt;npx shadcn@latest add&lt;/code&gt; 一键安装，快速构建具有&quot;Agent 味&quot;的交互界面。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 精准还原终端风格：组件库完整复刻了 Claude Code、Codex、Grok 等主流 AI 编码助手的终端界面，包括待办列表、计划展示、思考过程等核心 UI 元素&lt;br /&gt;2. 像素级细节还原：从实际终端截图出发，逐帧对比&quot;已发布&quot;与&quot;捕获&quot;版本，修正了行间距、符号对齐、颜色处理等细节差异，确保视觉体验与真实终端一致&lt;br /&gt;3. shadcn 生态原生支持：作为官方注册表组件，可直接通过 shadcn CLI 安装，与现有项目无缝集成，无需额外配置&lt;br /&gt;4. 开源可扩展：代码托管在 GitHub，开发者可自由查看源码、提交改进，甚至基于其设计思路构建自己的 Agent 风格界面&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://brainless.swerdlow.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://brainless.swerdlow.dev/&quot;&gt;https://brainless.swerdlow.dev/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://brainless.swerdlow.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Claude Code, Codex, and Grok interfaces as shadcn components.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;brainless&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;brainless&quot; src=&quot;/static/https://cdn4.telesco.pe/file/HK14x62iOHCcqEYnMd_DNKi7tYf0NIbUi5dSBdZqfDYd7nQnQBKQot0AKNnSsrreswrjpm0ob5eokCsKWEbY0_e3ipf3PXdObM-vmXJcV4Q6cmlEuDo83_cjY8F1utKHLpb92JXTQRvFt6wFbrSm_b_J2b9PA8ApTUo2RuLpAuOAh9b0a-LwJH3XVNqEti5rjdU4WnpGkVfgnUfeFzVS78TZSKqx-iK11je2NY_GbWe_hYsbBzUgOUfuvkk_RhCeCTbr4H6Hp8k1IGWGECnGjPOsGEEGcNKctRqcwdATdEJhol6uTWKWyLe8S1o746LPXQ7SFRdHxKOgcJhyZA3FaQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  
  &lt;div class=&quot;link_preview_description&quot;&gt;Claude Code, Codex, and Grok interfaces as shadcn components.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>