<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>EL's webSite Blog</title>
        <link>https://EL233.github.io/blog</link>
        <description>EL's webSite Blog</description>
        <lastBuildDate>Sun, 14 Jun 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[企业知识助手搭建]]></title>
            <link>https://EL233.github.io/blog/enterprise-knowledge-assistant</link>
            <guid>https://EL233.github.io/blog/enterprise-knowledge-assistant</guid>
            <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[企业知识助手介绍]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="企业知识助手介绍">企业知识助手介绍<a href="https://el233.github.io/blog/enterprise-knowledge-assistant#%E4%BC%81%E4%B8%9A%E7%9F%A5%E8%AF%86%E5%8A%A9%E6%89%8B%E4%BB%8B%E7%BB%8D" class="hash-link" aria-label="Direct link to 企业知识助手介绍" title="Direct link to 企业知识助手介绍">​</a></h3>
<p>企业知识助手是一款基于企业知识库构建的 AI 问答助手。</p>
<p>通过整理企业内部文档、规范、流程等资料，让用户可以通过自然语言快速查询相关信息，提高知识检索效率。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="技术栈">技术栈<a href="https://el233.github.io/blog/enterprise-knowledge-assistant#%E6%8A%80%E6%9C%AF%E6%A0%88" class="hash-link" aria-label="Direct link to 技术栈" title="Direct link to 技术栈">​</a></h3>
<ul>
<li>
<p><strong>AI 应用框架：</strong> Dify</p>
</li>
<li>
<p><strong>大语言模型：</strong> DeepSeek</p>
</li>
<li>
<p><strong>知识库方案：</strong> RAG（Retrieval-Augmented Generation，检索增强生成）</p>
</li>
<li>
<p><strong>向量检索：</strong> Dify 内置知识库检索能力</p>
</li>
<li>
<p><strong>文本处理：</strong> 文档解析、文本切片、Embedding 向量化</p>
</li>
<li>
<p><strong>数据存储：</strong> 向量数据库（用于存储知识文档特征向量）</p>
</li>
<li>
<p><strong>Prompt 工程：</strong> 自定义角色设定、回答规则、知识库约束</p>
</li>
<li>
<p><strong>部署方式：</strong> 基于 Web 应用部署</p>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="功能特点">功能特点<a href="https://el233.github.io/blog/enterprise-knowledge-assistant#%E5%8A%9F%E8%83%BD%E7%89%B9%E7%82%B9" class="hash-link" aria-label="Direct link to 功能特点" title="Direct link to 功能特点">​</a></h3>
<ul>
<li>基于企业知识库内容进行回答</li>
<li>支持自然语言提问</li>
<li>降低企业内部信息查找成本</li>
<li>帮助员工快速获取业务资料</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="使用方式">使用方式<a href="https://el233.github.io/blog/enterprise-knowledge-assistant#%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F" class="hash-link" aria-label="Direct link to 使用方式" title="Direct link to 使用方式">​</a></h3>
<p>访问企业知识助手：</p>
<p>-点击<a href="https://udify.app/chat/fHilF014keZvVYrr" target="_blank" rel="noopener noreferrer">此处🔗</a>进入企业知识助手</p>
<p>输入你的问题后，助手会根据已有知识库内容进行检索并生成回答。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="应用场景">应用场景<a href="https://el233.github.io/blog/enterprise-knowledge-assistant#%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF" class="hash-link" aria-label="Direct link to 应用场景" title="Direct link to 应用场景">​</a></h3>
<ul>
<li>企业制度查询</li>
<li>员工培训资料检索</li>
<li>产品文档查询</li>
<li>项目流程说明</li>
<li>内部知识共享</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="项目展示">项目展示<a href="https://el233.github.io/blog/enterprise-knowledge-assistant#%E9%A1%B9%E7%9B%AE%E5%B1%95%E7%A4%BA" class="hash-link" aria-label="Direct link to 项目展示" title="Direct link to 项目展示">​</a></h3>
<p><img decoding="async" loading="lazy" alt="企业知识助手01" src="https://el233.github.io/assets/images/enterprise-ai-assistant01-18896525c3a751aec134c7e1bf7204d9.png" width="2832" height="1648" class="img_ev3q">
<img decoding="async" loading="lazy" alt="企业知识助手02" src="https://el233.github.io/assets/images/enterprise-ai-assistant02-4b79527317413e760ef0ea583f967a6b.png" width="2832" height="1648" class="img_ev3q">
该项目基于知识库 + 大语言模型实现，通过 RAG（检索增强生成）方式连接企业文档，让 AI 回答更加贴合实际业务内容。</p>]]></content:encoded>
            <category>project</category>
            <category>AI</category>
            <category>RAG</category>
            <category>knowledge-base</category>
        </item>
        <item>
            <title><![CDATA[自动获取b站视频信息]]></title>
            <link>https://EL233.github.io/blog/chrome-extension</link>
            <guid>https://EL233.github.io/blog/chrome-extension</guid>
            <pubDate>Thu, 20 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[vue开发chrome插件]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="vue开发chrome插件">vue开发chrome插件<a href="https://el233.github.io/blog/chrome-extension#vue%E5%BC%80%E5%8F%91chrome%E6%8F%92%E4%BB%B6" class="hash-link" aria-label="Direct link to vue开发chrome插件" title="Direct link to vue开发chrome插件">​</a></h3>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="环境配置">环境配置<a href="https://el233.github.io/blog/chrome-extension#%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="Direct link to 环境配置" title="Direct link to 环境配置">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 安装 Vue CLI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">npm install -g @vue/cli</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">npm install -g @vue/cli-init</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 创建 Vue Web Extension 项目</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">vue create --preset kocal/vue-web-extension my-extension</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd my-extension</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 启动本地开发服务器</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">npm run server</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" alt="图片1" src="https://el233.github.io/assets/images/environmental-fa1150caf5a68f40cb06ddba968bdac8.png" width="1432" height="964" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="vue版本确认">Vue版本确认<a href="https://el233.github.io/blog/chrome-extension#vue%E7%89%88%E6%9C%AC%E7%A1%AE%E8%AE%A4" class="hash-link" aria-label="Direct link to Vue版本确认" title="Direct link to Vue版本确认">​</a></h3>
