<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>http://lmssee.pages.dev/建站日志</id>
    <title>泥豆君 Blog</title>
    <updated>2026-03-20T21:22:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="http://lmssee.pages.dev/建站日志"/>
    <subtitle>泥豆君 Blog</subtitle>
    <icon>http://lmssee.pages.dev/https://static.lmssee.com/icon/dev/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[react 中 img 的 onload]]></title>
        <id>http://lmssee.pages.dev/建站日志/2026/3/20/img 的 onload</id>
        <link href="http://lmssee.pages.dev/建站日志/2026/3/20/img 的 onload"/>
        <updated>2026-03-20T21:22:00.000Z</updated>
        <summary type="html"><![CDATA[在写 npm 包信息组件时，发现 img 的 onload 事件并不是总能如期执行]]></summary>
        <content type="html"><![CDATA[<p>在使用 react 写含 <code>&lt;img /&gt;</code> 组件时，发现该 <code>img</code> 元素的 <code>onload</code> 并不是像想象中那样能够如期执行。</p>
<p>于是对意外进行了反复测验，发现在某些环境下（ <code>img</code> 使用缓存到本地资源的图像作为源时）出现的频率较高。</p>
<p>而这导致了我本以 <code>img</code> 元素加载图像作为契机执行的想法成了不可执行事件。</p>
<!-- -->
<div class="language-tsx codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">下面的 img 元素并不总能在图像加载后获取到 loaded 样式类</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-tsx codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> useState </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'react'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Img</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> src </span><span class="token punctuation" style="color:#393A34">}</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">src</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">loaded</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> setLoaded</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">useState</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">handleLoad</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">setLoaded</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">img</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">src</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">onload</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">handleLoad</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">loaded </span><span class="token tag script language-javascript operator" style="color:#393A34">?</span><span class="token tag script language-javascript" style="color:#00009f"> styles</span><span class="token tag script language-javascript punctuation" style="color:#393A34">.</span><span class="token tag script language-javascript property-access" style="color:#00009f">loaded</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript operator" style="color:#393A34">?</span><span class="token tag script language-javascript" style="color:#00009f"> style</span><span class="token tag script language-javascript punctuation" style="color:#393A34">.</span><span class="token tag script language-javascript property-access" style="color:#00009f">loading</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token tag" style="color:#00009f">  </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="病症">病症<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/3/20/img%20%E7%9A%84%20onload#%E7%97%85%E7%97%87" class="hash-link" aria-label="病症的直接链接" title="病症的直接链接" translate="no">​</a></h2>
<p>原因是由于在 react 从虚拟 DOM 转化为实际的 DOM 时，先建立 DOM （通过 <a href="https://lmssee.com/react-source-code/react-dom/src/client/ReactDOMRoot#1-react-dom-%E6%A0%B9" target="_blank" rel="noopener noreferrer" class="">ReactDOM.render</a>）后进行事件监听（通过 <a href="https://lmssee.com/react-source-code/react-dom-bindings/src/events/DOMPluginEventSystem/#%E7%9B%91%E5%90%AC%E6%89%80%E6%9C%89%E6%94%AF%E6%8C%81%E7%9A%84%E4%BA%8B%E4%BB%B6" target="_blank" rel="noopener noreferrer" class="">listenToAllSupportedEvents</a> 注册所有可冒泡事件到事件池）及通过 <a href="https://lmssee.com/react-source-code/react-dom-bindings/src/events/DOMPluginEventSystem/#%E7%9B%91%E5%90%AC%E9%9D%9E%E5%A7%94%E6%89%98%E4%BA%8B%E4%BB%B6" target="_blank" rel="noopener noreferrer" class="">listenToNonDelegatedEvent</a> 未无法冒泡的事件的监听。</p>
<p>而无法冒泡的事件的监听，需要等到整个 <code>DocumentFragment</code> 挂载后才会进行监听，而此时已然错过了由于加载缓存资源而同步触发 <code>load</code> 事件。</p>
<div class="theme-admonition theme-admonition-note admonition_svZc alert alert--secondary"><div class="admonitionHeading_UBwC"><span class="admonitionIcon__uit"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>备注</div><div class="admonitionContent_Zh57"><p>目前，已知导致该事件的可能有两个：</p><ul>
<li class="">事件注册太慢导致滞后性错过了图像元素节点在使用缓存图像源时同步触发 onload</li>
<li class="">部分浏览器在元素节点使用缓存的图像源时认为无需走全部流程（虽然这个解释很二，但是有可能是 <code>load</code> 事件没有触发的原因之一）</li>
</ul></div></div>
<div class="theme-admonition theme-admonition-info admonition_svZc alert alert--info"><div class="admonitionHeading_UBwC"><span class="admonitionIcon__uit"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>TODO</div><div class="admonitionContent_Zh57"><p>在根（rootFiber）挂载到 react 程序跟元素的一刻图像资源在加载过程中直接进行了图像 <code>load</code> 事件，而此时并没有注册事件处理（或是由于 DOM 没有渲染完毕，但是不是通过 <code>DocumentFragment</code> 一键挂载的么？）</p><p>之后再深入研究源码探索下</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="开方">开方<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/3/20/img%20%E7%9A%84%20onload#%E5%BC%80%E6%96%B9" class="hash-link" aria-label="开方的直接链接" title="开方的直接链接" translate="no">​</a></h2>
<p>既然无法在 <code>img</code> 元素节点 <code>load</code> 时加载状态，那么只能验证其是否加载（ <code>img</code> 元素节点的 <code>HTMLImageElement.complete</code> 属性）而判定元素是否已经触发<code>load</code>（但这样会增加额外的工作量）。</p>
<div class="language-tsx codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">修复后的简单示意</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-tsx codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">React</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> useState</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> useRef</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> useEffect </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'react'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Img</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> src </span><span class="token punctuation" style="color:#393A34">}</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> src</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> imgRef </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token generic-function function" style="color:#d73a49">useRef</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">HTMLImageElement</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">isLoaded</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> setIsLoaded</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">useState</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token function" style="color:#d73a49">useEffect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> img </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> imgRef</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">current</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">img</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 未加载</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 在刚初始化完成后图像资源已经加载完毕，那么直接更新状态而无需对 load 事件进行处理</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">img</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">complete</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> img</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">naturalHeight</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token function" style="color:#d73a49">setIsLoaded</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">handleLoad</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">setIsLoaded</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 处理句柄</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    img</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'load'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> handleLoad</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 注册 load 事件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 清理监听事件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> img</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">removeEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'load'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> handleLoad</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">src</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">img</span><span class="token tag" style="color:#00009f"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token tag" style="color:#00009f">      </span><span class="token tag attr-name" style="color:#00a4db">ref</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">imgRef</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token tag" style="color:#00009f">      </span><span class="token tag attr-name" style="color:#00a4db">alt</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript string" style="color:#e3116c">'一张图片'</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token tag" style="color:#00009f">      </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">src</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token tag" style="color:#00009f">      </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">isLoaded </span><span class="token tag script language-javascript operator" style="color:#393A34">?</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript string" style="color:#e3116c">'block'</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript operator" style="color:#393A34">:</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript string" style="color:#e3116c">'none'</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token tag" style="color:#00009f">    </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p>多使用了 <code>useEffect</code>、<code>useRef</code> Hooks ，在性能上肯定有轻微的影响，但是这确实处理该问题的良策。</p>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[eslint 与 scss]]></title>
        <id>http://lmssee.pages.dev/建站日志/2026/2/4/eslint-scss</id>
        <link href="http://lmssee.pages.dev/建站日志/2026/2/4/eslint-scss"/>
        <updated>2026-02-04T04:01:00.000Z</updated>
        <summary type="html"><![CDATA[rollup 与 scss 搭配使用时的配置]]></summary>
        <content type="html"><![CDATA[<p>嗯，在之前使用 <a href="https://cn.rollupjs.org/configuration-options/" target="_blank" rel="noopener noreferrer" class="">rollup</a> 中，我以为自己配置好了关于 scss 的配置，现在发现并没有。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="一正确的-scss-配置">一、正确的 scss 配置<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#%E4%B8%80%E6%AD%A3%E7%A1%AE%E7%9A%84-scss-%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="一、正确的 scss 配置的直接链接" title="一、正确的 scss 配置的直接链接" translate="no">​</a></h2>
<p>使用 <code>node-sass</code> 或 <code>sass</code> 包处理 scss 后缀文件的编译，而负责链接 sass 和 <a href="https://cn.rollupjs.org/configuration-options/" target="_blank" rel="noopener noreferrer" class="">rollup</a> 的是 <a href="https://www.npmjs.com/package/rollup-plugin-postcss" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-postcss</a> 或 <a href="https://www.npmjs.com/package/rollup-plugin-styles" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-styles</a>。但是 <a href="https://www.npmjs.com/package/rollup-plugin-styles" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-styles</a> 的下载量远远低于 <a href="https://www.npmjs.com/package/rollup-plugin-postcss" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-postcss</a> （尽然，单纯的下载量说明不了什么问题）。</p>
<p>好了，现在以 <a href="https://www.npmjs.com/package/rollup-plugin-postcss" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-postcss</a> 为例。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-引入-npm-包">1. 引入 npm 包<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#1-%E5%BC%95%E5%85%A5-npm-%E5%8C%85" class="hash-link" aria-label="1. 引入 npm 包的直接链接" title="1. 引入 npm 包的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic"># 安装主要依赖</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> --save-dev rollup rollup-plugin-postcss </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">     autoprefixer cssnano</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 安装 scss 支持</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> --save-dev node-sass </span><span class="token comment" style="color:#999988;font-style:italic"># 或 sass</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-配置">2. 配置<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#2-%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="2. 配置的直接链接" title="2. 配置的直接链接" translate="no">​</a></h3>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">rollup.config.js</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">postcss</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'rollup-plugin-postcss'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">autoprefixer</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'autoprefixer'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">cssnano</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'cssnano'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他配置</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugin</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他插件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">postcss</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 关键配配置：提取独立 CSS 文件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// extract: true, // 移除该项则默认内联</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">extract</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'component.css'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 移除该项则默认内联</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 支持 .scss 编译</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">extensions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'.css'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.scss'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 开启 CSS 源码映射</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">sourceMap</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 生产环境：压缩 CSS + 自动补全前缀</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token function" style="color:#d73a49">autoprefixer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">overrideBrowserslist</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'&gt; 1%'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'last 2 versions'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 浏览器兼容</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token function" style="color:#d73a49">cssnano</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 压缩 CSS （取出空格、合并规则）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">modules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">generateScopedName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'[name]__[local]'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// CSS Modules 命名规则</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// 如果你的类型中有用下划线连字符的，建议关闭下面的配置，因为它会转化为驼峰而导致下划线丢失</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// localsConvention: 'camelCaseOnly', // 导出的类名格式</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：自定义 scss 编译选项</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">scss</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">loadPaths</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'node_modules'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">quietDeps</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">verbose</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他插件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他配置</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="3-使用">3. 使用<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#3-%E4%BD%BF%E7%94%A8" class="hash-link" aria-label="3. 使用的直接链接" title="3. 使用的直接链接" translate="no">​</a></h3>
<p>需要显式的使用 <code>~</code> 标识启用者来自于 "node_modules" 才可以。</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// 即便是 `enr` 包导出为 "enr/common.scss" ，也必须使用完整路径 "enr/styles/common.scss"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'~enr/styles/common.scss'</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="二其他包">二、其他包<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#%E4%BA%8C%E5%85%B6%E4%BB%96%E5%8C%85" class="hash-link" aria-label="二、其他包的直接链接" title="二、其他包的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-模块解析">1. 模块解析<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#1-%E6%A8%A1%E5%9D%97%E8%A7%A3%E6%9E%90" class="hash-link" aria-label="1. 模块解析的直接链接" title="1. 模块解析的直接链接" translate="no">​</a></h3>
<p>使用包 <a href="https://www.npmjs.com/package/@rollup/plugin-node-resolve" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-node-resolve</a> 解析 node_modules 路径（含 .ts/.scss 文件）</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-资源预处理">2. 资源预处理<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#2-%E8%B5%84%E6%BA%90%E9%A2%84%E5%A4%84%E7%90%86" class="hash-link" aria-label="2. 资源预处理的直接链接" title="2. 资源预处理的直接链接" translate="no">​</a></h3>
<p>使用包 <a href="https://www.npmjs.com/package/@rollup/plugin-url" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-url</a> 处理 JS 中的图片/字体资源（替代为 data URL ），需要在 babel/commonjs 前导入语句避免被修改</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="3-typescript">3. Typescript<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#3-typescript" class="hash-link" aria-label="3. Typescript的直接链接" title="3. Typescript的直接链接" translate="no">​</a></h3>
<p>官方推荐使用 <a href="https://www.npmjs.com/package/@rollup/plugin-typescript" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-typescript</a> ，但是该包在 pnpm 的 workspace 子包使用中无法找到子包自身的 "tsconfig.json" 文件。可能是我配置的问题，但是目前使用 <a href="https://www.npmjs.com/package/rollup-plugin-typescript2" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-typescript2</a> 代替，必须放在 commonjs/babel 之前。</p>
<div class="theme-admonition theme-admonition-info admonition_svZc alert alert--info"><div class="admonitionHeading_UBwC"><span class="admonitionIcon__uit"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_Zh57"><p>报错如下：</p><div class="language-text codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-text codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token plain">@rollup/plugin-typescript: Path of Typescript</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    compiler option 'outDir' must be located</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    inside Rollup 'dir' option.</span><br></div></code></pre></div></div><p>其实在 "tsconfig.json" 文件配置 <code>compilerOptions.outDir</code> 值，且改值为 rollup 打包出口之下即可。可能是我之前没有配置该值的习惯。所以才导致以为插件有问题。</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="4-json">4. JSON<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#4-json" class="hash-link" aria-label="4. JSON的直接链接" title="4. JSON的直接链接" translate="no">​</a></h3>
<p>使用包 <a href="https://www.npmjs.com/package/@rollup/plugin-json" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-json</a> 将 JSON 转化为 ES 模块，需放在 commonjs 之前，避免被误处理。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="5-commonjs-依赖">5. CommonJS 依赖<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#5-commonjs-%E4%BE%9D%E8%B5%96" class="hash-link" aria-label="5. CommonJS 依赖的直接链接" title="5. CommonJS 依赖的直接链接" translate="no">​</a></h3>
<p>使用包 [@rollup/plugin-commonjs] 处理 node_modules 中的 CommonJS 依赖。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="6-babel">6. babel<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#6-babel" class="hash-link" aria-label="6. babel的直接链接" title="6. babel的直接链接" translate="no">​</a></h3>
<p>使用包 <a href="https://www.npmjs.com/package/@rollup/plugin-babel" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-babel</a> 进行 JS 语法的转义/polyfill （处理所有的 JS 代码，包含 TS 转义结果）。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="7-scss">7. scss<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#7-scss" class="hash-link" aria-label="7. scss的直接链接" title="7. scss的直接链接" translate="no">​</a></h3>
<p>使用 <a href="https://www.npmjs.com/package/rollup-plugin-postcss" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-postcss</a> 处理 .css/.scss 文件，放在 babel 后面更安全</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="8-简单配置">8. 简单配置<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#8-%E7%AE%80%E5%8D%95%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="8. 简单配置的直接链接" title="8. 简单配置的直接链接" translate="no">​</a></h3>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">rollup.config.js</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> preserveDirective </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@qqi/rollup-preserve-directive'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">resolve</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@rollup/plugin-node-resolve'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">url</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@rollup/plugin-url'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">typescript</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@rollup/plugin-typescript'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">json</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@rollup/plugin-json'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">commonjs</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@rollup/plugin-commonjs'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">babel</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@rollup/plugin-babel'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">postcss</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'rollup-plugin-postcss'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">autoprefixer</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'autoprefixer'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">cssnano</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'cssnano'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">copy</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'rollup-plugin-copy'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他配置</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">preserveDirective</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 保留 'use client'; 指令</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">resolve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">extensions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'.js'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.ts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.jsx'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.tsx'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.scss'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.css'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">url</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 将小于 8 kb 的文件内联为 base64 编码</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">limit</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1024</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 8 kb</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">include</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'**/*.png'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 只处理 png 文件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">emitFiles</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 发出文件而不是将其转化为 base6</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">fileName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'[name][hash].[ext]'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 输出的格式</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">typescript</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">tsconfig</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'./tsconfig.json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">commonjs</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 处理 CommonJs 模块转化为 ES 模块</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">babel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">extends</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'.js'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.jsx'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.ts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.tsx'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">babelHelpers</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'runtime'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 关键： 使用 @babel/runtime</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">include</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'src/**/*'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 确保包含所有的源文件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">exclude</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'node_modules/**'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">skipPreflightCheck</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">presets</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'@babel/preset-env'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">modules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'@babel/preset-react'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'@babel/preset-typescript'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">postcss</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 关键配配置：提取独立 CSS 文件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// extract: true, // 移除该项则默认内联</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">extract</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'component.css'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 移除该项则默认内联</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 支持 .scss 编译</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">extensions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'.css'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.scss'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 开启 CSS 源码映射</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">sourceMap</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 生产环境：压缩 CSS + 自动补全前缀</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token function" style="color:#d73a49">autoprefixer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">overrideBrowserslist</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'&gt; 1%'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'last 2 versions'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 浏览器兼容</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token function" style="color:#d73a49">cssnano</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 压缩 CSS （取出空格、合并规则）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">modules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">generateScopedName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'[name]__[local]'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// CSS Modules 命名规则</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">localsConvention</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'camelCaseOnly'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 导出的类名格式</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：自定义 scss 编译选项</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">scss</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">loadPaths</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'node_modules'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">quietDeps</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">verbose</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">copy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">targets</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">src</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'src/css/**'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">dest</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dist/'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他配置</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="三实用包">三、实用包<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/2/4/eslint-scss#%E4%B8%89%E5%AE%9E%E7%94%A8%E5%8C%85" class="hash-link" aria-label="三、实用包的直接链接" title="三、实用包的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>高频使用</strong>：<!-- -->
<ul>
<li class=""><a href="https://www.npmjs.com/package/@rollup/plugin-replace" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-replace</a> ： 环境变量替换</li>
<li class=""><a href="https://www.npmjs.com/package/rollup-plugin-dts" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-dts</a> ： 生成纯净的 <code>.d.ts</code> 声明文件</li>
<li class=""><a href="https://www.npmjs.com/package/@rollup/plugin-terser" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-terser</a> ： 官方维护的代码压缩</li>
<li class=""><a href="https://www.npmjs.com/package/rollup-plugin-visalizer" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-visualizer</a> ： Bundle 体积可视化分析</li>
</ul>
</li>
<li class=""><strong>开发体验增强</strong>：<!-- -->
<ul>
<li class=""><a href="https://www.npmjs.com/package/rollup-pluign-delete" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-delete</a> ： 构建前自动清理 <code>dist</code> 目录</li>
<li class=""><a href="https://www.npmjs.com/package/@rollup/plugin-serve" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-serve</a> 和 <a href="https://www.npmjs.com/package/rollup-plugin-livereload" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-livereload</a> ： 本地开发服务器和热重载</li>
<li class=""><a href="https://www.npmjs.com/package/@rollup/plugin-alias" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-alias</a> ： 路径别名</li>
</ul>
</li>
<li class=""><strong>高级构建能力</strong> ：<!-- -->
<ul>
<li class=""><a href="https://www.npmjs.com/package/@rollup/plugin-html" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-html</a> ： 自动生成 HTML 入口。复杂项目建议使用 <a href="https://www.npmjs.com/package/rollup-plugin-html" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-html</a></li>
<li class=""><a href="https://www.npmjs.com/package/@rollup/plugin-workbox" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-workbox</a> ： PWA 支持：生成 Service worker</li>
<li class=""><a href="https://www.npmjs.com/package/rollup-plugin-gzip" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-gzip</a>/<a href="https://www.npmjs.com/package/rollup-plugin-brotli" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-brotli</a> ： 生成 <code>.gz</code> / <code>.br</code> 压缩资源，部署在 Nginx 时可直接提供预压缩版本</li>
<li class=""><a href="https://www.npmjs.com/package/rollup-plugin-manifest" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-manifest</a> ： 输出 <code>manifest.json</code> 资源映射， SSR 项目祝福资源时必备</li>
<li class=""><a href="https://www.npmjs.com/package/rollup-plugin-license" target="_blank" rel="noopener noreferrer" class="">rollup-plugin-license</a> ： 自动生成第三方依赖许可汇总</li>
</ul>
</li>
<li class=""><strong>特定技术栈利器</strong> ：<!-- -->
<ul>
<li class=""><a href="https://www.npmjs.com/package/@rollup/plugin-worker" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-worker</a> ： 自动打包 Worker 脚本并生成 URL</li>
<li class=""><a href="https://www.npmjs.com/package/@rollup/plugin-wasm" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-wasm</a> ： 处理 <code>.wasm</code> 模块的导入</li>
<li class=""><a href="https://www.npmjs.com/package/@rollup/p;ugin-dynamic-import-vars" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-dynamic-import-vars</a> ： 解析 <code>import('.lang')</code></li>
<li class=""><a href="https://www.npmjs.com/package/@rollup/plugin-inject" target="_blank" rel="noopener noreferrer" class="">@rollup/plugin-inject</a> ： 支持 <code>process</code>、<code>Buffer</code> 等 Node 全局对象（浏览器环境必备）</li>
</ul>
</li>
</ul>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[认识 eslint 插件]]></title>
        <id>http://lmssee.pages.dev/建站日志/2026/1/30/认识 eslint 插件</id>
        <link href="http://lmssee.pages.dev/建站日志/2026/1/30/认识 eslint 插件"/>
        <updated>2026-01-30T04:10:00.000Z</updated>
        <summary type="html"><![CDATA[学习和制作简单的 eslint 插件]]></summary>
        <content type="html"><![CDATA[<p><a href="https://cn.rollupjs.org/" target="_blank" rel="noopener noreferrer" class="">Rollup</a> 是一款<strong>面向 ES 模块（ESM）</strong> 的打包工具。其核心优势是「摇树（Tree Shaking）」和打包产物简洁。</p>
<div class="theme-admonition theme-admonition-info admonition_svZc alert alert--info"><div class="admonitionHeading_UBwC"><span class="admonitionIcon__uit"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>听人劝，吃饱饭</div><div class="admonitionContent_Zh57"><p>该插件并没有发布，原因有三：</p><ul>
<li class="">该需求不正常，这种垃圾插件发布了也不会有人下载使用</li>
<li class="">插件本身对打包会造成性能影响</li>
<li class="">使用 rollup 本身优秀的 Tree-Shaking 能力胜于画蛇添足</li>
</ul></div></div>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="一打包核心原理">一、打包核心原理<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#%E4%B8%80%E6%89%93%E5%8C%85%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86" class="hash-link" aria-label="一、打包核心原理的直接链接" title="一、打包核心原理的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-入口分析与依赖图构建">1. 入口分析与依赖图构建<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#1-%E5%85%A5%E5%8F%A3%E5%88%86%E6%9E%90%E4%B8%8E%E4%BE%9D%E8%B5%96%E5%9B%BE%E6%9E%84%E5%BB%BA" class="hash-link" aria-label="1. 入口分析与依赖图构建的直接链接" title="1. 入口分析与依赖图构建的直接链接" translate="no">​</a></h3>
<p><a href="https://cn.rollupjs.org/" target="_blank" rel="noopener noreferrer" class="">Rollup</a> 从配置文件中 input 配置的入口文件开始，通过静态分析 ES 模块的 import/export 语句，递归遍历所有依赖模块，不会执行代码（这是 Tree Shaking 的基础），最终构建出一个「模块依赖图」，记录所有模块的依赖关系、导出内容、导入内容。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-插件生命周期执行核心扩展点">2. 插件生命周期执行（核心扩展点）<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#2-%E6%8F%92%E4%BB%B6%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E6%89%A7%E8%A1%8C%E6%A0%B8%E5%BF%83%E6%89%A9%E5%B1%95%E7%82%B9" class="hash-link" aria-label="2. 插件生命周期执行（核心扩展点）的直接链接" title="2. 插件生命周期执行（核心扩展点）的直接链接" translate="no">​</a></h3>
<p><a href="https://cn.rollupjs.org/" target="_blank" rel="noopener noreferrer" class="">Rollup</a> 本身核心功能有限，所有自定义转换、路径解析、文件加载等能力都依赖插件。在打包的各个阶段，Rollup 会按顺序调用插件的钩子函数，对模块进行处理（这部分是实现你需求的核心）。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="3-ast-解析与转换">3. AST 解析与转换<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#3-ast-%E8%A7%A3%E6%9E%90%E4%B8%8E%E8%BD%AC%E6%8D%A2" class="hash-link" aria-label="3. AST 解析与转换的直接链接" title="3. AST 解析与转换的直接链接" translate="no">​</a></h3>
<p><a href="https://cn.rollupjs.org/" target="_blank" rel="noopener noreferrer" class="">Rollup</a> 内置 acorn 解析器，会将每个模块的代码解析为 ESTree 规范的抽象语法树（AST）。所有代码的修改、替换、移除，都不是直接操作字符串（易出错），而是通过操作 AST 节点实现的，修改完成后再将 AST 转换回可执行的 JS 代码。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="4-树摇tree-shaking">4. 树摇（Tree Shaking）<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#4-%E6%A0%91%E6%91%87tree-shaking" class="hash-link" aria-label="4. 树摇（Tree Shaking）的直接链接" title="4. 树摇（Tree Shaking）的直接链接" translate="no">​</a></h3>
<p>基于 ES 模块的「静态特性」（ import/export 只能在模块顶层，不能动态判断、不能嵌套在代码块中），Rollup 会分析模块依赖图，移除所有未被使用的导出内容和死代码，减少打包产物体积。你的需求 2、3 本质上是「增强版树摇」，需要自定义插件辅助实现。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="5-产物生成与输出">5. 产物生成与输出<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#5-%E4%BA%A7%E7%89%A9%E7%94%9F%E6%88%90%E4%B8%8E%E8%BE%93%E5%87%BA" class="hash-link" aria-label="5. 产物生成与输出的直接链接" title="5. 产物生成与输出的直接链接" translate="no">​</a></h3>
<p>根据配置文件 output 中的格式（ es/cjs/umd 等）、输出路径、拆分策略等，将处理后的所有模块合并，生成最终的打包文件，若配置了 sourcemap ，还会生成对应的源码映射文件。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="二插件工作原理">二、插件工作原理<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#%E4%BA%8C%E6%8F%92%E4%BB%B6%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86" class="hash-link" aria-label="二、插件工作原理的直接链接" title="二、插件工作原理的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-插件的本质">1. 插件的本质<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#1-%E6%8F%92%E4%BB%B6%E7%9A%84%E6%9C%AC%E8%B4%A8" class="hash-link" aria-label="1. 插件的本质的直接链接" title="1. 插件的本质的直接链接" translate="no">​</a></h3>
<p><a href="https://cn.rollupjs.org/" target="_blank" rel="noopener noreferrer" class="">Rollup</a> 插件是一个「返回钩子对象的函数」，函数可以接收插件配置参数，返回的对象中包含了 <a href="https://cn.rollupjs.org/" target="_blank" rel="noopener noreferrer" class="">Rollup</a> 打包生命周期的各种钩子， <a href="https://cn.rollupjs.org/" target="_blank" rel="noopener noreferrer" class="">Rollup</a> 在对应阶段会自动调用这些钩子。</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">javascript</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">customRollupPlugin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">options </span><span class="token parameter operator" style="color:#393A34">=</span><span class="token parameter"> </span><span class="token parameter punctuation" style="color:#393A34">{</span><span class="token parameter punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 插件名称，用于报错信息和日志标识，必填</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'custom-transform-plugin'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 各种生命周期钩子</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">options</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">config</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">/* 修改打包配置 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">resolveId</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">source</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">/* 解析模块真实路径 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">transform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">code</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">/* 转换模块代码，核心实现需求 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">generateBundle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">outputOptions</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> bundle</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">/* 处理生成后的产物 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-核心钩子">2. 核心钩子<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#2-%E6%A0%B8%E5%BF%83%E9%92%A9%E5%AD%90" class="hash-link" aria-label="2. 核心钩子的直接链接" title="2. 核心钩子的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><code>options</code> ：打包开始前执行，用于修改 <a href="https://cn.rollupjs.org/" target="_blank" rel="noopener noreferrer" class="">Rollup</a> 原始配置（比如补充输出格式）。</li>
<li class=""><code>resolveId</code> ：解析模块 ID（路径），用于处理别名、第三方包、虚拟模块（比如返回自定义模块 ID 屏蔽原始模块）。</li>
<li class=""><code>load</code> ：根据模块 ID 加载模块内容，用于加载非 JS 文件、虚拟模块内容（比如返回自定义代码替换原始模块）。</li>
<li class=""><code>transform</code> ：加载模块后、AST 分析前执行，接收模块代码和模块 ID，返回修改后的代码和 sourcemap。这是实现「代码转换 / 移除」的核心钩子，我们会在这里操作 AST 完成所有需求</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="3-插件实现的核心技术">3. 插件实现的核心技术<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#3-%E6%8F%92%E4%BB%B6%E5%AE%9E%E7%8E%B0%E7%9A%84%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF" class="hash-link" aria-label="3. 插件实现的核心技术的直接链接" title="3. 插件实现的核心技术的直接链接" translate="no">​</a></h3>
<p>要实现代码的精准转换 / 移除，不能直接用字符串替换（易出现边界错误，比如误匹配变量名），核心依赖 3 个工具库：</p>
<ul>
<li class=""><code>estree-walker</code> ：遍历 ESTree 规范的 AST 节点，方便找到需要修改 / 移除的节点。</li>
<li class=""><code>magic-string</code> ：安全修改代码字符串，同时保留 sourcemap（避免打包后无法映射到源码，难以调试）。</li>
<li class=""><code>@rollup/pluginutils</code> ：提供实用工具（比如 createFilter），用于过滤需要处理的文件（比如只处理 .js/.ts 文件，忽略 node_modules）</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="三小插件-rollup-版移除打印狗">三、小插件： rollup 版移除打印狗<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#%E4%B8%89%E5%B0%8F%E6%8F%92%E4%BB%B6-rollup-%E7%89%88%E7%A7%BB%E9%99%A4%E6%89%93%E5%8D%B0%E7%8B%97" class="hash-link" aria-label="三、小插件： rollup 版移除打印狗的直接链接" title="三、小插件： rollup 版移除打印狗的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-安装依赖">1. 安装依赖<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#1-%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96" class="hash-link" aria-label="1. 安装依赖的直接链接" title="1. 安装依赖的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Rollup 内置，但单独安装可保证版本一致，用于解析代码为 AST</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> --save-dev estree-walker magic-string @rollup/pluginutils acorn</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_svZc alert alert--secondary"><div class="admonitionHeading_UBwC"><span class="admonitionIcon__uit"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>备注</div><div class="admonitionContent_Zh57"><p>若需要处理 TypeScript 文件，还需要安装 @rollup/plugin-typescript 和 typescript，且自定义插件要放在 typescript 插件之后执行</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-代码片段">2. 代码片段<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#2-%E4%BB%A3%E7%A0%81%E7%89%87%E6%AE%B5" class="hash-link" aria-label="2. 代码片段的直接链接" title="2. 代码片段的直接链接" translate="no">​</a></h3>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic">// 自定义 Rollup 插件：prod环境下代码转换与死代码移除</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">acorn</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'acorn'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> walk </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'estree-walker'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">MagicString</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'magic-string'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> createFilter </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@rollup/pluginutils'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">prodCodeTransformPlugin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">options </span><span class="token parameter operator" style="color:#393A34">=</span><span class="token parameter"> </span><span class="token parameter punctuation" style="color:#393A34">{</span><span class="token parameter punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 过滤需要处理的文件：默认处理 .js/.ts 文件，忽略 node_modules</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> filter </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createFilter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    options</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">include</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'**/*.js'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'**/*.ts'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    options</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exclude</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'node_modules/**'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 判断是否为 production 环境</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> isProduction </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">env</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">NODE_ENV</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'production'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'qqi-rollup-plugin-remove-dog'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 插件名称，必填</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token doc-comment comment" style="color:#999988;font-style:italic">/**</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token doc-comment comment" style="color:#999988;font-style:italic">     * 核心转换钩子：处理每个模块的代码</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token doc-comment comment" style="color:#999988;font-style:italic">     * </span><span class="token doc-comment comment keyword" style="color:#00009f;font-style:italic">@param</span><span class="token doc-comment comment" style="color:#999988;font-style:italic"> </span><span class="token doc-comment comment class-name punctuation" style="color:#393A34;font-style:italic">{</span><span class="token doc-comment comment class-name" style="color:#999988;font-style:italic">string</span><span class="token doc-comment comment class-name punctuation" style="color:#393A34;font-style:italic">}</span><span class="token doc-comment comment" style="color:#999988;font-style:italic"> </span><span class="token doc-comment comment parameter" style="color:#999988;font-style:italic">code</span><span class="token doc-comment comment" style="color:#999988;font-style:italic"> - 模块原始代码</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token doc-comment comment" style="color:#999988;font-style:italic">     * </span><span class="token doc-comment comment keyword" style="color:#00009f;font-style:italic">@param</span><span class="token doc-comment comment" style="color:#999988;font-style:italic"> </span><span class="token doc-comment comment class-name punctuation" style="color:#393A34;font-style:italic">{</span><span class="token doc-comment comment class-name" style="color:#999988;font-style:italic">string</span><span class="token doc-comment comment class-name punctuation" style="color:#393A34;font-style:italic">}</span><span class="token doc-comment comment" style="color:#999988;font-style:italic"> </span><span class="token doc-comment comment parameter" style="color:#999988;font-style:italic">id</span><span class="token doc-comment comment" style="color:#999988;font-style:italic"> - 模块 ID（文件路径）</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token doc-comment comment" style="color:#999988;font-style:italic">     * </span><span class="token doc-comment comment keyword" style="color:#00009f;font-style:italic">@returns</span><span class="token doc-comment comment" style="color:#999988;font-style:italic"> </span><span class="token doc-comment comment class-name punctuation" style="color:#393A34;font-style:italic">{</span><span class="token doc-comment comment class-name" style="color:#999988;font-style:italic">object</span><span class="token doc-comment comment class-name operator" style="color:#393A34;font-style:italic">|</span><span class="token doc-comment comment class-name keyword" style="color:#00009f;font-style:italic">void</span><span class="token doc-comment comment class-name punctuation" style="color:#393A34;font-style:italic">}</span><span class="token doc-comment comment" style="color:#999988;font-style:italic"> - 修改后的代码和 sourcemap</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token doc-comment comment" style="color:#999988;font-style:italic">     */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">transform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">code</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 1. 非 production 环境、无需处理的文件，直接返回</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">isProduction </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token function" style="color:#d73a49">filter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 2. 初始化 MagicString，用于安全修改代码并保留 sourcemap</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> magicStr </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">MagicString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">code</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 3. 解析代码为 AST（ESTree 规范）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> ast</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        ast </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> acorn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">parse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">code</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">ecmaVersion</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'latest'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">sourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'module'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 按 ES 模块解析</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">ranges</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 保留节点的位置范围（start/end），方便 magicStr 操作</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">locations</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">warn</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">解析模块 </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">id</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c"> 失败：</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">err</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">message</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 标记：是否存在 dun = false（用于后续移除 if (dun) 代码块）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> hasDunFalse </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 存储需要移除的代码节点范围（避免重复操作）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> removeRanges </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 4. 遍历 AST，处理所有需求</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token function" style="color:#d73a49">walk</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ast</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// 进入 AST 节点时触发（核心处理逻辑）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token function" style="color:#d73a49">enter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">node</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token doc-comment comment" style="color:#999988;font-style:italic">/************************** 需求 1：转换 Dog 导入 **************************/</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ImportDeclaration'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">source</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">value</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@qqi/log'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// 遍历 import 声明的所有命名导入</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">specifiers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">specifier</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic">// 匹配：import { Dog } from '@qqi/log'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                specifier</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ImportSpecifier'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                specifier</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">imported</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">name</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Dog'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic">// 找到 Dog 对应的代码起始和结束位置，替换为 DogVirtual</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> importedNameStart </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> specifier</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">imported</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">start</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> importedNameEnd </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> specifier</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">imported</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">end</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                magicStr</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">overwrite</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                  importedNameStart</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                  importedNameEnd</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                  </span><span class="token string" style="color:#e3116c">'DogVirtual'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token doc-comment comment" style="color:#999988;font-style:italic">/************************** 需求 2：移除 dog 相关导入和调用 **************************/</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// 2.1 移除 import { dog } from 'xxx'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ImportDeclaration'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> needRemoveImport </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// 标记是否只导入了 dog（若有其他导入，只移除 dog 对应的部分）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> onlyDogImport </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">specifiers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">specifiers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">specifier</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> index</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                specifier</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ImportSpecifier'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                specifier</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">imported</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">name</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dog'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">onlyDogImport</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                  </span><span class="token comment" style="color:#999988;font-style:italic">// 整个 import 语句都移除</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                  removeRanges</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">node</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">start</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">-</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">node</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">end</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                  needRemoveImport </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                  </span><span class="token comment" style="color:#999988;font-style:italic">// 只移除 dog 对应的部分（处理逗号分隔）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> specStart </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> specifier</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">start</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> specEnd </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">specifiers</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                    </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">specifiers</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">start</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                    </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">end</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                  removeRanges</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">specStart</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">-</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">specEnd</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// 若标记了移除整个 import，直接跳过后续处理</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">needRemoveImport</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// 2.2 移除 dog('xxx')、dog.warn('xxx')、dog.error('xxx')</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'CallExpression'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> isDogCall </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// 匹配：dog('xxx')（直接调用）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">callee</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Identifier'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">callee</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">name</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dog'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              isDogCall </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// 匹配：dog.warn('xxx')、dog.error('xxx')（成员调用）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">callee</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'MemberExpression'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">callee</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">object</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Identifier'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">callee</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">object</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">name</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dog'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'info'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'type'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">includes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">callee</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">property</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              isDogCall </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// 标记需要移除的调用语句范围</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">isDogCall</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              removeRanges</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">node</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">start</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">-</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">node</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">end</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token doc-comment comment" style="color:#999988;font-style:italic">/************************** 需求 3：移除 dun 相关导出和 if 代码块 **************************/</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// 3.1 匹配：export const dun = false</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ExportNamedDeclaration'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">declaration</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">declaration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'VariableDeclaration'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">declaration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">kind</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'const'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">declaration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">declarations</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">declaration</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                declaration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">id</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">name</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dun'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                declaration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">init</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                declaration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">init</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Literal'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">declaration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">init</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">value</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                  declaration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">init</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">value</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic">// 标记存在 dun = false，且移除该导出语句</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                hasDunFalse </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                removeRanges</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">node</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">start</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">-</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">node</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">end</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// 3.2 匹配：if (dun) { ... }（仅当 hasDunFalse 为 true 时移除）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hasDunFalse </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'IfStatement'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> testNode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> node</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">test</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">testNode</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Identifier'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> testNode</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">name</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dun'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic">// 移除整个 if 语句块</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              removeRanges</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">node</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">start</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">-</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">node</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">end</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 5. 执行代码移除（处理所有标记的移除范围）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token known-class-name class-name">Array</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword module" style="color:#00009f">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">removeRanges</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">range</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">start</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> end</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> range</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">split</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'-'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">Number</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        magicStr</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">remove</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">start</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> end</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 6. 返回修改后的代码和 sourcemap</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">code</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> magicStr</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">toString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">map</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> magicStr</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">generateMap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">hires</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 生成高精度 sourcemap</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> prodCodeTransformPlugin</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="3-插件使用方式">3. 插件使用方式<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/30/%E8%AE%A4%E8%AF%86%20eslint%20%E6%8F%92%E4%BB%B6#3-%E6%8F%92%E4%BB%B6%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F" class="hash-link" aria-label="3. 插件使用方式的直接链接" title="3. 插件使用方式的直接链接" translate="no">​</a></h3>
<p>在 <a href="https://cn.rollupjs.org/" target="_blank" rel="noopener noreferrer" class="">Rollup</a> 配置文件（<code>rollup.config.js</code>）中引入并使用该插件：</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> prodCodeTransform </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'./prodCodeTransformPlugin'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> terser </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'rollup-plugin-terser'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选，production 环境压缩代码</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">input</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'src/index.js'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 你的入口文件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">output</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">file</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dist/bundle.js'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">format</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'es'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 输出 ES 模块</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 引入自定义插件，放在其他转换插件之后（比如 ts 插件）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token function" style="color:#d73a49">prodCodeTransform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：production 环境压缩代码（建议添加）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">env</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">NODE_ENV</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'production'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">terser</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[vs Code 扩展子命令菜单]]></title>
        <id>http://lmssee.pages.dev/建站日志/2026/1/1/vsCode 插件子命令配置</id>
        <link href="http://lmssee.pages.dev/建站日志/2026/1/1/vsCode 插件子命令配置"/>
        <updated>2026-01-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[当时看官方文档介绍这一块有点懵，也可能是当时看的比较潦草。所以找资料总结下构建带子菜单的自定义菜单命令组。]]></summary>
        <content type="html"><![CDATA[<p>当时看<a href="https://code.visualstudio.com/api/references/contribution-points#contributes.menus" target="_blank" rel="noopener noreferrer" class="">官方文档</a>介绍这一块有点懵，也可能是当时看的比较潦草。所以找资料总结下构建带子菜单的自定义菜单命令组。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="一声明命令">一、声明命令<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/1/vsCode%20%E6%8F%92%E4%BB%B6%E5%AD%90%E5%91%BD%E4%BB%A4%E9%85%8D%E7%BD%AE#%E4%B8%80%E5%A3%B0%E6%98%8E%E5%91%BD%E4%BB%A4" class="hash-link" aria-label="一、声明命令的直接链接" title="一、声明命令的直接链接" translate="no">​</a></h2>
<p>与普通命令一致，需要先在 <code>contributes.commands</code> 中进行注册：</p>
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"contributes"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"commands"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他命令</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"插件的第一个子命令"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"插件的第二个子命令"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"插件的第三个子命令"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand4"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"插件的第四个子命令"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand5"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"插件的第五个子命令"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand6"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"插件的第六个子命令"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="二构建菜单组">二、构建菜单组<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/1/vsCode%20%E6%8F%92%E4%BB%B6%E5%AD%90%E5%91%BD%E4%BB%A4%E9%85%8D%E7%BD%AE#%E4%BA%8C%E6%9E%84%E5%BB%BA%E8%8F%9C%E5%8D%95%E7%BB%84" class="hash-link" aria-label="二、构建菜单组的直接链接" title="二、构建菜单组的直接链接" translate="no">​</a></h2>
<p>自定义组需要显式的在 <code>contributes.submenus</code> 中定义子菜单命令组</p>
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"contributes"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"submenus"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommandGroup0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 唯一 id</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"label"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"自定义菜单项 0"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommandGroup1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"label"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"自定义菜单项 1"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="三将菜单子命令挂载到组">三、将菜单子命令挂载到组<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/1/vsCode%20%E6%8F%92%E4%BB%B6%E5%AD%90%E5%91%BD%E4%BB%A4%E9%85%8D%E7%BD%AE#%E4%B8%89%E5%B0%86%E8%8F%9C%E5%8D%95%E5%AD%90%E5%91%BD%E4%BB%A4%E6%8C%82%E8%BD%BD%E5%88%B0%E7%BB%84" class="hash-link" aria-label="三、将菜单子命令挂载到组的直接链接" title="三、将菜单子命令挂载到组的直接链接" translate="no">​</a></h2>
<p>子命令需要在（自定义）组中进行显示声明挂载才可显示在分组中：</p>
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"contributes"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"menus"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"extensionName.submenuCommandGroup0"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand1"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// 这里可以配置该子项的显示规则</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand2"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand2"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"extensionName.submenuCommandGroup1"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand3"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand4"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand5"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand6"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="四将组挂载到菜单栏">四、将组挂载到菜单栏<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/1/vsCode%20%E6%8F%92%E4%BB%B6%E5%AD%90%E5%91%BD%E4%BB%A4%E9%85%8D%E7%BD%AE#%E5%9B%9B%E5%B0%86%E7%BB%84%E6%8C%82%E8%BD%BD%E5%88%B0%E8%8F%9C%E5%8D%95%E6%A0%8F" class="hash-link" aria-label="四、将组挂载到菜单栏的直接链接" title="四、将组挂载到菜单栏的直接链接" translate="no">​</a></h2>
<p>菜单项可以分组，按辞典序排列。可以将分组添加到菜单项，或中间、上方或上方添加新的菜单项组。</p>
<p><strong>编辑器的右菜单项</strong>默认有以下分组：</p>
<ul>
<li class=""><code>navigation</code> - 群体在所有情况下都优先</li>
<li class=""><code>1_modification</code> - 修改代码命令组</li>
<li class=""><code>9_cutcopypaste</code> - 倒数第二组默认组，包含基本编辑命令</li>
<li class=""><code>z_commands</code> - 最后一个默认组，带有打开命令调色板的条目</li>
</ul>
<div class="language-plaintext codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">右键功能菜单示意</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-plaintext codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ---------------------------</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Go to Definition</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Peek Definition                       ←--------       navigation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Find All References</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ---------------------------</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Change All Occurrences</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                        ←--------       1_modification</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Format Document</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ---------------------------</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Cut</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Copy                                  ←--------       9_cutcopypaste</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Paste</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ---------------------------</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Command Palette ...                    ←--------       z_commands</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ---------------------------</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_svZc alert alert--info"><div class="admonitionHeading_UBwC"><span class="admonitionIcon__uit"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_Zh57"><p>其他分组详见 <a href="https://code.visualstudio.com/api/references/contribution-points#Sorting-of-groups" target="_blank" rel="noopener noreferrer" class="">sorting-of-groups</a></p></div></div>
<p>可以将组放在任何想放置的位置</p>
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"contributes"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"menus"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"editor/context"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"submenu"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommandGroup0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"group"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"navigation@3"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 将 submenuCommandGroup0 自定义组放到了优先组</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"when"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 控制该分组出现的条件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"submenu"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommandGroup1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"group"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"9_cutcopypaste@5"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 将 submenuCommandGroup1 自定义分组放置到了剪辑命令组</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="五超级计划之">五、超级计划之<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/1/vsCode%20%E6%8F%92%E4%BB%B6%E5%AD%90%E5%91%BD%E4%BB%A4%E9%85%8D%E7%BD%AE#%E4%BA%94%E8%B6%85%E7%BA%A7%E8%AE%A1%E5%88%92%E4%B9%8B" class="hash-link" aria-label="五、超级计划之的直接链接" title="五、超级计划之的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-子命令匿于命令面板">1. 子命令匿于命令面板<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/1/vsCode%20%E6%8F%92%E4%BB%B6%E5%AD%90%E5%91%BD%E4%BB%A4%E9%85%8D%E7%BD%AE#1-%E5%AD%90%E5%91%BD%E4%BB%A4%E5%8C%BF%E4%BA%8E%E5%91%BD%E4%BB%A4%E9%9D%A2%E6%9D%BF" class="hash-link" aria-label="1. 子命令匿于命令面板的直接链接" title="1. 子命令匿于命令面板的直接链接" translate="no">​</a></h3>
<p>每一个没有特殊设置的 <code>contributes.commands</code> 子项都将可在命令面板 <code>contributes.menus.commandPalette</code> 可见,
而自分组的子项命令由于其特殊性，其 <code>title</code> 值可能将与其他专门用于控制面板的命令不同：</p>
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">包含不同命令的命令组</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"contributes"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"commands"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.commandForCommandPalette0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName: 专门用于控制面板的命令 0"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 为了显著，可能添加插件名</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.commandForCommandPalette1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName: 专门用于控制面板的命令 1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"插件的第一个子命令"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 子组件由于分组的 label 已经有相关说明，可能更简洁</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"插件的第二个子命令"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>如果不在 <code>contributes.menus.commandPalette</code> 中显式关闭分组，分组在命令面板可见。但又由于其 <code>title</code> 描述的不完整性，可能对用于不太友好：</p>
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">显式关闭用于子组命令的命令条</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"contributes"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"menus"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"commandPalette"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"when"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"false"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 关闭该命令在命令面板的显示</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenuCommand2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"when"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"false"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-多语言支持">2. 多语言支持<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/1/vsCode%20%E6%8F%92%E4%BB%B6%E5%AD%90%E5%91%BD%E4%BB%A4%E9%85%8D%E7%BD%AE#2-%E5%A4%9A%E8%AF%AD%E8%A8%80%E6%94%AF%E6%8C%81" class="hash-link" aria-label="2. 多语言支持的直接链接" title="2. 多语言支持的直接链接" translate="no">​</a></h3>
<p>既然可能国际友人使用的情况比较少，但是功能不能不知晓。vsCode 提供原生支持！</p>
<p>使用 <code>packages.nls.xxx.json</code> 构建相应语言的示条，使用 <code>packages.nls.json</code> 设定默认（没有设定对应的语言时的兜底语言）。</p>
<div class="theme-tabs-container tabs-container tabList_GGXe"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_QOjA tabs__item--active">packages.json 文件</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_QOjA">packages.nls.json 文件</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_QOjA">packages.nls.zh-cn.json 文件</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_bPac"><div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"displayName"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%plugin.displayName%"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%plugin.descriptions%"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"contributes"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"commands"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.command1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%command.command1%"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.command2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%command.command2%"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"submenus"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenus1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"label"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%submenus.submenus1%"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName.submenus2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"label"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%submenus.submenus2%"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_bPac" hidden=""><div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"plugin.displayName"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extension plugin display name in extensions store"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"plugin.descriptions"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"some text for describing extension plugin in extensions store"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command.command1"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName: command1 description"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command.command2"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName: command1 description"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"submenus.submenus1"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName: submenus1 description"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"submenus.submenus2"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"extensionName: submenus2 description"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_bPac" hidden=""><div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"plugin.displayName"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"插件在扩展商城的展示名称"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"plugin.descriptions"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"插件在扩展商城展示的描述"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command.command1"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"中文扩展名：命令 1 的描述"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"command.command2"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"中文扩展名：命令 2 的描述"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"submenus.submenus1"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"中文扩展名：子组 1 的描述"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"submenus.submenus2"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"中文扩展名：子组 2 的描述"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="六完整示意">六、完整示意<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2026/1/1/vsCode%20%E6%8F%92%E4%BB%B6%E5%AD%90%E5%91%BD%E4%BB%A4%E9%85%8D%E7%BD%AE#%E5%85%AD%E5%AE%8C%E6%95%B4%E7%A4%BA%E6%84%8F" class="hash-link" aria-label="六、完整示意的直接链接" title="六、完整示意的直接链接" translate="no">​</a></h2>
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">简单示意</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"super-file-header"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 扩展唯一 ID 名</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"publisher"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Mr.MudBean"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 发布者</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"displayName"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%plugin.displayName%"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 扩展在扩展商店展示名</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%plugin.description%"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 扩展在扩展商店展示描述</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"commonjs"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 开发模式</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0.0.1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 版本信息</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"license"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MIT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 开源声明类型</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"engines"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"vscode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^1.90.0"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 扩展支持的最低引擎</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"categories"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"Other"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 功能分类</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keywords"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"文件头注释"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"activationEvents"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 启动事件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"onLanguages:javascript"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"onLanguages:javascriptreact"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"onLanguages:typescript"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"onLanguages:typescriptreact"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"onLanguages:markdown"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"onLanguages:mdx"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"onLanguages:vue"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"onStartupFinished"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"main"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./dist/extension.js"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 扩展入口</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"contributes"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"commands"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createJavaScriptHeaderCommentPalette"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%command.createJavaScriptHeaderComment%"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createJavaScriptHeaderCommentSubmenu"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%submenu.createJavaScriptHeaderComment%"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createMdxPageHeaderCommentPalette"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%command.createMdxPageHeaderComment%"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createMdxPageHeaderCommentSubmenu"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%command.createMdxHeaderComment%"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createMdxBlogHeaderCommentPalette"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%command.createMdxBlogHeaderComment%"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createMdxBlogHeaderCommentSubmenu"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%command.createMdxBlogHeaderComment%"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"submenus"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createFileHeader"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"label"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%submenus.createFileHeader%"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"menus"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"superFileHeader.createFileHeader"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createJavaScriptHeaderCommentSubmenu"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createMdxPageHeaderCommentSubmenu"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createMdxBlogHeaderCommentSubmenu"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"editor/context"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"submenu"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createFileHeader"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"group"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1_modification@8"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"commandPalette"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createJavaScriptHeaderCommentPalette"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"when"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"resourceFilename =~ /\\.(js|ts|vue|jsx|tsx)$/"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createJavaScriptHeaderCommentSubmenu"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"when"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"false"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 显式关闭子命令在命令面板的显示</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createMdxPageHeaderCommentPalette"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"when"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"resourceFilename =~ /\\.(md|mdx)$/"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createMdxPageHeaderCommentSubmenu"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"when"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"false"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 显式关闭子命令在命令面板的显示</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createMdxBlogHeaderCommentPalette"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"when"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"resourceFilename =~ /\\.(md|mdx)$/"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"superFileHeader.createMdxBlogHeaderCommentSubmenu"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"when"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"false"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 显式关闭子命令在命令面板的显示</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他配置</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_svZc alert alert--info"><div class="admonitionHeading_UBwC"><span class="admonitionIcon__uit"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_Zh57"><p>记录下来是因为本扩展最终并没有采用该方案，因为</p><ul>
<li class="">命令声明比较麻烦，需要在命令面板和菜单功能区分别定义同逻辑命令而展示文本不同</li>
<li class="">将命令放进子组之中在某些时候使用并不便捷，有一些画蛇添足</li>
</ul></div></div>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="vsCode 扩展" term="vsCode 扩展"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[更多的辅助工具]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/12/28/更多的辅助工具</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/12/28/更多的辅助工具"/>
        <updated>2025-12-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[记录已有开发辅助工具，省的自己造歪货]]></summary>
        <content type="html"><![CDATA[<p>这些工具不会增加维护成本，反而能大幅提升团队协作效率、规范度、开发速度，还能规避很多隐性问题。</p>
<p>其他辅助/规范开发的工具。（鉴于自己造破轮的经验，还是记录一下的好，省的以后在电器时代发现了磨石起火还自以为是）</p>
<!-- -->
<div class="theme-admonition theme-admonition-info admonition_svZc alert alert--info"><div class="admonitionHeading_UBwC"><span class="admonitionIcon__uit"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>工具选择的核心规则</div><div class="admonitionContent_Zh57"><ul>
<li class=""><strong>按需引入</strong> ： 避免堆砌工具，优先解决当前痛点（如提交不规范用 Commitlint ，样式乱用 Stylelint ）</li>
<li class=""><strong>生态兼容</strong> ： 确保工具间无冲突（如 Stylelint 与 Prettier 需结合 stylelint-config-prettier ）</li>
<li class=""><strong>自动化优先</strong> ： 通过 husky + lint-staged 将规范检查融入开发流程（提交前自动修复/校验）</li>
</ul></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="一提交细心规范">一、提交细心规范<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/28/%E6%9B%B4%E5%A4%9A%E7%9A%84%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7#%E4%B8%80%E6%8F%90%E4%BA%A4%E7%BB%86%E5%BF%83%E8%A7%84%E8%8C%83" class="hash-link" aria-label="一、提交细心规范的直接链接" title="一、提交细心规范的直接链接" translate="no">​</a></h2>
<p>确保团队提交信息清晰可追溯，配合 husky 可实现提交前校验。</p>
<ul>
<li class=""><code>Commitlint</code> ：校验 Git 提交信息格式（如是否符合 Conventional Commits 规范），用于 <strong>团队统一提交风格（如 feat: add login）</strong></li>
<li class=""><code>Commitizen</code> ： 交互式命令行引导生成标准化提交信息（替代手动输入 <code>git commit -m</code> ），用于 <strong>新手友好，避免格式错误</strong></li>
<li class=""><code>cz-conventional-changelog</code> ： Commitizen 适配器，生成符合 Conventional Commits 的提交信息，用于 <strong>配合 Commitizen 使用</strong></li>
<li class=""><code>standard-version</code> ： 自动根据提交信息生成 CHANGELOG.md、版本号和 Git 标签（SemVer），用于 <strong>发布流程自动化（替代手动改版本）</strong></li>
</ul>
<p><code>commitlint</code> 就是用来强制约束 git commit 的信息格式，配套的 <code>@commitlint/config-conventional</code> 是业界通用的「Angular 规范」，要求 commit 信息必须是：类型(作用域): 描述 的格式 ：</p>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic"># 不符合规范的 commit 信息被 commit 时，会直接拒绝提交，强制规范</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"feat(home): 新增首页轮播图组件"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"fix(api): 修复用户列表接口数据返回异常的问题"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docs(readme): 更新项目部署文档"</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="二css样式规范">二、CSS/样式规范<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/28/%E6%9B%B4%E5%A4%9A%E7%9A%84%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7#%E4%BA%8Ccss%E6%A0%B7%E5%BC%8F%E8%A7%84%E8%8C%83" class="hash-link" aria-label="二、CSS/样式规范的直接链接" title="二、CSS/样式规范的直接链接" translate="no">​</a></h2>
<p>针对 CSS/SCSS/Less 等样式文件的规范与格式化，与 Prettier 分工协作（Prettier 管格式，StyleLint 管规则）。</p>
<ul>
<li class=""><code>Stylelint</code> ： 校验 CSS/SCSS/Less 语法错误、规则一致性（如禁止使用 !important ），用于 <strong>样式代码质量控制</strong></li>
<li class=""><code>stylelint-config-standard</code> ： Stylelint 标准规则集（基于社区最佳实践），用于 <strong>快速上手，开箱即用</strong></li>
<li class=""><code>postcss</code> ： CSS 后处理器（配合 autoprefixer 自动加浏览器前缀、cssnano 压缩），用于 <strong>跨浏览器样式兼容、生产环境优化</strong></li>
<li class=""><code>autoprefixer</code> ： 根据 Can I Use 数据自动添加 CSS 浏览器前缀（如 -webkit- ），用于 <strong>替代手动写前缀，减少兼容性问题</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="三代码生成与模板减少重复劳动">三、代码生成与模板（减少重复劳动）<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/28/%E6%9B%B4%E5%A4%9A%E7%9A%84%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7#%E4%B8%89%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90%E4%B8%8E%E6%A8%A1%E6%9D%BF%E5%87%8F%E5%B0%91%E9%87%8D%E5%A4%8D%E5%8A%B3%E5%8A%A8" class="hash-link" aria-label="三、代码生成与模板（减少重复劳动）的直接链接" title="三、代码生成与模板（减少重复劳动）的直接链接" translate="no">​</a></h2>
<p>自动生成重复代码（组件、页面、配置文件等），提升开发速度。</p>
<ul>
<li class=""><code>Plop</code> ： 轻量级代码生成工具（通过 Handlebars 模板定义生成规则），用于 <strong>生成 React 组件、Redux 模板等</strong></li>
<li class=""><code>Hygen</code> ： 高性能代码生成器（支持动态模板、多文件生成），用于 <strong>复杂项目模板（如 Monorepo 子包结构）</strong></li>
<li class=""><code>Yeoman</code> ： 老牌脚手架工具（生态丰富，可集成自定义生成器），用于 <strong>项目初始化、框架级模板生成</strong></li>
<li class=""><code>create-react-app</code> ： React 官方脚手架（内置 Webpack、Babel 配置），用于 <strong>快速创建 React 项目（现推荐 Vite）</strong></li>
<li class=""><code>Vite</code> ： 新一代前端构建工具（快速冷启动、热更新，内置模板生成），用于 <strong>替代 CRA，快速创建 TS/React/Vue 项目</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="四依赖管理与优化">四、依赖管理与优化<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/28/%E6%9B%B4%E5%A4%9A%E7%9A%84%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7#%E5%9B%9B%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86%E4%B8%8E%E4%BC%98%E5%8C%96" class="hash-link" aria-label="四、依赖管理与优化的直接链接" title="四、依赖管理与优化的直接链接" translate="no">​</a></h2>
<p>自动化依赖更新、无用依赖检测、版本冲突解决。</p>
<ul>
<li class=""><code>npm-check-updates (ncu)</code> ： 扫描 package.json 并提示可更新的依赖版本（支持批量更新），用于 <strong>定期更新依赖，保持安全性</strong></li>
<li class=""><code>depcheck</code> ： 检测项目中未使用的依赖（ <code>dependencies</code>/<code>devDependencies</code> ） ，用于 <strong>清理冗余依赖，减小包体积</strong></li>
<li class=""><code>patch-package</code> ： 修改 <code>node_modules</code> 中依赖的源码并持久化补丁（无需 fork 仓库），用于 <strong>修复第三方依赖 bug（临时方案）</strong></li>
<li class=""><code>npm-dedupe</code> ：优化 <code>node_modules</code> 依赖树，合并重复依赖 ，用于 <strong>减小安装体积，提升加载速度</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="五测试辅助提升测试效率与质量">五、测试辅助（提升测试效率与质量）<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/28/%E6%9B%B4%E5%A4%9A%E7%9A%84%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7#%E4%BA%94%E6%B5%8B%E8%AF%95%E8%BE%85%E5%8A%A9%E6%8F%90%E5%8D%87%E6%B5%8B%E8%AF%95%E6%95%88%E7%8E%87%E4%B8%8E%E8%B4%A8%E9%87%8F" class="hash-link" aria-label="五、测试辅助（提升测试效率与质量）的直接链接" title="五、测试辅助（提升测试效率与质量）的直接链接" translate="no">​</a></h2>
<p>增强测试框架功能，规范测试用例，生成测试覆盖率报告。</p>
<ul>
<li class=""><code>Jest</code> ：全功能测试框架（单元测试、快照测试、Mock 函数），用于 <strong>React/Vue/Node.js 项目测试</strong></li>
<li class=""><code>Vitest</code> ：基于 Vite 的测试框架（更快速度、兼容 Jest API ），用于 <strong>Vite 项目首选，替代 Jest</strong></li>
<li class=""><code>Testing Library</code> ：组件测试工具（优先通过 DOM 语义查询元素，而非 test-id ），用于 <strong>React/Vue 组件行为测试</strong></li>
<li class=""><code>eslint-plugin-jest</code> ： ESLint 插件，校验 <code>Jest</code> 测试代码规范（如用例命名、断言风格 ），用于 <strong>测试代码质量控制</strong></li>
<li class=""><code>nyc/istanbul</code> ：生成测试覆盖率报告（标记未覆盖代码），用于 <strong>CI 流程中强制覆盖率阈值</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="六文档自动化减少手动维护成本">六、文档自动化（减少手动维护成本）<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/28/%E6%9B%B4%E5%A4%9A%E7%9A%84%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7#%E5%85%AD%E6%96%87%E6%A1%A3%E8%87%AA%E5%8A%A8%E5%8C%96%E5%87%8F%E5%B0%91%E6%89%8B%E5%8A%A8%E7%BB%B4%E6%8A%A4%E6%88%90%E6%9C%AC" class="hash-link" aria-label="六、文档自动化（减少手动维护成本）的直接链接" title="六、文档自动化（减少手动维护成本）的直接链接" translate="no">​</a></h2>
<p>自动生成 API 文档、组件文档、README 等。</p>
<ul>
<li class=""><code>Storybook</code> ：组件开发环境（可视化展示组件、编写交互用例、生成文档），用于 <strong><code>React</code>/<code>Vue</code>/<code>Angular</code> 组件文档</strong></li>
<li class=""><code>Typedoc</code> ：基于 <code>TypeScript</code> 类型生成 API 文档（支持 <code>Markdown</code> 注释提取），用于 <strong><code>TS</code> 项目 API 文档自动化</strong></li>
<li class=""><code>JSDoc</code> ：通过注释生成文档（需配合 <code>eslint-plugin-jsdoc</code> 规范注释），用于 <strong>JS 项目基础文档生成</strong></li>
<li class=""><code>docsify</code> ：轻量级文档网站生成器（基于 Markdown ，无需构建），用于 <strong>项目 README 扩展为在线文档</strong></li>
<li class=""><code>Sphinx</code> ：Python 生态文档工具（支持多语言，常用于开源项目），用于 <strong>大型项目多语言文档</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="七环境变量与配置管理">七、环境变量与配置管理<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/28/%E6%9B%B4%E5%A4%9A%E7%9A%84%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7#%E4%B8%83%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E4%B8%8E%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86" class="hash-link" aria-label="七、环境变量与配置管理的直接链接" title="七、环境变量与配置管理的直接链接" translate="no">​</a></h2>
<p>统一管理开发/测试/生产环境变量，避免硬编码。</p>
<ul>
<li class=""><code>dotenv</code> ： 从 <code>.env</code> 文件加载环境变量到 <code>process.env</code>，用于 <strong>本地开发环境配置</strong></li>
<li class=""><code>cross-env</code> ： 跨平台设置环境变量（解决 Windows 下 <code>NODE_ENV=production</code> 语法问题），用于 <strong>统一 CI/CD 与本地环境变量设</strong></li>
<li class=""><code>dotenv-cli</code> ： 命令行加载 <code>.env</code> 文件（如 <code>dotenv -e .env.prod node app.js</code> ），用于 <strong>多环境切换执行命令</strong></li>
<li class=""><code>conf</code> ： 轻量级 Node.js 配置管理（支持 JSON/YAML/JS 文件，自动合并层级配置），用于 <strong>应用配置集中管理</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="八git-增强与协作">八、Git 增强与协作<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/28/%E6%9B%B4%E5%A4%9A%E7%9A%84%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7#%E5%85%ABgit-%E5%A2%9E%E5%BC%BA%E4%B8%8E%E5%8D%8F%E4%BD%9C" class="hash-link" aria-label="八、Git 增强与协作的直接链接" title="八、Git 增强与协作的直接链接" translate="no">​</a></h2>
<p>除 husky 和 lint-staged 外，提升 Git 协作效率的工具。</p>
<ul>
<li class=""><code>Git LFS</code> ： 大文件存储（将二进制文件如图片、视频存储在 Git 外，仅保留指针），用于 <strong>游戏、设计资源管理</strong></li>
<li class=""><code>diff-so-fancy</code> ： 美化 Git 差异输出（高亮变更、简化 diff 格式），用于 <strong>提升代码 review 效率</strong></li>
<li class=""><code>gh (GitHub CLI)</code> ： 命令行操作 GitHub （创建 PR 、管理 Issue、查看仓库），用于 <strong>替代网页端操作，提升协作速度</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="九构建与打包辅助">九、构建与打包辅助<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/28/%E6%9B%B4%E5%A4%9A%E7%9A%84%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7#%E4%B9%9D%E6%9E%84%E5%BB%BA%E4%B8%8E%E6%89%93%E5%8C%85%E8%BE%85%E5%8A%A9" class="hash-link" aria-label="九、构建与打包辅助的直接链接" title="九、构建与打包辅助的直接链接" translate="no">​</a></h2>
<p>优化构建流程、分析包体积、加速编译。</p>
<ul>
<li class=""><code>webpack-bundle-analyzer</code> ：可视化分析 <code>Webpack</code> 打包产物体积（识别大依赖），用于 <strong>优化包体积，减少首屏加载时间</strong></li>
<li class=""><code>source-map-explorer</code> ：分析 <code>Source Map</code> 定位代码体积瓶颈（支持 <code>Webpack/Vite/Rollup</code> ），用于 <strong>精准优化代码拆分</strong></li>
<li class=""><code>concurrently</code> ：并行运行多个命令（如 <code>npm run dev:server &amp; npm run dev:client</code> ），用于 <strong>多进程开发（前后端联调）</strong></li>
<li class=""><code>rimraf</code> ：跨平台删除文件/文件夹（替代 <code>rm -rf</code> ，Windows 兼容），用于 <strong>构建前清理 <code>dist</code> 目录</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="十编辑器与-ide-辅助vs-code-插件">十、编辑器与 IDE 辅助（VS Code 插件）<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/28/%E6%9B%B4%E5%A4%9A%E7%9A%84%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7#%E5%8D%81%E7%BC%96%E8%BE%91%E5%99%A8%E4%B8%8E-ide-%E8%BE%85%E5%8A%A9vs-code-%E6%8F%92%E4%BB%B6" class="hash-link" aria-label="十、编辑器与 IDE 辅助（VS Code 插件）的直接链接" title="十、编辑器与 IDE 辅助（VS Code 插件）的直接链接" translate="no">​</a></h2>
<p>虽非 npm 插件，但能显著提升编码效率（需手动安装 VS Code 插件）。</p>
<ul>
<li class=""><code>ES7+ React Snippets</code> ：提供 React/Vue 代码片段（如 rfc 生成函数组件），用于 <strong>快速生成组件模板</strong></li>
<li class=""><code>Path Intellisense</code> ：自动补全文件路径（导入组件/资源时），用于 <strong>避免手写路径错误</strong></li>
<li class=""><code>Error Lens</code> ：在代码行内直接显示 <code>ESLint</code>/<code>TypeScript</code> 错误（无需看 <code>Problems</code> 面板），用于 <strong>实时错误反馈</strong></li>
<li class=""><code>GitLens</code> ：增强 Git 功能（显示代码作者、提交历史、分支对比），用于 <strong>代码溯源与协作</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="十一monorepo-管理多包仓库协作">十一、Monorepo 管理（多包仓库协作）<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/28/%E6%9B%B4%E5%A4%9A%E7%9A%84%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7#%E5%8D%81%E4%B8%80monorepo-%E7%AE%A1%E7%90%86%E5%A4%9A%E5%8C%85%E4%BB%93%E5%BA%93%E5%8D%8F%E4%BD%9C" class="hash-link" aria-label="十一、Monorepo 管理（多包仓库协作）的直接链接" title="十一、Monorepo 管理（多包仓库协作）的直接链接" translate="no">​</a></h2>
<p>针对 <code>Lerna</code>/<code>Yarn Workspaces</code>/<code>Turborepo</code> 的辅助工具。</p>
<ul>
<li class=""><code>Turborepo</code> ：高性能 Monorepo 构建系统（缓存任务结果、并行执行、依赖图优化），用于 <strong>大型 <code>Monorepo</code> 加速构建与测试</strong></li>
<li class=""><code>Lerna</code> ：老牌 Monorepo 管理工具（版本管理、包发布、依赖链接），用于 <strong>中小型 <code>Monorepo</code> 包管理</strong></li>
<li class=""><code>Changesets</code> ：管理 Monorepo 包版本与变更日志（配合 <code>Turborepo</code> 使用），用于 <strong>多包协同发布，自动生成 <code>CHANGELOG</code></strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="十二其他实用工具">十二、其他实用工具<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/28/%E6%9B%B4%E5%A4%9A%E7%9A%84%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7#%E5%8D%81%E4%BA%8C%E5%85%B6%E4%BB%96%E5%AE%9E%E7%94%A8%E5%B7%A5%E5%85%B7" class="hash-link" aria-label="十二、其他实用工具的直接链接" title="十二、其他实用工具的直接链接" translate="no">​</a></h2>
<p>解决特定痛点的轻量工具。</p>
<ul>
<li class=""><code>EditorConfig</code> ：统一不同编辑器的缩进、换行符等基础格式（需项目根目录 <code>.editorconfig</code> ），用于 <strong>跨编辑器协作格式一致</strong></li>
<li class=""><code>nodemon</code> ：监听文件变化自动重启 Node.js 服务（开发环境），用于 <strong>后端 API 开发热重载</strong></li>
<li class=""><code>serve</code> ：快速启动静态文件服务器（支持 <code>HTTPS</code> <code>、Gzip</code> ），用于 <strong>本地预览打包后的 dist 目录</strong></li>
<li class=""><code>http-server</code> ：轻量级 HTTP 服务器（比 <code>serve</code> 更简单），用于 <strong>临时分享静态文件</strong></li>
</ul>
<pre tabindex="0" class="codeBlockStandalone_x9VT thin-scrollbar codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><code class="codeBlockLines_JP7F"></code></pre>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="npm 包" term="npm 包"/>
        <category label="自动化" term="自动化"/>
        <category label="git" term="git"/>
        <category label="shell" term="shell"/>
        <category label="测试" term="测试"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[eslint 插件]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/12/27/eslint 插件</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/12/27/eslint 插件"/>
        <updated>2025-12-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[现在才发现有时候真的是“磨刀不误砍柴工”，构建良好的工具可以辅助快速的开发。]]></summary>
        <content type="html"><![CDATA[<p>现在才发现有时候真的是“磨刀不误砍柴工”，构建良好的工具可以辅助快速的开发。</p>
<p>之前比较忽略 eslint 插件的使用，现在发现还不错。是我肤浅了。</p>
<!-- -->
<ul>
<li class=""><strong>按需安装</strong> ： 避免堆砌插件，根据项目类型和痛点选择（例如：React 项目必装 eslint-plugin-react+ eslint-plugin-react-hooks）</li>
<li class=""><strong>组合配置</strong> ：多数插件提供预设配置（如 eslint-plugin-react/configs/recommended），直接继承减少手动配置</li>
<li class=""><strong>版本兼容</strong> ：注意插件与 ESLint 版本的兼容性（参考插件文档的 peerDependencies）</li>
</ul>
<div class="theme-admonition theme-admonition-danger admonition_svZc alert alert--danger"><div class="admonitionHeading_UBwC"><span class="admonitionIcon__uit"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>按需启用</div><div class="admonitionContent_Zh57"><ul>
<li class="">不要盲目安装太多插件，否则配置复杂且 lint 速度变慢</li>
<li class="">所有插件在 Flat Config ( <code>eslint.config.js</code> ) 中都应使用其 <code>.configs</code> 导出（如果支持），以获得最佳兼容性</li>
</ul></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="一常用插件">一、常用插件<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#%E4%B8%80%E5%B8%B8%E7%94%A8%E6%8F%92%E4%BB%B6" class="hash-link" aria-label="一、常用插件的直接链接" title="一、常用插件的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><code>@eslint/js</code> 适用于 js 的通用配置<!-- -->
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">eslint.config.mjs 片段</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">js</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@eslint/js'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：核心推荐规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 基础配置（所有文件通用）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  js</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">configs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">recommended</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：ESLint 核心推荐规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
</li>
<li class=""><code>eslint-plugin-jsdoc</code> JSDoc 对 ESLint 的 linting 规则<!-- -->
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">eslint.config.mjs 片段</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">jsdocPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-jsdoc'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：JSDoc 注释</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 5.1 可选：JSDoc 注释规范</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'**/*.{js,ts,jsx,tsx}'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">jsdoc</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> jsdocPlugin </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 基础规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-alignment'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-param-names'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-tag-names'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// 配置允许的标签</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">definedTags</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'packageDocumentation'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-types'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// TypeScript 适配规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/no-types'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-param-type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 使用 TS 类型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-returns-type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 使用 TS 类型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 文档质量规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-description'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">contexts</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'TSInterfaceDeclaration'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'TSTypeAliasDeclaration'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-jsdoc'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">require</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">FunctionDeclaration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">MethodDefinition</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">ClassDeclaration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
</li>
<li class=""><code>eslint-config-prettier </code> 关闭所有不必要的规则或可能与 <code>Prettier</code> 冲突的规则<!-- -->
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">eslint.config.mjs 片段</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">prettierConfig</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-config-prettier'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：关闭 Prettier 冲突规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 关闭 Prettier 冲突规则（必须，用 Prettier 时）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  prettierConfig</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须放在最后</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
</li>
<li class=""><code>typescript-eslint</code> 工具可以让你在 ESLint 上使用 TypeScript<!-- -->
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">eslint.config.mjs 片段</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">tseslint</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'typescript-eslint'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：TypeScript 支持</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// TypeScript 配置（必须）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">tseslint</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">configs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">recommended</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">config</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'src/**/*.{ts,tsx}'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">languageOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">languageOptions</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">globals</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">browser</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">node</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">es2025</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 浏览器 + Node +  ES2025 全局</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">parserOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">languageOptions</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">parserOptions</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">tsconfigRootDir</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">meta</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dirname</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ESM 获取当前配置目录</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">project</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 类型感知规则，或者指定实际的 tsconfig.json</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">ecmaVersion</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'latest'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">sourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'module'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">ecmaFeatures</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">jsx</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 开启JSX解析，适配React</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// TS 核心规则（示例）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'@typescript-eslint/no-explicit-any'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'@typescript-eslint/no-unused-vars'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">argsIgnorePattern</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'^_'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'@typescript-eslint/prefer-nullish-coalescing'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
</li>
<li class=""><a href="https://zh-hans.react.dev/" target="_blank" rel="noopener noreferrer" class="">react</a> 用：<!-- -->
<ul>
<li class=""><code>eslint-plugin-react</code> <a href="https://zh-hans.react.dev/" target="_blank" rel="noopener noreferrer" class="">React</a> 核心规则（组件规范、Props 校验、 jSX 最佳实践），用于 <a href="https://zh-hans.react.dev/" target="_blank" rel="noopener noreferrer" class="">React</a> 含 JSX 项目</li>
<li class=""><code>eslint-plugin-react-hooks</code> <a href="https://zh-hans.react.dev/" target="_blank" rel="noopener noreferrer" class="">React</a> Hooks 规则（如 <code>useState</code>/<code>useEffect</code> 依赖数组校验），用于使用 Hooks 的 <a href="https://zh-hans.react.dev/" target="_blank" rel="noopener noreferrer" class="">React</a> 的项目</li>
</ul>
</li>
<li class=""><a href="https://nextjs.org/" target="_blank" rel="noopener noreferrer" class="">next.js</a> 用<!-- -->
<ul>
<li class=""><code>eslint-plugin-next</code> <a href="https://nextjs.org/" target="_blank" rel="noopener noreferrer" class="">Next.js</a>专用规则（路由、SSR、Image 组件优化），用于 <a href="https://nextjs.org/" target="_blank" rel="noopener noreferrer" class="">Next.js</a> 全栈项目</li>
</ul>
</li>
<li class=""><a href="https://angular.dev/" target="_blank" rel="noopener noreferrer" class="">angular</a> 用<!-- -->
<ul>
<li class=""><code>eslint-plugin-angular</code> <a href="https://angular.dev/" target="_blank" rel="noopener noreferrer" class="">Angular</a> 规则（组件、服务、 RxJS 最佳实践），用于 AngularJS/<a href="https://angular.dev/" target="_blank" rel="noopener noreferrer" class="">Angular</a> 项目</li>
</ul>
</li>
<li class=""><a href="https://cn.vuejs.org/" target="_blank" rel="noopener noreferrer" class="">vue</a> 用<!-- -->
<ul>
<li class=""><code>eslint-plugin-vue</code> <a href="https://cn.vuejs.org/" target="_blank" rel="noopener noreferrer" class="">Vue</a> 单文件组件（ SFC ）规则（模版语法、 Composition API 、 选项式 API ）</li>
</ul>
</li>
<li class=""><a href="https://nuxt.com/" target="_blank" rel="noopener noreferrer" class="">Nuxt</a> 用<!-- -->
<ul>
<li class=""><code>eslint-plugin-nuxt</code> <a href="https://nuxt.com/" target="_blank" rel="noopener noreferrer" class="">Nuxt</a> 专用规则（页面/组件结构、中间件、 SEO ）</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="二代码质量与最佳实践">二、代码质量与最佳实践<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#%E4%BA%8C%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F%E4%B8%8E%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5" class="hash-link" aria-label="二、代码质量与最佳实践的直接链接" title="二、代码质量与最佳实践的直接链接" translate="no">​</a></h2>
<p>提升代码健壮性、可读性和现代 JS/TS 实践的工具。</p>
<ul>
<li class=""><code>eslint-plugin-promise</code> Promise 规范（错误捕获、链式调用、async/await 最佳实践），用于 <strong>异步代码较多的项目</strong></li>
<li class=""><code>eslint-plugin-sonarjs</code> SonarQube 代码质量检测（重复代码、复杂逻辑、潜在 Bug），用于 <strong>企业级项目（代码审计）</strong></li>
<li class=""><code>eslint-plugin-optimize-regex</code> 正则表达式性能优化（避免回溯陷阱），用于 <strong>大量使用正则的项目</strong></li>
<li class=""><code>eslint-plugin-unicorn</code> 现代 JS/TS 最佳实践（空白值处理、性能优化、错误处理），用于 <strong>所有 JS/TS 项目</strong></li>
<li class=""><code>eslint-plugin-no-use-extend-native</code> 禁止扩展原生对象（如 Array.prototype），用于 <strong>避免污染全局环境</strong></li>
<li class=""><code>eslint-plugin-functional</code> 函数式编程规范（纯函数、不可变数据、避免副作用），用于 <strong>函数式编程风格项目</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="三导入与模块管理">三、导入与模块管理<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#%E4%B8%89%E5%AF%BC%E5%85%A5%E4%B8%8E%E6%A8%A1%E5%9D%97%E7%AE%A1%E7%90%86" class="hash-link" aria-label="三、导入与模块管理的直接链接" title="三、导入与模块管理的直接链接" translate="no">​</a></h2>
<p>处理模块导入/导出的规范性（排序、路径别名、循环依赖等）。</p>
<ul>
<li class=""><code>eslint-plugin-import</code> 导入导出规范（排序、路径别名校验、禁止循环依赖、Node.js 模块解析），用于 <strong>所有模块化项目（必装）</strong></li>
<li class=""><code>eslint-plugin-simple-import-sort</code> 简化导入分组排序（自动按类型分组：内置模块、第三方、本地），用于 <strong>替代 import/order的轻量方案</strong></li>
<li class=""><code>eslint-plugin-alias</code> 路径别名校验（如 @/components是否指向正确目录），用于 <strong>使用 Webpack/Vite 别名配置的项目</strong></li>
<li class=""><code>eslint-plugin-unused-imports</code> <strong>自动修复</strong> 未使用的 imports （尤其是适合 TS 项目，因为 TS 默认不报 <code>unused import</code> ）</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="四测试框架专用插件">四、测试框架专用插件<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#%E5%9B%9B%E6%B5%8B%E8%AF%95%E6%A1%86%E6%9E%B6%E4%B8%93%E7%94%A8%E6%8F%92%E4%BB%B6" class="hash-link" aria-label="四、测试框架专用插件的直接链接" title="四、测试框架专用插件的直接链接" translate="no">​</a></h2>
<p>针对测试代码的规则集，确保测试用例质量。</p>
<ul>
<li class=""><code>eslint-plugin-jest</code> Jest 测试规则（用例命名、断言规范、Mock 函数使用），用于 <strong>Jest 单元测试项目</strong></li>
<li class=""><code>eslint-plugin-mocha</code> Mocha 测试规则（钩子函数使用、异步测试规范），用于 <strong>Mocha + Chai 测试项目</strong></li>
<li class=""><code>eslint-plugin-cypress</code> Cypress 端到端测试规则（命令链、元素定位最佳实践），用于 <strong>Cypress E2E 测试项目</strong></li>
<li class=""><code>eslint-plugin-testing-library</code> Testing Library 规则（优先用 DOM 查询而非 test-id），用于 **
<a href="https://zh-hans.react.dev/" target="_blank" rel="noopener noreferrer" class="">React</a>/<a href="https://cn.vuejs.org/" target="_blank" rel="noopener noreferrer" class="">Vue</a> 组件测试（Testing Library）**</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="五安全与隐私保护">五、安全与隐私保护<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#%E4%BA%94%E5%AE%89%E5%85%A8%E4%B8%8E%E9%9A%90%E7%A7%81%E4%BF%9D%E6%8A%A4" class="hash-link" aria-label="五、安全与隐私保护的直接链接" title="五、安全与隐私保护的直接链接" translate="no">​</a></h2>
<p>检测代码中的安全风险（如硬编码密钥、XSS 漏洞）。</p>
<ul>
<li class=""><code>eslint-plugin-security</code> 常见安全漏洞（XSS、SQL 注入、不安全的加密算法），用于 <strong>处理用户输入或后端交互的项目</strong></li>
<li class=""><code>eslint-plugin-no-secrets</code> 禁止提交敏感信息（API 密钥、密码、令牌），用于 **
所有开源/协作项目（防泄露）**</li>
<li class=""><code>eslint-plugin-csp</code> 内容安全策略（CSP）违规检测（如不安全的内联脚本），用于 <strong>注重安全的 Web 项目</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="六样式与格式非-prettier">六、样式与格式（非 Prettier）<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#%E5%85%AD%E6%A0%B7%E5%BC%8F%E4%B8%8E%E6%A0%BC%E5%BC%8F%E9%9D%9E-prettier" class="hash-link" aria-label="六、样式与格式（非 Prettier）的直接链接" title="六、样式与格式（非 Prettier）的直接链接" translate="no">​</a></h2>
<p>补充代码风格规则（与 Prettier 分工：Prettier 管格式，插件管逻辑风格）。</p>
<ul>
<li class=""><code>eslint-plugin-airbnb-base</code> Airbnb 基础规则（不含 <a href="https://zh-hans.react.dev/" target="_blank" rel="noopener noreferrer" class="">React</a> ，聚焦 JS 最佳实践），用于 <strong>喜欢 Airbnb 风格的非 <a href="https://zh-hans.react.dev/" target="_blank" rel="noopener noreferrer" class="">React</a> 项目</strong></li>
<li class=""><code>eslint-plugin-airbnb</code> Airbnb 完整规则（含 <a href="https://zh-hans.react.dev/" target="_blank" rel="noopener noreferrer" class="">React</a> ） ，用于 **
Airbnb 风格 <a href="https://zh-hans.react.dev/" target="_blank" rel="noopener noreferrer" class="">React</a> 项目**</li>
<li class=""><code>eslint-plugin-standard</code> Standard 风格（无分号、单引号、缩进 2 空格），用于 <strong>遵循 Standard 规范的项目</strong></li>
<li class=""><code>eslint-plugin-superic</code> 严格的代码风格（强制类型注解、禁止隐式转换），用于 <strong>强类型偏好项目</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="七特定文件类型支持">七、特定文件类型支持<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#%E4%B8%83%E7%89%B9%E5%AE%9A%E6%96%87%E4%BB%B6%E7%B1%BB%E5%9E%8B%E6%94%AF%E6%8C%81" class="hash-link" aria-label="七、特定文件类型支持的直接链接" title="七、特定文件类型支持的直接链接" translate="no">​</a></h2>
<p>处理非 JS/TS 文件的 ESLint 校验（如 JSON、Markdown、HTML）。</p>
<ul>
<li class=""><code>eslint-plugin-jsonc</code> 校验 JSON/JSONC（带注释的 JSON）文件，用于 <strong>配置文件（tsconfig.json、package.json）</strong></li>
<li class=""><code>eslint-plugin-yaml</code> 校验 YAML 文件（如 GitHub Actions、Docker Compose），用于 <strong>DevOps 配置文件</strong></li>
<li class=""><code>eslint-plugin-html</code> 校验 HTML 中的内联 JS 代码，用于 <strong>传统 HTML 项目（含 <code>&lt;script&gt;</code> 标签）</strong></li>
<li class=""><code>eslint-plugin-markdown</code> 校验 Markdown 中的代码块（JS/TS/React 等），用于 <strong>技术文档（含代码示例）</strong></li>
<li class=""><code>eslint-plugin-toml</code> 校验 TOML 文件（如 Rust Cargo.toml、Python pyproject.toml），用于 <strong>多语言项目配置</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="八nodejs-与环境适配">八、Node.js 与环境适配<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#%E5%85%ABnodejs-%E4%B8%8E%E7%8E%AF%E5%A2%83%E9%80%82%E9%85%8D" class="hash-link" aria-label="八、Node.js 与环境适配的直接链接" title="八、Node.js 与环境适配的直接链接" translate="no">​</a></h2>
<p>针对 Node.js 运行时或特定环境的规则。</p>
<ul>
<li class=""><code>eslint-plugin-node</code> Node.js 环境规则（模块导入、全局变量、process 使用），用于 <strong>Node.js 后端项目</strong></li>
<li class=""><code>eslint-plugin-compat</code> 浏览器兼容性检查（基于 caniuse 数据），用于 <strong>跨浏览器 Web 项目</strong></li>
<li class=""><code>eslint-plugin-eslint-comments</code> 校验 ESLint 注释（如 <code>/* eslint-disable */</code> 的滥用），用于 <strong>规范 ESLint 注释使用</strong></li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_svZc alert alert--secondary"><div class="admonitionHeading_UBwC"><span class="admonitionIcon__uit"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span><code>eslint-plugin-node</code> 已不再维护</div><div class="admonitionContent_Zh57"><p>现在由 <code>eslint-plugin-n</code> 从 eslint-plugin-node v1.1.0 分支而来</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="九正则与表达式">九、正则与表达式<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#%E4%B9%9D%E6%AD%A3%E5%88%99%E4%B8%8E%E8%A1%A8%E8%BE%BE%E5%BC%8F" class="hash-link" aria-label="九、正则与表达式的直接链接" title="九、正则与表达式的直接链接" translate="no">​</a></h2>
<p>专门优化正则表达式的规则。</p>
<ul>
<li class=""><code>eslint-plugin-regexp</code> 正则表达式语法校验、性能优化（避免灾难性回溯）、可读性提升，用于 <strong>大量使用正则的项目（如表单验证）</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="十实用小工具插件">十、实用小工具插件<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#%E5%8D%81%E5%AE%9E%E7%94%A8%E5%B0%8F%E5%B7%A5%E5%85%B7%E6%8F%92%E4%BB%B6" class="hash-link" aria-label="十、实用小工具插件的直接链接" title="十、实用小工具插件的直接链接" translate="no">​</a></h2>
<p>解决特定痛点的轻量插件。</p>
<ul>
<li class=""><code>eslint-plugin-enforce-module-boundaries</code> 模块边界检查（禁止跨层引用，如 UI 组件直接调用 API 层），用于 <strong>分层架构项目（DDD、Clean Architecture）</strong></li>
<li class=""><code>eslint-plugin-boundaries</code> 强制模块边界（如 <code>/api</code> 不能直接调用 <code>/ui</code>），适用于 <strong>大型 Monorepo 架构</strong></li>
<li class=""><code>eslint-plugin-deprecation</code> 标记已弃用的 API 使用（结合 JSDoc @deprecated），维护老项目或迭代频繁的代码库</li>
<li class=""><code>eslint-plugin-perfectionist</code> 自动排序一切可排序的代码，比如：对象的 Key、数组项、导入语句、接口的属性、枚举值、甚至是 CSS 类名，支持 TS/JS/JSON/Vue/React ，规则及其灵活。适用于 <strong>强迫症晚期患者</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="十一触发模式">十一、触发模式<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#%E5%8D%81%E4%B8%80%E8%A7%A6%E5%8F%91%E6%A8%A1%E5%BC%8F" class="hash-link" aria-label="十一、触发模式的直接链接" title="十一、触发模式的直接链接" translate="no">​</a></h2>
<p>在 VSCode 中（因为我用的是 VsCode ，别的没用过）使用 ESLint 时， <strong>自动修复（保存时应用）</strong> 和 <strong>手动执行 eslint --fix 是两种不同的触发模式</strong> ，具体取决于 VSCode 设置和 ESLint 规则的支持情况。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-默认行为">1. 默认行为<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#1-%E9%BB%98%E8%AE%A4%E8%A1%8C%E4%B8%BA" class="hash-link" aria-label="1. 默认行为的直接链接" title="1. 默认行为的直接链接" translate="no">​</a></h3>
<p>VSCode 不会自动修复 ESLint 错误，需手动执行 <code>eslint --fix</code> 或在 VSCode 中配置 **保存时自动触发修复。自动修复触发条件：</p>
<ul>
<li class="">VSCode 安装了 <a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" target="_blank" rel="noopener noreferrer" class="">ESLint 扩展</a></li>
<li class="">在 VSCode 中设置启用 「保存时自动修复规则」（通过 <code>editor.codeActionsOnSave</code> 设置）</li>
<li class="">ESLint 规则本身支持 <code>--fix</code> （大部分规则支持，少数需要手动修复）</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-配置-vscode-保存时自动修复-eslint">2. 配置 VSCode 保存时自动修复 ESLint<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#2-%E9%85%8D%E7%BD%AE-vscode-%E4%BF%9D%E5%AD%98%E6%97%B6%E8%87%AA%E5%8A%A8%E4%BF%AE%E5%A4%8D-eslint" class="hash-link" aria-label="2. 配置 VSCode 保存时自动修复 ESLint的直接链接" title="2. 配置 VSCode 保存时自动修复 ESLint的直接链接" translate="no">​</a></h3>
<ul>
<li class="">安装 VSCode ESLint 扩展</li>
<li class="">配置 VSCode 自动修复<!-- -->
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">.vscode/setting.json（工作区配置，优先推荐）</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 保存时自动修复 ESLint 可修复的问题</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"editor.codeActionsOnSave"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"source.fixAll.eslint"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ✅ 核心配置：保存时触发 ESLint 修复</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 确保 ESLint 处理 TypeScript/JSX 文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"eslint.validate"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"javascript"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"javascriptreact"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"typescript"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"typescriptreact"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：禁用 Vetur/Volar 的内置格式化（避免与 ESLint 冲突）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"vetur.format.defaultFormatter.js"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"none"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"volar.formatting.enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：与 Prettier 配合（若使用 Prettier 格式化）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"prettier.enable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"eslint.format.enable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 禁用 ESLint 格式化，交给 Prettier</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"editor.defaultFormatter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"esbenp.prettier-vscode"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 默认用 Prettier 格式化</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
</li>
<li class=""><strong>原理说明</strong> ：<!-- -->
<ul>
<li class=""><code>source.fixAll.eslint: true</code> ： 告诉 VSCode 在保存文件时，自动对可修复的 ESLint 错误执行 <code>eslint --fix</code></li>
<li class=""><code>eslint.validate</code> : 指定 ESLint 需要处理的文件类型（确保 TS/TSX/JS/JSX 被覆盖）</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="3-手动执行-eslint---fix-备用方案">3. 手动执行 eslint --fix （备用方案）<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#3-%E6%89%8B%E5%8A%A8%E6%89%A7%E8%A1%8C-eslint---fix-%E5%A4%87%E7%94%A8%E6%96%B9%E6%A1%88" class="hash-link" aria-label="3. 手动执行 eslint --fix （备用方案）的直接链接" title="3. 手动执行 eslint --fix （备用方案）的直接链接" translate="no">​</a></h3>
<p>如果不想配置自动修复，或需要批量修复文件，可在终端执行命令：</p>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic"># 修复单个文件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">npx eslint </span><span class="token parameter variable" style="color:#36acaa">--fix</span><span class="token plain"> src/components/Button.tsx</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 修复整个项目</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">npx eslint </span><span class="token parameter variable" style="color:#36acaa">--fix</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"src/**/*.{js,jsx,ts,tsx}"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 按你的文件模式调整</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 添加到 package.json 脚本（便捷执行）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># {</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#   "scripts": {</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#     "lint": "eslint . --ext .js,.jsx,.ts,.tsx",</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#     "lint:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix"  // ✅ 一键修复</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#   }</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># }</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> run lint:fix</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="4-注意事项">4. 注意事项<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#4-%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9" class="hash-link" aria-label="4. 注意事项的直接链接" title="4. 注意事项的直接链接" translate="no">​</a></h3>
<ul>
<li class="">并非所有的规则都支持自动修复，ESLint 规则分为「可自动修复」和 「需手动修复」两类：<!-- -->
<ul>
<li class=""><strong>可自动修复</strong> ： 如缩进、引号、分号、未使用变量等（规则名通常带 fixable 标记）</li>
<li class=""><strong>需手动修复</strong> ： 如逻辑错误（ no-unsafe-assignment ）、类型问题（ @typescript-eslint/no-explicit-any ）等</li>
</ul>
</li>
<li class="">可以通过 <code>eslint --fix-dry-run</code> 预览修复效果<!-- -->
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">npx eslint --fix-dry-run src/App.tsx </span><span class="token comment" style="color:#999988;font-style:italic"># 模拟修复，不实际修改文件</span></span><br></div></code></pre></div></div>
</li>
<li class="">与 <code>Prettier</code> 的配合（避免冲突）<!-- -->
<ul>
<li class="">若同时使用 Prettier 格式化， <strong>必须安装 <code>eslint-config-prettier</code></strong> ，它会关闭 ESLint 中与 Prettier 冲突的规则（如缩进、引号）</li>
<li class="">VSCode 中建议配置： <strong>Prettier 负责格式化，ESLint 负责代码质量</strong> ，通过 <code>editor.defaultFormatter</code>指定 Prettier 为默认格式化工具，ESLint 仅做修复</li>
</ul>
</li>
<li class="">自动修复不生效的常见原因：<!-- -->
<ul>
<li class=""><strong>VSCode 未启用自动修复</strong> ：检查 <code>editor.codeActionsOnSave.source.fixAll.eslint</code> 是否为 <code>true</code></li>
<li class=""><strong>ESLint 扩展未激活</strong> ：打开 VSCode 输出面板（Ctrl+Shift+U），选择「ESLint」，查看是否有报错（如依赖缺失、配置错误）</li>
<li class=""><strong>文件未被 ESLint 处理</strong> ：检查 eslint.validate是否包含你的文件类型（如 .tsx）</li>
<li class=""><strong>规则不支持修复</strong> ：部分规则（如 @typescript-eslint/explicit-function-return-type）需手动添加返回类型</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="十二简单示意">十二、简单示意<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#%E5%8D%81%E4%BA%8C%E7%AE%80%E5%8D%95%E7%A4%BA%E6%84%8F" class="hash-link" aria-label="十二、简单示意的直接链接" title="十二、简单示意的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-安装">1. 安装<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#1-%E5%AE%89%E8%A3%85" class="hash-link" aria-label="1. 安装的直接链接" title="1. 安装的直接链接" translate="no">​</a></h3>
<div class="theme-tabs-container tabs-container tabList_GGXe"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_QOjA">react 全依赖版</li><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_QOjA tabs__item--active">react 无可选依赖</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_QOjA">库模式</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_bPac" hidden=""><div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-D</span><span class="token plain"> @eslint/js eslint-plugin-jsdoc eslint-config-prettier </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    typescript-eslint eslint-plugin-unicorn eslint-plugin-promise </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    eslint-plugin-no-use-extend-native eslint-plugin-import eslint-import-resolver-typescript </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    eslint-plugin-alias eslint-plugin-unused-imports eslint-plugin-jsonc eslint-plugin-markdown </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    eslint-plugin-perfectionist eslint prettier </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    eslint-plugin-react eslint-plugin-react-hooks</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_bPac"><div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-D</span><span class="token plain"> @eslint/js eslint-plugin-jsdoc eslint-config-prettier </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    typescript-eslint eslint-plugin-promise eslint-import-resolver-typescript </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    eslint-plugin-import eslint-plugin-unused-imports eslint-plugin-jsonc eslint </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    prettier eslint-plugin-react eslint-plugin-react-hooks</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_bPac" hidden=""><div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-D</span><span class="token plain"> @eslint/js eslint-plugin-jsdoc eslint-config-prettier </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    typescript-eslint eslint-plugin-promise eslint-plugin-import </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    eslint-import-resolver-typescript eslint-plugin-unused-imports </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    eslint-plugin-jsonc eslint prettier</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-配置信息">2. 配置信息<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#2-%E9%85%8D%E7%BD%AE%E4%BF%A1%E6%81%AF" class="hash-link" aria-label="2. 配置信息的直接链接" title="2. 配置信息的直接链接" translate="no">​</a></h3>
<div class="theme-tabs-container tabs-container tabList_GGXe"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_QOjA">react 全依赖版</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_QOjA">react 无可选依赖</li><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_QOjA tabs__item--active">库模式</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_bPac" hidden=""><div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">eslint.config.mjs</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// eslint.config.mjs（ESM 格式）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">globals</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'globals'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 全局变量（非插件，必备）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">js</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@eslint/js'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：核心推荐规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">tseslint</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'typescript-eslint'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：TypeScript 支持</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">reactPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-react'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：React 规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">reactHooksPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-react-hooks'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：React Hooks 规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">importPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-import'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：导入导出规范</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">prettierConfig</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-config-prettier'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：关闭 Prettier 冲突规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 可选插件（按需启用）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">jsdocPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-jsdoc'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：JSDoc 注释</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">unicornPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-unicorn'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：现代 JS/TS 最佳实践</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">noExtendNativePlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-no-use-extend-native'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：禁止扩展原生对象</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">unusedImportsPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-unused-imports'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：删除未使用导入</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">jsoncPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-jsonc'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：校验 JSON/JSONC</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">markdownPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-markdown'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：校验 Markdown 代码块</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">perfectionistPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-perfectionist'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：排序导入/属性</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">promisePlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-promise'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：Promise 规范</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">mdxPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-mdx'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：Mdx 规范</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">mdxParser</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@mdx-js/eslint-parser'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选： Mdx 解析</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> dirname</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> resolve </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'node:path'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> fileURLToPath </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'node:url'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> __dirname </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">dirname</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">fileURLToPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">meta</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> tsconfigPath </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">resolve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__dirname</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'tsconfig.json'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ignorePattern </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'**/node_modules/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'dist/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'build/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'coverage/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'lib/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'es/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'**/test/**'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 匹配任何目录下的 test 目录</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'**/*.test.ts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 匹配任何目标下的 .test.ts 文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'**/*.spec.ts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 匹配 .spec.ts 文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'**/*.min.js'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'pnpm-lock.yaml'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'package-lock.json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'yarn.lock'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'.docusaurus'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'.wrangler'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 0. 忽略文件配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">ignores</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ignorePattern</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 优先配置忽略规则，提升配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 1. 基础配置（所有文件通用）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  js</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">configs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">recommended</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：ESLint 核心推荐规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">languageOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">globals</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">browser</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 浏览器全局变量</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">node</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Node.js 全局变量</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 2. TypeScript 配置（必须）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">tseslint</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">configs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">recommended</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">config</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'src/**/*.{ts,tsx}'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 按需配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">languageOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">languageOptions</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">globals</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">browser</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">node</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">es2025</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 浏览器 + Node +  ES2025 全局</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// parser: tseslint.parser, // 显式指定 TS 解析器，解决接口不匹配</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">parserOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">languageOptions</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">parserOptions</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">tsconfigRootDir</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> __dirname</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ESM 获取当前配置目录</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">project</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">tsconfigPath</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 类型感知规则，或者指定实际的 tsconfig.json</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">ecmaVersion</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'latest'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">sourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'module'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">ecmaFeatures</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">jsx</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 开启JSX解析，适配React</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugin</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">plugin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 需要搭配安装 eslint-import-resolver-typescript</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword module" style="color:#00009f">import</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> importPlugin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'unused-imports'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> unusedImportsPlugin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 内置未使用导入插件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">settings</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/parsers'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-property property" style="color:#36acaa">'@typescript-eslint/parser'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'.ts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.tsx'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/resolver'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">typescript</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">project</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> tsconfigPath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">alwaysTryTypes</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">node</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 兜底 node 解析器，兼容 commonjs/esm 混合模块</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 原生规则对 TS 语法支持极差，必须关闭</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'no-unused-vars'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'@typescript-eslint/no-unused-vars'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">vars</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'all'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">args</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'after-used'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">argsIgnorePattern</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'^_'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">varsIgnorePattern</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'^_'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'@typescript-eslint/consistent-type-imports'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">prefer</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'type-imports'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">disallowTypeAnnotations</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 禁用 在单个 import 中混合值与类型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">fixStyle</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'separate-type-imports'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/order'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">groups</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'builtin'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'external'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'internal'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'parent'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'sibling'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'index'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">alphabetize</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">order</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'asc'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">caseInsensitive</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/no-duplicates'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/no-cycle'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 未使用的导入规则， error 强制级别删除，联动 ts-eslint 规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'unused-imports/no-unused-imports'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'unused-imports/no-unused-vars'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 与 '@typescript-eslint/no-unused-vars' 冲突</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'@typescript-eslint/prefer-nullish-coalescing'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 3. React 配置（必须，React 项目）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'**/*.{jsx,tsx}'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 处理 JSX/TSX 文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">languageOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">parserOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">ecmaFeatures</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">jsx</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 启用 JSX</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">settings</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">react</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">version</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'detect'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 自动检测 React 版本</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">react</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> reactPlugin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：注册 React 插件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'react-hooks'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> reactHooksPlugin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：注册 Hooks 插件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// React 核心规则（必须）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'react/react-in-jsx-scope'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// React 17+ 无需手动引入 React</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'react/prop-types'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 用 TS 类型代替 PropTypes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// Hooks 规则（必须）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'react-hooks/rules-of-hooks'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'react-hooks/exhaustive-deps'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 4. 可选插件配置（按需启用）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 4.1 可选：JSDoc 注释规范</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  jsdocPlugin</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">configs</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'flat/recommended'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'**/*.{js,ts,jsx,tsx}'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">jsdoc</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> jsdocPlugin </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 基础规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-alignment'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-param'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-param-names'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-tag-names'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// 配置允许的标签</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">definedTags</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'packageDocumentation'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'lastModified'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-types'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// TypeScript 适配规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/no-types'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-param-type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 使用 TS 类型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-returns-type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 使用 TS 类型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 文档质量规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-description'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">contexts</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'TSInterfaceDeclaration'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'TSTypeAliasDeclaration'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-jsdoc'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">require</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">FunctionDeclaration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">MethodDefinition</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">ClassDeclaration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// settings: {</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//   jsdoc: {</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//   // 用于配置首选项别名设置一个 JSDoc 标签</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//     tagNamePreference: {</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//       // eg.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//       // "param": "arg",</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//       // "returns": "return",</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//       // todo: false, // 禁用 todo</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//       // todo: "禁用原因", // 禁用 todo ，并展示友好原因</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//     },</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//   },</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// },</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 5.2 可选：现代 JS/TS 最佳实践（unicorn）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'**/*.{js,ts,jsx,tsx}'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">unicorn</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> unicornPlugin </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'unicorn/prefer-array-find'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 用 find 替代 filter+[0]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'unicorn/no-null'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 避免显式 null</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 5.3 可选：禁止扩展原生对象</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">'no-use-extend-native'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> noExtendNativePlugin </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">'no-use-extend-native/no-use-extend-native'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 5.4 可选：校验 JSON/JSONC 文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'**/*.json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'**/*.jsonc'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">jsonc</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> jsoncPlugin </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">'jsonc/comma-dangle'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'never'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// JSON 禁止尾随逗号</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 5.5 可选：校验 Markdown 代码块</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'**/*.md'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">markdown</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> markdownPlugin </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">Processor</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'markdown/markdown'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 使用 markdown 处理提取代码块</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'markdown/remark'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'no-console'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 用 remark 校验代码块</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 5.6 可选：校验 mdx 代码块</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'**/*.mdx'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 处理 .mdx 文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">languageOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">parser</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> mdxParser</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 使用 MDX 解析器</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">parserOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">ecmaFeatures</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">jsx</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 启用 JSX</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">extraFileExtensions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'.mdx'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 声明 MDX 扩展名</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">mdx</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> mdxPlugin </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'mdx/no-jsx-html-comments'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// MDX 专用规则（禁止 HTML 注释）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 5.7 可选：排序导入/属性（perfectionist）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">perfectionist</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> perfectionistPlugin </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'perfectionist/sort-imports'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'natural'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 自然排序导入</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'perfectionist/sort-objects'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 排序对象属性</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 5.8 可选：Promise 规范（promise）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">promise</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> promisePlugin </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'promise/always-return'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Promise 必须返回</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'promise/no-return-wrap'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 禁止用 Promise.resolve 包裹</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 6. 关闭 Prettier 冲突规则（必须，用 Prettier 时）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  prettierConfig</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_bPac" hidden=""><div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">eslint.config.mjs</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// eslint.config.mjs（ESM 格式）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">globals</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'globals'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 全局变量（非插件，必备）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">js</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@eslint/js'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：核心推荐规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">tseslint</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'typescript-eslint'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：TypeScript 支持</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">reactPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-react'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：React 规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">reactHooksPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-react-hooks'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：React Hooks 规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">importPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-import'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：导入导出规范</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">prettierConfig</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-config-prettier'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：关闭 Prettier 冲突规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 可选插件（按需启用）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">jsdocPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-jsdoc'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：JSDoc 注释</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">unusedImportsPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-unused-imports'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：删除未使用导入</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">promisePlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-promise'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：Promise 规范</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> dirname</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> resolve </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'node:path'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> fileURLToPath </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'node:url'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> __dirname </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">dirname</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">fileURLToPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">meta</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> tsconfigPath </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">resolve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__dirname</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'tsconfig.json'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ignorePattern </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'node_modules/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'dist/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'build/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'coverage/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'lib/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'es/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'**/test/**'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 匹配任何目录下的 test 目录</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'**/*.test.ts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 匹配任何目标下的 .test.ts 文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'**/*.spec.ts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 匹配 .spec.ts 文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'**/*.min.js'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'pnpm-lock.yaml'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'package-lock.json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'yarn.lock'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'.docusaurus'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'.wrangler'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 0. 忽略文件配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">ignores</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ignorePattern</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 优先配置忽略规则，提升性能</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 1. 基础配置（所有文件通用）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  js</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">configs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">recommended</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：ESLint 核心推荐规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">languageOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">globals</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">browser</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 浏览器全局变量</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">node</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Node.js 全局变量</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 2. TypeScript 配置（必须）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">tseslint</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">configs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">recommended</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">config</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'src/**/*.{ts,tsx}'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 按需配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">languageOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">languageOptions</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">globals</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">browser</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">node</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">es2025</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 浏览器 + Node +  ES2025 全局</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// parser: tseslint.parser, // 显式指定 TS 解析器，解决接口不匹配</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">parserOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">languageOptions</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">parserOptions</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">tsconfigRootDir</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> __dirname</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ESM 获取当前配置目录</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">project</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">tsconfigPath</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 类型感知</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">ecmaVersion</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'latest'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">sourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'module'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">ecmaFeatures</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">jsx</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 开启JSX解析，适配React</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">plugins</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 需要搭配安装 eslint-import-resolver-typescript</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword module" style="color:#00009f">import</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> importPlugin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'unused-imports'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> unusedImportsPlugin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 内置未使用导入插件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">settings</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/parsers'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-property property" style="color:#36acaa">'@typescript-eslint/parser'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'.ts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.tsx'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/resolver'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">typescript</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">project</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> tsconfigPath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">alwaysTryTypes</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">node</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 兜底 node 解析器，兼容 commonjs/esm 混合模块</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 原生规则对 TS 语法支持极差，必须关闭</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'no-unused-vars'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'@typescript-eslint/no-unused-vars'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">vars</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'all'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">args</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'after-used'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">argsIgnorePattern</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'^_'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">varsIgnorePattern</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'^_'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'@typescript-eslint/consistent-type-imports'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">prefer</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'type-imports'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">disallowTypeAnnotations</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 禁用 在单个 import 中混合值与类型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">fixStyle</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'separate-type-imports'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/order'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">groups</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'builtin'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'external'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'internal'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'parent'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'sibling'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'index'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">alphabetize</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">order</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'asc'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">caseInsensitive</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/no-duplicates'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/no-cycle'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 未使用的导入扶着， error 强制级别删除，联动 ts-eslint 规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'unused-imports/no-unused-imports'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'unused-imports/no-unused-vars'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 与 '@typescript-eslint/no-unused-vars' 冲突</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 3. React 配置（必须，React 项目）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'**/*.{jsx,tsx}'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 处理 JSX/TSX 文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">languageOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">parserOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">ecmaFeatures</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">jsx</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 启用 JSX</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">settings</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">react</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">version</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'detect'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 自动检测 React 版本</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">react</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> reactPlugin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：注册 React 插件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'react-hooks'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> reactHooksPlugin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：注册 Hooks 插件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// React 核心规则（必须）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'react/react-in-jsx-scope'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// React 17+ 无需手动引入 React</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'react/prop-types'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 用 TS 类型代替 PropTypes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// Hooks 规则（必须）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'react-hooks/rules-of-hooks'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'react-hooks/exhaustive-deps'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 4. 可选插件配置（按需启用）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 4.1 可选：JSDoc 注释规范</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'**/*.{js,ts,jsx,tsx}'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">jsdoc</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> jsdocPlugin </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 基础规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-alignment'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-param'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-param-names'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-tag-names'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// 配置允许的标签</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">definedTags</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'packageDocumentation'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'lastModified'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-types'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// TypeScript 适配规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/no-types'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-param-type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 使用 TS 类型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-returns-type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 使用 TS 类型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 文档质量规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-description'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">contexts</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'TSInterfaceDeclaration'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'TSTypeAliasDeclaration'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-jsdoc'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">require</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">FunctionDeclaration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">MethodDefinition</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">ClassDeclaration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// settings: {</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//   jsdoc: {</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//   // 用于配置首选项别名设置一个 JSDoc 标签</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//     tagNamePreference: {</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//       // eg.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//       // "param": "arg",</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//       // "returns": "return",</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//       // todo: false, // 禁用 todo</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//       // todo: "禁用原因", // 禁用 todo ，并展示友好原因</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//     },</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//   },</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// },</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 4.2 可选：Promise 规范（promise）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">promise</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> promisePlugin </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'promise/always-return'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Promise 必须返回</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'promise/no-return-wrap'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 禁止用 Promise.resolve 包裹</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 5. 关闭 Prettier 冲突规则（必须，用 Prettier 时）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  prettierConfig</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_bPac"><div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">eslint.config.mjs</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// eslint.config.mjs（ESM 格式）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">globals</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'globals'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 全局变量（非插件，必备）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">js</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@eslint/js'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：核心推荐规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">tseslint</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'typescript-eslint'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：TypeScript 支持</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">importPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-import'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：导入导出规范</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">prettierConfig</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-config-prettier'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：关闭 Prettier 冲突规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 可选插件（按需启用）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">jsdocPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-jsdoc'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：JSDoc 注释</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">unusedImportsPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'eslint-plugin-unused-imports'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 可选：删除未使用导入</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> dirname</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> resolve </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'node:path'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> fileURLToPath </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'node:url'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> __dirname </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">dirname</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">fileURLToPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">meta</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> tsconfigPath </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">resolve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__dirname</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'tsconfig.json'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ignorePattern </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'node_modules/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'dist/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'build/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'coverage/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'lib/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'es/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'**/test/**'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 匹配任何目录下的 test 目录</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'**/*.test.ts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 匹配任何目标下的 .test.ts 文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'**/*.spec.ts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 匹配 .spec.ts 文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'**/*.min.js'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'pnpm-lock.yaml'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'package-lock.json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'yarn.lock'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'.docusaurus'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'.wrangler'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 0. 忽略文件配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">ignores</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ignorePattern</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 优先配置忽略规则，提升性能</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 1. 基础配置（所有文件通用）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  js</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">configs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">recommended</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须：ESLint 核心推荐规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">languageOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">globals</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">browser</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 浏览器全局变量</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">node</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Node.js 全局变量</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 2. TypeScript 配置（必须）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">tseslint</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">configs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">recommended</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">config</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'src/**/*.{ts,tsx}'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 按需配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ignores: ignorePattern,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">languageOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">languageOptions</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">globals</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">browser</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">node</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">globals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">es2025</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 浏览器 + Node +  ES2025 全局</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// parser: tseslint.parser, // 显式指定 TS 解析器，解决接口不匹配</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">parserOptions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">languageOptions</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">parserOptions</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">tsconfigRootDir</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> __dirname</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ESM 获取当前配置目录</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">project</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">tsconfigPath</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 类型感知规则，或者指定实际的 tsconfig.json</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">ecmaVersion</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'latest'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">sourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'module'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// ecmaFeatures: { jsx: true }, // 开启JSX解析，适配React</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">config</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">plugins</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 需要搭配安装 eslint-import-resolver-typescript</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword module" style="color:#00009f">import</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> importPlugin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'unused-imports'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> unusedImportsPlugin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 内置未使用导入插件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">settings</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/parsers'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-property property" style="color:#36acaa">'@typescript-eslint/parser'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'.ts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.tsx'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/resolver'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">typescript</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">project</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> tsconfigPath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">alwaysTryTypes</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">node</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 兜底 node 解析器，兼容 commonjs/esm 混合模块</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 原生规则对 TS 语法支持极差，必须关闭</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'no-unused-vars'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'@typescript-eslint/no-unused-vars'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">vars</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'all'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">args</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'after-used'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">argsIgnorePattern</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'^_'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">varsIgnorePattern</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'^_'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'@typescript-eslint/consistent-type-imports'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">prefer</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'type-imports'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">disallowTypeAnnotations</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 禁用 在单个 import 中混合值与类型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">fixStyle</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'separate-type-imports'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/order'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">groups</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'builtin'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'external'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'internal'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'parent'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'sibling'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'index'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">alphabetize</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">order</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'asc'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">caseInsensitive</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/no-duplicates'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'import/no-cycle'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 未使用的导入规则， error 强制级别删除，联动 ts-eslint 规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'unused-imports/no-unused-imports'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'unused-imports/no-unused-vars'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 与 '@typescript-eslint/no-unused-vars' 冲突</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 3 可选：JSDoc 注释规范</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">files</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'**/*.{js,ts,jsx,tsx}'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">jsdoc</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> jsdocPlugin </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 基础规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-alignment'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-param'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-param-names'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-tag-names'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// 配置允许的标签</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">definedTags</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'packageDocumentation'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'lastModified'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/check-types'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// TypeScript 适配规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/no-types'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-param-type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 使用 TS 类型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-returns-type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 使用 TS 类型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 文档质量规则</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-description'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">contexts</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'TSInterfaceDeclaration'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'TSTypeAliasDeclaration'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'jsdoc/require-jsdoc'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'warn'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">require</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">FunctionDeclaration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">MethodDefinition</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">ClassDeclaration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// settings: {</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">//   jsdoc: {</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">//   // 用于配置首选项别名设置一个 JSDoc 标签</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">//     tagNamePreference: {</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">//       // eg.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">//       // "param": "arg",</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">//       // "returns": "return",</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">//       // todo: false, // 禁用 todo</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">//       // todo: "禁用原因", // 禁用 todo ，并展示友好原因</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">//     },</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">//   },</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 4. 关闭 Prettier 冲突规则（必须，用 Prettier 时）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  prettierConfig</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="3-安装建议">3. 安装建议<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/27/eslint%20%E6%8F%92%E4%BB%B6#3-%E5%AE%89%E8%A3%85%E5%BB%BA%E8%AE%AE" class="hash-link" aria-label="3. 安装建议的直接链接" title="3. 安装建议的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">插件</th><th style="text-align:center">是否必须？</th><th style="text-align:left">说明</th></tr></thead><tbody><tr><td style="text-align:left"><code>@eslint/js</code></td><td style="text-align:center">✅ 必须</td><td style="text-align:left">ESLint 官方 JS 推荐规则基础</td></tr><tr><td style="text-align:left"><code>typescript-eslint</code></td><td style="text-align:center">✅ TS 项目必须</td><td style="text-align:left">没它 TS 文件无法正确 lint</td></tr><tr><td style="text-align:left"><code>eslint-config-prettier</code></td><td style="text-align:center">✅ 强烈推荐</td><td style="text-align:left">避免与 Prettier 格式冲突</td></tr><tr><td style="text-align:left"><code>eslint-plugin-import</code></td><td style="text-align:center">✅ 推荐</td><td style="text-align:left">模块导入规范，大型项目必备</td></tr><tr><td style="text-align:left"><code>eslint-plugin-unused-imports</code></td><td style="text-align:center">✅ 推荐（尤其 TS）</td><td style="text-align:left">自动删未用 <code>import</code> ，提升整洁度</td></tr><tr><td style="text-align:left"><code>eslint-plugin-react + react-hooks</code></td><td style="text-align:center">⚠️ 仅 React 项目需要</td><td style="text-align:left">非 <a href="https://zh-hans.react.dev/" target="_blank" rel="noopener noreferrer" class="">React</a> 项目可移除</td></tr><tr><td style="text-align:left"><code>eslint-plugin-jsdoc</code></td><td style="text-align:center">⚠️ 按需</td><td style="text-align:left">文档驱动开发才需要，否则可关</td></tr><tr><td style="text-align:left"><code>eslint-plugin-promise</code></td><td style="text-align:center">⚠️ 按需</td><td style="text-align:left">如果项目大量用 <code>Promise</code>，建议保留</td></tr><tr><td style="text-align:left"><code>eslint-plugin-jsonc</code></td><td style="text-align:center">⚠️ 按需</td><td style="text-align:left">项目含 <code>.jsonc</code>（如 <code>tsconfig.json</code> ）才需</td></tr><tr><td style="text-align:left"><code>eslint-plugin-unicorn</code></td><td style="text-align:center">❌ 可选</td><td style="text-align:left">提供现代 JS 最佳实践，但非必需</td></tr><tr><td style="text-align:left"><code>eslint-plugin-no-use-extend-native</code></td><td style="text-align:center">❌ 可选</td><td style="text-align:left">小众，除非团队明确禁止扩展原生对象</td></tr><tr><td style="text-align:left"><code>eslint-plugin-alias</code></td><td style="text-align:center">❌ 很少用</td><td style="text-align:left">除非你用路径别名且想 lint 别名使用</td></tr><tr><td style="text-align:left"><code>eslint-plugin-markdown</code></td><td style="text-align:center">❌ 可选</td><td style="text-align:left">仅当你在 Markdown 中写代码示例且想 lint</td></tr><tr><td style="text-align:left"><code>eslint-plugin-perfectionist</code></td><td style="text-align:center">❌ 可选</td><td style="text-align:left">专注于 <code>import/object</code> 排序，与 <code>import/order</code> 功能重叠</td></tr></tbody></table>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="npm 包" term="npm 包"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[样式之谜]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/12/22/跳出样式构建迷雾</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/12/22/跳出样式构建迷雾"/>
        <updated>2025-12-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[一直以来，我是不喜欢处理样式的。直到我遇见了麻烦。]]></summary>
        <content type="html"><![CDATA[<p>一直以来，我是不喜欢处理样式的。直到我<strong>遇见了</strong>麻烦。</p>
<p>直接在另一文件中使用一个库（以 enr 为例）的 scss 文件，可以这么做：</p>
<!-- -->
<ul>
<li class="">在 ts 、 js 、 tsx 或 jsx 中<!-- -->
<ul>
<li class="">使用 <code>import 'enr/common.scss';</code> 导入</li>
<li class="">使用 <code>import('enr/common.scss');</code> 异步导入</li>
<li class="">使用 <code>import(/* webpackMode: 'eager' */ 'enr/common.scss');</code> 同步导入</li>
</ul>
</li>
<li class="">在 scss 文件中使用 <code>@use 'enr/common.scss' as enr;</code> 导入（推荐）</li>
</ul>
<p>问题在于我既想使用 pnpm 的 workspace 又想使用 <code>import 'enr/common.scss';</code> 的模式。于是一错再错。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="一初遇麻烦以为只是个小麻烦">一、初遇麻烦以为只是个小麻烦<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#%E4%B8%80%E5%88%9D%E9%81%87%E9%BA%BB%E7%83%A6%E4%BB%A5%E4%B8%BA%E5%8F%AA%E6%98%AF%E4%B8%AA%E5%B0%8F%E9%BA%BB%E7%83%A6" class="hash-link" aria-label="一、初遇麻烦以为只是个小麻烦的直接链接" title="一、初遇麻烦以为只是个小麻烦的直接链接" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_svZc alert alert--secondary"><div class="admonitionHeading_UBwC"><span class="admonitionIcon__uit"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>备注</div><div class="admonitionContent_Zh57"><p>这个问题原以为改下配置就可以解决，谁知确实泥潭越陷越深。</p></div></div>
<p>我在将浏览器插件的项目使用 workspace 调整的时候，发现 <a class="" href="http://lmssee.pages.dev/">enr</a> 下导出的 scss 或 css 源码文件无法像以前那样正确导入了。</p>
<div class="language-ts codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-ts codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'enr/common.scss'</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>于是乎，又是两天的折腾。</p>
<p>也问过国产 5 大流氓了，由于蓝灯这几天不给力，让我着实吃尽了苦头。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-艰辛历程">1. 艰辛历程<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#1-%E8%89%B0%E8%BE%9B%E5%8E%86%E7%A8%8B" class="hash-link" aria-label="1. 艰辛历程的直接链接" title="1. 艰辛历程的直接链接" translate="no">​</a></h3>
<p>根据五大流氓的建议，先后进行了如下的更改：</p>
<ul>
<li class="">
<p>尝试使用 <code>require.resolve</code> 加载实际的路径</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">webpack.config.mjs</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> createRequest </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'node:module'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> require </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createRequire</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">meta</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> enrCommonScss </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> require</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">resolve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'enr/common.scss'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token comment" style="color:#999988;font-style:italic">/* ..., 其他配置 */</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">alias</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">'enr/common.scss'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> enrCommonScss</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token comment" style="color:#999988;font-style:italic">/* ..., 其他配置 */</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>更改包 enr 的导出方式（好在 enr 是我自己的包）</p>
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">package.json</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ..., 其他配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"exports"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"./common.scss"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"style"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./styles/common.scss"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"scss"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./styles/common.scss"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"default"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./styles/common.scss"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ..., 其他配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>禁用符号链接</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">webpack.config.mjs</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// 其他配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">alias</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">symlinks</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 其他配置</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>使用导入条件名称</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">webpack.config.mjs</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// 其他配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">alias</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">conditionNames</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'import'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'require'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'default'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 其他配置</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>配置模块</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">webpack.config.mjs</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> __dirname </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">meta</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dirname</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">path_join</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter spread operator" style="color:#393A34">...</span><span class="token parameter">paths</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> path</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__dirname</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token spread operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dir </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 其他配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">alias</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">modules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'node_modules'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">path_join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'../../node_modules'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">path_join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'node_modules'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 其他配置</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>设定导出字段</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">webpack.config.mjs</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> __dirname </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">meta</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dirname</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">path_join</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter spread operator" style="color:#393A34">...</span><span class="token parameter">paths</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> path</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__dirname</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token spread operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dir </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 其他配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">alias</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">exportsFields</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'exports'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 其他配置</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>还有其他很多修改一言难尽</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-自以为是曙光">2. 自以为是曙光<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#2-%E8%87%AA%E4%BB%A5%E4%B8%BA%E6%98%AF%E6%9B%99%E5%85%89" class="hash-link" aria-label="2. 自以为是曙光的直接链接" title="2. 自以为是曙光的直接链接" translate="no">​</a></h3>
<p>在查阅资料时发现使用 <code>import('enr/common.scss');</code> 的形式可以解决该问题（当然是经过上述的磨练之后啦）。</p>
<p>于是：</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">root.ts</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'enr/common.scss'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'enr/common.scss'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 或</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">(</span><span class="token comment" style="color:#999988;font-style:italic">/* webpackMode: 'eager' */</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'enr/common.scss'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>但是所有可查阅的地方都提醒我这样做的弊端很多。</p>
<p>其实，当时已经查到可以由另一个项目本地的 'xx.scss' 文件中使用 <code>@use ''enr/common.scss</code> 的方式，头铁的我想着能用修改配置的方式能够处理好这件事（使用 ）。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="3-人生就是兜兜转转">3. 人生就是兜兜转转<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#3-%E4%BA%BA%E7%94%9F%E5%B0%B1%E6%98%AF%E5%85%9C%E5%85%9C%E8%BD%AC%E8%BD%AC" class="hash-link" aria-label="3. 人生就是兜兜转转的直接链接" title="3. 人生就是兜兜转转的直接链接" translate="no">​</a></h3>
<p>后来，我总算学会了如何去改。可惜时间早已远去，消失在宙海。</p>
<p>后来，终于在眼泪中明白，有些代码，能跑就<strong>不要改</strong>。</p>
<p>既然使用 <code>@use 'enr/common.scss';</code> 是最正确的路，为何在错误的死胡同撞的头破血流。</p>
<p>额，可能是<span class=""><span class="">我撞了南墙不也会回头</span>&nbsp;&nbsp;&nbsp; <!-- --> &nbsp;&nbsp;&nbsp;<audio loop="" preload="metadata" src="https://static.lmssee.com/music/可能否.mp3"></audio></span>吧。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="二原来这本就是个误区">二、原来这本就是个误区<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#%E4%BA%8C%E5%8E%9F%E6%9D%A5%E8%BF%99%E6%9C%AC%E5%B0%B1%E6%98%AF%E4%B8%AA%E8%AF%AF%E5%8C%BA" class="hash-link" aria-label="二、原来这本就是个误区的直接链接" title="二、原来这本就是个误区的直接链接" translate="no">​</a></h2>
<p>使用 <code>import 'enr/common.scss';</code> 的导入模式本身就不是特别的友好，但对于模块的加载确是很好。</p>
<p>但我向来都是将样式打包成内嵌到根 html 的 <code>&lt;style&gt;</code> 的模式打包的。这似乎不是特别的好。（五大流氓都不建议这么做）</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="三webpack-打包样式">三、<a href="https://webpack.js.org/" target="_blank" rel="noopener noreferrer" class="">Webpack</a> 打包样式<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#%E4%B8%89webpack-%E6%89%93%E5%8C%85%E6%A0%B7%E5%BC%8F" class="hash-link" aria-label="三webpack-打包样式的直接链接" title="三webpack-打包样式的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-安装必要的依赖">1. 安装必要的依赖<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#1-%E5%AE%89%E8%A3%85%E5%BF%85%E8%A6%81%E7%9A%84%E4%BE%9D%E8%B5%96" class="hash-link" aria-label="1. 安装必要的依赖的直接链接" title="1. 安装必要的依赖的直接链接" translate="no">​</a></h3>
<ul>
<li class="">css ： 通常脚手架已内置支持</li>
<li class="">SCSS/Sass ：需要安装 sass 包 （Dart Sass 实现）</li>
</ul>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">bash</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> sass</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 或</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">yarn</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> sass</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 或</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> sass</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-在组件中导入-cssscss">2. 在组件中导入 CSS/SCSS<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#2-%E5%9C%A8%E7%BB%84%E4%BB%B6%E4%B8%AD%E5%AF%BC%E5%85%A5-cssscss" class="hash-link" aria-label="2. 在组件中导入 CSS/SCSS的直接链接" title="2. 在组件中导入 CSS/SCSS的直接链接" translate="no">​</a></h3>
<p>可以直接全局导入样式，也可以导入与组件相关的局部样式。</p>
<div class="language-jsx codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">App.jsx</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-jsx codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'./App.css'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 或 './App.scss';</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">styles</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'./Button.module.css'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 或 import styles from './Button.module.scss';</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> xcn </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'xcn'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:#d73a49">Button</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter punctuation" style="color:#393A34">{</span><span class="token parameter"> children </span><span class="token parameter punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript function" style="color:#d73a49">xcn</span><span class="token tag script language-javascript punctuation" style="color:#393A34">(</span><span class="token tag script language-javascript" style="color:#00009f">styles</span><span class="token tag script language-javascript punctuation" style="color:#393A34">.</span><span class="token tag script language-javascript property-access" style="color:#00009f">buttonPrimary</span><span class="token tag script language-javascript punctuation" style="color:#393A34">)</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">children</span><span class="token punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#d73a49">App</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">h1</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">你好</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">h1</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">点我试试</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="3-loader-的作用">3. Loader 的作用<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#3-loader-%E7%9A%84%E4%BD%9C%E7%94%A8" class="hash-link" aria-label="3. Loader 的作用的直接链接" title="3. Loader 的作用的直接链接" translate="no">​</a></h3>
<p>当写 <code>import './App.css';</code> 时， Node.js 本身并不会理解如何处理 <code>.css</code> 文件。这时就需要 Loader ：</p>
<ul>
<li class=""><strong><a href="https://www.npmjs.com/package/css-loader" target="_blank" rel="noopener noreferrer" class="">CSS Loader</a></strong> ： 负责解析 CSS 文件中的 <code>@import</code> 和 <code>url()</code> ，并将他们当作模块处理</li>
<li class=""><strong><a href="https://www.npmjs.com/package/style-loader" target="_blank" rel="noopener noreferrer" class="">Style Loader</a></strong> ： （开发常用）将解析后的 CSS 代码以字符串形式，通过 JavaScript 动态构建一个 <code>&lt;style&gt;</code> 标签插入到 HTML 的 <code>&lt;head&gt;</code> 中</li>
<li class=""><strong><a href="https://www.npmjs.com/package/mini-css-extract-plugin" target="_blank" rel="noopener noreferrer" class="">MiniCssExtractPlugin</a></strong> ：（生产常用）在生产构建阶段，代替 Style Loader ，将 CSS 代码提取 （ Extract ） 出来，生成单独的 <code>.css</code> 文件。然后 <a href="https://webpack.js.org/" target="_blank" rel="noopener noreferrer" class="">Webpack</a> 会生成一个 <code>&lt;link&gt;</code> 标签来引入这个 CSS 文件</li>
<li class=""><strong><a href="https://www.npmjs.com/package/sass-loader" target="_blank" rel="noopener noreferrer" class="">Sass Loader</a></strong> ： 在 css-loader 之前运行，负责将 <code>SCSS/Sass</code> 代码编译成普通的 CSS 代码。它需要 <del>node-sass</del> 或 <a href="https://sass-lang.com/" target="_blank" rel="noopener noreferrer" class="">sass</a> （Dart Sass）作为编译器的后端</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="4-工作流程">4. 工作流程<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#4-%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B" class="hash-link" aria-label="4. 工作流程的直接链接" title="4. 工作流程的直接链接" translate="no">​</a></h3>
<ul>
<li class="">遇到 <code>import './App.scss';</code></li>
<li class="">调用配置的 Loader 链（例如：sass-loader ➞ css-loader ➞ style-loader 或 css-loader ➞ css-loader + <a href="https://www.npmjs.com/package/mini-css-extract-plugin" target="_blank" rel="noopener noreferrer" class="">MiniCssExtractPlugin</a>.loader ）</li>
<li class="">sass-loader（如果是 SCSS ）将 SCSS 编译成 CSS</li>
<li class="">css-loader 处理 CSS 中的依赖关系</li>
<li class=""><strong>开发模式（ style-loader ）</strong> ： 将最终的 CSS 字符串注入到页面的 <code>&lt;style&gt;</code> 标签中</li>
<li class=""><strong>生产模式（ <a href="https://www.npmjs.com/package/mini-css-extract-plugin" target="_blank" rel="noopener noreferrer" class="">MiniCssExtractPlugin</a> ）</strong> ： 将最终的 CSS 写入一个或多个物理 <code>.css</code> 文件。 <a href="https://webpack.js.org/" target="_blank" rel="noopener noreferrer" class="">Webpack</a> 输出中会包含一个将这些 CSS 文件链接到 HTML 的指令（通常由 HTMLWebpackPlugin 自动完成）</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="5-开发打包总结处理">5. 开发打包总结处理<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#5-%E5%BC%80%E5%8F%91%E6%89%93%E5%8C%85%E6%80%BB%E7%BB%93%E5%A4%84%E7%90%86" class="hash-link" aria-label="5. 开发打包总结处理的直接链接" title="5. 开发打包总结处理的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>开发（ <code>npm start</code>/<code>yarn start</code>/<code>pnpm dev</code> ）</strong> ：<!-- -->
<ul>
<li class="">构建工具（ Webpack Dev Server ） 启用热更新</li>
<li class="">样式通常以 <code>&lt;style&gt;</code> 标签动态注入到当前的页面的 <code>&lt;head&gt;</code> 中。这样做速度快，修改后及时生效</li>
<li class="">性能不是首要考虑的因素，开发者体验优先</li>
</ul>
</li>
<li class=""><strong>打包（ <code>npm run build</code>/<code>yarn build</code>/<code>pnpm build</code> ）</strong> ：<!-- -->
<ul>
<li class="">构建工具执行生产优化</li>
<li class=""><strong>默认或推荐配置</strong> ： 使用 <code>MiniCssExtractPlugin(Webpack)</code> 或类似插件将 CSS 提取到独立的 <code>.css</code> 文件中</li>
<li class="">生成的 HTML 会通过 <code>&lt;link rel="stylesheet" href="..."&gt;</code> 引入这些 CSS 文件</li>
<li class="">同时会对 CSS 进行压缩（ Minification ） 、 Tree Shaking （移除未使用的 CSS - 取决于配置和工具支持 ） 、 可能的代码分割（ Code Splitting ）</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="四生产--生产">四、生产 🆚 生产<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#%E5%9B%9B%E7%94%9F%E4%BA%A7--%E7%94%9F%E4%BA%A7" class="hash-link" aria-label="四、生产 🆚 生产的直接链接" title="四、生产 🆚 生产的直接链接" translate="no">​</a></h2>
<p>开发时使用 <code>&lt;style&gt;</code> 标签是为了速度。生产时，<strong>最佳实践（也是默认或容易配置的选项）就是将 CSS 提取到外部 <code>.css</code> 文件并通过 <code>&lt;link&gt;</code> 加载</strong> 。</p>
<ul>
<li class=""><strong>并行加载</strong> ： 浏览器可以并行下载 JS 和 CSS 文件，而不必等待一个巨大的 CSS 包下载完后解析里面的 CSS 字符串</li>
<li class=""><strong>缓存</strong> ： 独立的 CSS 文件可以被浏览器单独缓存。如果只更新 JS 而没有更改 CSS ，用户下次只需加载新的 JS 文件， CSS 缓存有效</li>
<li class=""><strong>较少主包体积</strong> ： 将 CSS 移除 JS 包显著减少了 JS 的文件的体积，加快 JS 的下载和执行速度</li>
<li class=""><strong>渲染阻塞</strong> ： 浏览器会阻塞页面渲染直到关键的 CSS （通常是 <code>&lt;link&gt;</code> 引入的第一个 CSS 文件）下载完成，形成“关键渲染路径”。内联关键 CSS 有时能优化首屏，但提取非关键 CSS 到外部文件并使用 <code>preload</code> 提示的是现代框架的常规做法</li>
</ul>
<p>结论：使用 Loader 导入 CSS/SCSS <strong>本身不会导致</strong> 生产环境性能不佳。 <strong>恰恰相反，通过正确的正常的生产构建（提取 CSS ），它是实现高性能的标准方式</strong> 。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-安装生产环境依赖">1. 安装生产环境依赖<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#1-%E5%AE%89%E8%A3%85%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%BE%9D%E8%B5%96" class="hash-link" aria-label="1. 安装生产环境依赖的直接链接" title="1. 安装生产环境依赖的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">bash</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">pnpm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> --save-dev mini-css-extract-plugin css-minimizer-webpack-plugin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># css-minimizer-webpack-plugin ：压缩抽离的 CSS</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-优化配置">2. 优化配置<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#2-%E4%BC%98%E5%8C%96%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="2. 优化配置的直接链接" title="2. 优化配置的直接链接" translate="no">​</a></h3>
<div class="language-javaScript language-javascript codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">webpack.config.mjs</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-javascript codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="3-三方包解析">3. 三方包解析<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#3-%E4%B8%89%E6%96%B9%E5%8C%85%E8%A7%A3%E6%9E%90" class="hash-link" aria-label="3. 三方包解析的直接链接" title="3. 三方包解析的直接链接" translate="no">​</a></h3>
<p>在导出为库的时候，如果使用三方包的样式文件，可以排除打包到结果中（多出现于 workspace 工作环境下）。</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">webpack.config.mjs</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// webpack.config.mjs</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">module</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">test</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex escape" style="color:#36acaa">\/</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">(</span><span class="token regex regex-source language-regex" style="color:#36acaa">css</span><span class="token regex regex-source language-regex alternation keyword" style="color:#00009f">|</span><span class="token regex regex-source language-regex" style="color:#36acaa">sass</span><span class="token regex regex-source language-regex alternation keyword" style="color:#00009f">|</span><span class="token regex regex-source language-regex" style="color:#36acaa">scss</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">)</span><span class="token regex regex-source language-regex anchor function" style="color:#d73a49">$</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// 排除 node_modules 中的第三方 CSS</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">exclude</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex" style="color:#36acaa">node_modules</span><span class="token regex regex-source language-regex escape" style="color:#36acaa">\/</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">(</span><span class="token regex regex-source language-regex" style="color:#36acaa">antd</span><span class="token regex regex-source language-regex alternation keyword" style="color:#00009f">|</span><span class="token regex regex-source language-regex" style="color:#36acaa">bootstrap</span><span class="token regex regex-source language-regex alternation keyword" style="color:#00009f">|</span><span class="token regex regex-source language-regex" style="color:#36acaa">enr</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">)</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">use</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          isProduction </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token maybe-class-name">MiniCssExtractPlugin</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">loader</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'style-loader'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">'css-loader'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">'postcss-loader'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">'sass-loader'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// 对第三包 CSS 仅作「识别」，不打包（或直接忽略）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">test</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex" style="color:#36acaa">node_modules</span><span class="token regex regex-source language-regex escape" style="color:#36acaa">\/</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">(</span><span class="token regex regex-source language-regex" style="color:#36acaa">antd</span><span class="token regex regex-source language-regex alternation keyword" style="color:#00009f">|</span><span class="token regex regex-source language-regex" style="color:#36acaa">bootstrap</span><span class="token regex regex-source language-regex alternation keyword" style="color:#00009f">|</span><span class="token regex regex-source language-regex" style="color:#36acaa">enr</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">)</span><span class="token regex regex-source language-regex escape" style="color:#36acaa">\/</span><span class="token regex regex-source language-regex char-set class-name" style="color:#36acaa">.</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">+</span><span class="token regex regex-source language-regex special-escape escape" style="color:#36acaa">\.</span><span class="token regex regex-source language-regex" style="color:#36acaa">css</span><span class="token regex regex-source language-regex anchor function" style="color:#d73a49">$</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">use</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'null-loader'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 忽略第三方 CSS， 不打包进产物</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="4-剔除普通-css-中无用的样式--purgecss-">4. 剔除普通 CSS 中无用的样式 （ PurgeCSS ）<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#4-%E5%89%94%E9%99%A4%E6%99%AE%E9%80%9A-css-%E4%B8%AD%E6%97%A0%E7%94%A8%E7%9A%84%E6%A0%B7%E5%BC%8F--purgecss-" class="hash-link" aria-label="4. 剔除普通 CSS 中无用的样式 （ PurgeCSS ）的直接链接" title="4. 剔除普通 CSS 中无用的样式 （ PurgeCSS ）的直接链接" translate="no">​</a></h3>
<p>使用 <code>purgecss</code> 工具剔除未使用的样式，减少打包体积。</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">webpack.config.mjs</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports maybe-class-name">PurgeCSSPlugin</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'purgecss-webpack-plugin'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">glob</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'glob'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">path</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'path'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> __dirname </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">meta</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dirname</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ... 其他插件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">MiniCssExtractPlugin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">filename</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'css/[name].[contenthash].css'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">chunkFileName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'css/[name].[contenthash].chunk.css'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 生产环境启用 PurgeCSS</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    isProduction </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">PurgeCSSPlugin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// 扫描项目中所有使用样式的文件（JS/TS/TSX/HTML）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">paths</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> glob</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">sync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">path</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation method function property-access" style="color:#d73a49">resolver</span><span class="token template-string interpolation punctuation" style="color:#393A34">(</span><span class="token template-string interpolation">__dirname</span><span class="token template-string interpolation punctuation" style="color:#393A34">,</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation string" style="color:#e3116c">'src'</span><span class="token template-string interpolation punctuation" style="color:#393A34">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">/**/*</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">nodir</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// 保留第三方包 CSS 中被使用的样式</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">safelist</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// 需要手动保留需要的样式类（避免误删）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">standard</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex" style="color:#36acaa">ant-btn</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex" style="color:#36acaa">ant-card</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// 模糊匹配，保留所有以特定开头的样式类（按需开启）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">deep</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex" style="color:#36acaa">ant-</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex" style="color:#36acaa">en-</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">filter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">Boolean</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-warning admonition_svZc alert alert--warning"><div class="admonitionHeading_UBwC"><span class="admonitionIcon__uit"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>注意</div><div class="admonitionContent_Zh57"><p>需要手动添加需要保留的类名。</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="5-三方包的按需导入">5. 三方包的按需导入<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#5-%E4%B8%89%E6%96%B9%E5%8C%85%E7%9A%84%E6%8C%89%E9%9C%80%E5%AF%BC%E5%85%A5" class="hash-link" aria-label="5. 三方包的按需导入的直接链接" title="5. 三方包的按需导入的直接链接" translate="no">​</a></h3>
<p>像 antd 、 element-plus 这类包，使用插件或 babel 等转化为按需导入，并自动导入对应组件的 css，这样有助于开发者简化按需导入的操作，只关心使用而不用实际引用到组件</p>
<div class="theme-tabs-container tabs-container tabList_GGXe"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_QOjA tabs__item--active">antd 按需导入</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_QOjA">element-plus 按需导入</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_bPac"><p>antd 依赖 <code>babel-plugin-import</code> 实现按需导入</p><div class="language-ts codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">示意</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-ts codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// 原始代码</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Button </span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Input </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'antd'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 插件转换后</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Button </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'antd/lib/button'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Input </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'antd/lib/input'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 自动追加样式导入（配置导入 CSS 时）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 转换后的最终代码</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Button </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'antd/lib/button'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'antd/lib/button/style/index.css'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 自动添加</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Input form </span><span class="token string" style="color:#e3116c">'antd/lib/input'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'antd/lib/input/style/index.css'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 自动添加</span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_bPac" hidden=""><p>element-plus 推荐使用 <code>unplugin</code> 系列（ <code>ubplugin-auto-import</code> + <code>unplugin-vue-components</code> 夸构建工具 ）插件，比 <code>babel-plugin-import</code> 更灵活。</p><ul>
<li class=""><strong>自动识别组件使用</strong> ： 插件会扫描 Vue 模版或脚本中的 <code>&lt;el-button&gt;</code> 、 <code>ElButton</code> 等组件的使用痕迹</li>
<li class=""><strong>自动导入组件代码</strong> ： 无需手动写 <code>import { ElButton } from 'element-plus'</code> ，插件会自动注入这个单组件的导入<!-- -->
<div class="language-ts codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">插件自动导入</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-ts codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// 插件自动注入</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Element </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'element-plus/es/components/button/index'</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
</li>
<li class=""><strong>自动导入组件样式</strong> ： 同时自动注入对应的组件样式，无需手动引入<!-- -->
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// 插件自动插入样式（配置按需导入时）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'element-plus/es/components/button/style/css'</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
</li>
<li class=""><strong>全局样式按需排除</strong> ： 插件会自动忽略 <code>element-plus</code> 的全局 CSS，只引入用到的组件样式，避免冗余</li>
</ul></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="6-css-in-js">6. css in js<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/22/%E8%B7%B3%E5%87%BA%E6%A0%B7%E5%BC%8F%E6%9E%84%E5%BB%BA%E8%BF%B7%E9%9B%BE#6-css-in-js" class="hash-link" aria-label="6. css in js的直接链接" title="6. css in js的直接链接" translate="no">​</a></h3>
<p>采用 「CSS-in-JS」方案，样式按需直接内联在组件代码中，无需单独导入 CSS ，天然支持按需加载（组件加载时自动生效，未使用的组件样式不会被打包）。</p>
<ul>
<li class="">若作为 workspace 库打包，首选使用 <code>externals</code> 排除包</li>
<li class="">若作为发布包，不确定宿主项目环境 --- 打包进包（或标记为 <code>dependencies</code> ）<!-- -->
<ul>
<li class=""><strong>保证独立可用</strong> ：第三方使用包时，无需手动安装 <code>styled-components</code> ，直接引入即可使用组件样式，降低使用门槛</li>
<li class=""><strong>避免依赖缺失报错</strong> ： 如果互用忽略 <code>peerDependencies</code> 的提示，未安装 <code>styled-components</code> ，会导致运行时报错；打包进包避免该问题</li>
</ul>
</li>
</ul>
<hr>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="npm 包" term="npm 包"/>
        <category label="css" term="css"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[库的一些知识]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/12/21/库发布的一些知识</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/12/21/库发布的一些知识"/>
        <updated>2025-12-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[嗯，怎么说呢。 也挺滑稽的。]]></summary>
        <content type="html"><![CDATA[<p>嗯，怎么说呢。 也挺滑稽的。</p>
<p>写了很多的包，却不知道 'package.json' 下居然要加 <code>"sideEffects": false</code> 。 简直让人汗颜，就好像说一个士兵居然不知道怎么上膛。</p>
<!-- -->
<div class="theme-admonition theme-admonition-note admonition_svZc alert alert--secondary"><div class="admonitionHeading_UBwC"><span class="admonitionIcon__uit"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>备注</div><div class="admonitionContent_Zh57"><p>说来更尴尬的是，之前在 <a class="" href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/8/%E9%A1%B9%E7%9B%AE%E6%9E%84%E5%BB%BA%E5%9F%BA%E7%A1%80">项目构建基础</a> 中已经涉及了该内容，但是。。。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="一副作用">一、副作用<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#%E4%B8%80%E5%89%AF%E4%BD%9C%E7%94%A8" class="hash-link" aria-label="一、副作用的直接链接" title="一、副作用的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-sideeffects-false">1. <code>sideEffects: false</code><a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#1-sideeffects-false" class="hash-link" aria-label="1-sideeffects-false的直接链接" title="1-sideeffects-false的直接链接" translate="no">​</a></h3>
<p>适用于 <strong>包内所有文件都无全局副作用</strong> 的情况，是纯组件库 、 工具函数库的最优配置。</p>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="11-使用条件">1.1 使用条件<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#11-%E4%BD%BF%E7%94%A8%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="1.1 使用条件的直接链接" title="1.1 使用条件的直接链接" translate="no">​</a></h4>
<ul>
<li class="">包内仅导出「纯函数 、 纯组件 、 静态变量」，没有任何全局环境修改</li>
<li class="">没有全局样式导入（ <code>import './global.css'</code> ， 仅组件内联样式 / CSS-in-JS 除外 ）</li>
<li class="">没有 polyfill/全局 API 扩展（如 <code>Object.prototype.extend = ...</code> ）</li>
<li class="">没有全局注册行为（ 如 <code>window.GlobalUtils = ... </code> ）</li>
<li class="">没有副作用代码（如顶层 <code>console.log</code> 、 自动执行的函数 、 定时器/事件监听）</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="12-典型示例">1.2 典型示例<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#12-%E5%85%B8%E5%9E%8B%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="1.2 典型示例的直接链接" title="1.2 典型示例的直接链接" translate="no">​</a></h4>
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">package.json</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"shared-utils"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1.0.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"module"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"dist/esm/index.js"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"sideEffects"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 显示声明：所有的文件无副作用</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"exports"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"."</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./dist/esm/index.js"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"./Button"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./dist/esm/Button.js"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="13-配置效果">1.3 配置效果<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#13-%E9%85%8D%E7%BD%AE%E6%95%88%E6%9E%9C" class="hash-link" aria-label="1.3 配置效果的直接链接" title="1.3 配置效果的直接链接" translate="no">​</a></h4>
<p>消费端构建工具（ Webpack/Vite/Rollup ）会认为：包内所有的文件都是「无副作用」的，未被显式使用的模块可安全剔除（完美支持 Tree Shaking）。</p>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="14-禁忌场景绝对不能设为-false">1.4 禁忌场景（绝对不能设为 <code>false</code>）<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#14-%E7%A6%81%E5%BF%8C%E5%9C%BA%E6%99%AF%E7%BB%9D%E5%AF%B9%E4%B8%8D%E8%83%BD%E8%AE%BE%E4%B8%BA-false" class="hash-link" aria-label="14-禁忌场景绝对不能设为-false的直接链接" title="14-禁忌场景绝对不能设为-false的直接链接" translate="no">​</a></h4>
<p>如果包内存在以下内容，设置为 <code>false</code> 会导致构建工具误删关键代码：</p>
<ul>
<li class="">全局样式文件（如 <code>dist/global.css</code> ）</li>
<li class="">polyfill 文件（如 <code>dist/polyfill.js</code> )</li>
<li class="">顶层自动执行代码（如 <code>src/index.js</code> 中直接写 <code>initGlobalConfig()</code> ）</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-sideeffects-文件路径数组">2. <code>sideEffects: [文件路径数组]</code><a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#2-sideeffects-%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%E6%95%B0%E7%BB%84" class="hash-link" aria-label="2-sideeffects-文件路径数组的直接链接" title="2-sideeffects-文件路径数组的直接链接" translate="no">​</a></h3>
<p>适用于 <strong>包内大部分无副作用，但存在少量有全局副作用的文件</strong> 的情况，是带全局样式 、 polyfill 的组件库的标准配置。</p>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="21-适用条件">2.1 适用条件<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#21-%E9%80%82%E7%94%A8%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="2.1 适用条件的直接链接" title="2.1 适用条件的直接链接" translate="no">​</a></h4>
<ul>
<li class="">包内大部分文件（组件 、 工具函数）无辅助用，可被 Tree Shaking</li>
<li class="">存在少量 「必须保留的有副作用的文件」，请明确列举其路径</li>
<li class="">副作用文件多为： 全局样式 、 polyfill 、 全局注册文件等</li>
</ul>
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">package.json</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"shared-utils"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1.0.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"module"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"dist/esm/index.js"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"sideEffects"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 明确声明：以下文件有副作用，不可被删除</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"./dist/css/reset.css"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 全局样式重置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"./dist/css/global.scss"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 全局公共样式</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"./dist/polyfill.js"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 全局 API 兼容</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"*.css"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 通配符：所有 .css 文件都有副作用（更便捷）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"*.scss"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 通配符：所有 .scss 文件都有副作用</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"exports"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"."</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./dist/esm/index.js"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"./Button"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./dist/esm/Button.js"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"./css/reset"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./dist/css/reset.css"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="22-配置效果">2.2 配置效果<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#22-%E9%85%8D%E7%BD%AE%E6%95%88%E6%9E%9C" class="hash-link" aria-label="2.2 配置效果的直接链接" title="2.2 配置效果的直接链接" translate="no">​</a></h4>
<ul>
<li class="">数组内的文件：无论是否被显式使用，都会被消费端构建工具保留（避免副作用丢失）</li>
<li class="">数组外的文件：视为「无副作用」，未被使用时会被 Tree Shaking 剔除</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="23-路径写法技巧">2.3 路径写法技巧<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#23-%E8%B7%AF%E5%BE%84%E5%86%99%E6%B3%95%E6%8A%80%E5%B7%A7" class="hash-link" aria-label="2.3 路径写法技巧的直接链接" title="2.3 路径写法技巧的直接链接" translate="no">​</a></h4>
<ul>
<li class="">支持 <strong>精确路径</strong> ：<code>./dist/css/reset.css</code> （精准匹配单个文件）</li>
<li class="">支持 <strong>通配符</strong> ： <code>*.css</code> （匹配所有后缀为 <code>.css</code> 的文件） 、 <code>./dist/css/*</code> （匹配 <code>css</code> 目录下所有文件）</li>
<li class="">支持 <strong>目录匹配</strong> ： <code>./dist/styles/</code> （匹配 <code>styles</code> 目录下所有文件及子目录）</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="3-整个包有副作用">3. 整个包有副作用<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#3-%E6%95%B4%E4%B8%AA%E5%8C%85%E6%9C%89%E5%89%AF%E4%BD%9C%E7%94%A8" class="hash-link" aria-label="3. 整个包有副作用的直接链接" title="3. 整个包有副作用的直接链接" translate="no">​</a></h3>
<ul>
<li class="">不配置 <code>sideEffects</code> 等价于 <code>true</code> ，不属于「不为 <code>true</code> 」</li>
<li class="">显式声明有副作用： <code>sideEffects: true</code></li>
<li class=""><strong>效果</strong> ： 消费端构建工具会放弃对该包的 Tree Shaking ，即使只适用一个小模块，也会打包整个包的代码，导致体积冗余</li>
<li class=""><strong>使用场景</strong> ： 极少使用，仅适用于包内所有文件都有强副作用，且无法列举的极端场景（几乎不存在）</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="二依赖方式">二、依赖方式<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#%E4%BA%8C%E4%BE%9D%E8%B5%96%E6%96%B9%E5%BC%8F" class="hash-link" aria-label="二、依赖方式的直接链接" title="二、依赖方式的直接链接" translate="no">​</a></h2>
<p>区分 <code>peerDependencies</code>/<code>dependencies</code>/<code>devDependencies</code> 是为了避免重复打包、版本冲入的核心，尤其针对 <code>styled-components</code> 、 <code>react</code> 这类公共依赖：</p>
<table><thead><tr><th style="text-align:center">依赖类型</th><th style="text-align:left">适用场景</th><th style="text-align:left">示例</th></tr></thead><tbody><tr><td style="text-align:center"><code>peerDependencies</code></td><td style="text-align:left">宿主环境需提供的公共依赖</td><td style="text-align:left"><code>"react": "^19.3.0"</code></td></tr><tr><td style="text-align:center"><code>dependencies</code></td><td style="text-align:left">库自身必须的、宿主项目无需感知的私有依赖</td><td style="text-align:left">小众工具库</td></tr><tr><td style="text-align:center"><code>devDependencies</code></td><td style="text-align:left">开发/编译依赖（如 Rollup 、 TS 、 babel ）</td><td style="text-align:left"><code>"rollup": "^4.54.0"</code></td></tr></tbody></table>
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">package.json</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"peerDependencies"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"react"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^18.0.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"react-dom"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^18.0.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"styled-components"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^6.0.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"peerDependenciesMeta"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"react"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"optional"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 必须提供，否则报错</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"styled-components"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"optional"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"dependencies"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"date-fns-tz"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^2.0.0"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 库内部私有依赖</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"devDependencies"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"rollup"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^4.12.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 开发依赖</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"typescript"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^5.3.3"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 开发依赖</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="三子包抽离">三、子包抽离<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#%E4%B8%89%E5%AD%90%E5%8C%85%E6%8A%BD%E7%A6%BB" class="hash-link" aria-label="三、子包抽离的直接链接" title="三、子包抽离的直接链接" translate="no">​</a></h2>
<p><strong>抽离子包的核心价值时候解耦与灵活性</strong>。当函数具备独立生命力（复用性、迭代速度、体积优势）时，值的拆分为 <code>@主包/子包</code> ; 反之则优先保持主包简介。<strong>推荐从单一包开始，随需求演进逐步拆分</strong>，避免过度设计。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-可抽离场景">1. 可抽离场景<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#1-%E5%8F%AF%E6%8A%BD%E7%A6%BB%E5%9C%BA%E6%99%AF" class="hash-link" aria-label="1. 可抽离场景的直接链接" title="1. 可抽离场景的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>高复用性需求</strong> ： 该模块被<strong>多个外部项目</strong>独立使用</li>
<li class=""><strong>独立迭代与版本更新</strong> ： 函数需<strong>频繁更新</strong>，且更新节奏与主包不一致（如安全补丁、紧急修复）</li>
<li class=""><strong>无需加载优化</strong> ： 函数体积较大，但非<strong>所有用户都需要</strong>。抽离后可让用户选择性安装，减少主包体积</li>
<li class=""><strong>明确的功能边界</strong> ： 函数属于独立的功能域（如支付网关、日志服务），未来可能可扩展成完整模块</li>
<li class=""><strong>协作与权限隔离</strong> ： 不同的团队维护不同的功能（如核心团队维护主包、算法团队维护子包）。子包有自己的独立权限、 CI/CD 流程</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-不建议抽离场景">2. 不建议抽离场景<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/21/%E5%BA%93%E5%8F%91%E5%B8%83%E7%9A%84%E4%B8%80%E4%BA%9B%E7%9F%A5%E8%AF%86#2-%E4%B8%8D%E5%BB%BA%E8%AE%AE%E6%8A%BD%E7%A6%BB%E5%9C%BA%E6%99%AF" class="hash-link" aria-label="2. 不建议抽离场景的直接链接" title="2. 不建议抽离场景的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>低复用性</strong> ： 函数仅被主包内部使用，无外部调用需求 ➞ 保持内聚更简单</li>
<li class=""><strong>强耦合性</strong> ： 函数深度依赖主包的内部状态或私有模块 ➞ 抽离需大量重构，成本高</li>
<li class=""><strong>简单功能</strong> ： 函数是轻量级工具（如格式化辅助函数） ➞ 直接放在主包更易维护</li>
<li class=""><strong>初期项目</strong> ： 项目未稳定时过早的抽离 ➞ 增加维护复杂度（版本同步、依赖管理）</li>
</ul>
]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="npm 包" term="npm 包"/>
        <category label="囧事" term="囧事"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[记一件滑稽的事]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/12/16/一件滑稽的事</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/12/16/一件滑稽的事"/>
        <updated>2025-12-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[先说结论：使用 "write-translations": "docusaurus write-translations" docusaurus cli 命令 构建的翻译文件中的部分文本会强制为当前的文本。若后续修改了源码中的对应文本，可能出现文本被覆盖的现象。]]></summary>
        <content type="html"><![CDATA[<p>先说结论：使用 <code>"write-translations": "docusaurus write-translations"</code> <a href="https://docusaurus.io/zh-CN/docs/cli#docusaurus-write-translations-sitedir" target="_blank" rel="noopener noreferrer" class="">docusaurus cli 命令</a> 构建的翻译文件中的部分文本会强制为当前的文本。若后续修改了源码中的对应文本，可能出现文本被覆盖的现象。</p>
<!-- -->
<p>嗯，怎么说呢。</p>
<p>本来使用 node 的钩子名来创建不同的打包环境的环境值。</p>
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">packages.json 文件部分内容</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"scripts"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 测试启动</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"start"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"jja run PORT=42099 docusaurus start"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 普通测试</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"dev"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pnpm run start"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 模拟打包到 MrMudBean.github.io 测试</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"dev:io"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"jja run TARGET_DOMAIN=io pnpm start"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 模拟打包到 lmssee.com 测试</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"dev:com"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"jja run TARGET_DOMAIN=com pnpm start"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 写入 JSON 翻译文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"write-translations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docusaurus write-translations"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 给网站的 Markdown 文档添加明确的标题 ID。</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"write-heading-ids"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docusaurus write-heading-ids"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>发现使用 <code>pnpm dev</code> 测试结果很好，于是发布到服务器。</p>
<p>问题也就是这个时候接踵而至。</p>
<p>发现服务器中部分文本使用的测试文本（该文本由 <code>docusaurus.config.ts</code> 通过读取环境值判定而来）。</p>
<p>当时刚把项目公共部分做了抽离，于是怀疑是作为“三方”包的导出导致的异步问题。</p>
<div class="language-ts codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">原本导出为变量</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-ts codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> target_domain </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">DEVELOPMENT_TYPE</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">globalThis</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">process</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">env</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  target_domain </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> globalThis</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">process</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">env</span><span class="token operator" style="color:#393A34">?.</span><span class="token constant" style="color:#36acaa">TARGET_DOMAIN</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">??</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">DEVELOPMENT_TYPE</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="一五大贱人">一、五大贱人<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/16/%E4%B8%80%E4%BB%B6%E6%BB%91%E7%A8%BD%E7%9A%84%E4%BA%8B#%E4%B8%80%E4%BA%94%E5%A4%A7%E8%B4%B1%E4%BA%BA" class="hash-link" aria-label="一、五大贱人的直接链接" title="一、五大贱人的直接链接" translate="no">​</a></h2>
<p>后来就询问 AI 5 大贱人。一致给出结果是“ <a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer" class="">docusaurus</a> 缓存问题” 、 “导出变量异步加载导致的读取错误”...</p>
<p>一顿折腾，人都快奔溃了。什么清理缓存 、 清理依赖 、 清理安装包 、 清理 'pnpm-lock.yaml'。。。</p>
<p>就差重装电脑了 😭😭</p>
<p>无论使用哪个启动值，发现都是于事无补。</p>
<p>5 大贱人还跟我说什么这是因为 <a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer" class="">docusaurus</a> 的编译分好几个步骤，每一个步骤可能负责的工作不同，可能是某一个步骤进行时还未完全初始化环境变量。</p>
<p>就像编写 <a class="" href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/17/%E5%85%B3%E4%BA%8E%20mac%20%E7%BB%88%E7%AB%AF%E7%9A%84%E5%9B%A7%E4%BA%8B">a-common</a> 包时遇见的囧事。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="二初见端倪">二、初见端倪<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/16/%E4%B8%80%E4%BB%B6%E6%BB%91%E7%A8%BD%E7%9A%84%E4%BA%8B#%E4%BA%8C%E5%88%9D%E8%A7%81%E7%AB%AF%E5%80%AA" class="hash-link" aria-label="二、初见端倪的直接链接" title="二、初见端倪的直接链接" translate="no">​</a></h2>
<p>在这个问题耽搁了近 5 个小时，我居然没想着如果把测试的文本改一下看看是否会是新的测试文本展示。</p>
<p>终于，在功夫不负粗心汉。</p>
<p>我还是更新了纯测试环境文本，发现了在纯测试环境下依旧是旧值（我没有那么聪明，一下子能想到是 'i18n' 文件夹在捣乱，而是从抓耳挠腮变成了七窍生烟 、 火冒唐三藏）。</p>
<p>我想在，看来还是有地方的缓存没有清理干净。</p>
<p>于是，又是一个小时！！！</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="三问题解决">三、问题解决<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/16/%E4%B8%80%E4%BB%B6%E6%BB%91%E7%A8%BD%E7%9A%84%E4%BA%8B#%E4%B8%89%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3" class="hash-link" aria-label="三、问题解决的直接链接" title="三、问题解决的直接链接" translate="no">​</a></h2>
<p>后来在编译器使用全项目检索当前展示文本，发现当前仅有 'i18n/docusaurus-theme-classic/navbar.json' 文件中有该文本的痕迹。</p>
<p>愤怒 、 委屈 、 不甘。。。</p>
<p>说实话，我都想锤自己一顿。</p>
<p>还能怎么办，删了 'i18n' 文件夹呗。难不成真的要打自己一顿。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="四原因总结">四、原因总结<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/12/16/%E4%B8%80%E4%BB%B6%E6%BB%91%E7%A8%BD%E7%9A%84%E4%BA%8B#%E5%9B%9B%E5%8E%9F%E5%9B%A0%E6%80%BB%E7%BB%93" class="hash-link" aria-label="四、原因总结的直接链接" title="四、原因总结的直接链接" translate="no">​</a></h2>
<p>粗心永远是我最大的敌人。</p>
<p>另一个就是对知识点掌握的不足，如果能知道 'i18n' 文件将覆盖运行时，也不至于让自己变得很狼狈。</p>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="docusaurus" term="docusaurus"/>
        <category label="囧事" term="囧事"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[移除讨厌的打印狗]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/8/26/移除打印狗</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/8/26/移除打印狗"/>
        <updated>2025-08-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在 npm 项目上使用 dog 时发现挺便捷，关键在使用时添加 xxx_dev=all 的启动环境变量，既可以在正式环境也观察到数据流转及发现错误的具体原因。]]></summary>
        <content type="html"><![CDATA[<p>在 npm 项目上使用 <a href="https://www.npmjs.com/package/@qqi/log" target="_blank" rel="noopener noreferrer" class="">dog</a> 时发现挺便捷，关键在使用时添加 <code>xxx_dev=all</code> 的启动环境变量，既可以在正式环境也观察到数据流转及发现错误的具体原因。</p>
<p>后来就在 web 项目中使用，发现效果尚可，其实不如 <code>babel</code> 的插件 <code>babel-plugin-transform-remove-console</code> 移除 <code>console</code> 彻底些。</p>
<!-- -->
<p>但是，毕竟写了这么包，不用也不太好。主要该包能在函数头位通过设置 <code>type</code> 属性值来判定是否需要打印消息。这样就省去了添加再删除 、 下次使用时再添加 <code>console.log</code> 的麻烦，且也可以通过过滤器过滤掉。</p>
<p>在原有的包基础上，又添加了 <a href="https://www.npmjs.com/package/@qqi/babel-plugin-remove-dog-calls" target="_blank" rel="noopener noreferrer" class="">remove dog</a> babel 插件，并搭配着使用 mocks 模拟方法，将 dog 转换成无害的死代码。</p>
<p>其实，一开始还是好的。直到出现了双入口打包的情况。</p>
<p>为了让包 <code>enr</code> 能够在 <code>NextJs</code> 环境下使用，将有状态的组件和无状态的组件进行了分别打包，并在非服务组件的打包头部添加了 <code>use client</code>。但是，在测试时发现了显示 ：</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports operator" style="color:#393A34">*</span><span class="token imports"> </span><span class="token imports keyword module" style="color:#00009f">as</span><span class="token imports"> __webpack_chunk_1__</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'./dog.mjs'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">__webpack_require__</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">C</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__webpack_chunk_1__</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> __webpack_exports__ </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> __webpack_require__</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">O</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword nil" style="color:#00009f">undefined</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'dog'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token function" style="color:#d73a49">__webpack_require__</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'./index.server.ts'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">__webpack_exports__ </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> __webpack_require__</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">O</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__webpack_exports__</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> __webpack_exports__EnLayout </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> __webpack_exports__</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">EnLayout</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<p>该部分打包报错 <code>Can't read undefined of EnLayout</code>。 因为出错在 <code>dog</code> 包装后，所以判定是 <code>dog</code> 公共方法打包错误引起的。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="使用-babel">使用 babel<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/26/%E7%A7%BB%E9%99%A4%E6%89%93%E5%8D%B0%E7%8B%97#%E4%BD%BF%E7%94%A8-babel" class="hash-link" aria-label="使用 babel的直接链接" title="使用 babel的直接链接" translate="no">​</a></h2>
<p>正如先前构建的包 <a href="https://www.npmjs.com/package/@qqi/babel-plugin-remove-dog-calls" target="_blank" rel="noopener noreferrer" class="">remove dog</a> 一样，在 babel 中引入该包，并根据 <code>process.env</code> 的当前启动环境变量值确定是否加载该插件：</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">process</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'node:process'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">api</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  api</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">cache</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> mode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">env</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dev_mode</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">??</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'production'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> isProduction </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> env </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'production'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">presets</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'@babel/preset-env'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'@babel/preset-react'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'@babel/preset-typescript'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">isProduction </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@qqi/babel-plugin-remove-dog-calls'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">filter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token known-class-name class-name">Boolean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p>该方法确实是去除了代码结果中的 <code>dog</code> 调用，但打包发现并为完全去除。因为在实际打包的两个文件中还是分别发现了上面的 <code>dog</code> 引用代码，且，当前依旧是显示 <code>EnLayout</code> 无法被访问。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="使用-mocks">使用 mocks<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/26/%E7%A7%BB%E9%99%A4%E6%89%93%E5%8D%B0%E7%8B%97#%E4%BD%BF%E7%94%A8-mocks" class="hash-link" aria-label="使用 mocks的直接链接" title="使用 mocks的直接链接" translate="no">​</a></h2>
<p>一计不成，再想损招。于是想着既然移除了打印，但是还残留 <code>dog</code> 的打包，自然，已经包含着 <code>dog</code> ，但是 <code>dog</code> 本身又引用着 <a href="https://www.npmjs.com/package/@qqi/log" target="_blank" rel="noopener noreferrer" class="">@qqi/log</a> ，相当于还的把 <a href="https://www.npmjs.com/package/@qqi/log" target="_blank" rel="noopener noreferrer" class="">@qqi/log</a> 打包进最后的包或是强制使用该依赖包的项目多安装几个不需要的依赖。嗯，大可不必。</p>
<p>于是，使用 <code>webpack.config.js</code> 配置在打包时，将 <code>resolve.alias</code> 的 <code>@qqi/log</code> 指向它处：</p>
<div class="theme-tabs-container tabs-container tabList_GGXe"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_QOjA tabs__item--active">webpack.config.js</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_QOjA">mocks/log.mjs</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_bPac"><div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> join </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'node:path'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">resolve</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">alias</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token string-property property" style="color:#36acaa">'@qqi/log'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">meta</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dirname</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'./mocks/log.mjs'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_bPac" hidden=""><div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token doc-comment comment" style="color:#999988;font-style:italic">/**  模拟类，用于打包用  */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#d73a49">Dog</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token doc-comment comment" style="color:#999988;font-style:italic">/**  模拟类的构建  */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">_dev</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token known-class-name class-name">Object</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setPrototypeOf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_dev</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token known-class-name class-name">Object</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">defineProperties</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_dev</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">info</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">configurable</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">writable</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">warn</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">configurable</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">writable</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">error</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">configurable</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">writable</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">configurable</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">writable</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> _dev</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token class-name">Dog</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">prototype</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">clear</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">clear</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div></code></pre></div></div></div></div></div>
<p>然后，打包后发现并为解决 <code>Layout</code> 找不到的问题。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="使用-loader">使用 loader<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/26/%E7%A7%BB%E9%99%A4%E6%89%93%E5%8D%B0%E7%8B%97#%E4%BD%BF%E7%94%A8-loader" class="hash-link" aria-label="使用 loader的直接链接" title="使用 loader的直接链接" translate="no">​</a></h2>
<p>两计不成，继续憋坏。于是想着既然移除了打印，现在组件对 <code>dog</code> 的痕迹也就剩下了 <code>import { dog }  from 'dog';</code>。肯定就是这货捣的乱，于是，决定在 <code>webpack</code> 的 <code>loader</code> 中消灭掉该语句：</p>
<div class="theme-tabs-container tabs-container tabList_GGXe"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_QOjA tabs__item--active">loaders/remove-import-dog.js</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_QOjA">webpack.config.js</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_bPac"><div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">source</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> withDogRegExp </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex" style="color:#36acaa">import</span><span class="token regex regex-source language-regex char-set class-name" style="color:#36acaa">\s</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">+</span><span class="token regex regex-source language-regex special-escape escape" style="color:#36acaa">\{</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">?</span><span class="token regex regex-source language-regex char-set class-name" style="color:#36acaa">\s</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">*</span><span class="token regex regex-source language-regex" style="color:#36acaa">dog</span><span class="token regex regex-source language-regex char-set class-name" style="color:#36acaa">\s</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">*</span><span class="token regex regex-source language-regex special-escape escape" style="color:#36acaa">\}</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">*</span><span class="token regex regex-source language-regex char-set class-name" style="color:#36acaa">\s</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">+</span><span class="token regex regex-source language-regex" style="color:#36acaa">from</span><span class="token regex regex-source language-regex char-set class-name" style="color:#36acaa">\s</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">+</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">[</span><span class="token regex regex-source language-regex char-class" style="color:#36acaa">'"</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">]</span><span class="token regex regex-source language-regex" style="color:#36acaa">dog</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">[</span><span class="token regex regex-source language-regex char-class" style="color:#36acaa">'"</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">]</span><span class="token regex regex-source language-regex" style="color:#36acaa">;</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">?</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-flags" style="color:#36acaa">g</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">withDogRegExp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">test</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">source</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> source</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">replace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">withDogRegExp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">''</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> source</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div></div><div role="tabpanel" class="tabItem_bPac" hidden=""><div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">module</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">test</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex special-escape escape" style="color:#36acaa">\.</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">[</span><span class="token regex regex-source language-regex char-class" style="color:#36acaa">tj</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">]</span><span class="token regex regex-source language-regex" style="color:#36acaa">sx</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">?</span><span class="token regex regex-source language-regex anchor function" style="color:#d73a49">$</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">use</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'./loaders/remove-import-dog.js'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token literal-property property" style="color:#36acaa">loader</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'babel-loader'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token literal-property property" style="color:#36acaa">options</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">                </span><span class="token literal-property property" style="color:#36acaa">configFile</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'./babel.config.js'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">            </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">     </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div></div></div></div>
<p>方法倒是挺好理解，于是，就添加到了 <code>webpack.config.js</code> 。打包，测试（前提是启用了 <a href="https://www.npmjs.com/package/@qqi/babel-plugin-remove-dog-calls" target="_blank" rel="noopener noreferrer" class="">remove dog</a>）,发现没有了 <code>Can't not read undefined of Layout</code>，页面渲染正常。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="病灶">病灶<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/26/%E7%A7%BB%E9%99%A4%E6%89%93%E5%8D%B0%E7%8B%97#%E7%97%85%E7%81%B6" class="hash-link" aria-label="病灶的直接链接" title="病灶的直接链接" translate="no">​</a></h2>
<p>虽然，但是。是吧，是能够正确的渲染了，但是总感觉少点啥。对，少了一天的好心情。</p>
<p>于是，移除 <a href="https://www.npmjs.com/package/@qqi/babel-plugin-remove-dog-calls" target="_blank" rel="noopener noreferrer" class="">remove dog</a>，删除添加的 <code>loader</code>。</p>
<p>在原打包配置下，从压缩后的文件一点点打印日志，在实际的使用中获得了错误：</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword" style="color:#00009f">function</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">throw</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token template-string string" style="color:#e3116c">  Attempted to call __webpack_esm_modules__()</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token template-string string" style="color:#e3116c">  from the server but __webpack_esm_modules__ is on the client.</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token template-string string" style="color:#e3116c">  It's not possible to invoke a client function from the server,</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token template-string string" style="color:#e3116c">  it can only be rendered as a Component or passed to props of a Client Component.</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span></span><br></div></code></pre></div></div>
<p>该错误是由 <code>webpack</code> 在解析接入包时报错，且未显示在控制台，让我一直以为是 <code>dog</code> 没有移除干净导致的。原来是我手动给文件添加 <code>use client</code> 导致被切割的 <code>dog_ts.mjs</code> 文件头也存在了该物，遂导致了差不多耽搁一小天的时间的错误。</p>
<p>冤有头，债有主。</p>
<p>于是找到了 <code>add-use-client-loader.js</code> 文件，正确匹配了该添加 <code>use client</code> 的文件的。于是，耽搁一天的问题才算是真正的得到了解决。</p>
<p>这次的教训无疑的惨痛的，耽搁时间不说，还导致项目拖沓，脑瓜疼。遇事多打“断点”（日志） 、 少瞎折腾 、 多想解决方案，少着急上火。</p>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="npm 包" term="npm 包"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[布局的学习]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/8/22/布局的思考</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/8/22/布局的思考"/>
        <updated>2025-08-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[先写了一个布局，发现，总是在 NextJs 中显示水合错误]]></summary>
        <content type="html"><![CDATA[<p>先写了一个布局，发现，总是在 <code>NextJs</code> 中显示水合错误</p>
<p>现在想着使用 <code>FlexBox</code> 或是 <code>Grid</code> 来更改。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="布局结构">布局结构<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/22/%E5%B8%83%E5%B1%80%E7%9A%84%E6%80%9D%E8%80%83#%E5%B8%83%E5%B1%80%E7%BB%93%E6%9E%84" class="hash-link" aria-label="布局结构的直接链接" title="布局结构的直接链接" translate="no">​</a></h2>
<div class="language-html codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">布局结构</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-html codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">body</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">page</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">header</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">header</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">头部</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">page-container</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">aside</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">sidebar</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">侧边栏</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">aside</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">main</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">main</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">内容区</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">main</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">footer</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">footer</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">页脚</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">footer</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">body</span><span class="token tag punctuation" style="color:#393A34">&gt;</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="使用-flexbox-弹性布局样式">使用 FlexBox 弹性布局样式<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/22/%E5%B8%83%E5%B1%80%E7%9A%84%E6%80%9D%E8%80%83#%E4%BD%BF%E7%94%A8-flexbox-%E5%BC%B9%E6%80%A7%E5%B8%83%E5%B1%80%E6%A0%B7%E5%BC%8F" class="hash-link" aria-label="使用 FlexBox 弹性布局样式的直接链接" title="使用 FlexBox 弹性布局样式的直接链接" translate="no">​</a></h3>
<p>使用 <code>FlexBox</code> 可以考虑：</p>
<ul>
<li class=""><strong>头部和页脚固定高度</strong>：通过 <code>height</code> 属性固定高度，不随内容变化</li>
<li class=""><strong>侧栏与内容区弹性分配</strong>：<code>page-container</code> 使用 <code>flex: 1</code> 占据剩余空间，<code>sidebar</code> 和 <code>main</code> 分别通过 <code>width</code> 和 <code>flex: 1</code> 分配宽度，高度自动跟随 <code>container</code> 的高度（即视口高度减去头部和页脚高度）</li>
<li class=""><strong>内容过长</strong>：<code>sidebar</code> 和 <code>main</code> 设置 <code>overflow-y: auto</code>，内容过长时内部滚动，避免整体布局被撑开</li>
</ul>
<div class="language-css codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">flex-box.css</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-css codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic">/* 重置默认边距 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token selector" style="color:#00009f">html</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token selector" style="color:#00009f">body</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">margin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token unit">%</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* 确保父容器占满视口高度 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.page</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">display</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flex</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">flex-direction</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> column</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">min-height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token unit">vh</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* 至少占满视口高度 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.header</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--header-height</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* 头部固定高度 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">background</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#f0f0f0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.page-container</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">display</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flex</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">flex</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* 占据剩余所有空间 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">overflow</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> hidden</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* 防止内容溢出 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.sidebar</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--sidebar-width</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* 侧栏固定宽度 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">background</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#e0e0e0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">overflow-y</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> auto</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* 内容过长时滚动 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.main</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">flex</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* 内容区占据剩余空间 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token unit">rem</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">overflow-y</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> auto</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* 内容过长时滚动 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.footer</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--footer-height</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* 页脚固定高度 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">background</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#f0f0f0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="使用-grid-布局精细控制">使用 grid 布局精细控制<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/22/%E5%B8%83%E5%B1%80%E7%9A%84%E6%80%9D%E8%80%83#%E4%BD%BF%E7%94%A8-grid-%E5%B8%83%E5%B1%80%E7%B2%BE%E7%BB%86%E6%8E%A7%E5%88%B6" class="hash-link" aria-label="使用 grid 布局精细控制的直接链接" title="使用 grid 布局精细控制的直接链接" translate="no">​</a></h3>
<p>使用 <code>grid</code> 可以使用自动高度的方式让其精细分配：</p>
<ul>
<li class=""><strong>行高分配</strong>：使用 <code>grid-template-rows: auto 1fr auto</code> 头部（自动高度） 、 内容区（剩余空间） 、 页脚（自动高度）</li>
<li class=""><strong>列宽分配</strong>：使用 <code>grid-template-columns</code> 定义侧栏和内容区的宽度，侧栏固定，内容区占据剩余空间</li>
<li class=""><strong>高度分配</strong>：<code>container</code>的高度为 <code>100%</code>（即父容器的 <code>1fr</code> 高度），侧栏和内容区的高度自动同步，避免间隙</li>
</ul>
<div class="language-css codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OtSM">grid.css</div><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-css codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token selector class" style="color:#00009f">.page</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">display</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> grid</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">grid-template-rows</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> auto </span><span class="token number" style="color:#36acaa">1</span><span class="token unit">fr</span><span class="token plain"> auto</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* 头部（自动高度）  、 内容区（剩余空间）  、 页脚（自动高度） */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">min-height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token unit">vh</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.header</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">background</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#f0f0f0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.page-container</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">display</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> grid</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">grid-template-columns</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--sidebar-width</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token unit">fr</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* 侧栏固定宽度，内容区剩余空间 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token unit">%</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* 占据父容器的 1fr 高度 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.sidebar</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">background</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#e0e0e0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">overflow-y</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> auto</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.main</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token unit">rem</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">overflow-y</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> auto</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.footer</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">background</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#f0f0f0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="npm 包" term="npm 包"/>
        <category label="css" term="css"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[docusaurus 可弹出的组件]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/8/21/docusaurus-swizzle</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/8/21/docusaurus-swizzle"/>
        <updated>2025-08-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本来觉得没有用，但是英语不好，忽然觉得组件命名上可以借鉴。毕竟，docusaurus 是一款成熟且]]></summary>
        <content type="html"><![CDATA[<p>本来觉得没有用，但是英语不好，忽然觉得组件命名上可以借鉴。毕竟，<a href="https://docusaurus.io/zh-CN/docs/swizzling" target="_blank" rel="noopener noreferrer" class="">docusaurus</a> 是一款成熟且</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="警示相关">警示相关<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#%E8%AD%A6%E7%A4%BA%E7%9B%B8%E5%85%B3" class="hash-link" aria-label="警示相关的直接链接" title="警示相关的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><code>Admonition</code> 劝解 、 提示<!-- -->
<ul>
<li class=""><code>Icon</code>
<ul>
<li class=""><code>Danger</code> 危险提示图标</li>
<li class=""><code>Info</code> 信息</li>
<li class=""><code>Note</code> 备注</li>
<li class=""><code>Tip</code> 提示</li>
<li class=""><code>Warning</code> 警示 、 警告</li>
</ul>
</li>
<li class=""><code>Layout</code> 提示的布局</li>
<li class=""><code>Type</code> 提示的类型<!-- -->
<ul>
<li class=""><code>Caution</code> 注意，警告</li>
<li class=""><code>Danger</code> 危险</li>
<li class=""><code>Info</code> 信息</li>
<li class=""><code>Note</code> 备注</li>
<li class=""><code>Tip</code> 提示</li>
<li class=""><code>Warning</code> 警示</li>
</ul>
</li>
<li class=""><code>types</code></li>
</ul>
</li>
<li class="">AnnouncementBar<!-- -->
<ul>
<li class="">CloseButton</li>
<li class="">Content</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="代码块">代码块<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#%E4%BB%A3%E7%A0%81%E5%9D%97" class="hash-link" aria-label="代码块的直接链接" title="代码块的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><code>CodeBlock</code> 代码块<!-- -->
<ul>
<li class="">Buttons<!-- -->
<ul>
<li class="">Button</li>
<li class="">CopyButton</li>
<li class="">WordWrapButton</li>
</ul>
</li>
<li class="">Container</li>
<li class="">Content<!-- -->
<ul>
<li class="">Element</li>
<li class="">String</li>
</ul>
</li>
<li class="">Layout</li>
<li class="">Line<!-- -->
<ul>
<li class="">Token</li>
</ul>
</li>
<li class="">Title</li>
</ul>
</li>
<li class="">CodeInline</li>
<li class=""><code>ColorModeToggle</code> 深色模式切换</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="功能页">功能页<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#%E5%8A%9F%E8%83%BD%E9%A1%B5" class="hash-link" aria-label="功能页的直接链接" title="功能页的直接链接" translate="no">​</a></h2>
<ul>
<li class="">ErrorPageContent</li>
<li class="">NotFound<!-- -->
<ul>
<li class="">Content</li>
</ul>
</li>
<li class="">SearchMetadata</li>
<li class="">SiteMetadata</li>
<li class="">TOC</li>
<li class="">TOCCollapsible<!-- -->
<ul>
<li class="">CollapseButton</li>
</ul>
</li>
<li class="">TOCInline</li>
<li class="">TOCItems<!-- -->
<ul>
<li class="">Tree</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="功能组件">功能组件<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#%E5%8A%9F%E8%83%BD%E7%BB%84%E4%BB%B6" class="hash-link" aria-label="功能组件的直接链接" title="功能组件的直接链接" translate="no">​</a></h2>
<ul>
<li class="">Logo</li>
<li class="">EditMetaRow</li>
<li class="">EditThisPage</li>
<li class="">BackToTopButton</li>
<li class="">SkipToContent</li>
<li class="">Mermaid</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="布局">布局<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#%E5%B8%83%E5%B1%80" class="hash-link" aria-label="布局的直接链接" title="布局的直接链接" translate="no">​</a></h2>
<ul>
<li class="">Layout<!-- -->
<ul>
<li class="">Provider</li>
</ul>
</li>
<li class="">Heading</li>
<li class="">ContentVisibility<!-- -->
<ul>
<li class="">Draft</li>
<li class="">Unlisted</li>
</ul>
</li>
<li class="">Details</li>
<li class="">TabItem</li>
<li class="">Tabs</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="导航栏">导航栏<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#%E5%AF%BC%E8%88%AA%E6%A0%8F" class="hash-link" aria-label="导航栏的直接链接" title="导航栏的直接链接" translate="no">​</a></h3>
<ul>
<li class="">Navbar<!-- -->
<ul>
<li class="">ColorModeToggle</li>
<li class="">Content</li>
<li class="">Layout</li>
<li class="">Logo</li>
<li class="">MobileSidebar<!-- -->
<ul>
<li class="">Header</li>
<li class="">Layout</li>
<li class="">PrimaryMenu</li>
<li class="">SecondaryMenu</li>
<li class="">Toggle</li>
</ul>
</li>
<li class="">Search</li>
</ul>
</li>
<li class="">NavbarItem<!-- -->
<ul>
<li class="">DefaultNavbarItem<!-- -->
<ul>
<li class="">Desktop</li>
<li class="">Mobile</li>
</ul>
</li>
<li class="">DocNavbarItem</li>
<li class="">DocSidebarNavbarItem</li>
<li class="">DocsVersionDropdownNavbarItem</li>
<li class="">DocsVersionNavbarItem</li>
<li class="">DropdownNavbarItem<!-- -->
<ul>
<li class="">Desktop</li>
<li class="">Mobile</li>
</ul>
</li>
<li class="">HtmlNavbarItem</li>
<li class="">LocaleDropdownNavbarItem</li>
<li class="">NavbarNavLink</li>
<li class="">SearchNavbarItem</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="面包屑">面包屑<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#%E9%9D%A2%E5%8C%85%E5%B1%91" class="hash-link" aria-label="面包屑的直接链接" title="面包屑的直接链接" translate="no">​</a></h3>
<ul>
<li class="">PaginatorNavLink</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="页脚">页脚<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#%E9%A1%B5%E8%84%9A" class="hash-link" aria-label="页脚的直接链接" title="页脚的直接链接" translate="no">​</a></h3>
<ul>
<li class="">Footer<!-- -->
<ul>
<li class="">Copyright</li>
<li class="">Layout</li>
<li class="">LinkItem</li>
<li class="">Links<!-- -->
<ul>
<li class="">MultiColumn</li>
<li class="">Simple</li>
</ul>
</li>
<li class="">Logo</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="图标">图标<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#%E5%9B%BE%E6%A0%87" class="hash-link" aria-label="图标的直接链接" title="图标的直接链接" translate="no">​</a></h2>
<ul>
<li class="">Icon<!-- -->
<ul>
<li class="">Arrow</li>
<li class="">DarkMode</li>
<li class="">Edit</li>
<li class="">LightMode</li>
<li class="">Menu</li>
<li class="">Close</li>
<li class="">Copy</li>
<li class="">ExternalLink</li>
<li class="">Home</li>
<li class="">Language</li>
<li class="">Socials<!-- -->
<ul>
<li class="">Bluesky</li>
<li class="">Default</li>
<li class="">GitHub</li>
<li class="">Instagram</li>
<li class="">LinkedIn</li>
<li class="">Mastodon</li>
<li class="">StackOverflow</li>
<li class="">Threads</li>
<li class="">Twitch</li>
<li class="">Twitter</li>
<li class="">X</li>
<li class="">YouTube</li>
</ul>
</li>
<li class="">Success</li>
<li class="">SystemColorMode</li>
<li class="">WordWrap</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="mdx-文件内容">mdx 文件内容<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#mdx-%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9" class="hash-link" aria-label="mdx 文件内容的直接链接" title="mdx 文件内容的直接链接" translate="no">​</a></h2>
<ul>
<li class="">MDXPage</li>
<li class="">MDXContent</li>
<li class="">SearchBar</li>
<li class="">Admonition</li>
<li class="">NavbarItem<!-- -->
<ul>
<li class="">ComponentTypes</li>
</ul>
</li>
<li class="">prism-include-languages</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="mdx-元素默认覆盖">mdx 元素默认覆盖<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#mdx-%E5%85%83%E7%B4%A0%E9%BB%98%E8%AE%A4%E8%A6%86%E7%9B%96" class="hash-link" aria-label="mdx 元素默认覆盖的直接链接" title="mdx 元素默认覆盖的直接链接" translate="no">​</a></h3>
<ul>
<li class="">MDXComponents<!-- -->
<ul>
<li class="">A</li>
<li class="">Code</li>
<li class="">Details</li>
<li class="">Heading</li>
<li class="">Img</li>
<li class="">Pre</li>
<li class="">Ul</li>
<li class="">Li</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="文档系统">文档系统<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#%E6%96%87%E6%A1%A3%E7%B3%BB%E7%BB%9F" class="hash-link" aria-label="文档系统的直接链接" title="文档系统的直接链接" translate="no">​</a></h2>
<ul>
<li class="">DocBreadcrumbs<!-- -->
<ul>
<li class="">Items<!-- -->
<ul>
<li class="">Home</li>
</ul>
</li>
<li class="">StructuredData</li>
</ul>
</li>
<li class="">DocCard</li>
<li class="">DocCategoryGeneratedIndexPage</li>
<li class="">DocItem<!-- -->
<ul>
<li class="">Content</li>
<li class="">Footer</li>
<li class="">Layout</li>
<li class="">Metadata</li>
<li class="">Paginator</li>
<li class="">TOC<!-- -->
<ul>
<li class="">Desktop</li>
<li class="">Mobile</li>
</ul>
</li>
</ul>
</li>
<li class=""><code>DocCardList</code> 文档卡片列表</li>
<li class="">DocPaginator</li>
<li class="">DocRoot<!-- -->
<ul>
<li class="">Layout<!-- -->
<ul>
<li class="">Main</li>
<li class="">Sidebar<!-- -->
<ul>
<li class="">ExpandButton</li>
</ul>
</li>
</ul>
</li>
<li class="">Desktop<!-- -->
<ul>
<li class="">CollapseButton</li>
<li class="">Content</li>
</ul>
</li>
<li class="">Mobile</li>
</ul>
</li>
<li class="">DocSidebar</li>
<li class="">DocSidebarItem<!-- -->
<ul>
<li class="">Category</li>
<li class="">Html</li>
<li class="">Link</li>
</ul>
</li>
<li class="">DocSidebarItems</li>
<li class="">DocTagDocListPage</li>
<li class="">DocTagsListPage</li>
<li class="">DocVersionBadge</li>
<li class="">DocVersionBanner</li>
<li class="">DocVersionRoot</li>
<li class="">DocsRoot</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="博客相关">博客相关<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#%E5%8D%9A%E5%AE%A2%E7%9B%B8%E5%85%B3" class="hash-link" aria-label="博客相关的直接链接" title="博客相关的直接链接" translate="no">​</a></h2>
<ul>
<li class="">Blog<!-- -->
<ul>
<li class="">Components<!-- -->
<ul>
<li class="">Author<!-- -->
<ul>
<li class="">Socials</li>
</ul>
</li>
</ul>
</li>
<li class="">Pages<!-- -->
<ul>
<li class="">BlogAuthorsListPage</li>
<li class="">BlogAuthorsPostsPage</li>
</ul>
</li>
</ul>
</li>
<li class="">BlogArchivePage</li>
<li class="">BlogLayout</li>
<li class="">BlogListPage<!-- -->
<ul>
<li class="">StructuredData</li>
</ul>
</li>
<li class="">BlogListPaginator</li>
<li class="">BlogPostItem<!-- -->
<ul>
<li class="">Container</li>
<li class="">Content</li>
<li class="">Footer<!-- -->
<ul>
<li class="">ReadMoreLink</li>
</ul>
</li>
<li class="">Header<!-- -->
<ul>
<li class="">Authors</li>
<li class="">Info</li>
<li class="">Title</li>
</ul>
</li>
</ul>
</li>
<li class="">BlogPostItems</li>
<li class="">BlogPostPage<!-- -->
<ul>
<li class="">Metadata</li>
<li class="">StructuredData</li>
</ul>
</li>
<li class="">BlogPostPaginator</li>
<li class="">LastUpdated</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="博文侧栏">博文侧栏<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#%E5%8D%9A%E6%96%87%E4%BE%A7%E6%A0%8F" class="hash-link" aria-label="博文侧栏的直接链接" title="博文侧栏的直接链接" translate="no">​</a></h3>
<ul>
<li class="">
<p>BlogSidebar</p>
<ul>
<li class="">Content</li>
<li class="">Desktop</li>
<li class="">Mobile</li>
</ul>
</li>
<li class="">
<p>BlogTagsListPage</p>
</li>
<li class="">
<p>BlogTagsPostsPage</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="博客标签">博客标签<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/8/21/docusaurus-swizzle#%E5%8D%9A%E5%AE%A2%E6%A0%87%E7%AD%BE" class="hash-link" aria-label="博客标签的直接链接" title="博客标签的直接链接" translate="no">​</a></h3>
<ul>
<li class="">Tag</li>
<li class="">TagsListByLetter</li>
<li class="">TagsListInline</li>
<li class="">ThemeProvider<!-- -->
<ul>
<li class="">TitleFormatter</li>
</ul>
</li>
<li class="">ThemedImage</li>
</ul>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="docusaurus" term="docusaurus"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[await 也需要 catch]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/5/18/await 意味着 try catch</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/5/18/await 意味着 try catch"/>
        <updated>2025-05-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[正确使用 try...catch 可加强]]></summary>
        <content type="html"><![CDATA[<p>不记得在哪里看了这么一句话：“在 js 中尽量不写 <code>try...catch</code> ，因为会拖累进程，甚至拖垮程序。每一个 <code>try..catch</code> 都将创建一个独立的内存，需要先执行一遍，然后看一下有没有错误，没有错误再返回源执行栈事件进行执行。“</p>
<!-- -->
<p>当时，看见这句话，若获珍宝。巴不得在自己的项目中可以一个 <code>try...catch</code> 没有，也不能造成性能不足。</p>
<p><em>直到</em>，昨晚一个小时一点点的打印找关于 <code>triggerUncaughtException</code> 的错，才发现，这真是“外行看热闹，内行看门道。半瓶子看自以为是和瞎几把信外行的瞎几把说”。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="性能关键结论">性能关键结论​<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/18/await%20%E6%84%8F%E5%91%B3%E7%9D%80%20try%20catch#%E6%80%A7%E8%83%BD%E5%85%B3%E9%94%AE%E7%BB%93%E8%AE%BA" class="hash-link" aria-label="性能关键结论​的直接链接" title="性能关键结论​的直接链接" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">场景</th><th style="text-align:left">性能影响</th><th style="text-align:left">数据参考 (V8 引擎)</th></tr></thead><tbody><tr><td style="text-align:left">​​无异常的 try/catch</td><td style="text-align:left">几乎无损耗（ &lt;1% 差异）</td><td style="text-align:left">每秒执行 1 亿次无感知</td></tr><tr><td style="text-align:left">​​高频抛出异常​​</td><td style="text-align:left">显著下降（10~100 倍）</td><td style="text-align:left">每秒处理异常 ≤1 万次</td></tr><tr><td style="text-align:left">​​嵌套 try/catch</td><td style="text-align:left">作用域管理有轻微损耗</td><td style="text-align:left">单层 vs 五层损耗差约 5%</td></tr></tbody></table>
<p><strong>正确性 &gt;&gt; 性能</strong>​​：牺牲 1% 性能换取健壮的错误处理是值得的。只有对性能极其敏感的核心模块（如游戏引擎 、 高频交易系统），才需要抠 try/catch 的细节。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="引擎优化原理">引擎优化原理​<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/18/await%20%E6%84%8F%E5%91%B3%E7%9D%80%20try%20catch#%E5%BC%95%E6%93%8E%E4%BC%98%E5%8C%96%E5%8E%9F%E7%90%86" class="hash-link" aria-label="引擎优化原理​的直接链接" title="引擎优化原理​的直接链接" translate="no">​</a></h2>
<ol>
<li class=""><strong>无异常路径的「快速通道」​​</strong>
V8 会对未触发异常的 try 代码块做内联缓存优化（Inline Caching），跳过异常监控逻辑。
类似 if/else 的​​预测执行机制​​，不影响主线程性能。</li>
<li class=""><strong>​​仅当 throw 时触发「慢速路径」​​</strong>
异常对象需要生成堆栈跟踪（Stack Trace），消耗 CPU。
垃圾回收压力增大（频繁创建/销毁 Error 对象）。</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="极端场景性能陷阱">极端场景性能陷阱​<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/18/await%20%E6%84%8F%E5%91%B3%E7%9D%80%20try%20catch#%E6%9E%81%E7%AB%AF%E5%9C%BA%E6%99%AF%E6%80%A7%E8%83%BD%E9%99%B7%E9%98%B1" class="hash-link" aria-label="极端场景性能陷阱​的直接链接" title="极端场景性能陷阱​的直接链接" translate="no">​</a></h2>
<ol>
<li class="">高频异常抛出（灾难级性能）​</li>
</ol>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic">// ❌ 错误用法：将异常用于正常控制流</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">validate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">num</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">num </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">throw</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'Negative'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> num</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// ✅ 优化方案：用条件判断代替异常</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">validate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">num</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> num </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> num</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p><strong>性能对比​​</strong>：改用条件判断后，速度提升 ​​50~100 倍​​。2. ​​热代码路径中的冗余 try/catch</p>
<div class="language-js codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-js codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic">// ❌ 不必要的 try/catch 包裹循环</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1e6</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 高频执行代码</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// ✅ 将 try/catch 移出循环</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1e6</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">/* 单次操作 */</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p><strong>性能对比​​</strong>：外层包裹导致引擎无法优化，速度下降 ​​5~10%​​。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="建议">建议<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/18/await%20%E6%84%8F%E5%91%B3%E7%9D%80%20try%20catch#%E5%BB%BA%E8%AE%AE" class="hash-link" aria-label="建议的直接链接" title="建议的直接链接" translate="no">​</a></h2>
<ol>
<li class=""><strong>必要错误处理</strong>​​：对数据库 、 网络请求 、 文件 IO 等​​异步操作必须用 try/catch。</li>
<li class=""><strong>避免异常滥用</strong>​​：​​不要用 throw 替代条件判断​​（如参数校验）。</li>
<li class=""><strong>全局兜底​</strong>​：用 process.on('unhandledRejection') 或 window.onerror 捕获漏网之鱼。</li>
<li class=""><strong>性能敏感场景</strong>​​：对高频执行的数学计算 、 排序算法等，优先用 if 防御而非 try。</li>
</ol>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="js" term="js"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[终端虽好，理性待之]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/5/17/关于 mac 终端的囧事</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/5/17/关于 mac 终端的囧事"/>
        <updated>2025-05-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[使用 mac 终端导致的笑话]]></summary>
        <content type="html"><![CDATA[<p>不想说，说了都是泪。在写 <a href="https://www.npmjs.com/package/a-command" target="_blank" rel="noopener noreferrer" class="">a-command</a> 的时候，有一件事贼尴尬。</p>
<p>写好了之后，在发布新版本后在 <a href="https://www.npmjs.com/package/vjj" target="_blank" rel="noopener noreferrer" class="">vjj</a>（使用的是 <a href="https://www.npmjs.com/package/a-command" target="_blank" rel="noopener noreferrer" class="">a-command</a> 的 <code>question</code> 和 <code>select</code>） 中使用时，发现测试时总是第三次就会出现打印残影。</p>
<!-- -->
<p>于是翻箱倒柜问国产 ai，回答都是一致的“在使用 <code>emitKeypressEvents</code> 的时候没有清理导致的残余”。</p>
<p>在 <a href="https://www.npmjs.com/package/a-command" target="_blank" rel="noopener noreferrer" class="">a-command</a> 的每一次测试都没有问题，一到了 <a href="https://www.npmjs.com/package/vjj" target="_blank" rel="noopener noreferrer" class="">vjj</a> 上就会出现这个问题。</p>
<p>首先声明：我的代码逻辑能力很强，这个不是代码逻辑或残余事件监听导致的</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="寻求五大家族的帮助">寻求五大家族的帮助<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/17/%E5%85%B3%E4%BA%8E%20mac%20%E7%BB%88%E7%AB%AF%E7%9A%84%E5%9B%A7%E4%BA%8B#%E5%AF%BB%E6%B1%82%E4%BA%94%E5%A4%A7%E5%AE%B6%E6%97%8F%E7%9A%84%E5%B8%AE%E5%8A%A9" class="hash-link" aria-label="寻求五大家族的帮助的直接链接" title="寻求五大家族的帮助的直接链接" translate="no">​</a></h2>
<p>五大家族（<a href="https://www.tongyi.com/qianwen/" target="_blank" rel="noopener noreferrer" class="">通义千问</a> 、 <a href="https://www.doubao.com/chat/" target="_blank" rel="noopener noreferrer" class="">字节豆包</a> 、 <a href="https://yuanbao.tencent.com/chat/naQivTmsDa" target="_blank" rel="noopener noreferrer" class="">腾讯元宝</a> 、 <a href="https://yiyan.baidu.com/" target="_blank" rel="noopener noreferrer" class="">百度一言</a> 、 <a href="https://chat.deepseek.com/" target="_blank" rel="noopener noreferrer" class=""><code>传说 ds</code></a>）回答基本上没有啥区别。无非是在前两次积攒的未清理的绑定事件没有及时清理导致后面的第三次毕现 bug。</p>
<p>神奇的是在 <a href="https://www.npmjs.com/package/a-command" target="_blank" rel="noopener noreferrer" class="">a-command</a>中却不会出现该故障，无论多少次测试都是一致的效果。</p>
<p>硬控一天，你懂不懂。真的是硬控一天。</p>
<p>而且该故障在使用 mac 终端时会在调试 <a href="https://www.npmjs.com/package/vjj" target="_blank" rel="noopener noreferrer" class="">vjj</a> 第三（必须是干净的从新打开的终端）次时必现，而在 vscode 中则没有该故障。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="初见端倪">初见端倪<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/17/%E5%85%B3%E4%BA%8E%20mac%20%E7%BB%88%E7%AB%AF%E7%9A%84%E5%9B%A7%E4%BA%8B#%E5%88%9D%E8%A7%81%E7%AB%AF%E5%80%AA" class="hash-link" aria-label="初见端倪的直接链接" title="初见端倪的直接链接" translate="no">​</a></h2>
<p>从该功能的根依赖 <a href="https://www.npmjs.com/package/a-node-tools" target="_blank" rel="noopener noreferrer" class="">a-node-tools</a> 到 <a href="https://www.npmjs.com/package/a-command" target="_blank" rel="noopener noreferrer" class="">a-command</a> 再到 <a href="https://www.npmjs.com/package/vjj" target="_blank" rel="noopener noreferrer" class="">vjj</a> ，最后没办法，做最小单元测试 、 功能测试，都无没有效果。</p>
<p>直到，不小心拉长了 mac 自带终端。发现，第三次毕现的问题居然在第五次才出现！！！</p>
<p>咦，那要是这么说的话，我一直在找的未清理的事件监听它不存在。他有可能是终端长度（行数，<code>process.stdout.rows</code>）的问题。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="找到问题解决问题">找到问题，解决问题<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/17/%E5%85%B3%E4%BA%8E%20mac%20%E7%BB%88%E7%AB%AF%E7%9A%84%E5%9B%A7%E4%BA%8B#%E6%89%BE%E5%88%B0%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E9%97%AE%E9%A2%98" class="hash-link" aria-label="找到问题，解决问题的直接链接" title="找到问题，解决问题的直接链接" translate="no">​</a></h2>
<p>其实，在 <a href="https://www.npmjs.com/package/a-command" target="_blank" rel="noopener noreferrer" class="">a-command</a> 的 <code>2.1.9</code> 版本之前是没有这个问题的，之前是采用打印记行数的逻辑，统计打印的行数，然后在输出内容后直接使用 <a href="https://www.npmjs.com/package/a-node-tools" target="_blank" rel="noopener noreferrer" class="">a-node-tools</a> 中的 <code>cursorModeUp</code> 将光标手动移动到上一次打印该问题的位置，然后进行打印清理（调用 <a href="https://www.npmjs.com/package/a-node-tools" target="_blank" rel="noopener noreferrer" class="">a-node-tools</a> 的 <code>cursorAfterClean</code>），之后再打印新内容，看起来就像是交互的问答或是选择。</p>
<p>后来，在 <a href="https://www.npmjs.com/package/a-node-tools" target="_blank" rel="noopener noreferrer" class="">a-node-tools</a> 中添加了 <code>cursorPositionSave</code> 和 <code>cursorPositionUndo</code> 来储存光标位置和释放光标的位置。</p>
<p>在 mac 的终端上出现问题因为在全新页面的终端，使用 <code>cursorPositionSave</code> 记录的是可视区域的光标位置，如果剩余的空间不足以打印将打印的内容，保存的位置是打印前的原位置，而实际在打印后，想打印的位置被顶到到了上面，使用 <code>cursorPositionUndo</code> 时恢复的是最后保存的光标位置，而不是实际的位置。</p>
<p>在 <a href="https://www.npmjs.com/package/a-command" target="_blank" rel="noopener noreferrer" class="">a-command</a> 的测试中每次都没有问题是因为每次执行 <code>npm test</code> 时，该钩子中有 <code>jja cls</code> 清理了旧的缓冲区，每次都是新的。</p>
<div class="language-json codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-json codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"scripts"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"test"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"jja rm .eg cls &amp;&amp; npm run dev"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="解决方案">解决方案<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/17/%E5%85%B3%E4%BA%8E%20mac%20%E7%BB%88%E7%AB%AF%E7%9A%84%E5%9B%A7%E4%BA%8B#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88" class="hash-link" aria-label="解决方案的直接链接" title="解决方案的直接链接" translate="no">​</a></h2>
<p>在下一版的 <a href="https://www.npmjs.com/package/a-command" target="_blank" rel="noopener noreferrer" class="">a-command</a> 中做出应对方案，包括不限于监听终端尺寸变化时清理终端 、 终端尺寸不足渲染时提醒拉大尺寸 、 在 mac 终端保存光标前</p>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="mac" term="mac"/>
        <category label="囧事" term="囧事"/>
        <category label="npm 包" term="npm 包"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[光标，你肿么了？怎么不见了]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/5/12/node 退出事件</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/5/12/node 退出事件"/>
        <updated>2025-05-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[使用  ANSI 转义码]]></summary>
        <content type="html"><![CDATA[<p>在编写 <a href="https://www.npmjs.com/package/a-node-tools" target="_blank" rel="noopener noreferrer" class="">a-node-tools</a> 的 runOtherCode 模块时，使用 <code>process.on('exit', cursorShow)</code> 监听事件流中断，期望在程序退出时将隐藏的光标展示出来。然而，在实际的使用中，难遂人愿。</p>
<p>在实际的运行中，在遇到 <code>Ctrl + C</code> 的这种意外事件时，触发的是 <code>SIGINT</code> 信号，触发了 <code>process.on('SIGINT'，()=&gt;{})</code></p>
<!-- -->
<p>所以，在事件的退出时，仅注册了 <code>process.on('exit', cursorShow)</code> 并没有得到想要的结果。</p>
<p>如果仅是如此，直接将 <code>cursorShow</code> 事件作为 <code>SIGINT</code> 的回调不就完事。但，这件事没这么简单。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="为什么可以在-a-command-中可用">为什么可以在 <code>a-command</code> 中可用？<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/12/node%20%E9%80%80%E5%87%BA%E4%BA%8B%E4%BB%B6#%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8F%AF%E4%BB%A5%E5%9C%A8-a-command-%E4%B8%AD%E5%8F%AF%E7%94%A8" class="hash-link" aria-label="为什么可以在-a-command-中可用的直接链接" title="为什么可以在-a-command-中可用的直接链接" translate="no">​</a></h2>
<p>在之前的版本中，并没有等待提示的打印。后来添加了等待后，从该包的下游产品 <a href="https://www.npmjs.com/package/a-command" target="_blank" rel="noopener noreferrer" class="">a-command</a> 摘取了这一段代码</p>
<div class="language-ts codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-ts codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> cursorShow </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'../cursor'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'exit'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cursorShow</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<p>在 <a href="https://www.npmjs.com/package/a-command" target="_blank" rel="noopener noreferrer" class="">a-command</a> 中使用该段代码能够在 <code>question</code> 和 <code>selection</code> 模块执行时正确的退出程序，而移动到 <a href="https://www.npmjs.com/package/a-node-tools" target="_blank" rel="noopener noreferrer" class="">a-node-tools</a> 却上演了罢工潮。所以，一定是哪里处理问题。</p>
<p>在 <a href="https://nodejs.org/docs/latest/api/process.html#process-events" target="_blank" rel="noopener noreferrer" class="">node 官方文档中</a> 的信号事件中对该信号值触发进行了讲解。</p>
<p><code>SIGINT</code> 是比较常用的一个手动退出的信号消息，该消息直接触发退出程序，它就是大名鼎鼎的 <code>Ctrl</code> + <code>C</code>。也是导致 <a href="https://www.npmjs.com/package/a-node-tools" target="_blank" rel="noopener noreferrer" class="">a-node-tools</a> 在退出前没有执行 'exit' 的信号事件监听。</p>
<p>原则上，没有监听 <code>Ctrl</code> + <code>C</code> node 将直接中止进程。</p>
<p>而在实际的使用中，可以监听信号事件 <code>SIGINT</code> 来自定义接收信号的动作。而这，将直接覆盖原 node 在接收该信号后的退出。</p>
<p>现在想要在程序意外接收用户的主动退出信号 <code>Ctrl</code> + <code>C</code> ,则必须监听 <code>SIGINT</code> 信号事件：</p>
<div class="language-ts codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-ts codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> cursorShow </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'../cursor'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'exit'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cursorShow</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'SIGINT'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token function" style="color:#d73a49">cursorShow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 意外退出时恢复光标的展示</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">exit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 退出程序，该命令会再次触发 process.on('exit') 上绑定事件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="退出码">退出码<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/12/node%20%E9%80%80%E5%87%BA%E4%BA%8B%E4%BB%B6#%E9%80%80%E5%87%BA%E7%A0%81" class="hash-link" aria-label="退出码的直接链接" title="退出码的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="sigterm">SIGTERM<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/12/node%20%E9%80%80%E5%87%BA%E4%BA%8B%E4%BB%B6#sigterm" class="hash-link" aria-label="SIGTERM的直接链接" title="SIGTERM的直接链接" translate="no">​</a></h3>
<p>当进程接收到SIGTERM信号时触发。这个信号通常是由系统或其他进程发送给当前进程，用于请求进程正常终止。与SIGINT类似，它也是一种常见的用于终止进程的信号，但SIGINT通常是由用户通过终端输入（如Ctrl + C）产生，而SIGTERM更多是由外部系统或进程发出的终止请求。可以通过process.on('SIGTERM', () =&gt; <!-- -->)来监听该事件。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="uncaughtexception">uncaughtException<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/12/node%20%E9%80%80%E5%87%BA%E4%BA%8B%E4%BB%B6#uncaughtexception" class="hash-link" aria-label="uncaughtException的直接链接" title="uncaughtException的直接链接" translate="no">​</a></h3>
<p>当一个未捕获的异常在事件循环中冒泡到最顶层时触发。如果不处理这个事件，Node.js 会打印出异常堆栈信息并退出进程。可以使用process.on('uncaughtException', (err) =&gt; <!-- -->)来监听该事件，在回调函数中可以进行一些紧急的错误处理，比如记录错误日志 、 尝试进行一些清理操作等，但不建议在这个事件中进行复杂的异步操作，因为进程可能会在这个事件处理完后立即退出。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="unhandledrejection">unhandledRejection<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/12/node%20%E9%80%80%E5%87%BA%E4%BA%8B%E4%BB%B6#unhandledrejection" class="hash-link" aria-label="unhandledRejection的直接链接" title="unhandledRejection的直接链接" translate="no">​</a></h3>
<p>当一个 Promise 被拒绝且没有被catch块捕获时触发。这通常表示在异步操作中出现了错误，但没有进行适当的错误处理。可以通过process.on('unhandledRejection', (reason, promise) =&gt; <!-- -->)来监听该事件，在回调函数中可以记录错误信息或采取一些补救措施。与uncaughtException不同，unhandledRejection不会导致进程立即退出，而是会在事件循环的下一个 tick 继续执行，这给了开发者更多的时间来处理未处理的 Promise 拒绝情况。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="beforeexit">beforeExit<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/5/12/node%20%E9%80%80%E5%87%BA%E4%BA%8B%E4%BB%B6#beforeexit" class="hash-link" aria-label="beforeExit的直接链接" title="beforeExit的直接链接" translate="no">​</a></h3>
<p>在exit事件之前触发，当 Node.js 检测到没有其他工作要做，准备退出事件循环时会触发这个事件。可以使用process.on('beforeExit', (code) =&gt; <!-- -->)来监听该事件，在回调函数中可以执行一些最后的清理操作，但需要注意的是，如果在beforeExit事件处理函数中启动了新的异步操作，可能会导致进程无法正常退出，因为beforeExit事件只是在检查是否可以退出时触发，而不是在确定要退出时触发。</p>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="npm 包" term="npm 包"/>
        <category label="node" term="node"/>
        <category label="终端" term="终端"/>
        <category label="囧事" term="囧事"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[ANSI 转义码]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/4/22/ANSI 转义码</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/4/22/ANSI 转义码"/>
        <updated>2025-04-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[使用  ANSI 转义码]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar__dGB" id="类别">类别<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E7%B1%BB%E5%88%AB" class="hash-link" aria-label="类别的直接链接" title="类别的直接链接" translate="no">​</a></h2>
<p>转义码主要用于控制终端的输出行为，有四个基本类别：</p>
<ul>
<li class="">光标：允许操控屏幕上光标的：移动 、 显隐 、 滚动限制 、 部分屏幕的使用</li>
<li class="">属性：设置或清除文本的属性</li>
<li class="">颜色：更改当前文本的前景色和背景色</li>
<li class="">其他转义：清除屏幕 、 清除屏幕部分 、 重置终端 、 设置制表符</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="一些-ansi-转义序列">一些 ANSI 转义序列<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E4%B8%80%E4%BA%9B-ansi-%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97" class="hash-link" aria-label="一些 ANSI 转义序列的直接链接" title="一些 ANSI 转义序列的直接链接" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">序列</th><th style="text-align:left">名称</th><th style="text-align:left">作用</th></tr></thead><tbody><tr><td style="text-align:left"><code>\eN</code></td><td style="text-align:left">SS2 - Single Shift Two</td><td style="text-align:left">从其中一个代替的字符集选择一个字集</td></tr><tr><td style="text-align:left"><code>\eO</code></td><td style="text-align:left">SS3 - Single Shift Three</td><td style="text-align:left">同上</td></tr><tr><td style="text-align:left"><code>\eP</code></td><td style="text-align:left">DCS - 设备控制字符串</td><td style="text-align:left">控制设备。在 xterm 中，该序列的使用包括定义用户的自定义密钥，以及请求或设置 Termcap/Terminfo 数据</td></tr><tr><td style="text-align:left"><code>\e[</code></td><td style="text-align:left">CSI - 控制序列导入器</td><td style="text-align:left">大部分有用的序列，参阅下面的光标 、 颜色 、 滚动</td></tr><tr><td style="text-align:left"><code>\e\</code></td><td style="text-align:left">ST - 结束字符串</td><td style="text-align:left">终止其他控件（包括 APC 、 DCS 、 OSC 、 PM 和 SOS ）中的字符串</td></tr><tr><td style="text-align:left"><code>\e]</code></td><td style="text-align:left">OSC - 操作系统命令</td><td style="text-align:left">启动操作系统使用的控制字符串。 OSC 和 CSI 序列相似，但不限于整数参数</td></tr><tr><td style="text-align:left"><code>\eX</code></td><td style="text-align:left">SOS - 字符串开始</td><td style="text-align:left"></td></tr><tr><td style="text-align:left"><code>\e^</code></td><td style="text-align:left">PM - 私有消息</td><td style="text-align:left"></td></tr><tr><td style="text-align:left"><code>\e_</code></td><td style="text-align:left">APC - 应用程序命令</td><td style="text-align:left"></td></tr><tr><td style="text-align:left"><code>\ec</code></td><td style="text-align:left">RIS - 重置为初始状态</td><td style="text-align:left">将设备重置为原始状态。可能包括（如果适用的话）：重置图形格式，清除制表符，重置为默认字体等等。</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="光标和滚动转义序列">光标和滚动转义序列<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E5%85%89%E6%A0%87%E5%92%8C%E6%BB%9A%E5%8A%A8%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97" class="hash-link" aria-label="光标和滚动转义序列的直接链接" title="光标和滚动转义序列的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="光标显隐">光标显隐<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E5%85%89%E6%A0%87%E6%98%BE%E9%9A%90" class="hash-link" aria-label="光标显隐的直接链接" title="光标显隐的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">在 shell 脚本使用 <code>tput xx </code></th><th style="text-align:center">转义序列</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left"><code>tivis</code> (注意 ⚠️ ： Terminal 的条目不支持)</td><td style="text-align:center"><code>\e[?25l</code></td><td style="text-align:left">隐藏光标</td></tr><tr><td style="text-align:left"><code>tvvis</code> （注意 ⚠️ ： Terminal 的条目不支持）</td><td style="text-align:center"><code>\e[?25h</code></td><td style="text-align:left">显示光标</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="光标位置设置">光标位置设置<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E5%85%89%E6%A0%87%E4%BD%8D%E7%BD%AE%E8%AE%BE%E7%BD%AE" class="hash-link" aria-label="光标位置设置的直接链接" title="光标位置设置的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">在 shell 脚本使用 <code>tput xx </code></th><th style="text-align:center">转义序列</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left"><code>cup r c</code></td><td style="text-align:center"><code>\e[r;c;H</code></td><td style="text-align:left">光标设置到 r 行 c 列</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[6n</code></td><td style="text-align:left">报告光标位置（shell 脚本不支持）</td></tr><tr><td style="text-align:left"><code>sc</code></td><td style="text-align:center"><code>\e7</code> 或 <code>\e[s</code></td><td style="text-align:left">保存当前光标的位置 (wiki 百科说 <code>\e[s</code> 也可以，在我的 mac 不可用)</td></tr><tr><td style="text-align:left"><code>rc</code></td><td style="text-align:center"><code>\e8</code> 或 <code>\e[u</code></td><td style="text-align:left">恢复当前光标的位置 (wiki 百科说 <code>\e[u</code> 也可以，在我的 mac 不可用)</td></tr><tr><td style="text-align:left"><code>cuu r</code></td><td style="text-align:center"><code>\e[rA</code></td><td style="text-align:left">光标向上 r 行</td></tr><tr><td style="text-align:left"><code>cud r</code></td><td style="text-align:center"><code>\e[rB</code></td><td style="text-align:left">光标向下 r 行</td></tr><tr><td style="text-align:left"><code>cuf c</code></td><td style="text-align:center"><code>\e[cC</code></td><td style="text-align:left">光标向右 c 列</td></tr><tr><td style="text-align:left"><code>cub c</code></td><td style="text-align:center"><code>\e[cD</code></td><td style="text-align:left">光标向左 c 列</td></tr><tr><td style="text-align:left"><code>cnl c</code></td><td style="text-align:center"><code>\e[cE</code></td><td style="text-align:left">光标向下 c 列（默认 1）的开头</td></tr><tr><td style="text-align:left"><code>cha c</code></td><td style="text-align:center"><code>\e[cF</code></td><td style="text-align:left">光标向上 c 列（默认 1）的开头</td></tr><tr><td style="text-align:left"><code>el n</code></td><td style="text-align:center"><code>\e[nS</code></td><td style="text-align:left">整页向上滚动，新行添加到底部</td></tr><tr><td style="text-align:left"><code>su n</code></td><td style="text-align:center"><code>\e[nT</code></td><td style="text-align:left">整页向下滚动，新行添加到顶部</td></tr><tr><td style="text-align:left"><code>hvp r c</code></td><td style="text-align:center"><code>\e[r;cF</code></td><td style="text-align:left">光标位置设定，同 <code>cup</code></td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[?7l</code></td><td style="text-align:left">当光标达到屏幕的右边缘时禁用自动换行</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[?7h</code></td><td style="text-align:left">启用换行</td></tr><tr><td style="text-align:left"><code>do</code></td><td style="text-align:center"><code>\eD</code></td><td style="text-align:left">将光标向下移动一行</td></tr><tr><td style="text-align:left"><code>up</code></td><td style="text-align:center"><code>\eM</code></td><td style="text-align:left">将光标向上移动一行</td></tr><tr><td style="text-align:left">``</td><td style="text-align:center">``</td><td style="text-align:left"></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="屏幕滚动行为">屏幕滚动行为<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E5%B1%8F%E5%B9%95%E6%BB%9A%E5%8A%A8%E8%A1%8C%E4%B8%BA" class="hash-link" aria-label="屏幕滚动行为的直接链接" title="屏幕滚动行为的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">在 shell 脚本使用 <code>tput xx </code></th><th style="text-align:center">转义序列</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[r</code></td><td style="text-align:left">启用全屏滚动</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[S;Er</code></td><td style="text-align:left">启用从 S 行到 E 行的屏幕部分滚动，并将光标移动到此区域的顶部</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="属性和颜色转义序列">属性和颜色转义序列<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E5%B1%9E%E6%80%A7%E5%92%8C%E9%A2%9C%E8%89%B2%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97" class="hash-link" aria-label="属性和颜色转义序列的直接链接" title="属性和颜色转义序列的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="重置属性">重置属性<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E9%87%8D%E7%BD%AE%E5%B1%9E%E6%80%A7" class="hash-link" aria-label="重置属性的直接链接" title="重置属性的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">shell 脚本使用 <code>tput xx</code></th><th style="text-align:center">转义序列</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left"><code>me</code></td><td style="text-align:center"><code>\e[m</code> 或 <code>\e[0m</code></td><td style="text-align:left">将所有属性重置为默认值</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="属性设置">属性设置<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E5%B1%9E%E6%80%A7%E8%AE%BE%E7%BD%AE" class="hash-link" aria-label="属性设置的直接链接" title="属性设置的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">shell 脚本使用 <code>tput xx</code></th><th style="text-align:center">转义序列</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left"><code>bold</code></td><td style="text-align:center"><code>\e[1m</code></td><td style="text-align:left">启用粗文本显示</td></tr><tr><td style="text-align:left"><code>dim</code></td><td style="text-align:center"><code>\e[2m</code></td><td style="text-align:left">启用浅文本显示</td></tr><tr><td style="text-align:left"><code>so</code></td><td style="text-align:center"><code>\e[3m</code></td><td style="text-align:left">启用突出显示，在终端不受支持</td></tr><tr><td style="text-align:left"><code>us</code></td><td style="text-align:center"><code>\e[4m</code></td><td style="text-align:left">启用下划线文本显示</td></tr><tr><td style="text-align:left"><code>blink</code> （部分终端不支持）</td><td style="text-align:center"><code>\e[5m</code></td><td style="text-align:left">闪烁</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[6m</code></td><td style="text-align:left">快速闪烁或删除线（终端不支持）</td></tr><tr><td style="text-align:left"><code>mr</code></td><td style="text-align:center"><code>\e[7m</code></td><td style="text-align:left">启用反向显示</td></tr><tr><td style="text-align:left"><code>invis</code></td><td style="text-align:center"><code>\e[8m</code></td><td style="text-align:left">启用隐藏文本</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[9m</code></td><td style="text-align:left">闲置 (部分设备上为删除线)</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[10 - 19m</code></td><td style="text-align:left">字体选择，大部分终端不支持</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="清除属性">清除属性<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E6%B8%85%E9%99%A4%E5%B1%9E%E6%80%A7" class="hash-link" aria-label="清除属性的直接链接" title="清除属性的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">shell 脚本使用 <code>tput xx</code></th><th style="text-align:center">转义序列</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[20m</code></td><td style="text-align:left">"Fraktur"（尖角体）字体，大部分终端并不支持</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[21m</code></td><td style="text-align:left">闲置</td></tr><tr><td style="text-align:left"><code>se</code></td><td style="text-align:center"><code>\e[22m</code></td><td style="text-align:left">禁用粗文本 、 浅文本显示</td></tr><tr><td style="text-align:left"><code>se</code></td><td style="text-align:center"><code>\e[23m</code></td><td style="text-align:left">禁用突出显示</td></tr><tr><td style="text-align:left"><code>ue</code></td><td style="text-align:center"><code>\e[24m</code></td><td style="text-align:left">禁用带下划线的显示</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[25m</code></td><td style="text-align:left">禁用闪烁和删除线</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[26m</code></td><td style="text-align:left">闲置</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[27m</code></td><td style="text-align:left">禁用反向显示</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[28m</code></td><td style="text-align:left">禁用隐藏显示</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[29m</code></td><td style="text-align:left">闲置</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="前景色配置">前景色配置<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E5%89%8D%E6%99%AF%E8%89%B2%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="前景色配置的直接链接" title="前景色配置的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">shell 脚本使用 <code>tput xx</code></th><th style="text-align:center">转义序列</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left"><code>setaf 0</code></td><td style="text-align:center"><code>\e[30m</code></td><td style="text-align:left">将前景色设置为黑色</td></tr><tr><td style="text-align:left"><code>setaf 1</code></td><td style="text-align:center"><code>\e[31m</code></td><td style="text-align:left">将前景色设置为红色</td></tr><tr><td style="text-align:left"><code>setaf 2</code></td><td style="text-align:center"><code>\e[32m</code></td><td style="text-align:left">将前景色设置为绿色</td></tr><tr><td style="text-align:left"><code>setaf 3</code></td><td style="text-align:center"><code>\e[33m</code></td><td style="text-align:left">将前景色设置为黄色</td></tr><tr><td style="text-align:left"><code>setaf 4</code></td><td style="text-align:center"><code>\e[34m</code></td><td style="text-align:left">将前景色设置为蓝色</td></tr><tr><td style="text-align:left"><code>setaf 5</code></td><td style="text-align:center"><code>\e[35m</code></td><td style="text-align:left">将前景色设置为杨红色</td></tr><tr><td style="text-align:left"><code>setaf 6</code></td><td style="text-align:center"><code>\e[36m</code></td><td style="text-align:left">将前景色设置为青色</td></tr><tr><td style="text-align:left"><code>setaf 7</code></td><td style="text-align:center"><code>\e[37m</code></td><td style="text-align:left">将前景色设置为白色</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[38m</code></td><td style="text-align:left">闲置</td></tr><tr><td style="text-align:left"><code>setaf 9</code></td><td style="text-align:center"><code>\e[39m</code></td><td style="text-align:left">将前景色设置为默认色</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="背景色设置">背景色设置<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E8%83%8C%E6%99%AF%E8%89%B2%E8%AE%BE%E7%BD%AE" class="hash-link" aria-label="背景色设置的直接链接" title="背景色设置的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">shell 脚本使用 <code>tput xx</code></th><th style="text-align:center">转义序列</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left"><code>setab 0</code></td><td style="text-align:center"><code>\e[40m</code></td><td style="text-align:left">将背景色设置为黑色</td></tr><tr><td style="text-align:left"><code>setab 1</code></td><td style="text-align:center"><code>\e[41m</code></td><td style="text-align:left">将背景色设置为红色</td></tr><tr><td style="text-align:left"><code>setab 2</code></td><td style="text-align:center"><code>\e[42m</code></td><td style="text-align:left">将背景色设置为绿色</td></tr><tr><td style="text-align:left"><code>setab 3</code></td><td style="text-align:center"><code>\e[43m</code></td><td style="text-align:left">将背景色设置为黄色</td></tr><tr><td style="text-align:left"><code>setab 4</code></td><td style="text-align:center"><code>\e[44m</code></td><td style="text-align:left">将背景色设置为蓝色</td></tr><tr><td style="text-align:left"><code>setab 5</code></td><td style="text-align:center"><code>\e[45m</code></td><td style="text-align:left">将背景色设置为杨红色</td></tr><tr><td style="text-align:left"><code>setab 6</code></td><td style="text-align:center"><code>\e[46m</code></td><td style="text-align:left">将背景色设置为青色</td></tr><tr><td style="text-align:left"><code>setab 7</code></td><td style="text-align:center"><code>\e[47m</code></td><td style="text-align:left">将背景色设置为白色</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[48m</code></td><td style="text-align:left">闲置</td></tr><tr><td style="text-align:left"><code>setab 9</code></td><td style="text-align:center"><code>\e[49m</code></td><td style="text-align:left">将背景色设置为默认色</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="其他转义序列">其他转义序列<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E5%85%B6%E4%BB%96%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97" class="hash-link" aria-label="其他转义序列的直接链接" title="其他转义序列的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="重置终端">重置终端<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E9%87%8D%E7%BD%AE%E7%BB%88%E7%AB%AF" class="hash-link" aria-label="重置终端的直接链接" title="重置终端的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">shell 脚本使用 <code>tput xx</code></th><th style="text-align:center">转义序列</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left"><code>reset</code></td><td style="text-align:center"><code>\ec</code></td><td style="text-align:left">将前景色和背景色设置为默认值，清除屏幕，并将光标移动到默认位置</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="整屏滚动">整屏滚动<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E6%95%B4%E5%B1%8F%E6%BB%9A%E5%8A%A8" class="hash-link" aria-label="整屏滚动的直接链接" title="整屏滚动的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">shell 脚本使用 <code>tput xx</code></th><th style="text-align:center">转义序列</th><th style="text-align:left">描述</th></tr></thead></table>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="清除屏幕">清除屏幕<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E6%B8%85%E9%99%A4%E5%B1%8F%E5%B9%95" class="hash-link" aria-label="清除屏幕的直接链接" title="清除屏幕的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">shell 脚本使用 <code>tput xx</code></th><th style="text-align:center">转义序列</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left"><code>cd</code></td><td style="text-align:center"><code>\e[J</code> 或 <code>\e[0J</code></td><td style="text-align:left">使用当前背景色清除到屏幕底部</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[1J</code></td><td style="text-align:left">使用当前背景色清理到顶部</td></tr><tr><td style="text-align:left"><code>cl</code></td><td style="text-align:center"><code>\e[2J</code></td><td style="text-align:left">将屏幕清除为当前背景色。在部分终端上，还会将光标的位置重置到 home 位置</td></tr><tr><td style="text-align:left"><code>c</code></td><td style="text-align:center"><code>\e[3J</code></td><td style="text-align:left">将清除整个屏幕并删除回滚缓冲区中的所有行（该特性是 <a href="https://xterm.dev/" target="_blank" rel="noopener noreferrer" class="">xterm</a>,其他终端也支持 ）</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="清除行">清除行<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E6%B8%85%E9%99%A4%E8%A1%8C" class="hash-link" aria-label="清除行的直接链接" title="清除行的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">shell 脚本使用 <code>tput xx</code></th><th style="text-align:center">转义序列</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left"><code>ce</code></td><td style="text-align:center"><code>\e[K</code> 或 <code>\e[0K</code></td><td style="text-align:left">清除当前行到末尾</td></tr><tr><td style="text-align:left"><code>cb</code></td><td style="text-align:center"><code>\e[1K</code></td><td style="text-align:left">清除行到开头</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[2K</code></td><td style="text-align:left">清除当前行</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="制表符">制表符<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E5%88%B6%E8%A1%A8%E7%AC%A6" class="hash-link" aria-label="制表符的直接链接" title="制表符的直接链接" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">shell 脚本使用 <code>tput xx</code></th><th style="text-align:center">转义序列</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left"><code>hts</code></td><td style="text-align:center"><code>\e[W</code> 或 <code>\e[0W</code></td><td style="text-align:left">在光标位置设置水平制表符</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[1W</code></td><td style="text-align:left">当前行设置垂直制表符</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[ 2 - 6 W</code></td><td style="text-align:left">冗余代码</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[g</code> 或 <code>\e[0g</code></td><td style="text-align:left">清除当前光标位置的水平制表符</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[1g</code></td><td style="text-align:left">清除当前行的垂直制表符</td></tr><tr><td style="text-align:left">--</td><td style="text-align:center"><code>\e[2g</code></td><td style="text-align:left">仅清除当前行的水平和垂直制表位</td></tr><tr><td style="text-align:left"><code>tbc</code></td><td style="text-align:center"><code>\e[3g</code></td><td style="text-align:left">清除所有的说平选项卡</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="参考文档">参考文档<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/4/22/ANSI%20%E8%BD%AC%E4%B9%89%E7%A0%81#%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3" class="hash-link" aria-label="参考文档的直接链接" title="参考文档的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://zh.wikipedia.org/wiki/ANSI%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97" target="_blank" rel="noopener noreferrer" class="">wiki 中文 - ANSI 转义序列</a></li>
<li class=""><a href="https://developer.apple.com/library/archive/documentation/OpenSource/Conceptual/ShellScripting/AdvancedTechniques/AdvancedTechniques.html#//apple_ref/doc/uid/TP40004268-TP40003521-SW27" target="_blank" rel="noopener noreferrer" class="">apple shell 脚本入门 - 高级技术 - ANSI 转义篇</a></li>
<li class=""><a href="https://www.inwap.com/pdp10/ansicode.txt" target="_blank" rel="noopener noreferrer" class="">ANSI 84 年 标准摘要</a></li>
<li class=""><a href="https://static.lmssee.com/text/shell/ansi-84.txt" target="_blank" rel="noopener noreferrer" class="">ANSI 84 年 标准摘要（译文版）</a></li>
</ul>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="shell" term="shell"/>
        <category label="终端" term="终端"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[node 失灵了]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/3/29/node 失灵了</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/3/29/node 失灵了"/>
        <updated>2025-03-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[node 不知何故用不了了]]></summary>
        <content type="html"><![CDATA[<p>在 macOS 特别是 Apple Silicon (M1/M2) 设备上，Homebrew 的路径结构和符号链接机制与 Intel 芯片 Mac 不同。以下是您遇到的现象的原理详解和解决方案：</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="一路径结构解析apple-silicon-芯片">一、路径结构解析（Apple Silicon 芯片）<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#%E4%B8%80%E8%B7%AF%E5%BE%84%E7%BB%93%E6%9E%84%E8%A7%A3%E6%9E%90apple-silicon-%E8%8A%AF%E7%89%87" class="hash-link" aria-label="一、路径结构解析（Apple Silicon 芯片）的直接链接" title="一、路径结构解析（Apple Silicon 芯片）的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="1-homebrew-默认安装路径">1. Homebrew 默认安装路径<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#1-homebrew-%E9%BB%98%E8%AE%A4%E5%AE%89%E8%A3%85%E8%B7%AF%E5%BE%84" class="hash-link" aria-label="1. Homebrew 默认安装路径的直接链接" title="1. Homebrew 默认安装路径的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">/opt/homebrew/          </span><span class="token comment" style="color:#999988;font-style:italic"># ARM 版 Homebrew 主目录</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">├── bin/                </span><span class="token comment" style="color:#999988;font-style:italic"># 全局可执行文件符号链接</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">├── opt/                </span><span class="token comment" style="color:#999988;font-style:italic"># 实际安装的软件包</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">│   └── node/           </span><span class="token comment" style="color:#999988;font-style:italic"># Node.js 的主程序文件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">└── lib/                </span><span class="token comment" style="color:#999988;font-style:italic"># 共享库和依赖</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    └── node_modules/   </span><span class="token comment" style="color:#999988;font-style:italic"># 全局 npm 包安装目录</span></span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="2-关键路径说明">2. 关键路径说明<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#2-%E5%85%B3%E9%94%AE%E8%B7%AF%E5%BE%84%E8%AF%B4%E6%98%8E" class="hash-link" aria-label="2. 关键路径说明的直接链接" title="2. 关键路径说明的直接链接" translate="no">​</a></h4>
<table><thead><tr><th>路径</th><th>作用</th></tr></thead><tbody><tr><td><code>/opt/homebrew/opt/node</code></td><td>Node.js 的实际安装目录</td></tr><tr><td><code>/opt/homebrew/bin/node</code></td><td>指向实际可执行文件的符号链接</td></tr><tr><td><code>/opt/homebrew/lib/node_modules</code></td><td>全局 npm 包的安装位置</td></tr></tbody></table>
<hr>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="二现象原理分析">二、现象原理分析<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#%E4%BA%8C%E7%8E%B0%E8%B1%A1%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90" class="hash-link" aria-label="二、现象原理分析的直接链接" title="二、现象原理分析的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="1-符号链接机制">1. 符号链接机制<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#1-%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E6%9C%BA%E5%88%B6" class="hash-link" aria-label="1. 符号链接机制的直接链接" title="1. 符号链接机制的直接链接" translate="no">​</a></h4>
<p>执行 <code>ls -l $(brew --prefix node)/bin</code> 显示的是 <strong>软件包内部</strong> 的 bin 目录结构：</p>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic"># brew --prefix node 返回的是软件包安装路径</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">/opt/homebrew/opt/node/bin</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 查看内容会显示原始链接关系</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">node</span><span class="token plain"> -</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">/lib/node_modules/npm/bin/node</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> -</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">/lib/node_modules/npm/bin/npm-cli.js</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">npx -</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">/lib/node_modules/npm/bin/npx-cli.js</span></span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="2-实际生效路径">2. 实际生效路径<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#2-%E5%AE%9E%E9%99%85%E7%94%9F%E6%95%88%E8%B7%AF%E5%BE%84" class="hash-link" aria-label="2. 实际生效路径的直接链接" title="2. 实际生效路径的直接链接" translate="no">​</a></h4>
<p>Homebrew 会将这些可执行文件 <strong>再次链接到全局 bin 目录</strong>：</p>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic"># 实际生效的全局路径</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">/opt/homebrew/bin/</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">├── </span><span class="token function" style="color:#d73a49">node</span><span class="token plain"> -</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">/opt/node/bin/node</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">├── </span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> -</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">/lib/node_modules/npm/bin/npm-cli.js</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">└── npx -</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">/lib/node_modules/npm/bin/npx-cli.js</span></span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="三验证与解决方案">三、验证与解决方案<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#%E4%B8%89%E9%AA%8C%E8%AF%81%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88" class="hash-link" aria-label="三、验证与解决方案的直接链接" title="三、验证与解决方案的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="1-确认全局命令路径">1. 确认全局命令路径<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#1-%E7%A1%AE%E8%AE%A4%E5%85%A8%E5%B1%80%E5%91%BD%E4%BB%A4%E8%B7%AF%E5%BE%84" class="hash-link" aria-label="1. 确认全局命令路径的直接链接" title="1. 确认全局命令路径的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic"># 查看 node 的真实调用路径</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">which</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 正确应输出：/opt/homebrew/bin/node</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 查看符号链接最终指向</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">ls</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$(</span><span class="token variable function" style="color:#d73a49">which</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable function" style="color:#d73a49">node</span><span class="token variable" style="color:#36acaa">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 输出示例：/opt/homebrew/bin/node -&gt; ../opt/node/bin/node</span></span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="2-修复环境变量配置">2. 修复环境变量配置<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#2-%E4%BF%AE%E5%A4%8D%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="2. 修复环境变量配置的直接链接" title="2. 修复环境变量配置的直接链接" translate="no">​</a></h4>
<p>检查 <code>PATH</code> 变量是否包含 Homebrew 的 bin 目录：</p>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token environment constant" style="color:#36acaa">$PATH</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 正确顺序应优先包含 /opt/homebrew/bin</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 示例：/opt/homebrew/bin:/usr/bin:/bin...</span></span><br></div></code></pre></div></div>
<p>修改 shell 配置文件（以 zsh 为例）：</p>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic"># 编辑配置文件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">nano</span><span class="token plain"> ~/.zshrc</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 确保有以下内容（如果使用 bash 则修改 ~/.bash_profile）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable environment constant" style="color:#36acaa">PATH</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"/opt/homebrew/bin:</span><span class="token string environment constant" style="color:#36acaa">$PATH</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 使配置生效</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token builtin class-name">source</span><span class="token plain"> ~/.zshrc</span></span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="3-强制重建符号链接">3. 强制重建符号链接<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#3-%E5%BC%BA%E5%88%B6%E9%87%8D%E5%BB%BA%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5" class="hash-link" aria-label="3. 强制重建符号链接的直接链接" title="3. 强制重建符号链接的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic"># 解除现有链接并重新创建</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">brew unlink </span><span class="token function" style="color:#d73a49">node</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> brew </span><span class="token function" style="color:#d73a49">link</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--overwrite</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 示例成功输出：</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Linking /opt/homebrew/Cellar/node/xx.x.x... 7 symlinks created.</span></span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="四高级故障排查">四、高级故障排查<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#%E5%9B%9B%E9%AB%98%E7%BA%A7%E6%95%85%E9%9A%9C%E6%8E%92%E6%9F%A5" class="hash-link" aria-label="四、高级故障排查的直接链接" title="四、高级故障排查的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="场景-1存在多个-node-版本冲突">场景 1：存在多个 node 版本冲突<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#%E5%9C%BA%E6%99%AF-1%E5%AD%98%E5%9C%A8%E5%A4%9A%E4%B8%AA-node-%E7%89%88%E6%9C%AC%E5%86%B2%E7%AA%81" class="hash-link" aria-label="场景 1：存在多个 node 版本冲突的直接链接" title="场景 1：存在多个 node 版本冲突的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic"># 查看所有 node 安装位置</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">mdfind </span><span class="token parameter variable" style="color:#36acaa">-name</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> bin</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 典型冲突路径：</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># /opt/homebrew/bin/node     （Homebrew 安装）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># /usr/local/bin/node        （其他方式安装）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ~/.nvm/versions/node/...   （nvm 安装）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 解决方案：删除其他安装或调整 PATH 优先级</span></span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="场景-2权限问题修复">场景 2：权限问题修复<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#%E5%9C%BA%E6%99%AF-2%E6%9D%83%E9%99%90%E9%97%AE%E9%A2%98%E4%BF%AE%E5%A4%8D" class="hash-link" aria-label="场景 2：权限问题修复的直接链接" title="场景 2：权限问题修复的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic"># 重置 Homebrew 目录权限</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">chown</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-R</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$(</span><span class="token variable function" style="color:#d73a49">whoami</span><span class="token variable" style="color:#36acaa">)</span><span class="token plain"> /opt/homebrew/*</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-R</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">755</span><span class="token plain"> /opt/homebrew/*</span></span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar__dGB" id="场景-3完整重装">场景 3：完整重装<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#%E5%9C%BA%E6%99%AF-3%E5%AE%8C%E6%95%B4%E9%87%8D%E8%A3%85" class="hash-link" aria-label="场景 3：完整重装的直接链接" title="场景 3：完整重装的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic"># 完全卸载</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">brew uninstall </span><span class="token parameter variable" style="color:#36acaa">--force</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-rf</span><span class="token plain"> /opt/homebrew/lib/node_modules</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 清理缓存</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">brew cleanup </span><span class="token parameter variable" style="color:#36acaa">--prune</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">all</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 重新安装</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">brew </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span></span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="五路径结构示意图">五、路径结构示意图<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/29/node%20%E5%A4%B1%E7%81%B5%E4%BA%86#%E4%BA%94%E8%B7%AF%E5%BE%84%E7%BB%93%E6%9E%84%E7%A4%BA%E6%84%8F%E5%9B%BE" class="hash-link" aria-label="五、路径结构示意图的直接链接" title="五、路径结构示意图的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-text codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F"><div class="token-line" style="color:#393A34"><span class="token plain">Homebrew ARM 架构目录树</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── bin/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── node -&gt; ../opt/node/bin/node</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── npm -&gt; ../lib/node_modules/npm/bin/npm-cli.js</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── npx -&gt; ../lib/node_modules/npm/bin/npx-cli.js</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── opt/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── node/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       ├── bin/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       └── lib/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── lib/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    └── node_modules/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        └── npm/         # 全局 npm 包</span><br></div></code></pre></div></div>
<p>通过理解 Homebrew 在 Apple Silicon 设备上的路径设计，您可以更从容地管理 Node.js 环境。若问题依旧存在，建议提供以下信息以便进一步诊断：</p>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">brew config</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">brew doctor</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token environment constant" style="color:#36acaa">$PATH</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token function" style="color:#d73a49">which</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span></span><br></div></code></pre></div></div>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="node" term="node"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Emoji 的使用]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/3/28/Emoji 的使用</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/3/28/Emoji 的使用"/>
        <updated>2025-03-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在 `CHANGELOG.md` 文件中，使用 Emoji 添加色彩]]></summary>
        <content type="html"><![CDATA[<p>在 <code>CHANGELOG.md</code> 文件中，使用 Emoji 可以直观标识不同类型的变更。以下是常见的 Emoji 及其含义：</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="常用-emoji-分类"><strong>常用 Emoji 分类</strong><a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/28/Emoji%20%E7%9A%84%E4%BD%BF%E7%94%A8#%E5%B8%B8%E7%94%A8-emoji-%E5%88%86%E7%B1%BB" class="hash-link" aria-label="常用-emoji-分类的直接链接" title="常用-emoji-分类的直接链接" translate="no">​</a></h2>
<!-- -->
<table><thead><tr><th>Emoji</th><th>含义</th><th>示例场景</th></tr></thead><tbody><tr><td>✨</td><td>新功能</td><td>新增模块 、 API 或重大特性</td></tr><tr><td>🐛</td><td>Bug 修复</td><td>修复代码缺陷 、 崩溃问题</td></tr><tr><td>🚀</td><td>性能优化</td><td>提升速度 、 减少资源占用</td></tr><tr><td>🎨</td><td>代码/UI 改进</td><td>重构代码 、 优化交互设计</td></tr><tr><td>📚</td><td>文档更新</td><td>完善文档 、 教程或注释</td></tr><tr><td>⚠️</td><td>弃用警告</td><td>标记即将弃用的功能</td></tr><tr><td>🔧</td><td>配置变更</td><td>修改配置文件或环境变量</td></tr><tr><td>🔒</td><td>安全修复</td><td>修补安全漏洞</td></tr><tr><td>🌐</td><td>国际化</td><td>支持新语言或本地化优化</td></tr><tr><td>🚨</td><td>重要变更</td><td>破坏性的 API 变更</td></tr><tr><td>🎉</td><td>初始版本</td><td>项目首次发布</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="使用示例"><strong>使用示例</strong><a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/28/Emoji%20%E7%9A%84%E4%BD%BF%E7%94%A8#%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="使用示例的直接链接" title="使用示例的直接链接" translate="no">​</a></h2>
<div class="language-markdown codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-markdown codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> [1.2.0] - 2023-04-06</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">###</span><span class="token title important"> 新增功能 ✨</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 新增用户登录验证码功能</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">###</span><span class="token title important"> Bug 修复 🐛</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 修复首页加载缓慢的 bug</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">###</span><span class="token title important"> 性能优化 🚀</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 优化数据库查询效率</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">###</span><span class="token title important"> 文档更新 📚</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 完善 API 文档示例</span></span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="最佳实践"><strong>最佳实践</strong><a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/28/Emoji%20%E7%9A%84%E4%BD%BF%E7%94%A8#%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5" class="hash-link" aria-label="最佳实践的直接链接" title="最佳实践的直接链接" translate="no">​</a></h2>
<ol>
<li class=""><strong>一致性</strong>：<br>
<!-- -->在团队中统一 Emoji 使用规范，避免混淆。</li>
<li class=""><strong>简洁性</strong>：<br>
<!-- -->每个变更类型使用 1 个 Emoji，避免过度使用。</li>
<li class=""><strong>语义化</strong>：<br>
<!-- -->确保 Emoji 准确反映变更类型。</li>
</ol>
<p>通过合理使用 Emoji，可以让 <code>CHANGELOG.md</code> 更清晰易读。</p>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="npm 包" term="npm 包"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[手动触发 github actions]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/3/26/github actions 手动触发</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/3/26/github actions 手动触发"/>
        <updated>2025-03-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[手动触发 github actions]]></summary>
        <content type="html"><![CDATA[<p>有时候由于非代码原因，需要手动触发 github actions，比如：测试 、 部署等。</p>
<p>手动触发 github actions 可以通过以下两种方式：</p>
<!-- -->
<ul>
<li class="">通过 <a href="https://github.com/fe6/wxapp-uniapp/actions" target="_blank" rel="noopener noreferrer" class="">Actions</a> 页面手动触发</li>
<li class="">通过 <a href="https://github.com/fe6/wxapp-uniapp/actions" target="_blank" rel="noopener noreferrer" class="">Actions</a> 页面的 <code>Run workflow</code> 按钮触发</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="通过-actions-页面手动触发">通过 Actions 页面手动触发<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/26/github%20actions%20%E6%89%8B%E5%8A%A8%E8%A7%A6%E5%8F%91#%E9%80%9A%E8%BF%87-actions-%E9%A1%B5%E9%9D%A2%E6%89%8B%E5%8A%A8%E8%A7%A6%E5%8F%91" class="hash-link" aria-label="通过 Actions 页面手动触发的直接链接" title="通过 Actions 页面手动触发的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="添加配置">添加配置<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/26/github%20actions%20%E6%89%8B%E5%8A%A8%E8%A7%A6%E5%8F%91#%E6%B7%BB%E5%8A%A0%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="添加配置的直接链接" title="添加配置的直接链接" translate="no">​</a></h3>
<p>在 Workflow 文件夹下，添加 <code>workflow_dispatch</code> 文件，内容如下：</p>
<div class="language-yaml codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-yaml codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions 动作</span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">workflow_dispatch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">inputs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'触发原因'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">required</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">default</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'手动触发'</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="通过-actions-页面的-run-workflow-按钮触发">通过 Actions 页面的 <code>Run workflow</code> 按钮触发<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/26/github%20actions%20%E6%89%8B%E5%8A%A8%E8%A7%A6%E5%8F%91#%E9%80%9A%E8%BF%87-actions-%E9%A1%B5%E9%9D%A2%E7%9A%84-run-workflow-%E6%8C%89%E9%92%AE%E8%A7%A6%E5%8F%91" class="hash-link" aria-label="通过-actions-页面的-run-workflow-按钮触发的直接链接" title="通过-actions-页面的-run-workflow-按钮触发的直接链接" translate="no">​</a></h3>
<p>在 Actions 页面，点击 <code>Run workflow</code> 按钮，选择需要触发的 workflow，点击 <code>Run workflow</code> 按钮即可。</p>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">https://github.com/userName/propName/actions/workflows/</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="通过-github-api-触发">通过 GIthub API 触发<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/26/github%20actions%20%E6%89%8B%E5%8A%A8%E8%A7%A6%E5%8F%91#%E9%80%9A%E8%BF%87-github-api-%E8%A7%A6%E5%8F%91" class="hash-link" aria-label="通过 GIthub API 触发的直接链接" title="通过 GIthub API 触发的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="生成-token">生成 token<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/26/github%20actions%20%E6%89%8B%E5%8A%A8%E8%A7%A6%E5%8F%91#%E7%94%9F%E6%88%90-token" class="hash-link" aria-label="生成 token的直接链接" title="生成 token的直接链接" translate="no">​</a></h3>
<p>在 <a href="https://github.com/settings/tokens" target="_blank" rel="noopener noreferrer" class="">Personal access tokens</a> 页面，点击 <code>Generate new token</code> 按钮，输入 token 描述，勾选 <code>repo</code> 和 <code>workflow</code> 权限，点击 <code>Generate token</code> 按钮，复制生成的 token。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="生成-curl-命令">生成 curl 命令<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/26/github%20actions%20%E6%89%8B%E5%8A%A8%E8%A7%A6%E5%8F%91#%E7%94%9F%E6%88%90-curl-%E5%91%BD%E4%BB%A4" class="hash-link" aria-label="生成 curl 命令的直接链接" title="生成 curl 命令的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-X</span><span class="token plain"> POST </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Authorization: token &lt;KEY&gt;"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-H</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Accept: application/vnd.github.v3+json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  https://api.github.com/repos/fe6/wxapp-uniapp/actions/workflows/123456789/dispatches </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{"ref":"main", "inputs": {"name": "手动触发"}'</span></span><br></div></code></pre></div></div>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="自动化" term="自动化"/>
        <category label="github" term="github"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[github ip 直连]]></title>
        <id>http://lmssee.pages.dev/建站日志/2025/3/25/github ip 直连</id>
        <link href="http://lmssee.pages.dev/建站日志/2025/3/25/github ip 直连"/>
        <updated>2025-03-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在 ping github.com 不同时可选方案之 github ip 直连]]></summary>
        <content type="html"><![CDATA[<p>在提交代码时遇见了点问题，以为只是暂时的网络问题，没太注意。知道后来提交尝试很多次，发现 <code>ping github.com</code> 也不通。</p>
<!-- -->
<p>ping 可以通过发送 ICMP 协议包检测当前设备于目标服务器之间的 🛜 连通性。但在 DNS 被污染时，是没有办法甄别。</p>
<p>所以需要使用添加 IP 直连的方式，来绕过 DNS 解析。</p>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="一查看-github-ip">一、查看 github ip<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/25/github%20ip%20%E7%9B%B4%E8%BF%9E#%E4%B8%80%E6%9F%A5%E7%9C%8B-github-ip" class="hash-link" aria-label="一、查看 github ip的直接链接" title="一、查看 github ip的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-官网查找">1. 官网查找<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/25/github%20ip%20%E7%9B%B4%E8%BF%9E#1-%E5%AE%98%E7%BD%91%E6%9F%A5%E6%89%BE" class="hash-link" aria-label="1. 官网查找的直接链接" title="1. 官网查找的直接链接" translate="no">​</a></h3>
<p>在 <a href="https://docs.github.com/en/github/authenticating-to-github/about-githubs-ip-addresses" target="_blank" rel="noopener noreferrer" class="">github ip</a> 中可以查看到 github 的 ip 地址。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-使用-google-dns-查询">2. 使用 Google DNS 查询<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/25/github%20ip%20%E7%9B%B4%E8%BF%9E#2-%E4%BD%BF%E7%94%A8-google-dns-%E6%9F%A5%E8%AF%A2" class="hash-link" aria-label="2. 使用 Google DNS 查询的直接链接" title="2. 使用 Google DNS 查询的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token function" style="color:#d73a49">nslookup</span><span class="token plain"> github.com </span><span class="token number" style="color:#36acaa">8.8</span><span class="token plain">.8.8</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="3-使用-dig-查询">3. 使用 dig 查询<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/25/github%20ip%20%E7%9B%B4%E8%BF%9E#3-%E4%BD%BF%E7%94%A8-dig-%E6%9F%A5%E8%AF%A2" class="hash-link" aria-label="3. 使用 dig 查询的直接链接" title="3. 使用 dig 查询的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token function" style="color:#d73a49">dig</span><span class="token plain"> @1.1.1.1 github.com +short</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="4-通过在线工具">4. 通过在线工具<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/25/github%20ip%20%E7%9B%B4%E8%BF%9E#4-%E9%80%9A%E8%BF%87%E5%9C%A8%E7%BA%BF%E5%B7%A5%E5%85%B7" class="hash-link" aria-label="4. 通过在线工具的直接链接" title="4. 通过在线工具的直接链接" translate="no">​</a></h3>
<ul>
<li class="">
<p><a href="https://dnschecker.org/#A/github.com" target="_blank" rel="noopener noreferrer" class="">dnschecker</a></p>
</li>
<li class="">
<p><a href="https://www.whatsmydns.net/#A/github.com" target="_blank" rel="noopener noreferrer" class="">whatsmydns ip</a></p>
</li>
<li class="">
<p><a href="https://www.ipaddress.com/github.com" target="_blank" rel="noopener noreferrer" class="">github ip</a></p>
<p><em>工具排名不分先后</em></p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="二添加-ip-直连">二、添加 ip 直连<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/25/github%20ip%20%E7%9B%B4%E8%BF%9E#%E4%BA%8C%E6%B7%BB%E5%8A%A0-ip-%E7%9B%B4%E8%BF%9E" class="hash-link" aria-label="二、添加 ip 直连的直接链接" title="二、添加 ip 直连的直接链接" translate="no">​</a></h2>
<p>在 <code>hosts</code> 文件中添加 github ip 地址，即可绕过 DNS 解析。</p>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="1-windows">1. windows<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/25/github%20ip%20%E7%9B%B4%E8%BF%9E#1-windows" class="hash-link" aria-label="1. windows的直接链接" title="1. windows的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">C:/Windows/System32/drivers/etc/hosts</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar__dGB" id="2-maclinux">2. mac/linux<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/25/github%20ip%20%E7%9B%B4%E8%BF%9E#2-maclinux" class="hash-link" aria-label="2. mac/linux的直接链接" title="2. mac/linux的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /etc/hosts</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar__dGB" id="三自己开发了一款小插件">三、自己开发了一款小插件<a href="http://lmssee.pages.dev/%E5%BB%BA%E7%AB%99%E6%97%A5%E5%BF%97/2025/3/25/github%20ip%20%E7%9B%B4%E8%BF%9E#%E4%B8%89%E8%87%AA%E5%B7%B1%E5%BC%80%E5%8F%91%E4%BA%86%E4%B8%80%E6%AC%BE%E5%B0%8F%E6%8F%92%E4%BB%B6" class="hash-link" aria-label="三、自己开发了一款小插件的直接链接" title="三、自己开发了一款小插件的直接链接" translate="no">​</a></h2>
<p>将获取当前的可连 ip 添加到了 <a href="https://www.npmjs.com/package/jja" target="_blank" rel="noopener noreferrer" class="">jja</a> 下。</p>
<div class="language-bash codeBlockContainer_Mrip theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Dqsm"><pre tabindex="0" class="prism-code language-bash codeBlock_D2y_ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_JP7F codeBlockLinesWithNumbering_ZS9C" style="counter-reset:line-count 0"><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token comment" style="color:#999988;font-style:italic"># 如果全局安装了 jja</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_bo43" style="color:#393A34"><span class="codeLineNumber_AVBx"></span><span class="codeLineContent_aJC4"><span class="token plain">jja dns</span></span><br></div></code></pre></div></div>
<p>其他关于 <a href="https://www.npmjs.com/package/jja" target="_blank" rel="noopener noreferrer" class="">jja</a> 可查看 <a href="https://npm.lmssee.com/jja" target="_blank" rel="noopener noreferrer" class="">npm jja</a></p>]]></content>
        <author>
            <name>泥豆君</name>
            <uri>https://github.com/MrMudBean</uri>
        </author>
        <category label="git" term="git"/>
        <category label="github" term="github"/>
    </entry>
</feed>