<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Xiazhou</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://000902.icu/</id>
  <link href="https://000902.icu/" rel="alternate"/>
  <link href="https://000902.icu/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Xiazhou</rights>
  <subtitle>工单系统 · 前端工程化 · Vue 生态</subtitle>
  <title>Xiazhou's Blog</title>
  <updated>2026-09-10T13:48:38.086Z</updated>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="AI-又又造词，Graph-就又要替代-Loop-了？"><a href="#AI-又又造词，Graph-就又要替代-Loop-了？" class="headerlink" title="AI 又又造词，Graph 就又要替代 Loop 了？"></a>AI 又又造词，Graph 就又要替代 Loop 了？</h1><blockquote><p>本文转载自掘金，作者：恋猫de小郭。原文链接：<a href="https://juejin.cn/post/7664063148857442347">点击查看</a></p></blockquote><p>OpenClaw 的 Peter 是懂嘲讽的，之前也是他提的，Prompt Engineering 已经成为过去，开始要进入 Loop Engineering 了，然后最近他发现，大家已经开始炒 Gr</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/23/ai-%E5%8F%88%E5%8F%88%E9%80%A0%E8%AF%8D-graph-%E5%B0%B1%E5%8F%88%E8%A6%81%E6%9B%BF%E4%BB%A3-loop-%E4%BA%86/</id>
    <link href="https://000902.icu/2026/07/23/ai-%E5%8F%88%E5%8F%88%E9%80%A0%E8%AF%8D-graph-%E5%B0%B1%E5%8F%88%E8%A6%81%E6%9B%BF%E4%BB%A3-loop-%E4%BA%86/"/>
    <published>2026-07-23T16:00:00.000Z</published>
    <summary>OpenClaw 的 Peter 是懂嘲讽的，之前也是他提的，Prompt Engineering 已经成为过去，开始要进入 Loop Engineering 了，然后最近他发现，大家已经开始炒 Gr</summary>
    <title>AI 又又造词，Graph 就又要替代 Loop 了？</title>
    <updated>2026-09-10T13:48:38.086Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <category term="iOS" scheme="https://000902.icu/tags/iOS/"/>
    <category term="CSS" scheme="https://000902.icu/tags/CSS/"/>
    <category term="H5" scheme="https://000902.icu/tags/H5/"/>
    <category term="uni-app" scheme="https://000902.icu/tags/uni-app/"/>
    <category term="踩坑记录" scheme="https://000902.icu/tags/%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95/"/>
    <content>
      <![CDATA[<h1 id="被-iOS-弹窗支配的恐惧"><a href="#被-iOS-弹窗支配的恐惧" class="headerlink" title="被 iOS 弹窗支配的恐惧"></a>被 iOS 弹窗支配的恐惧</h1><h2 id="先说现象"><a href="#先说现象" class="headerlink" title="先说现象"></a>先说现象</h2><p>线上反馈：<strong>iOS 上工单流程弹窗显示不全</strong>——底部被切掉一块，点不到按钮。</p><p>复现场景：</p><table><thead><tr><th>设备</th><th>结果</th></tr></thead><tbody><tr><td>Android</td><td>正常</td></tr><tr><td>iOS 微信内置浏览器</td><td>弹窗底部被截断</td></tr><tr><td>iOS Safari</td><td>同上</td></tr><tr><td>PC Chrome</td><td>正常</td></tr></tbody></table><p>弹窗用的是 uni-app 的 <code>u-popup</code> &#x2F; <code>u-drawer</code> 组件（基于 uView UI），弹出的内容区域有 <code>scroll-view</code> 滚动列表。</p><p>核心报错：<code>Maximum call stack size exceeded</code>，查了后才确认是 <strong>Safari 对 <code>max-height: 100%</code> 的解析问题</strong>。</p><h2 id="第一阶段：浮层被挡住"><a href="#第一阶段：浮层被挡住" class="headerlink" title="第一阶段：浮层被挡住"></a>第一阶段：浮层被挡住</h2><p>最开始，弹窗内容被页面上的导航条和筛选栏挡住了。查 CSS 发现 <code>u-drawer</code> &#x2F; <code>u-modal</code> 的 <code>z-index</code> 只有 10090，但页面的固定 <code>header</code> 用了 <code>z-index: 999</code>——按理说弹窗还是更高，但 iOS 上 fixed 层级渲染有差异。</p><p><strong>修复：</strong> 在 <code>App.vue</code> 覆盖全局 z-index：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-class">.u-drawer</span>,<br><span class="hljs-selector-class">.u-modal</span>,<br>uni-modal &#123;<br>  <span class="hljs-attribute">z-index</span>: <span class="hljs-number">19999</span> <span class="hljs-meta">!important</span>;<br>&#125;<br></code></pre></td></tr></table></figure><p>这一步解决了「挡住」问题，但「底部截断」还在。</p><h2 id="第二阶段：底部截断，排查定位"><a href="#第二阶段：底部截断，排查定位" class="headerlink" title="第二阶段：底部截断，排查定位"></a>第二阶段：底部截断，排查定位</h2><p>弹窗本身样式加了 <code>max-height: 90%</code>，在 Android 上正常工作，iOS 上却把弹窗撑满全屏，内容溢到屏幕外。</p><p>检查 DOM 发现绘制出来的 <code>.u-drawer</code> 的 <code>scrollHeight</code> 远超预期。</p><p>关键线索是控制台报错：</p><figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">RangeError: Maximum call stack size exceeded<br></code></pre></td></tr></table></figure><p>搜了一圈，这其实是个 Safari 的老坑：<strong>当一个元素的 <code>max-height</code> 是百分比，且父容器的 <code>height</code> 不确定时，Safari 会重新进入布局计算循环，导致栈溢出。</strong></p><p>具体到我们的组件链：</p><figure class="highlight gauss"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs gauss">视图区 → <span class="hljs-keyword">scroll</span>-<span class="hljs-built_in">view</span> → .u-drawer__content → ... → 内容（动态高度）<br></code></pre></td></tr></table></figure><p>中间某个环节的 <code>height</code> 没有被明确定义，Safari 就会因为 <code>max-height: 100%</code> 反复计算，最终栈溢出、渲染错误。</p><h2 id="第三阶段：柔性修复方案"><a href="#第三阶段：柔性修复方案" class="headerlink" title="第三阶段：柔性修复方案"></a>第三阶段：柔性修复方案</h2><h3 id="方案-A：固定-scroll-view-高度（√-采用）"><a href="#方案-A：固定-scroll-view-高度（√-采用）" class="headerlink" title="方案 A：固定 scroll-view 高度（√ 采用）"></a>方案 A：固定 scroll-view 高度（√ 采用）</h3><p>最直接的办法是给弹窗里的 <code>scroll-view</code> 一个固定高度，而不是依赖百分比继承：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs css">scroll-view &#123;<br>  <span class="hljs-attribute">max-height</span>: <span class="hljs-number">60vh</span>;  <span class="hljs-comment">/* 折中值，适配不同屏幕 */</span><br>&#125;<br></code></pre></td></tr></table></figure><p>这解决了大部分场景，但<strong>不同流程的弹窗内容高度差异大</strong>——有的只有几条数据，60vh 显得太空；有的很长，又不够用。</p><h3 id="方案-B：MutationObserver-动态-max-height（√-最终方案）"><a href="#方案-B：MutationObserver-动态-max-height（√-最终方案）" class="headerlink" title="方案 B：MutationObserver + 动态 max-height（√ 最终方案）"></a>方案 B：MutationObserver + 动态 <code>max-height</code>（√ 最终方案）</h3><p>考虑到不同弹窗、不同流程的内容量不可控，写死一个值显然不优雅。最终方案是：</p><p><strong>MutationObserver 监听内容高度变化 → 动态计算并设置 <code>max-height</code>。</strong></p><p>核心思路：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-comment">// 监听弹窗 open</span><br><span class="hljs-title class_">MutationObserver</span>.<span class="hljs-title function_">observe</span>(scrollContainer, &#123;<br>  <span class="hljs-attr">attributes</span>: <span class="hljs-literal">true</span>,       <span class="hljs-comment">// 监听 style/class 变化</span><br>  <span class="hljs-attr">childList</span>: <span class="hljs-literal">true</span>,        <span class="hljs-comment">// 监听内容增减</span><br>  <span class="hljs-attr">subtree</span>: <span class="hljs-literal">true</span>,          <span class="hljs-comment">// 深度监听</span><br>&#125;)<br><br><span class="hljs-keyword">function</span> <span class="hljs-title function_">adjustMaxHeight</span>(<span class="hljs-params"></span>) &#123;<br>  <span class="hljs-keyword">const</span> viewportHeight = <span class="hljs-variable language_">window</span>.<span class="hljs-property">innerHeight</span><br>  <span class="hljs-keyword">const</span> contentHeight = scrollContent.<span class="hljs-property">scrollHeight</span><br>  <span class="hljs-comment">// 弹窗本身有 padding/header 占用约 200px，再多留 20px 安全边距</span><br>  <span class="hljs-keyword">const</span> maxHeight = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">min</span>(contentHeight, viewportHeight - <span class="hljs-number">220</span>)<br>  scrollContainer.<span class="hljs-property">style</span>.<span class="hljs-property">maxHeight</span> = maxHeight + <span class="hljs-string">&#x27;px&#x27;</span><br>&#125;<br></code></pre></td></tr></table></figure><p>关键细节：</p><ol><li><strong>触发时机</strong>：不能只在 DOM 变化时算，还需要在弹窗的 CSS 动画（transition）完成后触发——否则拿到的 <code>scrollHeight</code> 不对。所以加了 <code>setTimeout</code> 延迟 100ms。</li><li><strong>限制条件</strong>：只在 iOS 上启用（<code>const isIOS = !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)</code>），Android 上不受影响，避免不必要的性能开销。</li><li><strong>备用方案</strong>：如果 Observer 没来得及触发（极快速切换），还保留了 <code>max-height: 80vh</code> 托底。</li></ol><p><strong>最终代码结构：</strong></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-comment">// related-to-me.vue + TodoTicketReport.vue</span><br><br><span class="hljs-keyword">if</span> (isIOS) &#123;<br>  <span class="hljs-keyword">const</span> observer = <span class="hljs-keyword">new</span> <span class="hljs-title class_">MutationObserver</span>(<span class="hljs-function">() =&gt;</span> &#123;<br>    <span class="hljs-built_in">clearTimeout</span>(<span class="hljs-variable language_">this</span>.<span class="hljs-property">adjustTimer</span>)<br>    <span class="hljs-variable language_">this</span>.<span class="hljs-property">adjustTimer</span> = <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> &#123;<br>      <span class="hljs-keyword">const</span> vh = <span class="hljs-variable language_">window</span>.<span class="hljs-property">innerHeight</span><br>      <span class="hljs-keyword">const</span> sh = content.<span class="hljs-property">scrollHeight</span><br>      content.<span class="hljs-property">style</span>.<span class="hljs-property">maxHeight</span> = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">min</span>(sh, vh - <span class="hljs-number">220</span>) + <span class="hljs-string">&#x27;px&#x27;</span><br>    &#125;, <span class="hljs-number">100</span>)<br>  &#125;)<br>  observer.<span class="hljs-title function_">observe</span>(scrollContainer, &#123;<br>    <span class="hljs-attr">attributes</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">childList</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">subtree</span>: <span class="hljs-literal">true</span><br>  &#125;)<br>&#125;<br></code></pre></td></tr></table></figure><h2 id="第四阶段：overflow-清理"><a href="#第四阶段：overflow-清理" class="headerlink" title="第四阶段：overflow 清理"></a>第四阶段：overflow 清理</h2><p>排查过程中还发现 <code>detail.vue</code> 里有一个前期遗留的 <code>overflow: hidden</code>——它会强制裁剪弹窗外层，让 iOS 下弹窗底部的阴影阴影消失。顺手去掉。</p><h2 id="总结：时长与经验"><a href="#总结：时长与经验" class="headerlink" title="总结：时长与经验"></a>总结：时长与经验</h2><p>整个修复过程分三波：</p><table><thead><tr><th>阶段</th><th>改动文件</th><th>耗时</th></tr></thead><tbody><tr><td>z-index 提升</td><td><code>App.vue</code></td><td>~30 min</td></tr><tr><td>iOS 栈溢出 + MutationObserver</td><td><code>related-to-me.vue</code>, <code>TodoTicketReport.vue</code></td><td>~2 天</td></tr><tr><td>overflow 清理</td><td><code>detail.vue</code></td><td>~10 min</td></tr></tbody></table><h3 id="几个教训"><a href="#几个教训" class="headerlink" title="几个教训"></a>几个教训</h3><ol><li><strong>不要相信 <code>max-height: 100%</code></strong>——在 Safari 的布局引擎里，这行代码就是一个栈溢出炸弹。在非标准文档流（弹窗、浮层、drawer）中尤其危险。</li><li><strong>MutationObserver + <code>vh</code> 是动态布局的银弹</strong>——当 CSS 无法满足时，用 JS 算一次最靠谱。但要注意触发时机（CSS transition 完成后再读尺寸）。</li><li><strong>iOS 上 each 层级渲染不同</strong>——<code>z-index</code> 在 Android 和 iOS Safari 的行为有差异，不要用 Android 调试 iOS 样式。</li><li><strong>输出日志</strong>——排查过程中借助了 vconsole 来捕获 iOS 端的异常堆栈（<code>RangeError</code>），如果没有在移动端打出这个栈信息，可能还在盲目调 CSS。</li></ol>]]>
    </content>
    <id>https://000902.icu/2026/07/23/ios-popup-fix/</id>
    <link href="https://000902.icu/2026/07/23/ios-popup-fix/"/>
    <published>2026-07-23T16:00:00.000Z</published>
    <summary>线上工单流程弹出层被页面 fixed 元素挡住，深扒 iOS Safari 栈溢出的底层原理，MutationObserver + z-index 双管齐下搞定。</summary>
    <title>被 iOS 弹窗支配的恐惧——一次 H5 弹窗层级问题的排查与修复</title>
    <updated>2026-09-10T13:48:38.087Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <category term="人工智能" scheme="https://000902.icu/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    <content>
      <![CDATA[<h1 id="Kimi-K3-重构10000行单文件屎山代码！"><a href="#Kimi-K3-重构10000行单文件屎山代码！" class="headerlink" title="Kimi K3 重构10000行单文件屎山代码！"></a>Kimi K3 重构10000行单文件屎山代码！</h1><blockquote><p>本文转载自掘金，作者：甲维斯。原文链接：<a href="https://juejin.cn/post/7665283036799860763">点击查看</a></p></blockquote><p>Vibe Coding 的“恶果”来了！！</p><p>最近在升级 JClaude，发现 Tokens 消耗特猛，然后分析了代码，发现其中有一个代码文件已经快 10000 行了。</p><p>大概算了下，光这一个文件上下文就有十几万 Token 了！</p><p>虽然程序运行完全正常，但是技术债越来越重了，所以必须重构一下。</p><p>最近刚好在测试 Kimi K3，我就把这个任务交给它了！</p><p>这个测试应该比做一个动画效果来得更有实际意义吧。</p><p>下面就来看一下，它的重构过程，以及重构后的结果。</p><p>1、项目简介</p><p>先简单介绍一下这个项目的情况：</p><p>这是我之前做的 Claude Code 中文界面版，完全克隆了 Claude 桌面版的界面，然后调用 Claude Code 终端，自动接入第三方模型。也就是说第三方模型可以直接用 Anthropic 家最强编程智能体，不受账号限制。</p><p>当然，如果你接入了 Opus 4.8，那这个软件的能力基本上约等于 Anthropic 官方的 Claude 桌面版。</p><p>因为最近加入了这个角色和技能相关的功能，就发现这个项目文件已经膨胀到让人无法接受的程度了。</p><p>这个项目开始于一个简单的界面克隆测试，所以当时并没有在意代码结构的问题。然后在修改的过程中，也没有强制提出重构的需求，所以 AI 就一直在堆“屎山”！</p><p>我估计很多很多的 Vibe Coding 项目都会面临这样的问题。刚开始呢是试着玩玩的，玩得爽了，就越改越大。</p><p>2、基础情况</p><p>这个项目是Tauri+Rust开发的，安装包和很小，内存开销也很低，可以制作多平台的发行包。界面部分主要是JS+CSS+HTML等前端代码，界面效果可以做的很好，后端是Rust，可以高效的和系统进行交互。开发支持热更新，效率很高。这是基础情况。</p><p>要重构代码的话，先得了解一下具体的代码的情况！</p><p>所以我们的对话是这么开始的：</p><p>当前代码中有哪些文件代码行数特别多？有没有做一下优化的必要性？</p><p>然后得到了这样一个结果：</p><p>从这里可以看到 <code>main.js</code> 已经 9338 行了，真的是快接近万行了，里面有 400 个函数！！！</p><p>接下来就是具体看一下里面有什么了！</p><p>main.js 内部结构</p><p>它本身是纯 script（无 import&#x2F;模块化），靠 30 个 &#x2F;&#x2F; &#x3D;&#x3D;&#x3D;&#x3D; 注释分段。</p><p>最大的几段：</p><p>• Claude Code CLI bridge—— 约 2160 行，最大的单一块 • Experts &amp; Skills 管理—— 约 800 行 • i18n—— 约 620 行，基本是翻译数据 • Code workspace panels &#x2F; Projects &#x2F; Settings &#x2F; Providers—— 各 500-600 行</p><p>其实模块还是很清晰的，但是文件确实太大了！</p><p>有没有优化必要？</p><p>大概情况知道了，接下来就是判断一下有没有必要优化了。</p><p>K3 的结论是：有，但要看你们接下来的开发节奏，且不建议一次性大改。</p><p>支持拆分的理由：</p><p>bash<br> 代码解读复制代码&#96;• 单文件 9k+ 行已超过可维护性的常见阈值，多人协作时合并冲突几乎不可避免<br>​<br>• 部分段落是天然的拆分候选，成本低收益高：<br>​<br>   • i18n 是纯数据，抽成 i18n&#x2F;zh.json、i18n&#x2F;en.json 之类，零风险<br>   • CLI bridge 2000+ 行自成一体，抽成独立模块后主文件立刻瘦 1&#x2F;4</p><p>• Tauri 支持原生 ES modules，拆 <code>&lt;script type=&quot;module&quot;&gt;</code> 不一定需要引入打包工具</p><figure class="highlight autohotkey"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs autohotkey"><br>它这里提到了很关键的一点，就是多人协作冲突是一个大问题。对我而言还好，我就是多 AI 合作，一把梭。<br><br>需要权衡的点：<br><br> 代码解读复制代码`• 目前测试覆盖很薄，大重构没有安全网，回归风险高<br>• 大文件本身不是病——如果这段代码已经稳定、很少改动，靠分段注释导航也能用<br><br></code></pre></td></tr></table></figure><p>建议的优先级：</p><p>如果近期要持续加功能（尤其是 CLI bridge、Skills 相关），就按 “i18n → CLI bridge → 各 workspace 面板” 的顺序增量抽取，每抽一块跑一遍现有测试；</p><p>如果只是维护期、改动少，可以先不动，只把 i18n 数据分离出去。</p><p>3、多维度分析</p><p>目前的情况看来，除了大之外，没有特别大的问题。其实我比较担忧的是大文件情况下 AI 读写和 Token 消耗的问题。</p><p>所以我第二轮的需求是：</p><p>下面我们从代码设计、AI 读写以及 Token 消耗的角度来判断一下优化的必要性。</p><p>下面是 K3 的分析结果。</p><p>1、代码设计角度</p><p>python<br> 代码解读复制代码&#96;• main.js 的问题不只是”长”，而是无模块化的长：约 400 个函数全部是全局作用域，通过<br>一个全局 state 对象和 DOM id 隐式耦合。你没法只改”设置”而不碰”对话”，因为它们共<br>享同一片命名空间。<br>​<br>• 这直接导致可测试性差——测试薄（只有 3 个针对性测试）很大程度上是这个结构的果，不<br>是因。函数无法单独 import，就没法单测。<br>​<br>• lib.rs 同样 4148 行单文件，但 Rust 有模块系统和编译器兜底，拆分安全且容易，风险<br>远低于 main.js。<br>​<br>• styles.css 4836 行在 CSS 里不算异常，危害最低，可放最后。</p><figure class="highlight pf"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs pf"><br>单看代码设计：有必要拆，但属于<span class="hljs-string">&quot;慢性病&quot;</span>，不致命。<br><br><span class="hljs-number">2</span>、AI 读写角度<br><br>这是大文件代价最直观的地方：<br><br>scss<br> 代码解读复制代码`• 读不完整：主流 AI 工具单次读文件上限约 <span class="hljs-number">1000</span> 行，<span class="hljs-number">9338</span> 行的文件 AI 永远只能看局部<br>。改一个功能时，它读到目标段落，却看不到 <span class="hljs-number">3000</span> 行外那个依赖同一全局状态的函数——<br>改坏联动的概率显著上升。<br>​<br>• 编辑易误伤：AI 编辑靠精确字符串匹配。<span class="hljs-number">9</span>k 行文件里相似代码片段多（比如那 <span class="hljs-number">14</span> 个并<br>排且结构几乎一样的 <span class="hljs-keyword">persist</span>Xxx() 函数），匹配唯一性差，误替换风险高。<br>​<br>• 定位成本高：目前靠 // ==== 分段标记 + grep 还能工作，但跨段依赖（全局 <span class="hljs-keyword">state</span>、跨<br>段调用）对 AI 不可见，每次都要重新摸索。<br><br></code></pre></td></tr></table></figure><p>拆成模块后，每个文件能被 AI 一次整读，心智模型完整，改动质量明显上升。</p><p>3、Token 消耗角度</p><p>按中英文混合代码约 3.5 字节&#x2F;token 粗估：</p><p>perl<br> 代码解读复制代码&#96;• main.js 全量读入 ≈ 13 万 tokens，一次就吃掉大半个上下文窗口。<br>​<br>• 实际工作模式是 grep + 分页读若干段，但每次任务往往要读 state 定义段 + 目标功能段 +<br>相关 persist&#x2F;i18n 段，累计轻松到 3-5 万 tokens，而且每次会话都重复消耗。<br>​<br>• 拆成模块后，一个任务通常只需整读 1-2 个相关文件（几千 tokens），单次任务省 80%+，<br>且是持续性收益——每次让 AI 改代码都在省钱。<br>​<br>• i18n 那 620 行是纯数据，最冤：经常被卷入上下文，却几乎不需要全部内容。</p><figure class="highlight pf"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><code class="hljs pf"><br>这确实是个大问题，太浪费了。修改后能节省 <span class="hljs-number">80</span>%，这个诱惑还是很大的。<br><br><span class="hljs-number">4</span>、综合判断<br><br>单看代码设计，拆分是<span class="hljs-string">&quot;应该做但不紧急&quot;</span>；<br><br>叠加 AI 读写和 token 成本后，必要性明显升级——因为我主要就是用 AI 辅助开发，大文件的税是每次任务都在交的。<br><br>结论不变：增量拆分，顺序 i18n → CLI bridge → 各面板。<br><br><span class="hljs-number">4</span>、深入分析<br><br>其实，我心中早就有数了，因为我已经让 Opus <span class="hljs-number">4.8</span> 拆分过一次了。这次很明显也是让它按拆分的方向去的。<br><br>为了谨慎起见，或者说为了更好地引导 K3 完成任务，我再问它第三个问题：<br><br>那我们就先把 main.js 这个文件拆分一下吧。<br><br>那你觉得如何来拆分这个文件比较合适？<br><br>拆分到什么样的颗粒度比较合适？<br><br>拆分过程中应该注意什么？<br><br>如何保障成功完成这个重构任务？<br><br><span class="hljs-number">1</span>、怎么<br><br>对齐现有分段，分层 + 自下而上。加载方式从 `<span class="hljs-variable">&lt;script src=&quot;./main.js&quot;&gt;</span>` 改为 `<span class="hljs-variable">&lt;script type=&quot;module&quot; src=&quot;./main.js&quot;&gt;</span>`。<br><br>然后按现有 `// ====` 分段抽取，分层依赖：<br><br>bash<br> 代码解读复制代码`• 第 <span class="hljs-number">0</span> 层（纯数据，零依赖）：i18n、DEFAULTS、MODEL_BLURB/system prompt、action chip<br>prompts<br>​<br>• 第 <span class="hljs-number">1</span> 层（基础）：<span class="hljs-keyword">state</span>（全局 <span class="hljs-keyword">state</span> + KEYS + <span class="hljs-number">14</span> 个 <span class="hljs-keyword">persist</span>Xxx）、storage、Tauri API<br>封装<br>​<br>• 第 <span class="hljs-number">2</span> 层（UI 基建）：theme、sidebar、tooltip、菜单<br>​<br>• 第 <span class="hljs-number">3</span> 层（功能域）：chat、projects、settings、providers、experts/skills、code<br>panels、CLI bridge、browser、code stats、mentions<br>​<br>• main.js 最终只剩入口：import + init/boot 顺序<br><br></code></pre></td></tr></table></figure><p>2、颗粒度</p><p>一个分段一个模块，200–800 行&#x2F;单文件</p><p>bash<br> 代码解读复制代码&#96;• 目标：每个文件能被人或 AI 一次整读（&lt;1000 行），预计拆出 15–20 个文件，收进<br>src&#x2F;js&#x2F; 之类的子目录。<br>​<br>• 不要再细：拆成 50 个 100 行的小文件会让 import 清单本身变成维护负担，跨文件跳转反<br>而更累。<br>​<br>• 也别贪全：chat&#x2F;projects&#x2F;settings 核心段耦合最重，如果拆到那里发现代价陡增，留一个<br>较大的 app.js（2000 行以内）也完全可以接受——80% 的收益来自前 20% 的抽取。</p><figure class="highlight coffeescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><code class="hljs coffeescript"><br><span class="hljs-number">3</span>、注意事项（按翻车概率排序）<br><br>javascript<br> 代码解读复制代码`<span class="language-javascript"><span class="hljs-number">1.</span> 测试 <span class="hljs-built_in">eval</span> 耦合：如上所述，搬 <span class="hljs-variable constant_">DEFAULT_EXPERTS</span> 等被测代码块时必须同步改测试的 <span class="hljs-variable constant_">SRC</span></span><br><span class="language-javascript">路径，标记字符串原样保留。</span><br><span class="language-javascript">​</span><br><span class="language-javascript"><span class="hljs-number">2.</span> 循环依赖：功能模块间必然互相调用（chat ↔ workspace ↔ projects）。<span class="hljs-variable constant_">ESM</span> 循环导入在<span class="hljs-string">&quot;</span></span><br><span class="hljs-string"><span class="language-javascript">仅运行期调用、无顶层副作用&quot;</span>下是安全的——所以搬移时保持 <span class="hljs-keyword">function</span> <span class="hljs-title function_">foo</span>(<span class="hljs-params"></span>) &#123;&#125; 声明形式</span><br><span class="language-javascript">（有提升），禁止在模块顶层执行跨模块调用，init 统一由 main.<span class="hljs-property">js</span> 触发。</span><br><span class="language-javascript">​</span><br><span class="language-javascript"><span class="hljs-number">3.</span> 共享 state 唯一性：state 对象（main.<span class="hljs-property">js</span>:<span class="hljs-number">474</span>）必须从 state.<span class="hljs-property">js</span> 导出同一个引用，所有</span><br><span class="language-javascript">模块 <span class="hljs-keyword">import</span> 它，绝不能复制。</span><br><span class="language-javascript">​</span><br><span class="language-javascript"><span class="hljs-number">4.</span> 只搬不改：每次提交只做机械搬移 + 补 <span class="hljs-keyword">import</span>/<span class="hljs-keyword">export</span>，不顺手优化逻辑。重构成败的关键</span><br><span class="language-javascript">就是 diff 可审查。</span><br><span class="language-javascript">​</span><br><span class="language-javascript"><span class="hljs-number">5.</span> <span class="hljs-keyword">import</span> 清单遗漏：<span class="hljs-number">400</span> 个函数分散后，漏一个 <span class="hljs-keyword">import</span> 就是运行期 <span class="hljs-title class_">ReferenceError</span>，静态</span><br><span class="language-javascript">检查抓不住（项目无 lint）。对策见下。</span><br><span class="language-javascript">​</span><br><span class="language-javascript"><span class="hljs-number">6.</span> init 顺序：boot splash、applyWorkspace 等有 <span class="hljs-variable constant_">DOM</span> 时机依赖（index.<span class="hljs-property">html</span> 注释专门提过</span><br><span class="language-javascript">），入口处的初始化顺序原样保留。</span><br><span class="language-javascript">​</span><br><span class="language-javascript"></span><br></code></pre></td></tr></table></figure><p>虽然只是拆一个文件，其实难度还是有的。因为不同模块之间是有耦合的，我之前让 Opus 分析过，有些模块间的耦合度有几十个。一个拆完之后，文件行数和文件数量都会变化，所以模型必须重新学习新的结构，再进行后续的解耦。</p><p>4、如何保障成功</p><p>这一点很关键：</p><p>bash<br> 代码解读复制代码&#96;• 试点先行：第一步只做 i18n + state 两段，跑通”搬移 → 改测试 → 验证”全流程，确认模式<br>可行再批量搬。<br>​<br>• 每步三道闸：npm test 全绿（3 个 node 测试 + cargo test）→ npm run dev 启动冒烟（主<br>界面、聊天、设置、Code workspace 各点一遍，看控制台报错）→ 独立 commit。出问题单步<br>回退即可。<br>​<br>• 明确的完成标准：main.js 只剩入口（&lt;300 行）、测试全绿、冒烟清单通过、每个被搬分段<br>都能在新文件里被 grep 到。<br>​<br>• 顺序：i18n → 纯数据 → state&#x2F;storage → UI 基建 → CLI bridge（最大但自成一体，瘦 1&#x2F;4<br>就靠它）→ experts&#x2F;skills、code panels、browser → 核心段（视情况收尾）。</p><pre><code class="hljs">从它的回答看，应该是理解得比较透彻了。我已经经过 3 轮引导，它应该已经掌握了关键信息。所以，最后一句话就是：开干！5、重构过程下图是它自己做的 todo 任务列表：改完之后，还问了我两个问题：第一个是用 git 管理版本，方便回退。第二个是冒烟测试怎么做。这个还是很稳的！但是我对它的测试选项不是太满意，怎么可以把手动启动 dev 放在推荐呢？必须你来启动，我来看啊！另外说一点细节，可以作为对比参考。Opus 4.8 改的时候，虽然改得很细，但是很自信地告诉我它会自己做 dev 测试，我就做了个甩手掌柜。由于第一轮独立性比较强，整体修改非常快。我测试了一下，没有这么大问题。唯一的问题是无法调用 Claude Code！我不确定它为什么把内置CC给我跳过了，正常没有理由弹这个的。我把情况给它说了一下，它就成功解决这个问题了。那就没啥大问题了，继续推进！随着修改的深入，逐渐变得复杂起来了！改到中间环节的时候，验证点逐渐变多了，修改的时间也越来越久了。6、重构结果整个重构过程大概消耗了小半天时间。最后把这个 `main.js` 从 9938 行压缩到了 263 行，减少 97%。全部改成模块化设计，拆成了 24 个模块，每个 33-2177 行。总共提交了 13 个 commit，每步可单独回退。基础语法检查和其他校验它已经做好了，然后我人工检查了各项功能，全部是正常运转的。这次重构非常成功，而且毫无波澜！重构是要点脑子的，而且是一个非常严谨的问题，容不得一点错误。K3 能改完，没有错误，这一点还是略微出乎我的意料。2.8T 的参数了，果然是稳了很多！这一次测试结果还比较理想的！下一篇将要让它修改桌面软件的疑难 Bug 了，敬请期待！</code></pre>]]>
    </content>
    <id>https://000902.icu/2026/07/23/kimi-k3-%E9%87%8D%E6%9E%8410000%E8%A1%8C%E5%8D%95%E6%96%87%E4%BB%B6%E5%B1%8E%E5%B1%B1%E4%BB%A3%E7%A0%81/</id>
    <link href="https://000902.icu/2026/07/23/kimi-k3-%E9%87%8D%E6%9E%8410000%E8%A1%8C%E5%8D%95%E6%96%87%E4%BB%B6%E5%B1%8E%E5%B1%B1%E4%BB%A3%E7%A0%81/"/>
    <published>2026-07-23T16:00:00.000Z</published>
    <summary>Vibe Coding 的“恶果”来了！！ 最近在升级 JClaude，发现 Tokens 消耗特猛，然后分析了代码，发现其中有一个代码文件已经快 10000 行了。 大概算了下，光这一个文件上下文就</summary>
    <title>Kimi K3 重构10000行单文件屎山代码！</title>
    <updated>2026-09-10T13:48:38.087Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="为什么很多人觉得前端很简单？"><a href="#为什么很多人觉得前端很简单？" class="headerlink" title="为什么很多人觉得前端很简单？"></a>为什么很多人觉得前端很简单？</h1><blockquote><p>本文转载自掘金，作者：ErpanOmer。原文链接：<a href="https://juejin.cn/post/7664156897922351110">点击查看</a></p></blockquote><p>前端看似简单，实则复杂远超表象。视觉反馈快感掩盖了90%的隐性工作量，包括对抗失控的宿主环境、处理异步竞态灾难和防范内存泄漏。资深工程师用复杂机制伪装出简洁界面，在机器逻辑与人类行为间架起桥梁。</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/21/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BE%88%E5%A4%9A%E4%BA%BA%E8%A7%89%E5%BE%97%E5%89%8D%E7%AB%AF%E5%BE%88%E7%AE%80%E5%8D%95/</id>
    <link href="https://000902.icu/2026/07/21/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BE%88%E5%A4%9A%E4%BA%BA%E8%A7%89%E5%BE%97%E5%89%8D%E7%AB%AF%E5%BE%88%E7%AE%80%E5%8D%95/"/>
    <published>2026-07-21T16:00:00.000Z</published>
    <summary>前端看似简单，实则复杂远超表象。视觉反馈快感掩盖了90%的隐性工作量，包括对抗失控的宿主环境、处理异步竞态灾难和防范内存泄漏。资深工程师用复杂机制伪装出简洁界面，在机器逻辑与人类行为间架起桥梁。</summary>
    <title>为什么很多人觉得前端很简单？</title>
    <updated>2026-09-10T13:48:38.088Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="全网都在吹的-Kimi-K3，到底怎么样？"><a href="#全网都在吹的-Kimi-K3，到底怎么样？" class="headerlink" title="全网都在吹的 Kimi K3，到底怎么样？"></a>全网都在吹的 Kimi K3，到底怎么样？</h1><blockquote><p>本文转载自掘金，作者：stormzhangV。原文链接：<a href="https://juejin.cn/post/7663685196478611506">点击查看</a></p></blockquote><p>国产最贵、速度还慢，凭什么还是国产之光？Kimi K3 前端能力全球第一梯队，长任务处理稳，还是开源模型，这次是真敢跟顶尖闭源模型掰手腕了。</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/20/%E5%85%A8%E7%BD%91%E9%83%BD%E5%9C%A8%E5%90%B9%E7%9A%84-kimi-k3-%E5%88%B0%E5%BA%95%E6%80%8E%E4%B9%88%E6%A0%B7/</id>
    <link href="https://000902.icu/2026/07/20/%E5%85%A8%E7%BD%91%E9%83%BD%E5%9C%A8%E5%90%B9%E7%9A%84-kimi-k3-%E5%88%B0%E5%BA%95%E6%80%8E%E4%B9%88%E6%A0%B7/"/>
    <published>2026-07-20T16:00:00.000Z</published>
    <summary>国产最贵、速度还慢，凭什么还是国产之光？Kimi K3 前端能力全球第一梯队，长任务处理稳，还是开源模型，这次是真敢跟顶尖闭源模型掰手腕了。</summary>
    <title>全网都在吹的 Kimi K3，到底怎么样？</title>
    <updated>2026-09-10T13:48:38.088Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="用-Kimi-K3-交付一个真实项目后：很强，但还有不足"><a href="#用-Kimi-K3-交付一个真实项目后：很强，但还有不足" class="headerlink" title="用 Kimi K3 交付一个真实项目后：很强，但还有不足"></a>用 Kimi K3 交付一个真实项目后：很强，但还有不足</h1><blockquote><p>本文转载自掘金，作者：孟健AI编程。原文链接：<a href="https://juejin.cn/post/7663313773420462118">点击查看</a></p></blockquote><p>大家好，我是孟健。 Kimi K3 正式发布了。这个结果，我终于可以公开说了：发布之前，我已经把 ShipSolo 微信小程序这个真实项目整个交给它，从需求梳理到部署验证走完全程，最终完整交付。 交付</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/19/%E7%94%A8-kimi-k3-%E4%BA%A4%E4%BB%98%E4%B8%80%E4%B8%AA%E7%9C%9F%E5%AE%9E%E9%A1%B9%E7%9B%AE%E5%90%8E-%E5%BE%88%E5%BC%BA-%E4%BD%86%E8%BF%98%E6%9C%89%E4%B8%8D%E8%B6%B3/</id>
    <link href="https://000902.icu/2026/07/19/%E7%94%A8-kimi-k3-%E4%BA%A4%E4%BB%98%E4%B8%80%E4%B8%AA%E7%9C%9F%E5%AE%9E%E9%A1%B9%E7%9B%AE%E5%90%8E-%E5%BE%88%E5%BC%BA-%E4%BD%86%E8%BF%98%E6%9C%89%E4%B8%8D%E8%B6%B3/"/>
    <published>2026-07-19T16:00:00.000Z</published>
    <summary>大家好，我是孟健。 Kimi K3 正式发布了。这个结果，我终于可以公开说了：发布之前，我已经把 ShipSolo 微信小程序这个真实项目整个交给它，从需求梳理到部署验证走完全程，最终完整交付。 交付</summary>
    <title>用 Kimi K3 交付一个真实项目后：很强，但还有不足</title>
    <updated>2026-09-10T13:48:38.089Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="停更的这一年，All-In-AI、陪媳妇生娃、还考了个研"><a href="#停更的这一年，All-In-AI、陪媳妇生娃、还考了个研" class="headerlink" title="停更的这一年，All In AI、陪媳妇生娃、还考了个研"></a>停更的这一年，All In AI、陪媳妇生娃、还考了个研</h1><blockquote><p>本文转载自掘金，作者：我是Allen。原文链接：<a href="https://juejin.cn/post/7662691781214470180">点击查看</a></p></blockquote><p>停更的这一年，All In AI、陪媳妇生娃、还考了个研 打开掘金 App，看了一眼自己的最近更新——停在了整整一年前。 不是不想写，是这一年确实被塞得太满了。如果非要用几个关键词来概括，那就是： A</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/17/%E5%81%9C%E6%9B%B4%E7%9A%84%E8%BF%99%E4%B8%80%E5%B9%B4-all-in-ai-%E9%99%AA%E5%AA%B3%E5%A6%87%E7%94%9F%E5%A8%83-%E8%BF%98%E8%80%83%E4%BA%86%E4%B8%AA%E7%A0%94/</id>
    <link href="https://000902.icu/2026/07/17/%E5%81%9C%E6%9B%B4%E7%9A%84%E8%BF%99%E4%B8%80%E5%B9%B4-all-in-ai-%E9%99%AA%E5%AA%B3%E5%A6%87%E7%94%9F%E5%A8%83-%E8%BF%98%E8%80%83%E4%BA%86%E4%B8%AA%E7%A0%94/"/>
    <published>2026-07-17T16:00:00.000Z</published>
    <summary>停更的这一年，All In AI、陪媳妇生娃、还考了个研 打开掘金 App，看了一眼自己的最近更新——停在了整整一年前。 不是不想写，是这一年确实被塞得太满了。如果非要用几个关键词来概括，那就是： A</summary>
    <title>停更的这一年，All In AI、陪媳妇生娃、还考了个研</title>
    <updated>2026-09-10T13:48:38.088Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="Vue-和-React-真正的差距，不在语法，而在团队犯错成本"><a href="#Vue-和-React-真正的差距，不在语法，而在团队犯错成本" class="headerlink" title="Vue 和 React 真正的差距，不在语法，而在团队犯错成本"></a>Vue 和 React 真正的差距，不在语法，而在团队犯错成本</h1><blockquote><p>本文转载自掘金，作者：ErpanOmer。原文链接：<a href="https://juejin.cn/post/7661802823036338214">点击查看</a></p></blockquote><p>React 与 Vue 的本质区别在于：前者给予开发者极大自由度，但需团队具备高水平才能避免常见陷阱；后者通过底层机制自动兜底，显著降低犯错成本，更适合多数业务场景。</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/16/vue-%E5%92%8C-react-%E7%9C%9F%E6%AD%A3%E7%9A%84%E5%B7%AE%E8%B7%9D-%E4%B8%8D%E5%9C%A8%E8%AF%AD%E6%B3%95-%E8%80%8C%E5%9C%A8%E5%9B%A2%E9%98%9F%E7%8A%AF%E9%94%99%E6%88%90%E6%9C%AC/</id>
    <link href="https://000902.icu/2026/07/16/vue-%E5%92%8C-react-%E7%9C%9F%E6%AD%A3%E7%9A%84%E5%B7%AE%E8%B7%9D-%E4%B8%8D%E5%9C%A8%E8%AF%AD%E6%B3%95-%E8%80%8C%E5%9C%A8%E5%9B%A2%E9%98%9F%E7%8A%AF%E9%94%99%E6%88%90%E6%9C%AC/"/>
    <published>2026-07-16T16:00:00.000Z</published>
    <summary>React 与 Vue 的本质区别在于：前者给予开发者极大自由度，但需团队具备高水平才能避免常见陷阱；后者通过底层机制自动兜底，显著降低犯错成本，更适合多数业务场景。</summary>
    <title>Vue 和 React 真正的差距，不在语法，而在团队犯错成本</title>
    <updated>2026-09-10T13:48:38.088Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="为什么-AI-写前端时，总是优先选择-React，而不是-Vue？"><a href="#为什么-AI-写前端时，总是优先选择-React，而不是-Vue？" class="headerlink" title="为什么 AI 写前端时，总是优先选择 React，而不是 Vue？"></a>为什么 AI 写前端时，总是优先选择 React，而不是 Vue？</h1><blockquote><p>本文转载自掘金，作者：ErpanOmer。原文链接：<a href="https://juejin.cn/post/7661833071121530926">点击查看</a></p></blockquote><p>AI编程工具默认生成React+Tailwind代码，而非Vue，本质是模型对语言结构纯粹性的偏好。React的JSX在AST层面更接近标准JS，而Vue的模板与脚本分离增加了模型理解成本，导致生成质量下降。</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/15/%E4%B8%BA%E4%BB%80%E4%B9%88-ai-%E5%86%99%E5%89%8D%E7%AB%AF%E6%97%B6-%E6%80%BB%E6%98%AF%E4%BC%98%E5%85%88%E9%80%89%E6%8B%A9-react-%E8%80%8C%E4%B8%8D%E6%98%AF-vue/</id>
    <link href="https://000902.icu/2026/07/15/%E4%B8%BA%E4%BB%80%E4%B9%88-ai-%E5%86%99%E5%89%8D%E7%AB%AF%E6%97%B6-%E6%80%BB%E6%98%AF%E4%BC%98%E5%85%88%E9%80%89%E6%8B%A9-react-%E8%80%8C%E4%B8%8D%E6%98%AF-vue/"/>
    <published>2026-07-15T16:00:00.000Z</published>
    <summary>AI编程工具默认生成React+Tailwind代码，而非Vue，本质是模型对语言结构纯粹性的偏好。React的JSX在AST层面更接近标准JS，而Vue的模板与脚本分离增加了模型理解成本，导致生成质量下降。</summary>
    <title>为什么 AI 写前端时，总是优先选择 React，而不是 Vue？</title>
    <updated>2026-09-10T13:48:38.088Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="一键还原任意网站，这套-Playwright-多-Agent-工程流太猛了"><a href="#一键还原任意网站，这套-Playwright-多-Agent-工程流太猛了" class="headerlink" title="一键还原任意网站，这套 Playwright + 多 Agent 工程流太猛了"></a>一键还原任意网站，这套 Playwright + 多 Agent 工程流太猛了</h1><blockquote><p>本文转载自掘金，作者：我不是外星人。原文链接：<a href="https://juejin.cn/post/7661439504077176847">点击查看</a></p></blockquote><p>一 前言 哈喽，大家好，我是 alien，今天我们来讲一个能够将精美网站一键复制的功能——ai-website-cloner-template 的使用和实现原理。 通过本篇文档你能收获到哪些内容？ A</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/14/%E4%B8%80%E9%94%AE%E8%BF%98%E5%8E%9F%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99-%E8%BF%99%E5%A5%97-playwright-%E5%A4%9A-agent-%E5%B7%A5%E7%A8%8B%E6%B5%81%E5%A4%AA%E7%8C%9B%E4%BA%86/</id>
    <link href="https://000902.icu/2026/07/14/%E4%B8%80%E9%94%AE%E8%BF%98%E5%8E%9F%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99-%E8%BF%99%E5%A5%97-playwright-%E5%A4%9A-agent-%E5%B7%A5%E7%A8%8B%E6%B5%81%E5%A4%AA%E7%8C%9B%E4%BA%86/"/>
    <published>2026-07-14T16:00:00.000Z</published>
    <summary>一 前言 哈喽，大家好，我是 alien，今天我们来讲一个能够将精美网站一键复制的功能——ai-website-cloner-template 的使用和实现原理。 通过本篇文档你能收获到哪些内容？ A</summary>
    <title>一键还原任意网站，这套 Playwright + 多 Agent 工程流太猛了</title>
    <updated>2026-09-10T13:48:38.088Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="星云SDK-油猴：给LLM塑造肉身，陪伴你在每个网页"><a href="#星云SDK-油猴：给LLM塑造肉身，陪伴你在每个网页" class="headerlink" title="星云SDK + 油猴：给LLM塑造肉身，陪伴你在每个网页"></a>星云SDK + 油猴：给LLM塑造肉身，陪伴你在每个网页</h1><blockquote><p>本文转载自掘金，作者：石小石Orz。原文链接：<a href="https://juejin.cn/post/7661754132202766371">点击查看</a></p></blockquote><p>作为一名前端开发者，我一直有一个愿景：让大模型不再只是冰冷的输入框，而是能以具身交互智能数字人形象，出现在我们浏览的每一个网页上，一直陪伴我们。 这个想法其实来自钢铁侠的“贾维斯”，我希望在我使用浏览</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/13/%E6%98%9F%E4%BA%91sdk-%E6%B2%B9%E7%8C%B4-%E7%BB%99llm%E5%A1%91%E9%80%A0%E8%82%89%E8%BA%AB-%E9%99%AA%E4%BC%B4%E4%BD%A0%E5%9C%A8%E6%AF%8F%E4%B8%AA%E7%BD%91%E9%A1%B5/</id>
    <link href="https://000902.icu/2026/07/13/%E6%98%9F%E4%BA%91sdk-%E6%B2%B9%E7%8C%B4-%E7%BB%99llm%E5%A1%91%E9%80%A0%E8%82%89%E8%BA%AB-%E9%99%AA%E4%BC%B4%E4%BD%A0%E5%9C%A8%E6%AF%8F%E4%B8%AA%E7%BD%91%E9%A1%B5/"/>
    <published>2026-07-13T16:00:00.000Z</published>
    <summary>作为一名前端开发者，我一直有一个愿景：让大模型不再只是冰冷的输入框，而是能以具身交互智能数字人形象，出现在我们浏览的每一个网页上，一直陪伴我们。 这个想法其实来自钢铁侠的“贾维斯”，我希望在我使用浏览</summary>
    <title>星云SDK + 油猴：给LLM塑造肉身，陪伴你在每个网页</title>
    <updated>2026-09-10T13:48:38.089Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="Fiber-节点-——-一个数据结构如何承载整个-React-运行时"><a href="#Fiber-节点-——-一个数据结构如何承载整个-React-运行时" class="headerlink" title="Fiber 节点 —— 一个数据结构如何承载整个 React 运行时"></a>Fiber 节点 —— 一个数据结构如何承载整个 React 运行时</h1><blockquote><p>本文转载自掘金，作者：老王以为。原文链接：<a href="https://juejin.cn/post/7659763781161730102">点击查看</a></p></blockquote><p>React通过 Fiber 节点去承载整个 React 的运行时，今天我们通过这篇文章来梳理一下 React 是如何做的，为什么要这样做，这样做背后的考量是什么？</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/08/fiber-%E8%8A%82%E7%82%B9-%E4%B8%80%E4%B8%AA%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%A6%82%E4%BD%95%E6%89%BF%E8%BD%BD%E6%95%B4%E4%B8%AA-react-%E8%BF%90%E8%A1%8C%E6%97%B6/</id>
    <link href="https://000902.icu/2026/07/08/fiber-%E8%8A%82%E7%82%B9-%E4%B8%80%E4%B8%AA%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%A6%82%E4%BD%95%E6%89%BF%E8%BD%BD%E6%95%B4%E4%B8%AA-react-%E8%BF%90%E8%A1%8C%E6%97%B6/"/>
    <published>2026-07-08T16:00:00.000Z</published>
    <summary>React通过 Fiber 节点去承载整个 React 的运行时，今天我们通过这篇文章来梳理一下 React 是如何做的，为什么要这样做，这样做背后的考量是什么？</summary>
    <title>Fiber 节点 —— 一个数据结构如何承载整个 React 运行时</title>
    <updated>2026-09-10T13:48:38.086Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="凌晨睡不着，我给台风巴威写了个追踪网站"><a href="#凌晨睡不着，我给台风巴威写了个追踪网站" class="headerlink" title="凌晨睡不着，我给台风巴威写了个追踪网站"></a>凌晨睡不着，我给台风巴威写了个追踪网站</h1><blockquote><p>本文转载自掘金，作者：HiSt。原文链接：<a href="https://juejin.cn/post/7659393583027896330">点击查看</a></p></blockquote><p>索性爬起来，打开电脑，用 Claude Fable 5 把想法一点点敲了出来。把基于中央气象台、日本气象厅、美国 JTWC、台湾气象署四家的路径数据放在同一张地图上之后，很多事一眼就看明白了</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/07/%E5%87%8C%E6%99%A8%E7%9D%A1%E4%B8%8D%E7%9D%80-%E6%88%91%E7%BB%99%E5%8F%B0%E9%A3%8E%E5%B7%B4%E5%A8%81%E5%86%99%E4%BA%86%E4%B8%AA%E8%BF%BD%E8%B8%AA%E7%BD%91%E7%AB%99/</id>
    <link href="https://000902.icu/2026/07/07/%E5%87%8C%E6%99%A8%E7%9D%A1%E4%B8%8D%E7%9D%80-%E6%88%91%E7%BB%99%E5%8F%B0%E9%A3%8E%E5%B7%B4%E5%A8%81%E5%86%99%E4%BA%86%E4%B8%AA%E8%BF%BD%E8%B8%AA%E7%BD%91%E7%AB%99/"/>
    <published>2026-07-07T16:00:00.000Z</published>
    <summary>索性爬起来，打开电脑，用 Claude Fable 5 把想法一点点敲了出来。把基于中央气象台、日本气象厅、美国 JTWC、台湾气象署四家的路径数据放在同一张地图上之后，很多事一眼就看明白了</summary>
    <title>凌晨睡不着，我给台风巴威写了个追踪网站</title>
    <updated>2026-09-10T13:48:38.088Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="豆包和千问同时关了智能体，我用它们搭的-3-个自动化全废了——迁移方案整理"><a href="#豆包和千问同时关了智能体，我用它们搭的-3-个自动化全废了——迁移方案整理" class="headerlink" title="豆包和千问同时关了智能体，我用它们搭的 3 个自动化全废了——迁移方案整理"></a>豆包和千问同时关了智能体，我用它们搭的 3 个自动化全废了——迁移方案整理</h1><blockquote><p>本文转载自掘金，作者：kyriewen。原文链接：<a href="https://juejin.cn/post/7658599462051086371">点击查看</a></p></blockquote><p>豆包和千问 7&#x2F;15 同时下线智能体功能。整理了 4 种替代方案对比（Coze&#x2F;Dify&#x2F;Claude Code&#x2F;自建API），附迁移操作指南和数据导出 Checklist。</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/06/%E8%B1%86%E5%8C%85%E5%92%8C%E5%8D%83%E9%97%AE%E5%90%8C%E6%97%B6%E5%85%B3%E4%BA%86%E6%99%BA%E8%83%BD%E4%BD%93-%E6%88%91%E7%94%A8%E5%AE%83%E4%BB%AC%E6%90%AD%E7%9A%84-3-%E4%B8%AA%E8%87%AA%E5%8A%A8%E5%8C%96%E5%85%A8%E5%BA%9F%E4%BA%86-%E8%BF%81%E7%A7%BB%E6%96%B9%E6%A1%88%E6%95%B4%E7%90%86/</id>
    <link href="https://000902.icu/2026/07/06/%E8%B1%86%E5%8C%85%E5%92%8C%E5%8D%83%E9%97%AE%E5%90%8C%E6%97%B6%E5%85%B3%E4%BA%86%E6%99%BA%E8%83%BD%E4%BD%93-%E6%88%91%E7%94%A8%E5%AE%83%E4%BB%AC%E6%90%AD%E7%9A%84-3-%E4%B8%AA%E8%87%AA%E5%8A%A8%E5%8C%96%E5%85%A8%E5%BA%9F%E4%BA%86-%E8%BF%81%E7%A7%BB%E6%96%B9%E6%A1%88%E6%95%B4%E7%90%86/"/>
    <published>2026-07-06T16:00:00.000Z</published>
    <summary>豆包和千问 7/15 同时下线智能体功能。整理了 4 种替代方案对比（Coze/Dify/Claude Code/自建API），附迁移操作指南和数据导出 Checklist。</summary>
    <title>豆包和千问同时关了智能体，我用它们搭的 3 个自动化全废了——迁移方案整理</title>
    <updated>2026-09-10T13:48:38.089Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="别被模型宣传骗了，真实-Agent-任务一跑就知道"><a href="#别被模型宣传骗了，真实-Agent-任务一跑就知道" class="headerlink" title="别被模型宣传骗了，真实 Agent 任务一跑就知道"></a>别被模型宣传骗了，真实 Agent 任务一跑就知道</h1><blockquote><p>本文转载自掘金，作者：轻口味。原文链接：<a href="https://juejin.cn/post/7658119907389554738">点击查看</a></p></blockquote><p>现在市面上能调用的模型确实越来越多了，各家都有自己的亮点和侧重点，光看宣传文档和跑分数据其实很难判断哪个真正适合自己——尤其是当任务从单轮对话延伸到多步操作的时候，情况就更加复杂了。 所以我就想着，不</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/05/%E5%88%AB%E8%A2%AB%E6%A8%A1%E5%9E%8B%E5%AE%A3%E4%BC%A0%E9%AA%97%E4%BA%86-%E7%9C%9F%E5%AE%9E-agent-%E4%BB%BB%E5%8A%A1%E4%B8%80%E8%B7%91%E5%B0%B1%E7%9F%A5%E9%81%93/</id>
    <link href="https://000902.icu/2026/07/05/%E5%88%AB%E8%A2%AB%E6%A8%A1%E5%9E%8B%E5%AE%A3%E4%BC%A0%E9%AA%97%E4%BA%86-%E7%9C%9F%E5%AE%9E-agent-%E4%BB%BB%E5%8A%A1%E4%B8%80%E8%B7%91%E5%B0%B1%E7%9F%A5%E9%81%93/"/>
    <published>2026-07-05T16:00:00.000Z</published>
    <summary>现在市面上能调用的模型确实越来越多了，各家都有自己的亮点和侧重点，光看宣传文档和跑分数据其实很难判断哪个真正适合自己——尤其是当任务从单轮对话延伸到多步操作的时候，情况就更加复杂了。 所以我就想着，不</summary>
    <title>别被模型宣传骗了，真实 Agent 任务一跑就知道</title>
    <updated>2026-09-10T13:48:38.088Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="首屏加载半秒开！还有谁！！！"><a href="#首屏加载半秒开！还有谁！！！" class="headerlink" title="首屏加载半秒开！还有谁！！！"></a>首屏加载半秒开！还有谁！！！</h1><blockquote><p>本文转载自掘金，作者：锋行天下。原文链接：<a href="https://juejin.cn/post/7657709791472861225">点击查看</a></p></blockquote><p>这是我的网站登录页目前加载时间，毫秒级加载，嗖的一下就出来啦，现在总结一下怎么做到的 一，路由 懒加载，这是常规操作 二，UI组件库动态导入 一定不要在入口main.js里全部注册组件,使用插件动态自</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/04/%E9%A6%96%E5%B1%8F%E5%8A%A0%E8%BD%BD%E5%8D%8A%E7%A7%92%E5%BC%80-%E8%BF%98%E6%9C%89%E8%B0%81/</id>
    <link href="https://000902.icu/2026/07/04/%E9%A6%96%E5%B1%8F%E5%8A%A0%E8%BD%BD%E5%8D%8A%E7%A7%92%E5%BC%80-%E8%BF%98%E6%9C%89%E8%B0%81/"/>
    <published>2026-07-04T16:00:00.000Z</published>
    <summary>这是我的网站登录页目前加载时间，毫秒级加载，嗖的一下就出来啦，现在总结一下怎么做到的 一，路由 懒加载，这是常规操作 二，UI组件库动态导入 一定不要在入口main.js里全部注册组件,使用插件动态自</summary>
    <title>首屏加载半秒开！还有谁！！！</title>
    <updated>2026-09-10T13:48:38.089Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <content>
      <![CDATA[<h1 id="我用-Codex-重写了同事维护三年的代码，他没说谢谢——而是找了领导"><a href="#我用-Codex-重写了同事维护三年的代码，他没说谢谢——而是找了领导" class="headerlink" title="我用 Codex 重写了同事维护三年的代码，他没说谢谢——而是找了领导"></a>我用 Codex 重写了同事维护三年的代码，他没说谢谢——而是找了领导</h1><blockquote><p>本文转载自掘金，作者：kyriewen。原文链接：<a href="https://juejin.cn/post/7657392618506764326">点击查看</a></p></blockquote><p>我用 Codex 花一个周末重写了同事维护三年的代码，提了一个大 PR。他没有说谢谢，而是找了领导。这篇文章复盘了我在 AI 时代犯的一个典型错误：技术上正确不等于做法正确。</p><hr><p><em>本文为自动转载草稿，请编辑后发布。</em></p>]]>
    </content>
    <id>https://000902.icu/2026/07/03/%E6%88%91%E7%94%A8-codex-%E9%87%8D%E5%86%99%E4%BA%86%E5%90%8C%E4%BA%8B%E7%BB%B4%E6%8A%A4%E4%B8%89%E5%B9%B4%E7%9A%84%E4%BB%A3%E7%A0%81-%E4%BB%96%E6%B2%A1%E8%AF%B4%E8%B0%A2%E8%B0%A2-%E8%80%8C%E6%98%AF%E6%89%BE%E4%BA%86%E9%A2%86%E5%AF%BC/</id>
    <link href="https://000902.icu/2026/07/03/%E6%88%91%E7%94%A8-codex-%E9%87%8D%E5%86%99%E4%BA%86%E5%90%8C%E4%BA%8B%E7%BB%B4%E6%8A%A4%E4%B8%89%E5%B9%B4%E7%9A%84%E4%BB%A3%E7%A0%81-%E4%BB%96%E6%B2%A1%E8%AF%B4%E8%B0%A2%E8%B0%A2-%E8%80%8C%E6%98%AF%E6%89%BE%E4%BA%86%E9%A2%86%E5%AF%BC/"/>
    <published>2026-07-03T16:00:00.000Z</published>
    <summary>我用 Codex 花一个周末重写了同事维护三年的代码，提了一个大 PR。他没有说谢谢，而是找了领导。这篇文章复盘了我在 AI 时代犯的一个典型错误：技术上正确不等于做法正确。</summary>
    <title>我用 Codex 重写了同事维护三年的代码，他没说谢谢——而是找了领导</title>
    <updated>2026-09-10T13:48:38.089Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <category term="AI 编程" scheme="https://000902.icu/categories/AI-%E7%BC%96%E7%A8%8B/"/>
    <category term="工作流" scheme="https://000902.icu/tags/%E5%B7%A5%E4%BD%9C%E6%B5%81/"/>
    <category term="AI 编程" scheme="https://000902.icu/tags/AI-%E7%BC%96%E7%A8%8B/"/>
    <category term="代码审查" scheme="https://000902.icu/tags/%E4%BB%A3%E7%A0%81%E5%AE%A1%E6%9F%A5/"/>
    <category term="工程实践" scheme="https://000902.icu/tags/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/"/>
    <content>
      <![CDATA[<h1 id="AI-编程工作流：上下文、任务拆分与代码审查"><a href="#AI-编程工作流：上下文、任务拆分与代码审查" class="headerlink" title="AI 编程工作流：上下文、任务拆分与代码审查"></a>AI 编程工作流：上下文、任务拆分与代码审查</h1><p>AI 编程不是”把需求丢进去，代码自己就写好了”。真实项目里，你需要管理上下文、拆分任务、审查代码、控制变更范围。这篇文章把我在项目中总结的 AI 编程工作流整理出来。</p><span id="more"></span><h2 id="完整工作流"><a href="#完整工作流" class="headerlink" title="完整工作流"></a>完整工作流</h2><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">需求分析 → 任务拆分 → 上下文准备 → AI 实现 → 代码审查 → 测试验证 → 提交上线<br></code></pre></td></tr></table></figure><p>每个环节都很重要，跳过任何一步都可能出问题。</p><h2 id="第一步：需求分析"><a href="#第一步：需求分析" class="headerlink" title="第一步：需求分析"></a>第一步：需求分析</h2><p>在让 AI 写代码之前，先自己想清楚：</p><h3 id="问自己三个问题"><a href="#问自己三个问题" class="headerlink" title="问自己三个问题"></a>问自己三个问题</h3><ol><li><strong>要做什么</strong>：功能的边界是什么？</li><li><strong>怎么做</strong>：技术方案是什么？</li><li><strong>不能做什么</strong>：有哪些约束和限制？</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 让 Claude 帮你梳理需求</span><br>claude <span class="hljs-string">&quot;我要给用户列表加分页功能，帮我梳理一下需求：</span><br><span class="hljs-string">1. 需要考虑哪些场景？</span><br><span class="hljs-string">2. 前后端分别需要改什么？</span><br><span class="hljs-string">3. 有什么边界情况需要处理？&quot;</span><br></code></pre></td></tr></table></figure><h2 id="第二步：任务拆分"><a href="#第二步：任务拆分" class="headerlink" title="第二步：任务拆分"></a>第二步：任务拆分</h2><p>大任务拆成小任务，每个小任务独立可验证。</p><h3 id="拆分原则"><a href="#拆分原则" class="headerlink" title="拆分原则"></a>拆分原则</h3><table><thead><tr><th>原则</th><th>说明</th></tr></thead><tbody><tr><td>独立性</td><td>每个任务独立完成，不依赖其他未完成的任务</td></tr><tr><td>可验证</td><td>每个任务完成后都能验证是否正确</td></tr><tr><td>小粒度</td><td>每个任务改 1-3 个文件，不超过 100 行代码</td></tr></tbody></table><h3 id="拆分示例"><a href="#拆分示例" class="headerlink" title="拆分示例"></a>拆分示例</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs markdown">需求：用户列表加分页<br><br>任务 1：后端接口支持分页参数<br><span class="hljs-bullet">  -</span> 修改 UserMapper.xml 的查询语句<br><span class="hljs-bullet">  -</span> 修改 UserService 的分页逻辑<br><span class="hljs-bullet">  -</span> 修改 UserController 的参数接收<br><br>任务 2：前端分页组件<br><span class="hljs-bullet">  -</span> 创建 Pagination 组件<br><span class="hljs-bullet">  -</span> 在用户列表页引入组件<br><br>任务 3：前后端联调<br><span class="hljs-bullet">  -</span> 调用接口测试分页<br><span class="hljs-bullet">  -</span> 处理异常情况<br><br>任务 4：测试和优化<br><span class="hljs-bullet">  -</span> 添加单元测试<br><span class="hljs-bullet">  -</span> 优化加载速度<br></code></pre></td></tr></table></figure><h2 id="第三步：上下文准备"><a href="#第三步：上下文准备" class="headerlink" title="第三步：上下文准备"></a>第三步：上下文准备</h2><p>给 AI 提供必要的上下文，让它理解任务背景。</p><h3 id="上下文清单"><a href="#上下文清单" class="headerlink" title="上下文清单"></a>上下文清单</h3><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs">✅ 相关代码文件（当前要改的 + 相关的）<br>✅ 接口文档（如果有）<br>✅ 数据库表结构（如果涉及数据库）<br>✅ 相关的工具函数（如果要复用）<br>✅ 错误信息（如果有报错）<br>❌ 不相关的代码<br>❌ 敏感信息（密码、密钥）<br>❌ 过多的历史对话<br></code></pre></td></tr></table></figure><h3 id="实际操作"><a href="#实际操作" class="headerlink" title="实际操作"></a>实际操作</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 不好的做法：把所有文件都给 Claude</span><br><span class="hljs-built_in">cat</span> src/**/*.js | claude <span class="hljs-string">&quot;加分页&quot;</span><br><br><span class="hljs-comment"># 好的做法：只给相关的</span><br>claude <span class="hljs-string">&quot;给用户列表加分页，相关文件：</span><br><span class="hljs-string">- src/views/user/list.vue（列表页）</span><br><span class="hljs-string">- src/api/user.js（API 请求）</span><br><span class="hljs-string">- src/components/Pagination.vue（分页组件，已有）</span><br><span class="hljs-string"></span><br><span class="hljs-string">接口返回格式：</span><br><span class="hljs-string">&#123;</span><br><span class="hljs-string">  code: 200,</span><br><span class="hljs-string">  data: &#123;</span><br><span class="hljs-string">    list: [...],</span><br><span class="hljs-string">    total: 100,</span><br><span class="hljs-string">    page: 1,</span><br><span class="hljs-string">    size: 20</span><br><span class="hljs-string">  &#125;</span><br><span class="hljs-string">&#125;&quot;</span><br></code></pre></td></tr></table></figure><h2 id="第四步：AI-实现"><a href="#第四步：AI-实现" class="headerlink" title="第四步：AI 实现"></a>第四步：AI 实现</h2><h3 id="让-AI-先说再做"><a href="#让-AI-先说再做" class="headerlink" title="让 AI 先说再做"></a>让 AI 先说再做</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 不好的做法：直接让 AI 改代码</span><br>claude <span class="hljs-string">&quot;修改用户列表页，加上分页&quot;</span><br><br><span class="hljs-comment"># 好的做法：先让 AI 说方案</span><br>claude <span class="hljs-string">&quot;用户列表页要加后端分页，先说说你打算怎么改？确认后再动手&quot;</span><br></code></pre></td></tr></table></figure><h3 id="控制变更范围"><a href="#控制变更范围" class="headerlink" title="控制变更范围"></a>控制变更范围</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 明确告诉 AI 只改哪些文件</span><br>claude <span class="hljs-string">&quot;只修改以下文件：</span><br><span class="hljs-string">1. src/views/user/list.vue - 添加分页组件和请求逻辑</span><br><span class="hljs-string">2. src/api/user.js - 修改 getList 方法添加分页参数</span><br><span class="hljs-string"></span><br><span class="hljs-string">不要修改其他文件&quot;</span><br></code></pre></td></tr></table></figure><h3 id="分步验证"><a href="#分步验证" class="headerlink" title="分步验证"></a>分步验证</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 每完成一步就验证</span><br>claude <span class="hljs-string">&quot;先修改 src/api/user.js 的 getList 方法，添加 page 和 size 参数&quot;</span><br><br><span class="hljs-comment"># 验证无误后继续</span><br>claude <span class="hljs-string">&quot;再修改 src/views/user/list.vue，引入分页组件&quot;</span><br></code></pre></td></tr></table></figure><h2 id="第五步：代码审查"><a href="#第五步：代码审查" class="headerlink" title="第五步：代码审查"></a>第五步：代码审查</h2><p>AI 写的代码必须过审，不能盲目信任。</p><h3 id="审查清单"><a href="#审查清单" class="headerlink" title="审查清单"></a>审查清单</h3><h4 id="功能正确性"><a href="#功能正确性" class="headerlink" title="功能正确性"></a>功能正确性</h4><ul><li><input disabled="" type="checkbox"> 代码是否实现了需求？</li><li><input disabled="" type="checkbox"> 边界情况是否处理？（空值、空列表、超长输入）</li><li><input disabled="" type="checkbox"> 异常情况是否处理？（网络错误、权限不足）</li></ul><h4 id="安全性"><a href="#安全性" class="headerlink" title="安全性"></a>安全性</h4><ul><li><input disabled="" type="checkbox"> 用户输入是否校验？</li><li><input disabled="" type="checkbox"> SQL 注入风险？</li><li><input disabled="" type="checkbox"> XSS 风险？</li><li><input disabled="" type="checkbox"> 敏感信息是否泄露？</li></ul><h4 id="性能"><a href="#性能" class="headerlink" title="性能"></a>性能</h4><ul><li><input disabled="" type="checkbox"> 有没有不必要的循环？</li><li><input disabled="" type="checkbox"> 有没有重复查询？</li><li><input disabled="" type="checkbox"> 大数据量是否分页？</li></ul><h4 id="可维护性"><a href="#可维护性" class="headerlink" title="可维护性"></a>可维护性</h4><ul><li><input disabled="" type="checkbox"> 命名是否清晰？</li><li><input disabled="" type="checkbox"> 逻辑是否易懂？</li><li><input disabled="" type="checkbox"> 有没有重复代码？</li></ul><h3 id="使用-Claude-辅助审查"><a href="#使用-Claude-辅助审查" class="headerlink" title="使用 Claude 辅助审查"></a>使用 Claude 辅助审查</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 审查当前改动</span><br>git diff | claude <span class="hljs-string">&quot;审查这些改动，重点关注：</span><br><span class="hljs-string">1. 安全性：有没有注入风险？</span><br><span class="hljs-string">2. 性能：有没有可以优化的地方？</span><br><span class="hljs-string">3. 边界情况：空值处理是否完善？&quot;</span><br><br><span class="hljs-comment"># 审查特定文件</span><br><span class="hljs-built_in">cat</span> src/api/user.js | claude <span class="hljs-string">&quot;审查这个文件的错误处理是否完善&quot;</span><br></code></pre></td></tr></table></figure><h2 id="第六步：测试验证"><a href="#第六步：测试验证" class="headerlink" title="第六步：测试验证"></a>第六步：测试验证</h2><h3 id="单元测试"><a href="#单元测试" class="headerlink" title="单元测试"></a>单元测试</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 让 AI 生成测试</span><br>claude <span class="hljs-string">&quot;为 src/utils/pagination.js 生成单元测试，覆盖以下场景：</span><br><span class="hljs-string">1. 正常分页</span><br><span class="hljs-string">2. 页码为 0 或负数</span><br><span class="hljs-string">3. 每页条数为 0</span><br><span class="hljs-string">4. 总数为 0&quot;</span><br></code></pre></td></tr></table></figure><h3 id="手动测试"><a href="#手动测试" class="headerlink" title="手动测试"></a>手动测试</h3><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs">✅ 正常流程：能分页、能切换页码<br>✅ 边界情况：第一页点上一页、最后一页点下一页<br>✅ 异常情况：网络断开、接口报错<br>✅ 性能：大数据量是否流畅<br></code></pre></td></tr></table></figure><h2 id="第七步：提交上线"><a href="#第七步：提交上线" class="headerlink" title="第七步：提交上线"></a>第七步：提交上线</h2><h3 id="提交规范"><a href="#提交规范" class="headerlink" title="提交规范"></a>提交规范</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 小步提交，每个 commit 都是独立可回滚的</span><br>git add src/api/user.js<br>git commit -m <span class="hljs-string">&quot;feat(user): 添加用户列表分页参数&quot;</span><br><br>git add src/views/user/list.vue<br>git commit -m <span class="hljs-string">&quot;feat(user): 用户列表添加分页组件&quot;</span><br><br>git add src/components/Pagination.vue src/utils/pagination.js<br>git commit -m <span class="hljs-string">&quot;feat(pagination): 新增分页组件和工具函数&quot;</span><br></code></pre></td></tr></table></figure><h3 id="提交信息格式"><a href="#提交信息格式" class="headerlink" title="提交信息格式"></a>提交信息格式</h3><figure class="highlight nestedtext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs nestedtext"><span class="hljs-attribute">类型(范围)</span><span class="hljs-punctuation">:</span> <span class="hljs-string">简短描述</span><br><br><span class="hljs-attribute">类型：</span><br><span class="hljs-attribute">- feat</span><span class="hljs-punctuation">:</span> <span class="hljs-string">新功能</span><br><span class="hljs-bullet">-</span> <span class="hljs-string">fix: 修复 bug</span><br><span class="hljs-bullet">-</span> <span class="hljs-string">refactor: 重构</span><br><span class="hljs-bullet">-</span> <span class="hljs-string">test: 测试</span><br><span class="hljs-bullet">-</span> <span class="hljs-string">docs: 文档</span><br></code></pre></td></tr></table></figure><h2 id="回滚策略"><a href="#回滚策略" class="headerlink" title="回滚策略"></a>回滚策略</h2><h3 id="Git-回滚"><a href="#Git-回滚" class="headerlink" title="Git 回滚"></a>Git 回滚</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 回滚最近一次提交</span><br>git reset --hard HEAD~1<br><br><span class="hljs-comment"># 回滚到指定提交</span><br>git reset --hard &lt;commit-hash&gt;<br><br><span class="hljs-comment"># 回滚已推送的提交（谨慎使用）</span><br>git revert &lt;commit-hash&gt;<br>git push<br></code></pre></td></tr></table></figure><h3 id="分支策略"><a href="#分支策略" class="headerlink" title="分支策略"></a>分支策略</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 功能开发在分支上</span><br>git checkout -b feat/user-pagination<br><br><span class="hljs-comment"># 完成后合并到主分支</span><br>git checkout main<br>git merge feat/user-pagination<br><br><span class="hljs-comment"># 出问题时回滚合并</span><br>git revert -m 1 &lt;merge-commit-hash&gt;<br></code></pre></td></tr></table></figure><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h3 id="AI-改动太大"><a href="#AI-改动太大" class="headerlink" title="AI 改动太大"></a>AI 改动太大</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">claude <span class="hljs-string">&quot;只修改 src/api/user.js 这一个文件，不要动其他文件。如果需要改其他文件，先告诉我，我确认后再改&quot;</span><br></code></pre></td></tr></table></figure><h3 id="AI-理解错了需求"><a href="#AI-理解错了需求" class="headerlink" title="AI 理解错了需求"></a>AI 理解错了需求</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 先让 AI 说方案</span><br>claude <span class="hljs-string">&quot;先描述一下你打算怎么改，包括会修改哪些文件、每个文件改什么。我确认后再动手&quot;</span><br></code></pre></td></tr></table></figure><h3 id="AI-生成的代码有-bug"><a href="#AI-生成的代码有-bug" class="headerlink" title="AI 生成的代码有 bug"></a>AI 生成的代码有 bug</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 提供错误信息</span><br><span class="hljs-built_in">cat</span> error.log | claude <span class="hljs-string">&quot;这段代码报错了，错误信息如下：xxx。帮我定位问题并修复&quot;</span><br></code></pre></td></tr></table></figure><h3 id="上下文不够"><a href="#上下文不够" class="headerlink" title="上下文不够"></a>上下文不够</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 补充上下文</span><br>claude <span class="hljs-string">&quot;补充一下背景：这个项目的用户表结构是 xxx，之前已经有一个不分页的查询接口&quot;</span><br></code></pre></td></tr></table></figure><h2 id="效率对比"><a href="#效率对比" class="headerlink" title="效率对比"></a>效率对比</h2><table><thead><tr><th>场景</th><th>纯手写</th><th>AI 辅助</th><th>效率提升</th></tr></thead><tbody><tr><td>写 CRUD</td><td>2小时</td><td>30分钟</td><td>4x</td></tr><tr><td>写测试</td><td>1小时</td><td>15分钟</td><td>4x</td></tr><tr><td>代码审查</td><td>30分钟</td><td>10分钟</td><td>3x</td></tr><tr><td>排查 bug</td><td>1小时</td><td>20分钟</td><td>3x</td></tr><tr><td>重构</td><td>3小时</td><td>1小时</td><td>3x</td></tr></tbody></table><p><strong>注意</strong>：这是建立在正确使用 AI 的前提下。如果上下文管理不好、任务拆分不合理，效率可能反而下降。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>AI 编程是一个完整的工作流，不是一步到位</li><li>上下文管理是关键：只给相关的，不给多余的</li><li>大任务拆成小任务，每步都验证</li><li>AI 写的代码必须过审，不能盲目信任</li><li>Git 是安全网，小步提交，方便回滚</li></ul>]]>
    </content>
    <id>https://000902.icu/2026/07/02/ai-coding/ai-coding-workflow/</id>
    <link href="https://000902.icu/2026/07/02/ai-coding/ai-coding-workflow/"/>
    <published>2026-07-02T16:00:00.000Z</published>
    <summary>AI 编程在真实项目中的完整工作流，包括需求分析、任务拆分、实现、审查和回滚</summary>
    <title>AI 编程工作流：上下文、任务拆分与代码审查</title>
    <updated>2026-09-10T13:48:38.086Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <category term="AI 编程" scheme="https://000902.icu/categories/AI-%E7%BC%96%E7%A8%8B/"/>
    <category term="Claude Code" scheme="https://000902.icu/tags/Claude-Code/"/>
    <category term="AI 编程" scheme="https://000902.icu/tags/AI-%E7%BC%96%E7%A8%8B/"/>
    <category term="CLI" scheme="https://000902.icu/tags/CLI/"/>
    <content>
      <![CDATA[<h1 id="Claude-Code-使用指南：从配置到实战"><a href="#Claude-Code-使用指南：从配置到实战" class="headerlink" title="Claude Code 使用指南：从配置到实战"></a>Claude Code 使用指南：从配置到实战</h1><p>Claude Code 是 Anthropic 推出的 CLI 编程工具。它不是简单的代码补全，而是一个能理解整个项目、执行复杂任务的 AI 功手。但要把它用好，你得知道怎么配置、怎么给上下文、怎么拆任务。</p><p>这篇文章从实际使用角度，讲 Claude Code 的核心配置和工程实践。</p><span id="more"></span><h2 id="安装与配置"><a href="#安装与配置" class="headerlink" title="安装与配置"></a>安装与配置</h2><h3 id="基础安装"><a href="#基础安装" class="headerlink" title="基础安装"></a>基础安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">npm install -g @anthropic-ai/claude-code<br></code></pre></td></tr></table></figure><h3 id="项目级配置：CLAUDE-md"><a href="#项目级配置：CLAUDE-md" class="headerlink" title="项目级配置：CLAUDE.md"></a>项目级配置：CLAUDE.md</h3><p><code>CLAUDE.md</code> 是 Claude Code 的项目规则文件，放在项目根目录。它告诉 Claude 这个项目的背景、规范和约束。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs markdown"><span class="hljs-section"># 项目规则</span><br><br><span class="hljs-section">## 技术栈</span><br><span class="hljs-bullet">-</span> Vue 3 + TypeScript + Vite<br><span class="hljs-bullet">-</span> 后端：Spring Boot + MyBatis-Plus<br><span class="hljs-bullet">-</span> 数据库：MySQL 8.0<br><br><span class="hljs-section">## 代码规范</span><br><span class="hljs-bullet">-</span> 使用 Composition API，不用 Options API<br><span class="hljs-bullet">-</span> 组件命名：PascalCase<br><span class="hljs-bullet">-</span> 工具函数放 src/utils/<br><span class="hljs-bullet">-</span> API 请求放 src/api/<br><br><span class="hljs-section">## 禁止事项</span><br><span class="hljs-bullet">-</span> 不要直接修改 node<span class="hljs-emphasis">_modules</span><br><span class="hljs-emphasis">- 不要删除测试文件</span><br><span class="hljs-emphasis">- 不要改变现有 API 接口格式</span><br></code></pre></td></tr></table></figure><h3 id="CLAUDE-md-的层级结构"><a href="#CLAUDE-md-的层级结构" class="headerlink" title="CLAUDE.md 的层级结构"></a>CLAUDE.md 的层级结构</h3><figure class="highlight nix"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs nix">项目根目录<span class="hljs-symbol">/CLAUDE.md</span>          <span class="hljs-comment"># 项目级规则</span><br>├── src<span class="hljs-symbol">/</span><br>│   ├── components<span class="hljs-symbol">/CLAUDE.md</span>  <span class="hljs-comment"># 组件目录规则</span><br>│   └── utils<span class="hljs-symbol">/CLAUDE.md</span>       <span class="hljs-comment"># 工具函数规则</span><br></code></pre></td></tr></table></figure><p><strong>原则</strong>：越具体越好。不要写”遵循最佳实践”，要写”组件用 Composition API + setup 语法糖”。</p><h2 id="核心命令"><a href="#核心命令" class="headerlink" title="核心命令"></a>核心命令</h2><h3 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h3><table><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>claude</code></td><td>启动交互式会话</td></tr><tr><td><code>claude &quot;问题&quot;</code></td><td>直接提问</td></tr><tr><td><code>claude -p &quot;问题&quot;</code></td><td>非交互模式，适合脚本</td></tr><tr><td><code>/help</code></td><td>查看帮助</td></tr><tr><td><code>/cost</code></td><td>查看 Token 消耗</td></tr><tr><td><code>/clear</code></td><td>清空上下文</td></tr></tbody></table><h3 id="工作流命令"><a href="#工作流命令" class="headerlink" title="工作流命令"></a>工作流命令</h3><table><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>/review</code></td><td>代码审查</td></tr><tr><td><code>/simplify</code></td><td>简化代码</td></tr><tr><td><code>/loop N 命令</code></td><td>重复执行 N 次</td></tr></tbody></table><h3 id="实用技巧"><a href="#实用技巧" class="headerlink" title="实用技巧"></a>实用技巧</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 批量修改文件</span><br>claude <span class="hljs-string">&quot;把 src/ 下所有 .js 文件中的 var 改成 const&quot;</span><br><br><span class="hljs-comment"># 生成测试</span><br>claude <span class="hljs-string">&quot;为 src/utils/date.js 生成单元测试&quot;</span><br><br><span class="hljs-comment"># 代码审查</span><br>git diff | claude <span class="hljs-string">&quot;审查这些改动，指出潜在问题&quot;</span><br><br><span class="hljs-comment"># 解释代码</span><br><span class="hljs-built_in">cat</span> src/complex-function.js | claude <span class="hljs-string">&quot;解释这个函数的逻辑&quot;</span><br></code></pre></td></tr></table></figure><h2 id="上下文管理：最关键的技能"><a href="#上下文管理：最关键的技能" class="headerlink" title="上下文管理：最关键的技能"></a>上下文管理：最关键的技能</h2><p>Claude Code 的效果很大程度上取决于你怎么给上下文。</p><h3 id="原则一：相关性优先"><a href="#原则一：相关性优先" class="headerlink" title="原则一：相关性优先"></a>原则一：相关性优先</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 不好的做法：把所有文件都给 Claude</span><br><span class="hljs-built_in">cat</span> src/**/*.js | claude <span class="hljs-string">&quot;修改这个函数&quot;</span><br><br><span class="hljs-comment"># 好的做法：只给相关的文件</span><br><span class="hljs-built_in">cat</span> src/api/user.js src/utils/request.js | claude <span class="hljs-string">&quot;修改用户 API 的请求方式&quot;</span><br></code></pre></td></tr></table></figure><h3 id="原则二：明确目标"><a href="#原则二：明确目标" class="headerlink" title="原则二：明确目标"></a>原则二：明确目标</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 不好的做法：模糊的指令</span><br>claude <span class="hljs-string">&quot;修复这个 bug&quot;</span><br><br><span class="hljs-comment"># 好的做法：具体的指令</span><br>claude <span class="hljs-string">&quot;用户列表页点击分页后，数据没有刷新。问题可能在 src/views/user/list.vue 的 fetchList 方法，或者 src/api/user.js 的 getList 接口&quot;</span><br></code></pre></td></tr></table></figure><h3 id="原则三：提供约束"><a href="#原则三：提供约束" class="headerlink" title="原则三：提供约束"></a>原则三：提供约束</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 不好的做法：没有约束</span><br>claude <span class="hljs-string">&quot;重构这个组件&quot;</span><br><br><span class="hljs-comment"># 好的做法：明确约束</span><br>claude <span class="hljs-string">&quot;重构 src/components/UserTable.vue：</span><br><span class="hljs-string">1. 从 Options API 改成 Composition API</span><br><span class="hljs-string">2. 不要改变现有的 props 和 events 接口</span><br><span class="hljs-string">3. 保持现有的样式不变&quot;</span><br></code></pre></td></tr></table></figure><h3 id="上下文窗口管理"><a href="#上下文窗口管理" class="headerlink" title="上下文窗口管理"></a>上下文窗口管理</h3><p>Claude Code 有上下文窗口限制。处理大项目时：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 1. 分阶段处理</span><br><span class="hljs-comment"># 第一阶段：理解项目结构</span><br>claude <span class="hljs-string">&quot;先看一下 src/ 目录结构，告诉我这个项目的架构&quot;</span><br><br><span class="hljs-comment"># 第二阶段：定位问题</span><br>claude <span class="hljs-string">&quot;用户模块的 API 请求在哪个文件？&quot;</span><br><br><span class="hljs-comment"># 第三阶段：具体修改</span><br>claude <span class="hljs-string">&quot;修改 src/api/user.js 中的 getList 方法，添加分页参数&quot;</span><br></code></pre></td></tr></table></figure><h2 id="任务拆分：大任务拆成小步骤"><a href="#任务拆分：大任务拆成小步骤" class="headerlink" title="任务拆分：大任务拆成小步骤"></a>任务拆分：大任务拆成小步骤</h2><h3 id="不好的做法"><a href="#不好的做法" class="headerlink" title="不好的做法"></a>不好的做法</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">claude <span class="hljs-string">&quot;给这个项目加上用户认证功能&quot;</span><br></code></pre></td></tr></table></figure><p>这个任务太大，Claude 可能会：</p><ul><li>改太多文件</li><li>遗漏某些步骤</li><li>引入新的 bug</li></ul><h3 id="好的做法"><a href="#好的做法" class="headerlink" title="好的做法"></a>好的做法</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 步骤 1：设计</span><br>claude <span class="hljs-string">&quot;帮我设计用户认证的技术方案，包括：登录接口、Token 存储、路由守卫&quot;</span><br><br><span class="hljs-comment"># 步骤 2：实现登录接口</span><br>claude <span class="hljs-string">&quot;实现登录接口 POST /api/auth/login，返回 JWT Token&quot;</span><br><br><span class="hljs-comment"># 步骤 3：Token 管理</span><br>claude <span class="hljs-string">&quot;实现 Token 的存储和刷新逻辑，放在 src/utils/auth.js&quot;</span><br><br><span class="hljs-comment"># 步骤 4：路由守卫</span><br>claude <span class="hljs-string">&quot;在 src/router/index.js 中添加路由守卫，未登录跳转登录页&quot;</span><br><br><span class="hljs-comment"># 步骤 5：测试</span><br>claude <span class="hljs-string">&quot;为以上功能编写测试用例&quot;</span><br></code></pre></td></tr></table></figure><h2 id="代码审查：AI-写的代码要过审"><a href="#代码审查：AI-写的代码要过审" class="headerlink" title="代码审查：AI 写的代码要过审"></a>代码审查：AI 写的代码要过审</h2><h3 id="审查清单"><a href="#审查清单" class="headerlink" title="审查清单"></a>审查清单</h3><ol><li><strong>功能正确性</strong>：代码是否实现了需求？</li><li><strong>边界情况</strong>：空值、异常、并发是否处理？</li><li><strong>安全性</strong>：SQL 注入、XSS、敏感信息泄露？</li><li><strong>性能</strong>：有没有不必要的循环、重复查询？</li><li><strong>可维护性</strong>：命名是否清晰、逻辑是否易懂？</li></ol><h3 id="使用-Claude-辅助审查"><a href="#使用-Claude-辅助审查" class="headerlink" title="使用 Claude 辅助审查"></a>使用 Claude 辅助审查</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 审查当前改动</span><br>git diff | claude <span class="hljs-string">&quot;审查这些改动，重点关注安全性和性能&quot;</span><br><br><span class="hljs-comment"># 审查特定文件</span><br><span class="hljs-built_in">cat</span> src/api/user.js | claude <span class="hljs-string">&quot;审查这个文件的错误处理是否完善&quot;</span><br><br><span class="hljs-comment"># 检查测试覆盖</span><br><span class="hljs-built_in">cat</span> src/utils/date.test.js | claude <span class="hljs-string">&quot;检查测试用例是否覆盖了边界情况&quot;</span><br></code></pre></td></tr></table></figure><h2 id="多模型协同"><a href="#多模型协同" class="headerlink" title="多模型协同"></a>多模型协同</h2><p>不同任务适合不同的模型：</p><table><thead><tr><th>任务</th><th>推荐模型</th><th>原因</th></tr></thead><tbody><tr><td>写代码</td><td>Claude Sonnet</td><td>性价比高，速度快</td></tr><tr><td>审查代码</td><td>Claude Opus</td><td>推理能力强</td></tr><tr><td>排查问题</td><td>Claude Opus</td><td>需要深度分析</td></tr><tr><td>简单修改</td><td>本地模型</td><td>快，不需要联网</td></tr></tbody></table><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 在 CLAUDE.md 中配置</span><br><span class="hljs-comment">## 模型使用建议</span><br>- 简单任务用默认模型<br>- 复杂任务用 claude-sonnet-4-20250514<br>- 关键代码审查用 claude-opus-4-20250514<br></code></pre></td></tr></table></figure><h2 id="回滚策略"><a href="#回滚策略" class="headerlink" title="回滚策略"></a>回滚策略</h2><p>AI 改的代码出了问题，怎么回滚？</p><h3 id="Git-是你的安全网"><a href="#Git-是你的安全网" class="headerlink" title="Git 是你的安全网"></a>Git 是你的安全网</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 改动前先提交</span><br>git add -A &amp;&amp; git commit -m <span class="hljs-string">&quot;保存当前状态&quot;</span><br><br><span class="hljs-comment"># 让 Claude 修改</span><br>claude <span class="hljs-string">&quot;修改 xxx&quot;</span><br><br><span class="hljs-comment"># 如果不满意</span><br>git reset --hard HEAD~1<br></code></pre></td></tr></table></figure><h3 id="小步提交"><a href="#小步提交" class="headerlink" title="小步提交"></a>小步提交</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 不要一次性改太多</span><br><span class="hljs-comment"># 每完成一个功能点就提交</span><br>git add src/api/user.js &amp;&amp; git commit -m <span class="hljs-string">&quot;feat: 添加用户登录接口&quot;</span><br>git add src/utils/auth.js &amp;&amp; git commit -m <span class="hljs-string">&quot;feat: 添加 Token 管理&quot;</span><br>git add src/router/index.js &amp;&amp; git commit -m <span class="hljs-string">&quot;feat: 添加路由守卫&quot;</span><br></code></pre></td></tr></table></figure><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h3 id="Claude-改动太大怎么办"><a href="#Claude-改动太大怎么办" class="headerlink" title="Claude 改动太大怎么办"></a>Claude 改动太大怎么办</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">claude <span class="hljs-string">&quot;只修改 src/api/user.js 这一个文件，不要动其他文件&quot;</span><br></code></pre></td></tr></table></figure><h3 id="Claude-理解错了需求"><a href="#Claude-理解错了需求" class="headerlink" title="Claude 理解错了需求"></a>Claude 理解错了需求</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 先让 Claude 说说它的理解</span><br>claude <span class="hljs-string">&quot;先描述一下你打算怎么改，我确认后再动手&quot;</span><br></code></pre></td></tr></table></figure><h3 id="Claude-生成的代码有-bug"><a href="#Claude-生成的代码有-bug" class="headerlink" title="Claude 生成的代码有 bug"></a>Claude 生成的代码有 bug</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 提供错误信息</span><br><span class="hljs-built_in">cat</span> error.log | claude <span class="hljs-string">&quot;这段代码报错了，帮我修复&quot;</span><br></code></pre></td></tr></table></figure><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><ul><li>CLAUDE.md 写清楚项目规则，越具体越好</li><li>上下文管理是关键：相关性、明确目标、提供约束</li><li>大任务拆成小步骤，每步都验证</li><li>AI 写的代码必须过审，不要盲目信任</li><li>Git 是安全网，小步提交，方便回滚</li></ul><hr><p><strong>下一篇</strong>：<a href="/posts/ai-coding/ai-coding-workflow">AI 编程工作流：上下文、任务拆分与代码审查</a></p>]]>
    </content>
    <id>https://000902.icu/2026/07/01/ai-coding/claude-code/</id>
    <link href="https://000902.icu/2026/07/01/ai-coding/claude-code/"/>
    <published>2026-07-01T16:00:00.000Z</published>
    <summary>Claude Code 的核心配置、常用命令、上下文管理和最佳实践</summary>
    <title>Claude Code 使用指南：从配置到实战</title>
    <updated>2026-09-10T13:48:38.086Z</updated>
  </entry>
  <entry>
    <author>
      <name>Xiazhou</name>
    </author>
    <category term="前端" scheme="https://000902.icu/tags/%E5%89%8D%E7%AB%AF/"/>
    <category term="工程化" scheme="https://000902.icu/tags/%E5%B7%A5%E7%A8%8B%E5%8C%96/"/>
    <category term="架构" scheme="https://000902.icu/tags/%E6%9E%B6%E6%9E%84/"/>
    <content>
      <![CDATA[<h1 id="2026-年微前端选型指南：wujie、qiankun、micro-app、Module-Federation-全面对比"><a href="#2026-年微前端选型指南：wujie、qiankun、micro-app、Module-Federation-全面对比" class="headerlink" title="2026 年微前端选型指南：wujie、qiankun、micro-app、Module Federation 全面对比"></a>2026 年微前端选型指南：wujie、qiankun、micro-app、Module Federation 全面对比</h1><p>你有没有这种场景：<strong>旧系统只维护不改，新系统想用新技术栈独立开发，但用户需要一个统一的入口</strong>。</p><p>我最近就在做这个事——一个基于 Vue 3 + Element Plus + Avue + Vuex 的老管理后台，决定不再重构，新功能另起炉灶。经过完整的方案调研和 POC，这篇文章把四个主流方案的对比写清楚。</p><span id="more"></span><h2 id="为什么需要微前端（以及你可能不需要）"><a href="#为什么需要微前端（以及你可能不需要）" class="headerlink" title="为什么需要微前端（以及你可能不需要）"></a>为什么需要微前端（以及你可能不需要）</h2><p>先诚实说一句：<strong>微前端有成本</strong>。沙箱隔离、联调部署、数据通信——这些在单体应用里不需要操心的东西，微前端都要管。</p><p><strong>什么时候真的需要：</strong></p><table><thead><tr><th>条件</th><th>说明</th></tr></thead><tbody><tr><td>多个独立系统需要统一入口</td><td>用户不用记多个 URL</td></tr><tr><td>旧系统不敢动</td><td>代码太老、太乱、没人敢重构</td></tr><tr><td>多团队独立部署</td><td>每个团队可以自由发版</td></tr><tr><td>渐进式技术栈迁移</td><td>Vue 2 → Vue 3，jQuery → React</td></tr></tbody></table><p><strong>什么时候不需要：</strong></p><ul><li>小团队（1-3 人）做新项目 → 单体应用更高效</li><li>旧系统还在频繁迭代 → 微前端会拖慢迭代速度</li><li>性能敏感型应用（编辑器、地图、大屏） → 沙箱有开销</li></ul><p>我的场景属于”旧系统只维护 + 新系统独立开发 + 需要统一入口”，正好在微前端的适用区。</p><h2 id="四个方案概览"><a href="#四个方案概览" class="headerlink" title="四个方案概览"></a>四个方案概览</h2><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs dns">             ┌─────────────┐<br>             │ 微前端方案   │<br>             └──────┬──────┘<br>                    │<br>    ┌───────────────┼───────────────┐<br>    │               │               │<br>┌───┴───┐     ┌────┴────┐     ┌───┴───┐<br>│ wujie │     │ qiankun │     │micro- │<br>│<span class="hljs-punctuation">(</span>腾讯<span class="hljs-punctuation">)</span> │     │ <span class="hljs-punctuation">(</span>阿里<span class="hljs-punctuation">)</span>   │     │ app   │<br>└───┬───┘     └────┬────┘     │<span class="hljs-punctuation">(</span>京东<span class="hljs-punctuation">)</span> │<br>    │               │          └───┬───┘<br>    │               │              │<br>    └───────────────┼──────────────┘<br>                    │<br>            ┌───────┴───────┐<br>            │ Module        │<br>            │ Federation    │<br>            │ <span class="hljs-punctuation">(</span>构建时方案<span class="hljs-punctuation">)</span>   │<br>            └───────────────┘<br></code></pre></td></tr></table></figure><h2 id="详细对比"><a href="#详细对比" class="headerlink" title="详细对比"></a>详细对比</h2><h3 id="wujie（无界）—-腾讯"><a href="#wujie（无界）—-腾讯" class="headerlink" title="wujie（无界）— 腾讯"></a>wujie（无界）— 腾讯</h3><p><strong>核心原理</strong>：iframe 沙箱 + Web Components 容器</p><figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs dart">旧系统原样部署 → wujie 用 iframe 加载 → 通过 <span class="hljs-title class_">Web</span> <span class="hljs-title class_">Components</span> 挂载到主应用 DOM<br></code></pre></td></tr></table></figure><p><strong>接入方式</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs vue">&lt;template&gt;<br>  &lt;WujieVue<br>    name=&quot;old-app&quot;<br>    url=&quot;//old-app.example.com&quot;<br>    :props=&quot;&#123; token &#125;&quot;<br>  /&gt;<br>&lt;/template&gt;<br></code></pre></td></tr></table></figure><p><strong>关键特征</strong>：</p><table><thead><tr><th>维度</th><th>评价</th></tr></thead><tbody><tr><td>旧系统改造成本</td><td><strong>零</strong>—不改任何代码，原样部署</td></tr><tr><td>CSS 隔离</td><td>天然隔离（iframe 物理隔离）</td></tr><tr><td>JS 沙箱</td><td>天然隔离（iframe 自洽，无逃逸可能）</td></tr><tr><td>性能</td><td>好—iframe 创建有开销，但 wujie 做了保活和预加载</td></tr><tr><td>Vite 子应用支持</td><td>原生支持，不需要插件</td></tr><tr><td>数据通信</td><td><code>props</code> + <code>window.$wujie</code></td></tr><tr><td>学习成本</td><td>低—核心 API 就几个</td></tr></tbody></table><p><strong>适合</strong>：旧系统完全不动、异构技术栈、需要强隔离的场景。</p><p><strong>注意</strong>：</p><ul><li>iframe 的弹窗&#x2F;全屏跨域问题 wujie 做了处理，但非降级模式下仍有边界情况</li><li>英文文档几乎没有</li></ul><hr><h3 id="qiankun（乾坤）—-阿里"><a href="#qiankun（乾坤）—-阿里" class="headerlink" title="qiankun（乾坤）— 阿里"></a>qiankun（乾坤）— 阿里</h3><p><strong>核心原理</strong>：Proxy 沙箱 + HTML 入口加载</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">import</span> &#123; registerMicroApps, start &#125; <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;qiankun&#x27;</span><br><br><span class="hljs-title function_">registerMicroApps</span>([<br>  &#123;<br>    <span class="hljs-attr">name</span>: <span class="hljs-string">&#x27;old-app&#x27;</span>,<br>    <span class="hljs-attr">entry</span>: <span class="hljs-string">&#x27;//localhost:8080&#x27;</span>,<br>    <span class="hljs-attr">container</span>: <span class="hljs-string">&#x27;#container&#x27;</span>,<br>    <span class="hljs-attr">activeRule</span>: <span class="hljs-string">&#x27;/old&#x27;</span>,<br>  &#125;<br>])<br><br><span class="hljs-title function_">start</span>(&#123; <span class="hljs-attr">sandbox</span>: &#123; <span class="hljs-attr">experimentalStyleIsolation</span>: <span class="hljs-literal">true</span> &#125; &#125;)<br></code></pre></td></tr></table></figure><p><strong>关键特征</strong>：</p><table><thead><tr><th>维度</th><th>评价</th></tr></thead><tbody><tr><td>旧系统改造成本</td><td><strong>有</strong>—必须改构建配置 + 导出生命周期函数</td></tr><tr><td>CSS 隔离</td><td><code>experimentalStyleIsolation</code> 有坑，依赖命名约定</td></tr><tr><td>JS 沙箱</td><td>Proxy 沙箱，性能开销比 iframe 大</td></tr><tr><td>性能</td><td>中等—沙箱劫持开销 + 子应用每次切换重建</td></tr><tr><td>Vite 子应用支持</td><td>需要 <code>vite-plugin-qiankun</code> 插件</td></tr><tr><td>数据通信</td><td><code>initGlobalState</code></td></tr><tr><td>学习成本</td><td>中等—沙箱配置复杂，踩坑指南要熟读</td></tr></tbody></table><p><strong>曾经是微前端的事实标准，但 2023-2024 年后维护节奏明显放缓，核心团队已转向 wujie。</strong> 2026 年不推荐新项目使用。</p><p><strong>适合</strong>：已在用 qiankun 的项目维持现有架构，不建议新接入。</p><hr><h3 id="micro-app（京东）"><a href="#micro-app（京东）" class="headerlink" title="micro-app（京东）"></a>micro-app（京东）</h3><p><strong>核心原理</strong>：Web Components <code>&lt;micro-app&gt;</code> 标签 + 资源劫持</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">micro-app</span></span><br><span class="hljs-tag">  <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;old-app&quot;</span></span><br><span class="hljs-tag">  <span class="hljs-attr">url</span>=<span class="hljs-string">&quot;//old-app.example.com&quot;</span></span><br><span class="hljs-tag">  <span class="hljs-attr">baseroute</span>=<span class="hljs-string">&quot;/old&quot;</span></span><br><span class="hljs-tag">&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">micro-app</span>&gt;</span><br></code></pre></td></tr></table></figure><p><strong>关键特征</strong>：</p><table><thead><tr><th>维度</th><th>评价</th></tr></thead><tbody><tr><td>旧系统改造成本</td><td>少，但需要少量配置</td></tr><tr><td>CSS 隔离</td><td>Scoped CSS，边界情况仍存在</td></tr><tr><td>JS 沙箱</td><td>Proxy 沙箱，与 qiankun 类似</td></tr><tr><td>使用体验</td><td>像用原生 HTML 标签一样，体验好</td></tr><tr><td>Vite 子应用支持</td><td>需要插件</td></tr><tr><td>学习成本</td><td>低</td></tr></tbody></table><p><strong>注意</strong>：</p><ul><li>刷新后子应用路由状态有丢失问题</li><li>社区比 wujie 小，踩坑参考少</li></ul><p><strong>适合</strong>：想用 Web Components 方式接入、愿意接受少量改造。</p><hr><h3 id="Module-Federation（构建时方案）"><a href="#Module-Federation（构建时方案）" class="headerlink" title="Module Federation（构建时方案）"></a>Module Federation（构建时方案）</h3><p><strong>核心原理</strong>：Webpack 5 &#x2F; Vite 编译时模块共享</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-comment">// webpack 5</span><br><span class="hljs-keyword">new</span> <span class="hljs-title class_">ModuleFederationPlugin</span>(&#123;<br>  <span class="hljs-attr">name</span>: <span class="hljs-string">&#x27;main_app&#x27;</span>,<br>  <span class="hljs-attr">remotes</span>: &#123;<br>    <span class="hljs-attr">old_app</span>: <span class="hljs-string">&#x27;old_app@//localhost:8080/remoteEntry.js&#x27;</span>,<br>  &#125;,<br>&#125;)<br></code></pre></td></tr></table></figure><p><strong>关键特征</strong>：</p><table><thead><tr><th>维度</th><th>评价</th></tr></thead><tbody><tr><td>旧系统改造成本</td><td><strong>必须改构建配置</strong></td></tr><tr><td>CSS 隔离</td><td><strong>无</strong>—完全互通</td></tr><tr><td>JS 隔离</td><td><strong>无</strong>—完全互通</td></tr><tr><td>跨技术栈</td><td>困难—适合同栈</td></tr><tr><td>开发体验</td><td>好—组件可以直接 import</td></tr><tr><td>Vite 支持</td><td><code>@module-federation/enhanced</code>（2024 年才稳定）</td></tr></tbody></table><p><strong>不是沙箱方案</strong>，而是构建时模块共享。适合<strong>同技术栈、新建项目</strong>的场景。</p><p><strong>适合</strong>：多个新项目共享组件库&#x2F;工具库、同栈微前端。</p><hr><h2 id="横向对比表"><a href="#横向对比表" class="headerlink" title="横向对比表"></a>横向对比表</h2><table><thead><tr><th>维度</th><th>wujie</th><th>qiankun</th><th>micro-app</th><th>Module Federation</th></tr></thead><tbody><tr><td>维护状态</td><td>✅ 活跃</td><td>⚠️ 变慢</td><td>✅ 活跃</td><td>✅ 标准能力</td></tr><tr><td>旧系统改造</td><td><strong>零</strong></td><td>必须改</td><td>少量</td><td>必须改</td></tr><tr><td>CSS 隔离</td><td>iframe 物理隔离</td><td>Scoped（有坑）</td><td>Scoped</td><td>无</td></tr><tr><td>JS 沙箱</td><td>iframe 物理隔离</td><td>Proxy 沙箱</td><td>Proxy 沙箱</td><td>无</td></tr><tr><td>Vite 子应用</td><td>原生支持</td><td>需插件</td><td>需插件</td><td>需插件</td></tr><tr><td>性能</td><td>好（保活+预加载）</td><td>中等</td><td>中等</td><td>好（编译时）</td></tr><tr><td>同栈体验</td><td>一般</td><td>一般</td><td>一般</td><td><strong>最好</strong></td></tr><tr><td>学习成本</td><td>低</td><td>中等</td><td>低</td><td>中等</td></tr><tr><td>中文文档</td><td>有</td><td>有</td><td>有</td><td>有</td></tr><tr><td>英文文档</td><td>几乎没有</td><td>少量</td><td>几乎没有</td><td>有</td></tr></tbody></table><h2 id="2026-年选型建议"><a href="#2026-年选型建议" class="headerlink" title="2026 年选型建议"></a>2026 年选型建议</h2><h3 id="场景一：旧系统零改造接入（最推荐-wujie）"><a href="#场景一：旧系统零改造接入（最推荐-wujie）" class="headerlink" title="场景一：旧系统零改造接入（最推荐 wujie）"></a>场景一：旧系统零改造接入（最推荐 wujie）</h3><figure class="highlight nix"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs nix">旧系统：jQuery <span class="hljs-symbol">/</span> Vue <span class="hljs-number">2</span> <span class="hljs-symbol">/</span> PHP <span class="hljs-symbol">/</span> 任意老旧项目<br>旧系统策略：不改代码<br>新系统：Vue <span class="hljs-number">3</span> <span class="hljs-symbol">/</span> React<br></code></pre></td></tr></table></figure><p>➡ <strong>wujie</strong>。唯一真正做到零侵入的方案，旧系统原样部署，新系统 <code>&lt;WujieVue&gt;</code> 加载。</p><h3 id="场景二：同技术栈多应用共享组件"><a href="#场景二：同技术栈多应用共享组件" class="headerlink" title="场景二：同技术栈多应用共享组件"></a>场景二：同技术栈多应用共享组件</h3><figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs dart">主应用 + 子应用，都是 <span class="hljs-title class_">Vue</span> <span class="hljs-number">3</span> + <span class="hljs-title class_">Vite</span><br>需要共享组件库、工具库、甚至 store<br></code></pre></td></tr></table></figure><p>➡ <strong>Module Federation</strong>。编译时共享，体验最顺，类型安全。</p><h3 id="场景三：已有-qiankun-的项目"><a href="#场景三：已有-qiankun-的项目" class="headerlink" title="场景三：已有 qiankun 的项目"></a>场景三：已有 qiankun 的项目</h3><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">已经在用 qiankun，跑得还行<br></code></pre></td></tr></table></figure><p>➡ 继续保持 qiankun。迁移成本高于收益，等下次大改版再考虑切换。</p><h3 id="场景四：高安全-金融场景"><a href="#场景四：高安全-金融场景" class="headerlink" title="场景四：高安全&#x2F;金融场景"></a>场景四：高安全&#x2F;金融场景</h3><figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mipsasm">对 <span class="hljs-keyword">JS/CSS </span>隔离要求极高，不能有任何互相影响<br></code></pre></td></tr></table></figure><p>➡ <strong>wujie</strong>。iframe 提供的是浏览器级别的物理隔离，这是 Proxy 沙箱做不到的。</p><h3 id="场景五：小团队新项目"><a href="#场景五：小团队新项目" class="headerlink" title="场景五：小团队新项目"></a>场景五：小团队新项目</h3><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs apache"><span class="hljs-attribute">1</span>-<span class="hljs-number">3</span> 个人，从零开始<br></code></pre></td></tr></table></figure><p>➡ <strong>不建议用微前端</strong>。单体应用 + 合理的模块划分就够了。</p><h2 id="我的选择：wujie"><a href="#我的选择：wujie" class="headerlink" title="我的选择：wujie"></a>我的选择：wujie</h2><p>回到开头的场景——旧管理后台不动，新功能用 Vue 3 独立开发。</p><p><strong>选了 wujie</strong>，理由很简单：</p><ol><li><strong>旧系统一行代码都不用改</strong>—原样部署，风险为零</li><li><strong>iframe 沙箱最省心</strong>—不需要操心 Proxy 劫持的边界情况</li><li><strong>新系统完全自由</strong>—Vue 3 + TypeScript + Pinia，想怎么搭都行</li><li><strong>配置极少</strong>—核心代码不超过 20 行</li></ol><p>架构示意图：</p><figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs dart">┌──────────────────────────────────────────┐<br>│           新系统 <span class="hljs-title class_">Shell</span>                     │<br>│  ┌────────────────────────────────┐       │<br>│  │  统一顶部导航栏                   │       │<br>│  ├──────────┬─────────────────────┤       │<br>│  │ 统一侧边    │  内容区               │       │<br>│  │ 栏菜单     │                      │       │<br>│  │          │  ┌─────────────────┐ │       │<br>│  │          │  │ wujie 加载旧系统  │ │       │<br>│  │          │  │ （原样部署）      │ │       │<br>│  │          │  └─────────────────┘ │       │<br>│  │          │  ┌─────────────────┐ │       │<br>│  │          │  │ 新系统原生页面    │ │       │<br>│  │          │  └─────────────────┘ │       │<br>│  └──────────┴─────────────────────┘       │<br>└──────────────────────────────────────────┘<br></code></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><ul><li>2026 年活着的微前端方案主要四个：wujie、qiankun、micro-app、Module Federation</li><li><strong>qiankun 不再推荐新项目使用</strong>，核心团队已转向 wujie</li><li><strong>wujie 是零侵入最优解</strong>，旧系统不改任何代码就能接入</li><li>Module Federation 适合同技术栈的新建项目，但没有沙箱隔离</li><li>小团队新项目不建议上微前端，单体应用更高效</li><li>选方案先问自己：旧系统能改吗？团队几人？需要强隔离吗？</li></ul><hr><p><strong>参考资源</strong>：</p><ul><li><a href="https://wujie-micro.github.io/doc/">wujie 官方文档</a></li><li><a href="https://zeroing.jd.com/micro-app/">micro-app 官方文档</a></li><li><a href="https://qiankun.umijs.org/">qiankun 官方文档</a></li><li><a href="https://module-federation.io/">Module Federation 官方文档</a></li></ul>]]>
    </content>
    <id>https://000902.icu/2026/06/30/micro-frontend-landscape-2026/</id>
    <link href="https://000902.icu/2026/06/30/micro-frontend-landscape-2026/"/>
    <published>2026-06-30T16:00:00.000Z</published>
    <summary>旧系统不敢动，新系统想用 Vue 3——微前端怎么选？本文从实际项目角度对比 wujie、qiankun、micro-app、Module Federation 四个方案，给出 2026 年的选型建议。</summary>
    <title>2026 年微前端选型指南：wujie、qiankun、micro-app、Module Federation 全面对比</title>
    <updated>2026-09-10T13:48:38.087Z</updated>
  </entry>
</feed>