<p>我使用的是Vue2</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm list vue</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="安装-elementui">安装 elementUI<a href="https://el233.github.io/blog/chrome-extension#%E5%AE%89%E8%A3%85-elementui" class="hash-link" aria-label="Direct link to 安装 elementUI" title="Direct link to 安装 elementUI">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm install element-ui --save</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>在<code>main.js</code>中引入：</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span 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">Vue</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">'vue'</span><span class="token plain"></span><br></span><span 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 maybe-class-name">App</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">'./App.vue'</span><span class="token plain"></span><br></span><span 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 maybe-class-name">ElementUI</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">'element-ui'</span><span class="token plain"></span><br></span><span 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-ui/lib/theme-chalk/index.css'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token maybe-class-name">Vue</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token maybe-class-name">ElementUI</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span 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">Vue</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">el</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'#app'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function-variable function" style="color:#d73a49">render</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token parameter">h</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">h</span><span class="token punctuation" style="color:#393A34">(</span><span class="token maybe-class-name">App</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span 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></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="安装-tailwind-css">安装 Tailwind CSS<a href="https://el233.github.io/blog/chrome-extension#%E5%AE%89%E8%A3%85-tailwind-css" class="hash-link" aria-label="Direct link to 安装 Tailwind CSS" title="Direct link to 安装 Tailwind CSS">​</a></h3>
<p>使用与兼容的 Vue2+Webpack 的旧版 Tailwind</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm install tailwindcss@npm:@tailwindcss/postcss7-compat postcss@^7 autoprefixer@^9</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="配置postcssconfigjs-文件">配置postcss.config.js 文件<a href="https://el233.github.io/blog/chrome-extension#%E9%85%8D%E7%BD%AEpostcssconfigjs-%E6%96%87%E4%BB%B6" class="hash-link" aria-label="Direct link to 配置postcss.config.js 文件" title="Direct link to 配置postcss.config.js 文件">​</a></h3>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><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><br></span><span 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></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">'@tailwindcss/postcss'</span><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 plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">autoprefixer</span><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><br></span><span 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></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="配置tailwindconfigjs-文件">配置tailwind.config.js 文件<a href="https://el233.github.io/blog/chrome-extension#%E9%85%8D%E7%BD%AEtailwindconfigjs-%E6%96%87%E4%BB%B6" class="hash-link" aria-label="Direct link to 配置tailwind.config.js 文件" title="Direct link to 配置tailwind.config.js 文件">​</a></h3>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><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">@type</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 keyword" style="color:#00009f;font-style:italic">import</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 string" style="color:#e3116c;font-style:italic">'tailwindcss'</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 punctuation" style="color:#393A34;font-style:italic">.</span><span class="token doc-comment comment class-name" style="color:#999988;font-style:italic">Config</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 plain"></span><br></span><span class="token-line" style="color:#393A34"><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><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">content</span><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></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">'./public/**/*.html'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">'./src/**/*.{vue,js,ts,jsx,tsx}'</span><span class="token plain"></span><br></span><span 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></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">theme</span><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></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">extend</span><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><br></span><span 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></span><span 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 punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="升级-manifest-版本">升级 manifest 版本<a href="https://el233.github.io/blog/chrome-extension#%E5%8D%87%E7%BA%A7-manifest-%E7%89%88%E6%9C%AC" class="hash-link" aria-label="Direct link to 升级 manifest 版本" title="Direct link to 升级 manifest 版本">​</a></h3>
<p>在<code>manifest.json</code>修改字段</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">"manifest_version": 3</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="插件功能设计">插件功能设计<a href="https://el233.github.io/blog/chrome-extension#%E6%8F%92%E4%BB%B6%E5%8A%9F%E8%83%BD%E8%AE%BE%E8%AE%A1" class="hash-link" aria-label="Direct link to 插件功能设计" title="Direct link to 插件功能设计">​</a></h3>
<ul>
<li>获取视频信息<br>
<!-- -->getVideoInfo()会调用b站API获取信息：</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">async</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">getVideoInfo</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><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> videoApi </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">https://api.bilibili.com/x/web-interface/view?bvid=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">bvid</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 plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> videoRes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">videoApi</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> videoData </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> videoRes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> videoData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">title</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> view </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> videoData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stat</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">view</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> reply </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> videoData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stat</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">reply</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> mid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> videoData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">owner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">mid</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> upName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> videoData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">owner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">name</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> upApi </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">https://api.bilibili.com/x/relation/stat?vmid=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">mid</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 plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> upRes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">upApi</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> upData </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> upRes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> follower </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> upData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">follower</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span 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></span><span class="token-line" style="color:#393A34"><span class="token plain">  infoDisplay</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">innerHTML</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string html language-html"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string html language-html">    </span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;</span><span class="token template-string html language-html tag" style="color:#00009f">p</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;</span><span class="token template-string html language-html tag" style="color:#00009f">strong</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html">UP主:</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;/</span><span class="token template-string html language-html tag" style="color:#00009f">strong</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html"> </span><span class="token template-string html language-html interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string html language-html interpolation">upName</span><span class="token template-string html language-html interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;/</span><span class="token template-string html language-html tag" style="color:#00009f">p</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string html language-html">    </span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;</span><span class="token template-string html language-html tag" style="color:#00009f">p</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;</span><span class="token template-string html language-html tag" style="color:#00009f">strong</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html">粉丝数:</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;/</span><span class="token template-string html language-html tag" style="color:#00009f">strong</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html"> </span><span class="token template-string html language-html interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string html language-html interpolation">follower</span><span class="token template-string html language-html interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;/</span><span class="token template-string html language-html tag" style="color:#00009f">p</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string html language-html">    </span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;</span><span class="token template-string html language-html tag" style="color:#00009f">p</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;</span><span class="token template-string html language-html tag" style="color:#00009f">strong</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html">BV号:</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;/</span><span class="token template-string html language-html tag" style="color:#00009f">strong</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html"> </span><span class="token template-string html language-html interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string html language-html interpolation">bvid</span><span class="token template-string html language-html interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;/</span><span class="token template-string html language-html tag" style="color:#00009f">p</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string html language-html">    </span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;</span><span class="token template-string html language-html tag" style="color:#00009f">p</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;</span><span class="token template-string html language-html tag" style="color:#00009f">strong</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html">标题:</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;/</span><span class="token template-string html language-html tag" style="color:#00009f">strong</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html"> </span><span class="token template-string html language-html interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string html language-html interpolation">title</span><span class="token template-string html language-html interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;/</span><span class="token template-string html language-html tag" style="color:#00009f">p</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string html language-html">    </span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;</span><span class="token template-string html language-html tag" style="color:#00009f">p</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;</span><span class="token template-string html language-html tag" style="color:#00009f">strong</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html">播放量:</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;/</span><span class="token template-string html language-html tag" style="color:#00009f">strong</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html"> </span><span class="token template-string html language-html interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string html language-html interpolation">view</span><span class="token template-string html language-html interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;/</span><span class="token template-string html language-html tag" style="color:#00009f">p</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string html language-html">    </span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;</span><span class="token template-string html language-html tag" style="color:#00009f">p</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;</span><span class="token template-string html language-html tag" style="color:#00009f">strong</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html">评论数:</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;/</span><span class="token template-string html language-html tag" style="color:#00009f">strong</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html"> </span><span class="token template-string html language-html interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string html language-html interpolation">reply</span><span class="token template-string html language-html interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&lt;/</span><span class="token template-string html language-html tag" style="color:#00009f">p</span><span class="token template-string html language-html tag punctuation" style="color:#393A34">&gt;</span><span class="token template-string html language-html"></span><br></span><span class="token-line" style="color:#393A34"><span class="token template-string html language-html">  </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>为什么用API而不是DOM：<br>
<!-- -->1.使用官方 API，可以直接获取完整、实时、可靠的数据<br>
<!-- -->2.从API获取的JSON中直接包含了JSON 不用解析DOM</p>
<ul>
<li>一键三连<br>
<!-- -->模拟手动长按按钮3秒实现：</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">realTripleLike</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><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> likeBtn </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">querySelector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'.video-like'</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 dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">querySelector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'button.like'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><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">likeBtn</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 plain"> </span><span class="token function" style="color:#d73a49">alert</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 plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  likeBtn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">dispatchEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">MouseEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'mousedown'</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">bubbles</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><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">setTimeout</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><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    likeBtn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">dispatchEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">MouseEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'mouseup'</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">bubbles</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><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">alert</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 plain"></span><br></span><span 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 number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>发送评论<br>
<!-- -->调用b站API发送配置好的评论：</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">async</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">sendComment</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><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> csrf </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getCSRF</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> bvid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getBvid</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> text </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">window</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">__bili_comment__</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">'好耶！'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">bilibiliPost</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'https://api.bilibili.com/x/v2/reply/add'</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></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">oid</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> bvid</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><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 number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">message</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> text</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    csrf</span><br></span><span 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></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">alert</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 plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="弹窗样式">弹窗样式<a href="https://el233.github.io/blog/chrome-extension#%E5%BC%B9%E7%AA%97%E6%A0%B7%E5%BC%8F" class="hash-link" aria-label="Direct link to 弹窗样式" title="Direct link to 弹窗样式">​</a></h3>
<p>这里因为elementui的按钮组件自带样式导致我的弹窗按钮无法对齐<br>
<!-- -->于是添加<code>!important</code>到样式，强制覆盖其默认样式<br>
<!-- -->添加<code>box-sizing: border-box !important</code>确保宽度计算包含内边距和边框<br>
<!-- -->效果图如下：<br>
<img decoding="async" loading="lazy" alt="图片1" src="https://el233.github.io/assets/images/bvget-3c5f9bb0270ee64bc13013c0e3b1e2b6.png" width="674" height="562" class="img_ev3q"><br>
<img decoding="async" loading="lazy" alt="图片2" src="https://el233.github.io/assets/images/getbv-2cdd0b5417aefff6a7316d91575d6d9a.png" width="664" height="456" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="popup--content-script-通信">popup → content-script 通信<a href="https://el233.github.io/blog/chrome-extension#popup--content-script-%E9%80%9A%E4%BF%A1" class="hash-link" aria-label="Direct link to popup → content-script 通信" title="Direct link to popup → content-script 通信">​</a></h3>
<p>Vue popup 发送消息到 content-script:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">chrome</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">tabs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">query</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">active</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 literal-property property" style="color:#36acaa">currentWindow</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 punctuation" style="color:#393A34">(</span><span class="token parameter">tabs</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></span><span class="token-line" style="color:#393A34"><span class="token plain">  chrome</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">tabs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">sendMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tabs</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 property-access">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 class="token literal-property property" style="color:#36acaa">action</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'get_video_info'</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></span><span 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></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>content-script接收消息并处理：</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">chrome</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">runtime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">onMessage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">msg</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> sendResponse</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></span><span class="token-line" style="color:#393A34"><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">msg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">action</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">'get_video_info'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getVideoInfo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><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">msg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">action</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">'open_floating_box'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createFloatingBox</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><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">msg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">action</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">'triple_action'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">realTripleLike</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span 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 boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span 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></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>project</category>
            <category>chrome</category>
            <category>vue</category>
        </item>
        <item>
            <title><![CDATA[mac m芯片 配置pytorch开发环境]]></title>
            <link>https://EL233.github.io/blog/pytorch-mac</link>
            <guid>https://EL233.github.io/blog/pytorch-mac</guid>
            <pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[准备工作如下]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="准备工作如下">准备工作如下<a href="https://el233.github.io/blog/pytorch-mac#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C%E5%A6%82%E4%B8%8B" class="hash-link" aria-label="Direct link to 准备工作如下" title="Direct link to 准备工作如下">​</a></h3>
<p>1、去安装Conda（推荐 Miniforge 或 Anaconda）<br>
<!-- -->2、在里面创建一个干净的虚拟环境<br>
<!-- -->3、安装PyTorch<br>
<!-- -->4、测试GPU是否可用</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="安装conda推荐-miniforge-或-anaconda">安装Conda（推荐 Miniforge 或 Anaconda）<a href="https://el233.github.io/blog/pytorch-mac#%E5%AE%89%E8%A3%85conda%E6%8E%A8%E8%8D%90-miniforge-%E6%88%96-anaconda" class="hash-link" aria-label="Direct link to 安装Conda（推荐 Miniforge 或 Anaconda）" title="Direct link to 安装Conda（推荐 Miniforge 或 Anaconda）">​</a></h3>
<p>这边我用的是Miniforge，因为它原生支持ARM架构，使用社区驱动的conda-forge频道，更轻量。<br>
<!-- -->顺便说一下我的是m2芯片。</p>
<p>下载最新版本的ARM64（M芯片）安装脚本：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>安装 Miniforge：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">bash Miniforge3-MacOSX-arm64.sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>中途会显示一些协议条目,它开始打印协议时，需要你按enter继续，最后问你是否同意的时候打yes。</p>
<p>选择安装目录，这边我选择默认的没有修改。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Miniforge3 will now be installed into this location:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/Users/xxx/miniforge3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - Press ENTER to confirm the location</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - Press CTRL-C to abort the installation</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - Or specify a different location below</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>出现这个：选择yes自动执行<code>conda init</code></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">You can undo this by running `conda init --reverse $SHELL`? [yes|no]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>查找你的conda位置：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">which conda</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>手动使conda生效：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">eval "$(/Users/xxx/miniforge3/bin/conda shell.zsh hook)"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>验证是否安装成功：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda --version</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="在里面创建一个干净的虚拟环境">在里面创建一个干净的虚拟环境<a href="https://el233.github.io/blog/pytorch-mac#%E5%9C%A8%E9%87%8C%E9%9D%A2%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%B9%B2%E5%87%80%E7%9A%84%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83" class="hash-link" aria-label="Direct link to 在里面创建一个干净的虚拟环境" title="Direct link to 在里面创建一个干净的虚拟环境">​</a></h3>
<p>创建独立的<code>PyTorch</code>环境：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#创建命令  -n 虚拟环境名称 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda create -n torch python=3.10</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#激活虚拟环境</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda activate torch</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>检查python是否安装：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">python --version</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="安装-pytorch">安装 PyTorch<a href="https://el233.github.io/blog/pytorch-mac#%E5%AE%89%E8%A3%85-pytorch" class="hash-link" aria-label="Direct link to 安装 PyTorch" title="Direct link to 安装 PyTorch">​</a></h3>
<p>安装 PyTorch：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda install pytorch torchvision torchaudio -c pytorch</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="测试gpu是否可用">测试GPU是否可用：<a href="https://el233.github.io/blog/pytorch-mac#%E6%B5%8B%E8%AF%95gpu%E6%98%AF%E5%90%A6%E5%8F%AF%E7%94%A8" class="hash-link" aria-label="Direct link to 测试GPU是否可用：" title="Direct link to 测试GPU是否可用：">​</a></h3>
<p>打开编辑器，进入刚刚建立好的虚拟环境：
1、终端手动进入：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda activate torch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">python torch_demo.py</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>2、在编辑器中指定解释器：（每次运行都自动使用<code>torch</code>环境的<code>Python</code>）<br>
<!-- -->我用的是vs code，打开命令面板（Cmd + Shift + P）输入以下内容，然后找到类似这种路径<code>miniforge3/envs/torch/bin/python</code></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">“Python: Select Interpreter”</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>建立一个torch_demo.py文件用来测试：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#导入 PyTorch 库</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import torch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#输出当前PyTorch的版本</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">print("PyTorch version:", torch.__version__)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#检查MPS是否可用</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">print("MPS available:", torch.backends.mps.is_available())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#检查 PyTorch 是否编译时包含了 MPS 支持</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">print("MPS built:", torch.backends.mps.is_built())</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>以后每次运行PyTorch项目前，都要先确实处于torch环境，如果没有的话就先激活：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">#激活虚拟环境</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda activate torch</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>pytorch</category>
            <category>python</category>
        </item>
        <item>
            <title><![CDATA[Parsing error No Babel config file detected]]></title>
            <link>https://EL233.github.io/blog/eslint-error</link>
            <guid>https://EL233.github.io/blog/eslint-error</guid>
            <pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[起因]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="起因">起因<a href="https://el233.github.io/blog/eslint-error#%E8%B5%B7%E5%9B%A0" class="hash-link" aria-label="Direct link to 起因" title="Direct link to 起因">​</a></h3>
<p>本人正在试图用vue开发chrome插件，刚配置好环境，用vs code打开文件后就发现报错信息<code>Parsing error: No Babel config file detected</code>。<br>
<!-- -->奇怪的是我明明就有<code>/babel.config.js</code>文件。遂提问小G，ta说只要在文件里加上一句<code>requireConfigFile: false,</code>就可以了，<br>
<!-- -->于是我改成这样：</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><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><br></span><span class="token-line" style="color:#393A34"><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><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'@vue/cli-plugin-babel/preset'</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">requireConfigFile</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><br></span><span 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></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>并且同步修改了<code>/.eslintrc.js</code>文件：</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><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></span><span 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"> </span><span class="token string" style="color:#e3116c">'@babel/eslint-parser'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">requireConfigFile</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><br></span><span 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></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>报错的确是消失了，可是我突然意识到，同时我的Babel的配置也失效了。</p>
<p>再一番搜索后得知：<code>babel.config.js</code> 必须在项目根目录，于是我还原两个文件后重新打开项目，使得此文件处在根目录下，报错果然消失了。<br>
<!-- -->即编辑器打开的目录并不等于运行项目的目录，ta对根部的理解就是表面上打开文件的层级最上部。<br>
<!-- -->ESLint判断“项目根目录”时，并不是根据磁盘路径，而是根据你在编辑器里打开的文件夹作为 Workspace根。<br>
<!-- -->以下是图解：<br>
<img decoding="async" loading="lazy" alt="图片3" src="https://el233.github.io/assets/images/0003-66680e00b3e523045ec30f3d90982792.png" width="1132" height="238" class="img_ev3q"><br>
<img decoding="async" loading="lazy" alt="图片1" src="https://el233.github.io/assets/images/0001-3d449b12965fe2ac850127b322f78b64.png" width="604" height="776" class="img_ev3q"><br>
<img decoding="async" loading="lazy" alt="图片2" src="https://el233.github.io/assets/images/0002-78a7027f0163c9e8ac8e774275c4e263.png" width="610" height="1008" class="img_ev3q"></p>]]></content:encoded>
            <category>project</category>
            <category>chrome</category>
            <category>vue</category>
        </item>
        <item>
            <title><![CDATA[自动生成项目结构树]]></title>
            <link>https://EL233.github.io/blog/project-autotree</link>
            <guid>https://EL233.github.io/blog/project-autotree</guid>
            <pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[一个vs code插件]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="一个vs-code插件">一个vs code插件<a href="https://el233.github.io/blog/project-autotree#%E4%B8%80%E4%B8%AAvs-code%E6%8F%92%E4%BB%B6" class="hash-link" aria-label="Direct link to 一个vs code插件" title="Direct link to 一个vs code插件">​</a></h3>
<p>起因是写东西的过程中，想要清晰的查看自己的项目结构，脑袋突然一闪“那我为什么不直接写一个插件给自己用呢”。
于是直接开始。
ps:在扩展库搜索<code>AutoPJTree</code>就可以直接安装使用喔，插件详细可以看我GitHub<a href="https://github.com/EL233/AutoTree" target="_blank" rel="noopener noreferrer">🔗</a></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="前期准备">前期准备<a href="https://el233.github.io/blog/project-autotree#%E5%89%8D%E6%9C%9F%E5%87%86%E5%A4%87" class="hash-link" aria-label="Direct link to 前期准备" title="Direct link to 前期准备">​</a></h3>
<p>首先安装好<a href="https://nodejs.org/en" target="_blank" rel="noopener noreferrer">Node.js</a>和<a href="https://git-scm.com/" target="_blank" rel="noopener noreferrer">Git</a>
再来安装<a href="https://yeoman.io/" target="_blank" rel="noopener noreferrer">Yeoman</a>和<a href="https://www.npmjs.com/package/generator-code" target="_blank" rel="noopener noreferrer">VS Code Extension Generator</a></p>
<p>第一步安装脚手架工具：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm install -g yo generator-code</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>作用：
全局安装 yo（Yeoman） 和 generator-code。
Yeoman 是一个项目模板生成器框架，而 generator-code 是它的插件，用来生成 VS Code 扩展项目。</p>
<p>安装完成后，你会在命令行中获得 yo 命令。</p>
<p>第二步：创建 VS Code 插件模板</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">yo code</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>接下来它会询问一系列问题：
插件名称（Extension name）
标识符（Identifier）
描述（Description）
作者名
是否使用 TypeScript
是否添加 Git 初始化等
<img decoding="async" loading="lazy" alt="图片" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAiEAAADLCAIAAAA3NdQdAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABM4SURBVHhe7d0NmqM2s4bh5Kxslpalzc5yqnlJfTX6A4GEAT/3lcuRiqIk3LbUbnd7/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiJv9f/38zv37/XVvDr16/Z8bUFAAAAAAAAAAAAAMD9ffg9/+J77+ZTb7/fbT4AAAAAAAB4sd+LtfNAT58/AFzp/9b/AwAwGnsMAGAW9hgAwCw3/bwytBXfEzrw+WzEDXFpxNcWcH/2IC4+jp/i6fMHgCvxszIAwCzsMQ+gF09m7QOfsD4KeRyiB3sMAAAAAAAAAADAXFf/fYzeMBzyG/f/hNuGnWk7DZx/l0njJmX3jKIcuf5+uJhf7MkrjXds8U7ec88fM/brNW+eeKunvue/f+cYu8fA1pe7LTFxGT0jr/OCxfSGXy98lUfuMb3bBtvMi83bYK7EToC3et7PymobRowUt5PaiV3Oz/+YSeMmZWNXbcnHzedTyy/GY1CKh/JxE5fVsa43lvCR+krbWacYP1BHkuTDRtXB9/jw55XVNoPNTSJJyA8lCaZ91FiwFn8rXzKsoVvvqhFz7NYlwVr+ZtsauvVunmO3DcW0UXWM4sYOeU5v/c38JFjL36xjivFaMjDb1T8rs8e6Hu6iZT35rxEfJams/xpxl8z/Mh8Z99igtpCdXMuOjTtV8YrmzVPDqfhyd27fn5qMWftzXDAEXuZ578do0U+W/k3Hzno9X8usobUjLmc/a9t/1tAl1iEXa+iW1iku1tA4Krss6dtrun/tjCLATfCePzbsXOZcb35Nb53e/JreOnvytfR75uZOkGSqDTzRe/4+Jm4heTtGzhg4/y7zxvXKyRDqShw3xkVH9+QnxYvdWp0GP2Vz3La8ThJRN7alq36SHOtIu77HLRgLbsZdrNYrVgYAAAAAADvZC+r8FToA4NtMeT/m235oe8H1zhsifjdwvr5XS0oNmf+Bqdbms1Mc0Z2/l84bcn8e8Klx8VxTfq9MD8Hi8xO34ktG8Ut24CuoOjO0p1pzcj5++jLsD3XbDtxvwFvN+t3l/U9I3NPYhfLk48E3GHU/aHMO12wwy93J8wsP8OHPknmBa5a/SaPUyuYLpXJifnJuckoxHgeqxYuSsaI99c3mfGri0Nb2hgdjNxaXJEeKQeNxU8w3XfFG/WNU8HwdfI+L9pjksS72SH16fG09mV9acjmKN4J72i4JbuYnajm1Or3tBqU5z/fTkzrFsjF4pu2S4OE6wGy8jnmG2QtEXr84Ym3NqrVdEtzMT9RyanXa7SivmUhOj/leLQ8mZWvjJsW9nXcTjeQ97cOGFMFXeeRnyWAUWzLiqqH2/fm0j7GLdWton978hEaUNVSntJNXCnwceww23GGZ06I8dhrHrstPUaMxsZ/qPfHIc2ZcOHAlflb2DHHFGSuuX0l9PxTjMRhntRl3eVyRTcVTanU8bkG1D4wbk11S0BS7JtYvjhtPrBUxtToST5c99Y8ZUgQAAAAAAHzWP//8/AcAuNgH3vM/v+LnFWIkPzrEpLI7/V6sHdzbi79YL740THL1HqNl+uLFesigH5k5rjRk9fQirMWAuXSP+eAybYOeH/eD88dsbAnADNf97vKoBbpYJwaLCQPNrl+kFfBNvzPqa7pdVLy6uNb79SYbQLwf2vlJcbOnvtmZv7P+ayQXC2x63t9g2uJ+8fp+B/asftMT25cqE5etGPeuy+O1fHWjeEiSoDdE3WP1k8ab/NwRb7wuzMPf+T+DLWG+ir1e78U28i2erIlKNmv/HKvzVWvuwLsOX+K6PeYjP2Ia7h1XcXPL98qrNdS0pi7W0H8U8UNaH717nuokBZMu8M2+5T3/IdhgRtES3P6muH0015tfc77O+QrAa3zg88omrdSx4IxtYNK0d9Ka9crvjpNLi6tzEvSdydvelXZQ/JDFa6XiKb31TVL2TV58aZjkpp+JGZ/D0agH9+z6aItLFcsW8GJ87jI+I27zbDAAAAD4Yvatcfzu+DXeel14Fh6HOOBjfx8z/MHqBWc8DXhqAcABn9ljJm0wvxbeHYttBgB6fWCP8f1A3UeYt3VteuLdhffhcYhjrv69skmP1Fh23pPhPk8zzSRhEyNuiMvA+NoC+l26x+gRPOMhmz83Jj0x5l0CALzPdT8ru2B1tuKzV3/VL367BwBIXLTHvOnbf7YZANjputcx79hg5E3XAgDzfPizZEa9Gqgt+rPrAwAAAAAA4EXu8rnL5/91Fj83ljpc8OTpAADzmc+SGa64r7BDAMBnvWSPcck2AwDAz65wq43hbvMBAAAAcD+8jgGA93nb+zEAgPtgjwEAzMIeAwAAAAAAAAAA8AX4xWUAeCXe8wcAzMIeAwB4L35QBgAAAAAAAAAA3u0u/9Zykb8vMukNktn1AeDL8XtlAIBZBr+O+f3799ra59evX2trn1EvOHrrzL4uAAAAAE9jLyq+6g0Re1XU+8IIAJ5o1/sxD1oTi9uV5i9rqGn/nhcz958FAF/iFu/5a2metEBrX/m18O5n3WcmADDVXX6v7NteBPieBwAvtr3H+OsAdV9v6osqAPgqt/4bzFHiT6WGb5ZxN2JnAoA3s1X++oX+I4MCwP3xd/4AgFnYYwAAs7DHnOU/JePHZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6hH/PP/77J1v/Fsq///5rt3//vZ7uXTXUVuMbvOCqky/ocN/5wPhm/hU3XV/0379/2+2vX78a7bfSNZp5l3n93fjfv1GmTcVuvXHIsRUkPhz36M2fKq7OkyZ2q+s95qu2lkc/nhv2z1OZ9kXvfV58w0bScMGFawjfzC4Q9pij+8pJr3lC+jNqrGuud9Lkv9BrHs+Jrnkeezh9+QZzmYu3mexxsO91jB5w/jCKXW8Xc6QYFD9U1MiPw3k7aaitRizlwYZavg+h7qZinaSId2OyJDlSDBqPm2K+6Yo36tfUTqmNW6N8ZeZtSYrnyTVJzs76rhY3e8aNiqXaRaQ9T4uovVm/Xcdt1pFk0IbiBhODSUJcIuNZtXhNMd+DFonj1uKmUafWLYo5eVtihd58F5On+vPf89+3wUT5g08srgeWJ1hXkqA3RN0aT1CyUbdGCZqMt/02CTbU8mPD2w3KyevEruf4rRqibq2O5PFGvgej3vo1SR3Xrr/fqDoNKm6sndTP4+qqIerWeIKSjbq911XLVzfSoUZ9BY218zo6ZNRt1DF+VN2BfH3UEunraS3eoGRjbc9XN/LK6jrFD4y7KY7YW3/GfA77c48ZJ39g2QNO1v4NnJ+PX+bPk2z3c6k4rk5XfGepYp2ipPjO+l8ovz+X+/jH2r+94tfX5l8M5teloFn7O/TmnxeXTl9JncX3r6pKNmv/TxZPikstXlOrX6P8w9elE71IUudi2euYfS9i9Hi1B5Y19PDKH8GR57TTLqb5yBq6xDrkYg0dspZYrKE6pf0sBtcuB492z8ftAZp/ciHqiiLHrlf5soYWeaQhLot7aOlcVt30FB2SNVShcxuZiucJtfgoKptcmoaTNVSntOXuKdylCu6pc97BPWaGZfXrWP6SfD2aPbj/we2nXCwZV22/iiX2hyW9Ix55TqP+zR3++u7hxa0xqv4y0477uTe/prfOqPw8nkfatOQV18TEsnL+b5UsnuI5H+TT03LvkT1ql/ZzVSHoaQrWunbr4qEL/PlE0gazb5vRoyd5TvpDKnbzQzFukrM2tfNrxaUY3zNuMb+3iGnUaXdNHGKzTq2IqdWReLrsqV/jdSwzP102i0TJuLU6tXFrPKdWPx6KOUm+iaeo0VbM96DZU6eY3yhSOxQno3ZerZhvikMkwU3JChjXx7gs9sZrPN+SfegDxdunxOJLuMyLKC2eUqvvkvq1/CQN3exhHR/0Jo/gufhqAjnbOeKmcit932LcVlx3dn6ThQfh6wjk4r7CSxMAwNcJ3xL+s7wPo9tNSXLXuXsUSw2sf9jwK83FIfKBhg8dC54vXpv2fucrALiN8Htlt3pu+zSsof/2uMnkz9AlxAvx9oyr8+G8caXicB+ZCYA5kt9d7nx6X7kQbI51zWRslHkDqXKsn4w1b+hRbIY7J9lI06H7XyyALaW3T/c8w+NRa8dTkkOxUesWxRy7TbqSHI2SHCkGTTHHHG7HoEm6RcopZhYPxaDfJg21k4ZJgvGQa+SroXZ+yCRBu80jiVokjwN4jtJnyfQ+t2Omn9tbpMZLSSyb36qh/7yrW29Eedy7Sdx4MPI0b0S1+Dw+XDJ0jHvXGx53SdyPJmkmHqod1SFv+60afgjA65zbY2o5jVVjT9koL6VuvN2UF6lJiu886ymKV+TB2sW2zwKAumyP0cKxf/koZmoB0n9DnKzTNZ+u5IE03NRB/bp8FG/H2z08f/8pXXrnA+CWzr3nL7V8i/shr+xBP7ST58fTi0Us2BWPPCfeXqZrUE/uOsv4KTv15vfK66s7dVAAl5jw9zGxQt622zwtVzyan1vsxoYpttXIb2PD1NqSnGi8HQ/laW1JfjyxWKSRb4rxw+1agkm6RpFGmrfzYHIWAOADbC1OluM88ll3mw+AC/HRT88UV+097U+523wAAADwDgdfx+jzPpN/q2DgB38WP6f6Dh8sOvxKc8Uh4h0ydvSxlc/fPxfcwwAuU/r7mBvwJcYaom5bXC4fqrbCemTnXbGTD6eyF9+BxeE+MhMAk5zaY65cCLT0NFwzmWU1HrnKR7qEefUvsP/+aXy9VIFtBniBUz8rE1sR4uKYHFIjJuTdoqRmLJ7XUSNKcqQYNB43xXzTFW/Ur9EpjcwkoTGuur35iUa+sUhX/Xii3cZk8VNcUh/AEw34WVlcL3xd0NKQLyW9rEIsEsvqVhHdqiHqeo4isZTJ4418D0a99QdScWPtPfXX7D/zvZtUULeWH8VD+VFFLMePeuWfw/+dZdQF8DKn9pja0mDriJaSXC1eky9A6qpOcqhmmc6ucZPiO+vP05i5Dpm1v2XNzvL9MvND4gmRJedBAEicfR1TXGiWRWm1hs45WUczkTVUp7RlNd67fA+hue0cVGmaqiJttfyfi/zvkLpLeJvyl3q7JtArzgrAcw34WVltIViWr3XNUo51raFg7/LhpeLpHows2BWPPKdRf57zg3oFFem9k4u82iR5fXWHTB7AZ43/+5i4XsRlwnP2rCCxiMvPLXZNLB5LFU+sFTG1OhJPlz31NyX5xfrG4xYsnpKMWMv3uImnFOO1ZBMPSV7fFIfIg0lxAAAKbM/wvQTAt+HzyjBR3F14aQIAAIBhbvp5ZdL1XfDUb5ljcdEQHh8+IgC8wIDfK5vE961kNa/xzEm8eBxl6ogA8HSn9pjNdf8w32DU/bhkJmwtALDHTT+vrJFQrO/yE4v5HrRIY6xEMdODyVEfwhSD0s4HgEcb8LOyuDj6OqtVMl9ST+qtX8tXNzo5VTs9DlEbVxSMh9r5APBQp/YYLYg5WyJrq+TdVk+bT+0quhSLLHdDx/X25gPAzZ19HVNcWy3o1tA58xZfzXDgVCOVlTXUtKYu1hAAPNmAn5XVFsS4MSjHutZQsL2Mer66j/ZzL/RcSG8+ANzWTT+vTIql2vUjHe0q0tCuE8faHLfYLeYDAAAAAAAAAIAXuOnnlb34zQnedwHwPQb8XtkMvvi+coOxi9J1xf3mg24yDQDvc2qPYW16Ab6IAOa56eeVmVpOo76LZ/khC3rNWDy2vSubdey2ll+UjOXygknbR2nHjUdMHvRTYp3ITwGA8wb8rCyuU75+1Zaw81TcWDupn8fjfLy9HKlSsrH2Zp0Y926Dp21miucvI/wxYjHuR2NQETVcrKOGqAsAQ5zaY2pLkq1fvrolavFNfuJS+4e6w63Ve+p35ftS3jXEKDZo7asGAMOdfR1TXLCWVXS1hs7x5ViNgZUTx+orX9ZQhdX3IdRdwtfRuMtMp9yBABAN+FlZbbXy9dQox7rWUPCaNc7H1aCH7anTPnp/T58/gBu66eeVxSIuqR9LxZq1+km8WMdua3FXq2OSzKJafm3cmG+K45pivB10fjQ/BACostXTF9DY7hXPje0L1IarxQHgPg6+jnmQuBCf+T59VJ0utUE/MhkAAADgLm76eWVy4Lt1P+XwZI69RJh0DwDAow34vbJJfNXWwh2X/oaTq/yxQWe7yTQAoNepPWbe2udrvbr359vScGwwAJ7rpp9X1kgo1jcxbpKxpDGi1MatFTfF+l7Hj+pQLW4adaJ2PgDcyoCflcXFTm1b8rTq5UvkSbX6Sdz1zsfTipnFOh6MPM2P6pRa3I/GoCLeEHVr+QBwK6f2GF/yErbk1Va9j6yGjfnkPrhw759nnKFPGADu5uzrmOLqplVP1tA5+xffonUqizVU4QMp88ygB2iGsobqlOYTBoAbGvCzstqCGJc/5VhXy6JHajxf3SF+ZvOE5bg2zxj39ow7CgBGuennlUmxVLu+SYao5dc0Bo0Fk0NRPq6p5RfjHhQ/FOONfADAy9keELcBV4sDwPu8//PKPiLuIrz4AAAAAAAAeIS//vp/GbBZbbvpq3wAAAAASUVORK5CYII=" width="545" height="203" class="img_ev3q"></p>
<p>按需填好字段后它会生成一个目录结构，比如：</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">my-extension/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── .vscode/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   └── launch.json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── src/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   └── extension.ts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── package.json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── tsconfig.json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── README.md</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>进入生成的目录：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cd my-extension</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>打开vs code，按 F5 启动调试，会自动启动一个新的 VS Code 窗口加载初始插件。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="在extensionts里进行插件功能的编辑">在<code>extension.ts</code>里进行插件功能的编辑。<a href="https://el233.github.io/blog/project-autotree#%E5%9C%A8extensionts%E9%87%8C%E8%BF%9B%E8%A1%8C%E6%8F%92%E4%BB%B6%E5%8A%9F%E8%83%BD%E7%9A%84%E7%BC%96%E8%BE%91" class="hash-link" aria-label="Direct link to 在extensionts里进行插件功能的编辑" title="Direct link to 在extensionts里进行插件功能的编辑">​</a></h3>
<p>比如我这个自动生成树的逻辑：
1、计算最大深度
函数<code>computeProjectMaxDepth()</code>用来计算整个项目的实际层级深度。
它递归扫描目录结构，忽略掉指定的文件夹。返回值为项目的最大层级。</p>
<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><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">stat</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isDirectory</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 punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> subDepth </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">computeProjectMaxDepth</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fullPath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ignore</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> currentDepth</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span 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">subDepth </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> maxDepth</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></span><span class="token-line" style="color:#393A34"><span class="token plain">    maxDepth </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> subDepth</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span 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></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>2、生成目录树文本
函数<code>generateTree()</code>用来生成类似 tree 命令输出的文本。
代码中通过缩进控制层级：</p>
<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> indent </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> level </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"> </span><span class="token string" style="color:#e3116c">''</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">'│   '</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">repeat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">level </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 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><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>使用递归：</p>
<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><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">stat</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isDirectory</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 punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  out </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">generateTree</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">itemPath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ignore</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> depth</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> level </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 plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>通过<code>getConfigSources()</code>从两种配置来源（工作区配置、用户配置）中获取设置。
1.、读取 VS Code 的配置对象：</p>
<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> cfg </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> vscode</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">workspace</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getConfiguration</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'autotree'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>2、通过 inspect 分别读取不同层级的配置：</p>
<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> workspaceIgnore </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cfg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">inspect</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name builtin">string</span><span class="token generic-function generic class-name punctuation" style="color:#393A34">[</span><span class="token generic-function generic class-name punctuation" style="color:#393A34">]</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 string" style="color:#e3116c">'ignore'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">workspaceValue </span><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 plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> userIgnore </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cfg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">inspect</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name builtin">string</span><span class="token generic-function generic class-name punctuation" style="color:#393A34">[</span><span class="token generic-function generic class-name punctuation" style="color:#393A34">]</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 string" style="color:#e3116c">'ignore'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">globalValue </span><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><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>3、检查是否有多处配置（用来决定后续是否弹出选择框）：</p>
<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> hasMultiple </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> hasWorkspaceConfig </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> hasUserConfig</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>4、返回两个 ConfigSource 对象。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="在packagejson里编辑插件的名称描述信息版本信息等">在<code>package.json</code>里编辑插件的名称、描述信息、版本信息等。<a href="https://el233.github.io/blog/project-autotree#%E5%9C%A8packagejson%E9%87%8C%E7%BC%96%E8%BE%91%E6%8F%92%E4%BB%B6%E7%9A%84%E5%90%8D%E7%A7%B0%E6%8F%8F%E8%BF%B0%E4%BF%A1%E6%81%AF%E7%89%88%E6%9C%AC%E4%BF%A1%E6%81%AF%E7%AD%89" class="hash-link" aria-label="Direct link to 在packagejson里编辑插件的名称描述信息版本信息等" title="Direct link to 在packagejson里编辑插件的名称描述信息版本信息等">​</a></h3>
<p><code>name</code>扩展的包名 必须全局唯一，发布时会变成 <code>&lt;publisher&gt;.&lt;name&gt;</code><br>
<code>displayName</code>在 VS Code 插件市场显示的名字（可以更友好）<br>
<code>description</code>插件的描述信息<br>
<code>version</code>当前版本号（发布时用于更新）</p>
<p>其中有一个引擎兼容性，用来告诉 VS Code 这个插件需要的最低版本。
如果后续在打包过程中有相关报错信息，可以在这里修改成对应的版本：</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><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><br></span><span class="token-line" style="color:#393A34"><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">"输入对应的版本号"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>激活事件：定义插件何时被激活</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><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 punctuation" style="color:#393A34">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>常见触发方式：
"onStartupFinished"：VS Code 启动后加载。
"onCommand<!-- -->:xxx<!-- -->"：用户执行某个命令时加载。
"onLanguage<!-- -->:python<!-- -->"：打开某种语言文件时加载。
"*"：总是加载（不推荐，会影响性能）。</p>
<p>主入口：</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><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><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>指定插件的入口文件路径（编译后）。
默认是 src/extension.ts 编译出来的 JS 文件。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="一些杂乱的">一些杂乱的<a href="https://el233.github.io/blog/project-autotree#%E4%B8%80%E4%BA%9B%E6%9D%82%E4%B9%B1%E7%9A%84" class="hash-link" aria-label="Direct link to 一些杂乱的" title="Direct link to 一些杂乱的">​</a></h3>
<p>原本把问题想的很简单，只需要完成递归生成树就好了，实际操作中才能意识到很多需要改进的地方。
比如需要忽略掉某些文件夹/文件，有时候不需要查看那么深的结构，手动设置步骤很繁琐，每次都要重新来一遍。
为此增加了多种设置方法：项目设置 (.vscode/settings.json)、工作区设置、用户设置 (全局)。以及递归深度限制。
过程中又遇到问题，比如我在项目设置与工作区设置不一样，又或者我是提前设置好了，但临时改主意想要手动设置不一样的。
于是我加入了配置优先级，对他们进行排序，避免了用户设置冲突的问题。
现在这个版本我目前比较满意吧，如果后续使用过程中遇到新的问题或改进之处，会继续更新的。</p>]]></content:encoded>
            <category>project</category>
            <category>typescript</category>
        </item>
        <item>
            <title><![CDATA[写一个敲木鱼App]]></title>
            <link>https://EL233.github.io/blog/woodenfish-app</link>
            <guid>https://EL233.github.io/blog/woodenfish-app</guid>
            <pubDate>Mon, 09 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[一个敲木鱼App]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="一个敲木鱼app">一个敲木鱼App<a href="https://el233.github.io/blog/woodenfish-app#%E4%B8%80%E4%B8%AA%E6%95%B2%E6%9C%A8%E9%B1%BCapp" class="hash-link" aria-label="Direct link to 一个敲木鱼App" title="Direct link to 一个敲木鱼App">​</a></h3>
<ul>
<li>
<p>一个极简的敲木鱼App 功能非常纯粹</p>
</li>
<li>
<p>点击木鱼 功德计数器加1 聆听纯粹的木鱼敲击声</p>
</li>
<li>
<p>作为swift的入门练习</p>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="前期准备">前期准备<a href="https://el233.github.io/blog/woodenfish-app#%E5%89%8D%E6%9C%9F%E5%87%86%E5%A4%87" class="hash-link" aria-label="Direct link to 前期准备" title="Direct link to 前期准备">​</a></h3>
<ul>
<li>[IDE] <a href="https://developer.apple.com/xcode/" target="_blank" rel="noopener noreferrer">Xcode</a> (在App Store即可下载)</li>
<li>[硬件] 一台Mac 以及一台用于真机测试的iPhone (可选)</li>
<li>[技术] 对Swift和SwiftUI有最基础的了解</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="创建xcode项目">创建Xcode项目<a href="https://el233.github.io/blog/woodenfish-app#%E5%88%9B%E5%BB%BAxcode%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="Direct link to 创建Xcode项目" title="Direct link to 创建Xcode项目">​</a></h3>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="搭建ui界面">搭建UI界面<a href="https://el233.github.io/blog/woodenfish-app#%E6%90%AD%E5%BB%BAui%E7%95%8C%E9%9D%A2" class="hash-link" aria-label="Direct link to 搭建UI界面" title="Direct link to 搭建UI界面">​</a></h3>
<p>界面非常简单 只有木鱼图片和一个功德计数文本</p>
<p>在<code>ContentView.swift</code>文件中 我们可以用一个 <code>VStack</code> 来垂直布局这两个元素</p>
<p>加了<code>.resizable()</code>确保图片可以缩放</p>
<p>使用<code>scaleEffect(scale)</code>来控制点击时的缩放动画</p>
<div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">VStack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">spacing</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</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></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"功德：</span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">\(</span><span class="token string-literal interpolation">count</span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">)</span><span class="token string-literal string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">font</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">largeTitle</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">bold</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"woodfish"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">resizable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">width</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 punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">scaleEffect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scale</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">onTapGesture </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token function" style="color:#d73a49">withAnimation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">easeOut</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">duration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.1</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></span><span class="token-line" style="color:#393A34"><span class="token plain">                        scale </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.9</span><span class="token plain"></span><br></span><span 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></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token class-name">DispatchQueue</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">main</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">asyncAfter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">deadline</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 function" style="color:#d73a49">now</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"> </span><span class="token number" style="color:#36acaa">0.1</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></span><span class="token-line" style="color:#393A34"><span class="token plain">                        withAnimation </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            scale </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"></span><br></span><span 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></span><span class="token-line" style="color:#393A34"><span class="token plain">                        count </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><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token function" style="color:#d73a49">playSound</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span 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></span><span 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></span><span 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></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">padding</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="音效实现">音效实现<a href="https://el233.github.io/blog/woodenfish-app#%E9%9F%B3%E6%95%88%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="Direct link to 音效实现" title="Direct link to 音效实现">​</a></h3>
<p>我们可以直接用库乐队的木鱼音效作为此app的音效素材:</p>
<p><img decoding="async" loading="lazy" alt="图片" src="https://el233.github.io/assets/images/sound-da392d1abe255aa84a3a60df08b3a873.png" width="2776" height="1610" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="真机测试效果">真机测试效果<a href="https://el233.github.io/blog/woodenfish-app#%E7%9C%9F%E6%9C%BA%E6%B5%8B%E8%AF%95%E6%95%88%E6%9E%9C" class="hash-link" aria-label="Direct link to 真机测试效果" title="Direct link to 真机测试效果">​</a></h3>
<p><img decoding="async" loading="lazy" alt="图片1" src="https://el233.github.io/assets/images/IMG_1183-92709e202c3ae8830941ac42b8789dc4.PNG" width="1170" height="2532" class="img_ev3q"><br>
<img decoding="async" loading="lazy" alt="图片2" src="https://el233.github.io/assets/images/IMG_1184-f0d246bfce044ecc2cd57708b6dba129.PNG" width="1170" height="2532" class="img_ev3q"><br>
<img decoding="async" loading="lazy" alt="图片3" src="https://el233.github.io/assets/images/IMG_1186-9627ddb40d36b278bfdabc5633639ef9.PNG" width="1170" height="2532" class="img_ev3q"></p>]]></content:encoded>
            <category>project</category>
            <category>swift</category>
        </item>
        <item>
            <title><![CDATA[TD初尝试]]></title>
            <link>https://EL233.github.io/blog/flower-by-touchdesigner</link>
            <guid>https://EL233.github.io/blog/flower-by-touchdesigner</guid>
            <pubDate>Tue, 27 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[最近一直刷到大佬们做的 TD 作品，觉得特别好玩，便在红薯上找了个简单的教程跟着做了一遍。]]></description>
            <content:encoded><![CDATA[<p>最近一直刷到大佬们做的 TD 作品，觉得特别好玩，便在红薯上找了个简单的教程跟着做了一遍。<br>
<!-- -->以下是成果视频捏：</p>
<video width="640" height="360" controls=""><source src="/static/video/163229.MP4" type="video/mp4"><p>你的浏览器不支持播放视频哦。</p></video>
<p>附上<a href="https://www.xiaohongshu.com/user/profile/5f2a0969000000000101c83e?xsec_token=ABt1Un3At6PFffTDNQ9cfAVmcGHB0n-nUvI185xPqPZfY=&amp;xsec_source=pc_search" target="_blank" rel="noopener noreferrer">原博主</a>主页</p>]]></content:encoded>
            <category>TouchDesigner</category>
        </item>
        <item>
            <title><![CDATA[一个python小游戏]]></title>
            <link>https://EL233.github.io/blog/first-game-by-pygame</link>
            <guid>https://EL233.github.io/blog/first-game-by-pygame</guid>
            <pubDate>Tue, 01 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[✈️ 飞机大战]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="️-飞机大战">✈️ 飞机大战<a href="https://el233.github.io/blog/first-game-by-pygame#%EF%B8%8F-%E9%A3%9E%E6%9C%BA%E5%A4%A7%E6%88%98" class="hash-link" aria-label="Direct link to ✈️ 飞机大战" title="Direct link to ✈️ 飞机大战">​</a></h3>
<ul>
<li>做一个经典的小游戏</li>
<li>贴上完整版🔗<a href="https://github.com/EL233/PyGame-Airplane" target="_blank" rel="noopener noreferrer">链接</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="基本逻辑">基本逻辑<a href="https://el233.github.io/blog/first-game-by-pygame#%E5%9F%BA%E6%9C%AC%E9%80%BB%E8%BE%91" class="hash-link" aria-label="Direct link to 基本逻辑" title="Direct link to 基本逻辑">​</a></h3>
<p>构建飞机可以在画面最底下左右移动并且不会移动到界面以外（初始位置居中）：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Player</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pygame</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sprite</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Sprite</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">__init__</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token builtin">super</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">__init__</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">image </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pygame</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">transform</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">scale</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">player_img</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">38</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">image</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">set_colorkey</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">BLACK</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">image</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get_rect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">radius </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">centerx </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> WIDTH </span><span class="token operator" style="color:#393A34">//</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">bottom </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> HEIGHT </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>后续可修改飞机速度是否有加速度，或者匀速。</p>
<p>构建陨石从画面上方（界面以外）生成并且掉落：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Rock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pygame</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sprite</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Sprite</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">__init__</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token builtin">super</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">__init__</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">image_ori </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> random</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">choice</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rock_imgs</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">image_ori</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">set_colorkey</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">BLACK</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">image </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">image_ori</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">copy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">image</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get_rect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">radius </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">int</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">width </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.85</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">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">x </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> random</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">randrange</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 plain"> WIDTH </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">y </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> random</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">randrange</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">180</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 number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">speedy </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> random</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">randrange</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">speedx </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> random</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">randrange</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>后续可修改陨石的随机速度范围，旋转角度，大小等。</p>
<p>构建子弹从飞机上方向上发射：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Bullet</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pygame</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sprite</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Sprite</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">__init__</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token builtin">super</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">__init__</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">image </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> bullet_img</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">image</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">set_colorkey</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">BLACK</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">image</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get_rect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">centerx </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> x</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">bottom </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> y</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">speedy </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 number" style="color:#36acaa">10</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>后续可添加多枚子弹以及多枚子弹效果持续时间等。</p>
<p>添加碰撞事件：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span 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></span><span class="token-line" style="color:#393A34"><span class="token plain">    hits </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pygame</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sprite</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">groupcollide</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rocks</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">bullets</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 boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> hit </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> hits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        random</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">choice</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">expl_sounds</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">play</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        score </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> hit</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">radius</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        expl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Explosion</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hit</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">'lg'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        all_sprites</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">expl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> random</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">random</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 number" style="color:#36acaa">0.9</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token builtin">pow</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Power</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hit</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            all_sprites</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">pow</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            powers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">pow</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        new_rock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span 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></span><span class="token-line" style="color:#393A34"><span class="token plain">    hits </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pygame</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sprite</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">spritecollide</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">player</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">rocks</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 plain">pygame</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sprite</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">collide_circle</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> hit </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> hits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        new_rock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        player</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">health </span><span class="token operator" style="color:#393A34">-=</span><span class="token plain"> hit</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">radius</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        expl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Explosion</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hit</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">'sm'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        all_sprites</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">expl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> player</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">health </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><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            die </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Explosion</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">player</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">'player'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            all_sprites</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">die</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            die_sound</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">play</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            player</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">lives </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><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            player</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">health </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            player</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hide</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>python</category>
        </item>
        <item>
            <title><![CDATA[基于algolia实现站内搜索]]></title>
            <link>https://EL233.github.io/blog/search-by-algolia</link>
            <guid>https://EL233.github.io/blog/search-by-algolia</guid>
            <pubDate>Sat, 07 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[配置索引]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="配置索引">配置索引<a href="https://el233.github.io/blog/search-by-algolia#%E9%85%8D%E7%BD%AE%E7%B4%A2%E5%BC%95" class="hash-link" aria-label="Direct link to 配置索引" title="Direct link to 配置索引">​</a></h2>
<p>首先向<a href="https://docsearch.algolia.com/apply/" target="_blank" rel="noopener noreferrer">DocSearch</a>申请你的项目</p>
<p>成功后会给你发邮件确认✅</p>
<p>一定要先申请，我是直接去创建application导致一开始没有上传网站数据</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="注册algolia">注册algolia<a href="https://el233.github.io/blog/search-by-algolia#%E6%B3%A8%E5%86%8Calgolia" class="hash-link" aria-label="Direct link to 注册algolia" title="Direct link to 注册algolia">​</a></h2>
<p>如果你有收到邀请邮件，algolia会给你的项目创建好一个application<br>
<img decoding="async" loading="lazy" alt="图片" src="https://el233.github.io/assets/images/2024-09-1312.33.05-3620399a2d2a713c90228aeb46c167b2.png" width="2394" height="1252" class="img_ev3q"></p>
<p>在这里你可以获取Application ID、Search API Key 待会会用到</p>
<p>如果你跟我一样没有先申请：<br>
<!-- -->注册<a href="https://www.algolia.com/" target="_blank" rel="noopener noreferrer">algolia</a>，这时候应该会跳出get start画面，可以忽略。<br>
<img decoding="async" loading="lazy" alt="图片" src="https://el233.github.io/assets/images/2024-9-716.17-4133b2b8298daf9961ecbbe9b3823de5.jpg" width="2940" height="1655" class="img_ev3q"></p>
<p>回到主页面，点击左下角settings，点击applications，create application。<br>
<img decoding="async" loading="lazy" alt="图片" src="https://el233.github.io/assets/images/2024-9-717.07-255d3a4cffe64a510a86b3f8d44488fd.jpg" width="2937" height="1656" class="img_ev3q"></p>
<p>选择数据节点，这里我选择的是US West。<br>
<img decoding="async" loading="lazy" alt="图片" src="https://el233.github.io/assets/images/2024-9-716.14-ae6519bc8e0011b9628c87b963116a42.jpg" width="2940" height="1632" class="img_ev3q"></p>
<p>创建成功后我们可以获取API Keys。<br>
<img decoding="async" loading="lazy" alt="图片" src="https://el233.github.io/assets/images/2024-9-716.18-8867b58c5fc660d636fa20d0054d991f.jpg" width="2076" height="1659" class="img_ev3q"></p>
<p>点击左下角Data sources，Create Indices，设置一个indices name。<br>
<img decoding="async" loading="lazy" alt="图片" src="https://el233.github.io/assets/images/2024-9-716.37-6c765bf366af552ac526187df8e74c99.jpg" width="2940" height="1662" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="连接algolia">连接algolia<a href="https://el233.github.io/blog/search-by-algolia#%E8%BF%9E%E6%8E%A5algolia" class="hash-link" aria-label="Direct link to 连接algolia" title="Direct link to 连接algolia">​</a></h2>
<p>因为Docusaurus 的 @docusaurus/preset-classic 自带 Algolia DocSearch 集成。<br>
<!-- -->所以如果你用的是经典预设，就不需要额外安装任何东西。<br>
<!-- -->可以回到你的项目，在 docusaurus.config.js 中的 themeConfig 中添加一个 algolia 字段。</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">algolia: {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        // Algolia 提供的 application ID</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        appId: 'YOUR_APP_ID',</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        //  公开 API 密钥：提交它没有危险</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        apiKey: 'YOUR_SEARCH_API_KEY',</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        indexName: 'YOUR_INDEX_NAME',</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        // 可选：见下文</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        contextualSearch: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      },</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>如果你用的不是经典预设，首先安装软件包：<br>
<code>npm install --save @docusaurus/theme-search-algolia</code></p>
<p>然后在 docusaurus.config.js 中注册主题：</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">export default {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  // ...其他配置</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  themes: ['@docusaurus/theme-search-algolia'],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  themeConfig: {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">};</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>再按照上面的步骤添加一个 algolia 字段。</p>
<p>这样search功能就完成啦。<br>
<img decoding="async" loading="lazy" alt="图片" src="https://el233.github.io/assets/images/2024-9-716.45-a6ce8787d0eec2499266ed1acfe0eae7.jpg" width="2940" height="1666" class="img_ev3q"></p>
<ul>
<li>更多内容可参考<a href="https://docusaurus.io/zh-CN/docs/next/search" target="_blank" rel="noopener noreferrer">docusaurus</a>官网</li>
</ul>]]></content:encoded>
            <category>algolia</category>
            <category>Docusaurus</category>
        </item>
        <item>
            <title><![CDATA[通过Docusaurus搭建个人博客]]></title>
            <link>https://EL233.github.io/blog/first-blog-by-docusaurus</link>
            <guid>https://EL233.github.io/blog/first-blog-by-docusaurus</guid>
            <pubDate>Fri, 06 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[为什么选择通过Docusaurus搭建个人博客]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="为什么选择通过docusaurus搭建个人博客">为什么选择通过Docusaurus搭建个人博客<a href="https://el233.github.io/blog/first-blog-by-docusaurus#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9%E9%80%9A%E8%BF%87docusaurus%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2" class="hash-link" aria-label="Direct link to 为什么选择通过Docusaurus搭建个人博客" title="Direct link to 为什么选择通过Docusaurus搭建个人博客">​</a></h3>
<ul>
<li>Docusaurus是一个静态网站生成器</li>
<li>免费 快速 对小白友好</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="前期准备">前期准备<a href="https://el233.github.io/blog/first-blog-by-docusaurus#%E5%89%8D%E6%9C%9F%E5%87%86%E5%A4%87" class="hash-link" aria-label="Direct link to 前期准备" title="Direct link to 前期准备">​</a></h3>
<ul>
<li>IDE 这里我用的是<a href="https://code.visualstudio.com/Download" target="_blank" rel="noopener noreferrer">vs code</a></li>
<li><a href="https://nodejs.org/en/download/" target="_blank" rel="noopener noreferrer">Node.js</a></li>
<li>一个<a href="https://github.com/" target="_blank" rel="noopener noreferrer">GitHub</a>账号</li>
<li><a href="https://git-scm.com/downloads" target="_blank" rel="noopener noreferrer">git</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="安装docusaurus">安装Docusaurus<a href="https://el233.github.io/blog/first-blog-by-docusaurus#%E5%AE%89%E8%A3%85docusaurus" class="hash-link" aria-label="Direct link to 安装Docusaurus" title="Direct link to 安装Docusaurus">​</a></h3>
<p>打开终端 选择你要存放这个项目的位置<br>
<code>cd '这里写文件地址' </code></p>
<p>输入以下命令：<br>
<code>npx create-docusaurus@latest my-website classic</code></p>
<p><img decoding="async" loading="lazy" alt="图片" src="https://el233.github.io/assets/images/2024-9-423.46-bf3eb71c05bdf343bfadbb9761b1a676.jpg" width="1305" height="849" class="img_ev3q"></p>
<p>显示这些就代表安装成功啦</p>
<p><img decoding="async" loading="lazy" alt="图片" src="https://el233.github.io/assets/images/2024-9-423.51-76c31c523302660031c105deaa8126d3.jpg" width="1235" height="1223" class="img_ev3q"></p>
<p>在vs code中打开上面创建的项目<br>
<!-- -->新建终端 输入：
<code>npm run start</code></p>
<p>运行成功后会出现: <a href="http://localhost:3000/" target="_blank" rel="noopener noreferrer">http://localhost:3000</a> 地址</p>
<p>打开如下图所示 这样我们的网站就建立成功啦</p>
<p><img decoding="async" loading="lazy" alt="图片" src="https://el233.github.io/assets/images/2024-9-500.21-3c43b1ab5322ab0cb9512c3e59347784.jpg" width="2397" height="1331" class="img_ev3q"></p>]]></content:encoded>
            <category>project</category>
            <category>Docusaurus</category>
        </item>
        <item>
            <title><![CDATA[关于]]></title>
            <link>https://EL233.github.io/blog/about</link>
            <guid>https://EL233.github.io/blog/about</guid>
            <pubDate>Thu, 05 Sep 2024 18:05:51 GMT</pubDate>
            <description><![CDATA[- 一个在读大学生👩‍💻]]></description>
            <content:encoded><![CDATA[<ul>
<li>一个在读大学生👩‍💻</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="为什么要写博客">为什么要写博客<a href="https://el233.github.io/blog/about#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%86%99%E5%8D%9A%E5%AE%A2" class="hash-link" aria-label="Direct link to 为什么要写博客" title="Direct link to 为什么要写博客">​</a></h3>
<ul>
<li>觉得好玩 想写🤓</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="关于名字">关于名字<a href="https://el233.github.io/blog/about#%E5%85%B3%E4%BA%8E%E5%90%8D%E5%AD%97" class="hash-link" aria-label="Direct link to 关于名字" title="Direct link to 关于名字">​</a></h3>
<p>可以叫我十一，英文名是Aki。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="技术栈">技术栈<a href="https://el233.github.io/blog/about#%E6%8A%80%E6%9C%AF%E6%A0%88" class="hash-link" aria-label="Direct link to 技术栈" title="Direct link to 技术栈">​</a></h3>
<ul>
<li>
<p>💻 编程语言 JavaScript / TypeScript、Python</p>
</li>
<li>
<p>🗄️ 数据库：MySQL、MongoDB、Redis</p>
</li>
<li>
<p>🧩 框架 React、Vue</p>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="一些杂乱的">一些杂乱的<a href="https://el233.github.io/blog/about#%E4%B8%80%E4%BA%9B%E6%9D%82%E4%B9%B1%E7%9A%84" class="hash-link" aria-label="Direct link to 一些杂乱的" title="Direct link to 一些杂乱的">​</a></h3>
<p>本人热爱看live，有多次演出志愿者、工作人员经验。<br>
<!-- -->最爱的乐队是my little airport<br>
<!-- -->最近的兴趣是剑玉，自以为小有天赋，新手十招很快就过了，正在进一步的练习，希望有朝一日可以玩的特别厉害。<br>
<!-- -->日本語をゆっくり勉強しています！</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="关于博客首页">关于博客首页<a href="https://el233.github.io/blog/about#%E5%85%B3%E4%BA%8E%E5%8D%9A%E5%AE%A2%E9%A6%96%E9%A1%B5" class="hash-link" aria-label="Direct link to 关于博客首页" title="Direct link to 关于博客首页">​</a></h3>
<p>参考自<a href="https://github.com/kuizuo" target="_blank" rel="noopener noreferrer">愧怍</a><br>
<!-- -->我创建此博客的原因其中一部份也是刷到这位大佬的网站，觉得他魔改的特别好。</p>]]></content:encoded>
            <category>blog</category>
        </item>
    </channel>
</rss>