LLM Agent 常用范式详解

<p>本文整理了 LLM Agent 中常用的几种范式,从简单到复杂,详细介绍每种范式的概念、工作原理、特点、适用场景、流程示意以及优势与局限。</p> <h2 id="单步回答型-single-step-direct-response" tabindex="-1">单步回答型(Single-step / Direct Response) <a class="header-anchor" href="#单步回答型-single-step-direct-response" aria-label="Permalink to &quot;单步回答型(Single-step / Direct Response)&quot;">&ZeroWidthSpace;</a></h2> <p>单步回答型是最基础的 LLM Agent 范式,特点是收到问题或任务后<strong>直接生成答案</strong>,不保留历史状态,也不调用外部工具。<br> 简单理解:<strong>“你问我答,不做额外思考”</strong>。</p> <h3 id="工作原理" tabindex="-1">工作原理 <a class="header-anchor" href="#工作原理" aria-label="Permalink to &quot;工作原理&quot;">&ZeroWidthSpace;</a></h3> <ul> <li><strong>接收输入</strong>:用户发送问题或任务描述给模型。</li> <li><strong>生成输出</strong>:模型根据训练中学到的语言模式和知识生成答案。</li> <li><strong>返回结果</strong>:输出文本返回给用户。</li> </ul> <blockquote> <p>注意:整个过程没有循环、计划或外部验证,完全依赖模型自身知识。</p> </blockquote> <h3 id="特点" tabindex="-1">特点 <a class="header-anchor" href="#特点" aria-label="Permalink to &quot;特点&quot;">&ZeroWidthSpace;</a></h3> <ul> <li>快速:无需多轮推理或外部查询。</li> <li>实现简单:只需调用生成接口即可。</li> <li>依赖训练数据:输出结果依赖模型已有知识。</li> </ul> <h3 id="适用场景" tabindex="-1">适用场景 <a class="header-anchor" href="#适用场景" aria-label="Permalink to &quot;适用场景&quot;">&ZeroWidthSpace;</a></h3> <ul> <li>事实类问答:如“世界上最高的山是哪座?”</li> <li>知识查询:如“谁写了《哈利·波特》?”</li> <li>简单计算或翻译:如“把‘Hello’翻译成中文”。</li> </ul> <h3 id="流程示意" tabindex="-1">流程示意 <a class="header-anchor" href="#流程示意" aria-label="Permalink to &quot;流程示意&quot;">&ZeroWidthSpace;</a></h3> <p><img src="/images/posts/agent/single_step.png" alt="" data-tag="post-image" loading="lazy" onload="this.onload=null;this.style.opacity=1;"></p> <h3 id="优势与局限" tabindex="-1">优势与局限 <a class="header-anchor" href="#优势与局限" aria-label="Permalink to &quot;优势与局限&quot;">&ZeroWidthSpace;</a></h3> <ul> <li><strong>优势</strong>:快速、易实现,对简单任务足够使用。</li> <li><strong>局限</strong>:无法处理多步骤问题或实时信息,缺乏可解释性。</li> </ul> <h2 id="链式思维型-chain-of-thought-cot" tabindex="-1">链式思维型(Chain-of-Thought, CoT) <a class="header-anchor" href="#链式思维型-chain-of-thought-cot" aria-label="Permalink to &quot;链式思维型(Chain-of-Thought, CoT)&quot;">&ZeroWidthSpace;</a></h2> <p>链式思维型让 LLM <strong>在生成答案之前先写出思考步骤</strong>,增加可解释性。<br> 简单理解:<strong>“先写下我的思路,再给你答案”</strong>。</p> <h3 id="工作原理-1" tabindex="-1">工作原理 <a class="header-anchor" href="#工作原理-1" aria-label="Permalink to &quot;工作原理&quot;">&ZeroWidthSpace;</a></h3> <ol> <li><strong>接收输入</strong>:用户提供问题或任务。</li> <li><strong>生成思考步骤</strong>:模型拆解问题、分析子问题或列出公式。</li> <li><strong>生成答案</strong>:结合思考步骤输出最终结果。</li> <li><strong>返回结果</strong>:输出既包含思考步骤,也包含答案。</li> </ol> <blockquote> <p>注意:链式思维型通常一次生成,不会根据结果再循环修正,除非与 ReAct 或反思型结合。</p> </blockquote> <h3 id="特点-1" tabindex="-1">特点 <a class="header-anchor" href="#特点-1" aria-label="Permalink to &quot;特点&quot;">&ZeroWidthSpace;</a></h3> <ul> <li>显式推理,增强可解释性。</li> <li>支持多步骤问题处理。</li> <li>依赖模型内部知识,无外部工具调用能力。</li> </ul> <h3 id="适用场景-1" tabindex="-1">适用场景 <a class="header-anchor" href="#适用场景-1" aria-label="Permalink to &quot;适用场景&quot;">&ZeroWidthSpace;</a></h3> <ul> <li>数学题、逻辑题</li> <li>多步骤推理问题</li> <li>需要分析过程的问答</li> </ul> <h3 id="流程示意-1" tabindex="-1">流程示意 <a class="header-anchor" href="#流程示意-1" aria-label="Permalink to &quot;流程示意&quot;">&ZeroWidthSpace;</a></h3> <p><img src="/images/posts/agent/cot.png" alt="" data-tag="post-image" loading="lazy" onload="this.onload=null;this.style.opacity=1;"></p> <h3 id="优势与局限-1" tabindex="-1">优势与局限 <a class="header-anchor" href="#优势与局限-1" aria-label="Permalink to &quot;优势与局限&quot;">&ZeroWidthSpace;</a></h3> <ul> <li><strong>优势</strong>:提高复杂问题正确率,增强信任度。</li> <li><strong>局限</strong>:无法调用外部数据,输出长度较长,处理速度略慢。</li> </ul> <h2 id="react-reasoning-acting" tabindex="-1">ReAct(Reasoning + Acting) <a class="header-anchor" href="#react-reasoning-acting" aria-label="Permalink to &quot;ReAct(Reasoning + Acting)&quot;">&ZeroWidthSpace;</a></h2> <p>ReAct 结合 <strong>推理和行动</strong>,让模型在思考的同时可以执行操作,并根据结果不断调整策略。<br> 简单理解:<strong>“先想,再做,边做边想”</strong>。</p> <h3 id="工作原理-2" tabindex="-1">工作原理 <a class="header-anchor" href="#工作原理-2" aria-label="Permalink to &quot;工作原理&quot;">&ZeroWidthSpace;</a></h3> <ol> <li><strong>接收输入</strong>:用户提供任务。</li> <li><strong>推理(Reasoning)</strong>:分析问题,生成解决思路。</li> <li><strong>行动(Acting)</strong>:执行操作,如调用工具、查询数据、计算等。</li> <li><strong>反馈</strong>:行动结果返回模型,供下一轮推理。</li> <li><strong>循环迭代</strong>:模型根据反馈不断调整,直到完成任务。</li> <li><strong>输出答案</strong>:最终返回结果。</li> </ol> <h3 id="特点-2" tabindex="-1">特点 <a class="header-anchor" href="#特点-2" aria-label="Permalink to &quot;特点&quot;">&ZeroWidthSpace;</a></h3> <ul> <li>动态交互,可根据环境或工具结果调整策略。</li> <li>支持多步骤任务处理。</li> <li>可以调用外部工具或 API。</li> <li>推理链条透明,便于理解。</li> </ul> <h3 id="适用场景-2" tabindex="-1">适用场景 <a class="header-anchor" href="#适用场景-2" aria-label="Permalink to &quot;适用场景&quot;">&ZeroWidthSpace;</a></h3> <ul> <li>查询实时数据(天气、股市、新闻)</li> <li>多步骤问答或推理任务</li> <li>自动化办公任务(数据处理、报告生成)</li> </ul> <h3 id="流程示意-2" tabindex="-1">流程示意 <a class="header-anchor" href="#流程示意-2" aria-label="Permalink to &quot;流程示意&quot;">&ZeroWidthSpace;</a></h3> <p><img src="/images/posts/agent/re_act.png" alt="" data-tag="post-image" loading="lazy" onload="this.onload=null;this.style.opacity=1;"></p> <h3 id="优势与局限-2" tabindex="-1">优势与局限 <a class="header-anchor" href="#优势与局限-2" aria-label="Permalink to &quot;优势与局限&quot;">&ZeroWidthSpace;</a></h3> <ul> <li><strong>优势</strong>:适合复杂任务,支持工具调用,循环迭代可提高准确性。</li> <li><strong>局限</strong>:实现复杂,循环可能增加响应时间。</li> </ul> <h2 id="反思型-reflexive-agent" tabindex="-1">反思型(Reflexive Agent) <a class="header-anchor" href="#反思型-reflexive-agent" aria-label="Permalink to &quot;反思型(Reflexive Agent)&quot;">&ZeroWidthSpace;</a></h2> <p>反思型让 LLM <strong>在输出前自我检查和修正</strong>,类似人类写完作业后回头自查。<br> 简单理解:<strong>“先写,再检查,再修正”</strong>。</p> <h3 id="工作原理-3" tabindex="-1">工作原理 <a class="header-anchor" href="#工作原理-3" aria-label="Permalink to &quot;工作原理&quot;">&ZeroWidthSpace;</a></h3> <ol> <li><strong>接收输入</strong></li> <li><strong>初步生成答案</strong></li> <li><strong>自我反思</strong>:检查语法、逻辑或数据合理性</li> <li><strong>修正输出</strong></li> <li><strong>最终输出</strong></li> </ol> <h3 id="特点-3" tabindex="-1">特点 <a class="header-anchor" href="#特点-3" aria-label="Permalink to &quot;特点&quot;">&ZeroWidthSpace;</a></h3> <ul> <li>内部自查循环,提升输出质量。</li> <li>无需外部工具。</li> <li>适合长文本或多轮任务。</li> </ul> <h3 id="适用场景-3" tabindex="-1">适用场景 <a class="header-anchor" href="#适用场景-3" aria-label="Permalink to &quot;适用场景&quot;">&ZeroWidthSpace;</a></h3> <ul> <li>自动写作(文章、报告、邮件)</li> <li>长对话系统保持逻辑一致</li> <li>编程辅助:生成代码并检查逻辑/语法</li> </ul> <h3 id="流程示意-3" tabindex="-1">流程示意 <a class="header-anchor" href="#流程示意-3" aria-label="Permalink to &quot;流程示意&quot;">&ZeroWidthSpace;</a></h3> <p><img src="/images/posts/agent/reflexive.png" alt="" data-tag="post-image" loading="lazy" onload="this.onload=null;this.style.opacity=1;"></p> <h2 id="任务规划型-planner-executor" tabindex="-1">任务规划型(Planner + Executor) <a class="header-anchor" href="#任务规划型-planner-executor" aria-label="Permalink to &quot;任务规划型(Planner + Executor)&quot;">&ZeroWidthSpace;</a></h2> <p>任务规划型将复杂任务<strong>拆分为子任务并逐步执行</strong>,核心是“规划 + 执行”。<br> 简单理解:<strong>“先规划,再执行,每步有条理”</strong>。</p> <h3 id="工作原理-4" tabindex="-1">工作原理 <a class="header-anchor" href="#工作原理-4" aria-label="Permalink to &quot;工作原理&quot;">&ZeroWidthSpace;</a></h3> <ol> <li><strong>接收输入</strong></li> <li><strong>规划阶段</strong>:拆解任务、排列子任务顺序</li> <li><strong>执行阶段</strong>:逐步完成子任务,可调用工具</li> <li><strong>整合结果</strong>:汇总各子任务输出</li> <li><strong>最终输出</strong></li> </ol> <h3 id="特点-4" tabindex="-1">特点 <a class="header-anchor" href="#特点-4" aria-label="Permalink to &quot;特点&quot;">&ZeroWidthSpace;</a></h3> <ul> <li>适合多步骤任务</li> <li>结构清晰</li> <li>可结合工具</li> <li>支持长任务处理</li> </ul> <h3 id="流程示意-4" tabindex="-1">流程示意 <a class="header-anchor" href="#流程示意-4" aria-label="Permalink to &quot;流程示意&quot;">&ZeroWidthSpace;</a></h3> <p><img src="/images/posts/agent/plan.png" alt="" data-tag="post-image" loading="lazy" onload="this.onload=null;this.style.opacity=1;"></p> <h2 id="记忆增强型-memory-augmented-agent" tabindex="-1">记忆增强型(Memory-Augmented Agent) <a class="header-anchor" href="#记忆增强型-memory-augmented-agent" aria-label="Permalink to &quot;记忆增强型(Memory-Augmented Agent)&quot;">&ZeroWidthSpace;</a></h2> <p>记忆增强型具有<strong>长期记忆能力</strong>,在多轮对话或长期任务中持续利用历史信息。<br> 简单理解:<strong>“记住过去,做出更智能的决策”</strong>。</p> <h3 id="工作原理-5" tabindex="-1">工作原理 <a class="header-anchor" href="#工作原理-5" aria-label="Permalink to &quot;工作原理&quot;">&ZeroWidthSpace;</a></h3> <ol> <li><strong>接收输入</strong></li> <li><strong>访问记忆</strong>:检索历史信息或上下文</li> <li><strong>生成答案</strong>:结合当前输入和记忆</li> <li><strong>更新记忆</strong>:保存新信息</li> <li><strong>返回输出</strong></li> </ol> <h3 id="特点-5" tabindex="-1">特点 <a class="header-anchor" href="#特点-5" aria-label="Permalink to &quot;特点&quot;">&ZeroWidthSpace;</a></h3> <ul> <li>长期记忆与个性化</li> <li>上下文连续,多轮任务一致性</li> <li>可动态更新</li> </ul> <h3 id="流程示意-5" tabindex="-1">流程示意 <a class="header-anchor" href="#流程示意-5" aria-label="Permalink to &quot;流程示意&quot;">&ZeroWidthSpace;</a></h3> <p><img src="/images/posts/agent/memory.png" alt="" data-tag="post-image" loading="lazy" onload="this.onload=null;this.style.opacity=1;"></p> <h2 id="多-agent-协作型-multi-agent-team-agents" tabindex="-1">多 Agent 协作型(Multi-Agent / Team Agents) <a class="header-anchor" href="#多-agent-协作型-multi-agent-team-agents" aria-label="Permalink to &quot;多 Agent 协作型(Multi-Agent / Team Agents)&quot;">&ZeroWidthSpace;</a></h2> <p>多 Agent 协作型由多个 Agent <strong>分工协作完成任务</strong>。<br> 简单理解:<strong>“分工合作,每个成员做擅长的事”</strong>。</p> <h3 id="工作原理-6" tabindex="-1">工作原理 <a class="header-anchor" href="#工作原理-6" aria-label="Permalink to &quot;工作原理&quot;">&ZeroWidthSpace;</a></h3> <ol> <li><strong>接收输入</strong></li> <li><strong>任务拆分与分配</strong>:将任务分配给不同 Agent</li> <li><strong>各 Agent 执行任务</strong></li> <li><strong>信息汇总</strong>:整合输出</li> <li><strong>最终输出</strong></li> </ol> <h3 id="特点-6" tabindex="-1">特点 <a class="header-anchor" href="#特点-6" aria-label="Permalink to &quot;特点&quot;">&ZeroWidthSpace;</a></h3> <ul> <li>分工明确</li> <li>可扩展性强</li> <li>协作与信息整合</li> <li>每个 Agent 可调用工具</li> </ul> <h3 id="流程示意-6" tabindex="-1">流程示意 <a class="header-anchor" href="#流程示意-6" aria-label="Permalink to &quot;流程示意&quot;">&ZeroWidthSpace;</a></h3> <p><img src="/images/posts/agent/multi_agent.png" alt="" data-tag="post-image" loading="lazy" onload="this.onload=null;this.style.opacity=1;"></p> <h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;">&ZeroWidthSpace;</a></h2> <p>从简单到复杂的 LLM Agent 范式:</p> <p><strong>单步回答 → 链式思维 → ReAct → 反思型 → 任务规划 → 记忆增强 → 多 Agent 协作</strong></p> <ul> <li>越往右,模型能力越强,处理复杂任务能力越高。</li> <li>越往右,实现成本越高,但灵活性和适用性也越强。</li> <li>在实际应用中,常会<strong>混合使用多种范式</strong>,发挥各自优势,提升准确性和任务处理能力。</li> </ul>

2026/3/17
阅读更多

利用 AI 编程提效体验

<p>从今年开始,公司开始全员推广AI编程,并提供Cursor账号给大家使用。经过三个多月的深度使用,在此分享我的一些真实体验与感受。</p>

2025/3/25
阅读更多

项目验收需要做哪些东西?

<p>最近需要做一些项目验收相关的事,结合网上的别人的经验和自己实操,整理一些需要清单和要做的事情。</p>

2024/10/10
阅读更多

vitepress 自定义主题教程

<p>这篇文章是什么呢? 就是如题所述告诉你如何自定义极简的博客主题。</p>

2024/9/23
阅读更多

从 hexo 迁移到 Vitepress

<p>最近抽空把博客从 hexo 转移到 vitepress 了,也对 vitepress-theme-async 进行了一波爆更,整体迁移还算比较顺利。大部分的功能都已经处理完了,<s>部分原来需要三方插件支持功能还没支持。</s></p> <p>有需要从 hexo-theme-async 迁移到 vitepress-theme-async 的可以 <a href="https://vitepress-theme-async.imalun.com/guide/faq#hexo-theme-async-%E5%A6%82%E4%BD%95%E8%BF%81%E7%A7%BB" target="_blank" rel="noreferrer">参考文档这里</a></p>

2024/8/24
阅读更多

vitepress-theme-async 主题发布

<p>之前文档一直使用的是 vitepress 搭建的,体验感觉也挺好的,所以萌生了想移植到 vitepress 上去。为什么不是选择 vuepress,是因为 vitepress 更加轻量更快。</p>

2024/4/16
阅读更多

自建免费 Moe-Counter 计数器

手把手教你自建免费 Moe-Counter 计数器

2024/3/7
阅读更多

Hexo 主题开发之自定义模板

<p>关于 Hexo 如何开发主题包的教程已经是大把的存在了,这里就不再赘述了。这篇文章主要讲的是作为一个主题的开发者,如何让你的主题具有更好的扩展性,在用户自定义修改主题后,能够更加平易升级主题。</p>

2023/12/13
阅读更多

手撸 Grid 拖拽布局

<p>最近有个需求需要实现自定义首页布局,需要将屏幕按照 6 列 4 行进行等分成多个格子,然后将组件拖拽对应格子进行渲染展示。</p> <p><img src="/images/posts/grid_layout/demo.png" alt="" data-tag="post-image" loading="lazy" onload="this.onload=null;this.style.opacity=1;"><em>示例</em></p>

2023/11/30
阅读更多

前端基建之工具篇

<p>随着前端发展的越来越工程化,越来越繁琐复杂,前端能做的事情越来越多,最近几年 <strong>前端基建</strong> 也是越来越火热。但是实际上很多公司并不注重前端,更别谈能会有人来做基建。对于没有基建的前端,我们能做些什么呢?</p> <p>我个人推荐可以从工具、CLI 入手,因为这些往往是独立,不会像推规范、搞数据埋点、日志上报、整 BFF 那样对团队或者现有代码有入侵性。即便在自己空闲时间也能弄一弄,弄得好可以在团队推广使用,弄得不好也无所谓,可以当作练手提升自己能力。</p>

2023/9/19
阅读更多

uni-app 使用体验

<p>一句话总结就是,坑是真的多,填完一个坑等着你的就是下个坑。</p>

2023/7/21
阅读更多

hexo 在线编辑器

<p>开源了一款 Hexo 在线编辑器,提供在线编写 Hexo 方式。目前已实现对本地 Hexo 编辑维护</p> <p><img src="/images/posts/web_hexo_editor/hexo_editor_demo.png" alt="Img" data-tag="post-image" loading="lazy" onload="this.onload=null;this.style.opacity=1;"> <em>示例</em></p>

2023/4/6
阅读更多

2023年,还在手动发布 npm 包?

<p>还在手动 <strong>npm publish</strong> 发布 <strong>npm</strong> ? 还在手动更新版本创建发布 <strong>Github Release</strong> ?还在手动添加 <strong>Changelog</strong>?是时候利用 <strong>CI/CD</strong> 解放双手啦。常见的 <strong>CI/CD</strong> 有很多,比如 Jenkins、GitLab CI、CircleCI 、Github Actions 等。本文主要是通过 <strong>Github Actions</strong> 来自动化处理 <strong>npm</strong> 包管理。</p> <h2 id="github-actions" tabindex="-1">Github Actions <a class="header-anchor" href="#github-actions" aria-label="Permalink to &quot;Github Actions&quot;">&ZeroWidthSpace;</a></h2> <p><strong>GitHub Actions</strong> 距离推出已经好几年了,相信小伙伴们没用过,也听说过。<strong>GitHub Actions</strong> 不仅仅是能自动执行生成、测试和部署操作,还允许您在存储库中发生其他事件时运行工作流程。 例如,您可以运行工作流程,以便在有人在您的存储库中创建新问题时自动添加相应的标签。而且 GitHub 提供 Linux、Windows 和 macOS 多种虚拟机来运行工作流程,可以更具项目选择合适的虚拟机环境。</p> <p><strong>GitHub Actions</strong> 其实主要步骤只有两个,<strong>event</strong> (事件触发时机)、<strong>jobs</strong>(工作流程)。如果还不熟悉 <strong>GitHub Actions</strong>,可以<a href="https://docs.github.com/zh/actions" target="_blank" rel="noreferrer">参考文档</a>对其大致使用有个了解。</p> <h2 id="发布-npm" tabindex="-1">发布 Npm <a class="header-anchor" href="#发布-npm" aria-label="Permalink to &quot;发布 Npm&quot;">&ZeroWidthSpace;</a></h2> <p>在本地发布 npm 包都是本地打包成组件后,登录 npm 账号运行 npm publish 发布。使用 <strong>GitHub Actions</strong> 来发布 <strong>npm</strong> 可以使用 <strong>Npm Access Tokens</strong>,可以更据需要分配 <strong>Tokens</strong> 权限,不需要使用账号密码登录。</p> <h3 id="github-actions-发布-npm" tabindex="-1">Github Actions 发布 Npm <a class="header-anchor" href="#github-actions-发布-npm" aria-label="Permalink to &quot;Github Actions 发布 Npm&quot;">&ZeroWidthSpace;</a></h3> <p>首先需要确定你工作流触发时机,这个需要根据你个人习惯决定。</p> <p>举例:</p> <div class="vp-code-group vp-adaptive-theme"><div class="tabs"><input type="radio" name="group-ivw5E" id="tab-BJNavH3" checked><label data-title="推送 Tag 时触发" for="tab-BJNavH3">推送 Tag 时触发</label><input type="radio" name="group-ivw5E" id="tab-VPHgzWf" ><label data-title="仅在 master 推送时触发" for="tab-VPHgzWf">仅在 master 推送时触发</label><input type="radio" name="group-ivw5E" id="tab-catdgmm" ><label data-title="限定修改文件" for="tab-catdgmm">限定修改文件</label></div><div class="blocks"> <div class="language-yaml vp-adaptive-theme active"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> push</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> tags</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"v*"</span></span></code></pre> </div><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> push</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> branches</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">master</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">]</span></span></code></pre> </div><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 仅在 master 推送时,且 docs 下文件修改时触发,更多可以[参考文档](https://docs.github.com/zh/actions/using-workflows/events-that-trigger-workflows)</span></span> <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> push</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> branches</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">master</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">]</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> paths</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'docs/**'</span></span></code></pre> </div></div></div> <p>本文就以为推送 Tag 触发为例:</p> <p>在你项目下添加 <strong>.github\workflows\publish.yml</strong> 文件,内容如下</p> <div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">NPM Publish</span></span> <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> push</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> tags</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"v*"</span></span></code></pre> </div><h4 id="代码拉取和node配置" tabindex="-1">代码拉取和Node配置 <a class="header-anchor" href="#代码拉取和node配置" aria-label="Permalink to &quot;代码拉取和Node配置&quot;">&ZeroWidthSpace;</a></h4> <p>在 <strong>jobs</strong> 添加一个名为 <strong>build</strong> 的 job,配置 <strong>build</strong> 的环境和拉取代码。<strong>runs-on: ubuntu-latest</strong> 配置虚拟机为 <strong>ubuntu</strong>,使用官方提取代码拉取和 配置 Node 的 Actions,更多 <a href="https://github.com/actions" target="_blank" rel="noreferrer">官方提供 Actions</a></p> <div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">jobs</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> build</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> runs-on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ubuntu-latest</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> steps</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">uses</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">actions/checkout@v2</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 拉取代码</span></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">uses</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">actions/setup-node@v3</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 设置 Node 版本</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> with</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> node-version</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">16</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> registry-url</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'https://registry.npmjs.org'</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> cache</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">yarn</span></span></code></pre> </div><h4 id="配置环境密钥" tabindex="-1">配置环境密钥 <a class="header-anchor" href="#配置环境密钥" aria-label="Permalink to &quot;配置环境密钥&quot;">&ZeroWidthSpace;</a></h4> <p>添加环境变量,在你项目 =&gt; Settings =&gt; Secrets and variables =&gt; Actions 中 添加你的密钥,名称随意取,密钥值为你上面生成的 <strong>Npm Access Tokens</strong>。</p> <p>例如: Name =&gt; NPM_TOKEN Secret =&gt; 你的 <strong>Npm Access Tokens</strong></p> <h4 id="发布-npm-1" tabindex="-1">发布 Npm <a class="header-anchor" href="#发布-npm-1" aria-label="Permalink to &quot;发布 Npm&quot;">&ZeroWidthSpace;</a></h4> <p><strong>build</strong> 的 job 中,添加发布 Npm 操作,利用 NPM_TOKEN 发布 npm 包</p> <div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> steps</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">Npm Publish</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> run</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">npm publish</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> env</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> NODE_AUTH_TOKEN</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">${{ secrets.NPM_TOKEN }}</span></span></code></pre> </div><p>到此时,当你推送一个以 v开头 tag 到仓库时,就会执行这个 publish.yml,这个 Action 会将当前仓库发布到 Npm 了。</p> <p>当然你的包可能还需要执行一些构建操作等等,你可以在 <strong>run</strong> 里执行多条命令</p> <div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">run</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">|</span></span> <span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> npm run build</span></span> <span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> #...更多操作</span></span> <span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> npm publish</span></span></code></pre> </div><h3 id="区分-beta-和-latest" tabindex="-1">区分 Beta 和 latest <a class="header-anchor" href="#区分-beta-和-latest" aria-label="Permalink to &quot;区分 Beta 和 latest&quot;">&ZeroWidthSpace;</a></h3> <p>默认情况下 <strong>npm publish</strong> 发布时正式包,如果需要测试包需要执行 <strong>npm publish --tag beta</strong>。利用 git tag 我们可以将 v1.0.2 格式发为正式包,将 v1.0.2-beta.1 格式发布测试包。</p> <p>修改 publish 流程,<strong>Github Action</strong> 支持 <strong>if</strong> 操作,并不支持 <strong>else</strong>,只能通过如下模拟 <strong>if else</strong> 操作。</p> <div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> steps</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">Beta Publish</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">${{ contains(github.ref,'beta') }}</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> run</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">npm publish --tag beta</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> env</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> NODE_AUTH_TOKEN</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">${{ secrets.NPM_TOKEN }}</span></span> <span class="line"></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">Publish</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">${{ !contains(github.ref,'beta') }}</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> run</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">npm publish</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> env</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> NODE_AUTH_TOKEN</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">${{ secrets.NPM_TOKEN }}</span></span></code></pre> </div><h3 id="根据-tag-更新版本号" tabindex="-1">根据 Tag 更新版本号 <a class="header-anchor" href="#根据-tag-更新版本号" aria-label="Permalink to &quot;根据 Tag 更新版本号&quot;">&ZeroWidthSpace;</a></h3> <p>为例避免每次修改 package.json 中版本,我们可以根据 tag 来修改 package.json 中版本,因为上面配置 node 环境,可以直接执行 node 代码,我们直接添加一个 publish.js 文件,去修改 package.json 中 version 。</p> <div class="language-js vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> fs</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'fs'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span></span> <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> path</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'path'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span></span> <span class="line"></span> <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">process</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">env</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#E06C75">RELEASE_VERSION</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) {</span></span> <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> version</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> process</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">env</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">RELEASE_VERSION</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">split</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'/'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">reverse</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()[</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">]</span></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> console</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">log</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'当前版本:'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span> <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> pkg</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'./package.json'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> pkg</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> version</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'v'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">''</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> fs</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">writeFileSync</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">path</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">__dirname</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'./package.json'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">), </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">JSON</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">stringify</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">pkg</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">null</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">), </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'utf-8'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre> </div><p>修改 publish 流程,在发布前修改版本,并将 github.ref 添加环境变量 RELEASE_VERSION</p> <div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> steps</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">Build</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> run</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">node ./publish</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> env</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> RELEASE_VERSION</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">${{ github.ref }}</span></span></code></pre> </div><h3 id="创建发布-github-release" tabindex="-1">创建发布 Github Release <a class="header-anchor" href="#创建发布-github-release" aria-label="Permalink to &quot;创建发布 Github Release&quot;">&ZeroWidthSpace;</a></h3> <p>官方 <strong>actions/create-release</strong> 不在维护,推荐如下 Actions,可以结合需要选择,你也可以去前往 <a href="https://github.com/marketplace" target="_blank" rel="noreferrer">marketplace</a> 选择更多 Actions。</p> <ul> <li><a href="https://github.com/elgohr/Github-Release-Action" target="_blank" rel="noreferrer">elgohr/Github-Release-Action</a></li> <li><a href="https://github.com/marvinpinto/action-automatic-releases" target="_blank" rel="noreferrer">marvinpinto/action-automatic-releases</a></li> <li><a href="https://github.com/softprops/action-gh-release" target="_blank" rel="noreferrer">softprops/action-gh-release</a></li> <li><a href="https://github.com/ncipollo/release-action" target="_blank" rel="noreferrer">ncipollo/release-action</a></li> </ul> <p>很多创建 <strong>Release</strong> 的 <strong>Actions</strong>,并不会将你的提交自动生成发版说明,所以我编写了一个发布 <strong>Release</strong> 的 <strong>Actions</strong>,具体实现参考 <a href="https://github.com/MaLuns/add-release" target="_blank" rel="noreferrer">MaLuns/add-release</a> 以满足我的需求。Github 为我们提供 <a href="https://github.com/actions/toolkit" target="_blank" rel="noreferrer"><strong>actions/toolkit</strong></a> 帮助我们简化了很多操作。</p> <p>简单描述如何实现:</p> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 730.4648101751317 852.9999999999993" filter="invert(93%) hue-rotate(180deg)"> <g stroke-linecap="round" transform="translate(10 10) rotate(0 139.5 27.5)"><path d="M13.75 0 M13.75 0 C109.38 -2.41, 205.68 1.99, 265.25 0 M13.75 0 C70.18 2.36, 124.81 0.97, 265.25 0 M265.25 0 C273.89 1.09, 281.74 7.28, 279 13.75 M265.25 0 C277.97 4.59, 274.44 8.78, 279 13.75 M279 13.75 C276.09 18.18, 279.75 24.18, 279 41.25 M279 13.75 C277.83 23.76, 280.05 32.76, 279 41.25 M279 41.25 C280.53 49.75, 271.57 52.1, 265.25 55 M279 41.25 C276.2 54.43, 269.9 58.1, 265.25 55 M265.25 55 C209.34 55.8, 147.98 55.99, 13.75 55 M265.25 55 C169.39 56.68, 70.38 55.24, 13.75 55 M13.75 55 C8.57 51.9, -0.4 48.89, 0 41.25 M13.75 55 C7.04 56.87, -3.65 50.34, 0 41.25 M0 41.25 C0.8 31.53, 3.38 23.71, 0 13.75 M0 41.25 C-1.05 30.71, 0.18 22.03, 0 13.75 M0 13.75 C-0.72 6.24, 2.74 3.88, 13.75 0 M0 13.75 C4.5 8.33, 4.37 -1.58, 13.75 0" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(28.5 27.5) rotate(0 121 10)"><text x="121" y="14" font-family="Virgil, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">从当前位置开始分页获取提交记录</text></g><g stroke-linecap="round" transform="translate(70.88888888888926 119.11111111111086) rotate(0 87 27.5)"><path d="M13.75 0 M13.75 0 C70.27 -1.27, 132.16 -5.78, 160.25 0 M13.75 0 C49.11 3.38, 82.62 0.94, 160.25 0 M160.25 0 C172.31 1.56, 177.77 6.12, 174 13.75 M160.25 0 C168.65 -3.27, 170.67 1.79, 174 13.75 M174 13.75 C170.69 27.99, 173.48 37.63, 174 41.25 M174 13.75 C175.49 23.48, 174.56 32.65, 174 41.25 M174 41.25 C174.25 47.02, 166.12 58.98, 160.25 55 M174 41.25 C170.43 49.95, 167.66 57.46, 160.25 55 M160.25 55 C108.89 54.23, 59.37 55.65, 13.75 55 M160.25 55 C126.86 53.71, 92.28 51.97, 13.75 55 M13.75 55 C4.11 55.89, 2.76 49.69, 0 41.25 M13.75 55 C6.49 52.89, 4.47 54.92, 0 41.25 M0 41.25 C-2.82 31.53, 2.41 23.49, 0 13.75 M0 41.25 C-0.4 35.03, -0.56 28.24, 0 13.75 M0 13.75 C-2.36 7.79, 4.22 1.59, 13.75 0 M0 13.75 C3.15 8.94, 5.15 2.29, 13.75 0" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(101.38888888888926 137.11111111111086) rotate(0 56.5 9.5)"><text x="56.5" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">获取所有 tags</text></g><g stroke-linecap="round"><g transform="translate(150.88997153960383 67.18500722316435) rotate(0 -2.375925603429664 26.98165787361677)"><path d="M-1.36 1.74 C-3.05 10.23, -6.88 42.36, -7.85 50.27 M3.1 0.21 C2.04 9.22, -2.05 45.19, -2.81 53.75" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(150.88997153960383 67.18500722316435) rotate(0 -2.375925603429664 26.98165787361677)"><path d="M-6.52 25.54 C-7.15 35.91, -6.31 49.69, -6.21 57.11 M-9.03 28.39 C-6.66 37.72, -6.6 43.18, -3.49 52.44" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(150.88997153960383 67.18500722316435) rotate(0 -2.375925603429664 26.98165787361677)"><path d="M10.78 27.32 C3.54 36.85, -2.23 49.95, -6.21 57.11 M8.26 30.18 C5.44 38.84, 0.29 43.76, -3.49 52.44" stroke="#c92a2a" stroke-width="1" fill="none"/></g></g><mask/><g stroke-linecap="round" transform="translate(76.88888888888852 359.55555555555543) rotate(0 81.00000000000003 26)"><path d="M13 0 M13 0 C48.15 0.59, 83.48 -1.4, 149 0 M13 0 C65.81 -1.5, 120.05 -1.13, 149 0 M149 0 C156.96 3.43, 160.63 2.94, 162 13 M149 0 C155.72 3.81, 163.79 6.52, 162 13 M162 13 C164.97 21.93, 165.32 33.71, 162 39 M162 13 C164.16 18.66, 162.04 22.96, 162 39 M162 39 C165.01 45.04, 159.76 50.22, 149 52 M162 39 C158.91 43.92, 155.83 52.56, 149 52 M149 52 C114.38 51.99, 76.13 50.26, 13 52 M149 52 C111.19 51.86, 73.18 49.38, 13 52 M13 52 C7.36 54.09, 3.81 48.54, 0 39 M13 52 C8.37 50.93, 2.61 49.39, 0 39 M0 39 C-1.37 29.54, -3.76 16.5, 0 13 M0 39 C-1.16 33.31, -0.27 25.99, 0 13 M0 13 C1.34 5.4, 4.26 0.12, 13 0 M0 13 C2.13 1.13, 6.08 -3.88, 13 0" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(108.88888888888857 376.05555555555543) rotate(0 49 9.5)"><text x="49" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">循环读取记录</text></g><g stroke-linecap="round"><g transform="translate(153.3959809829115 291.96031746031736) rotate(0 -0.3315164564070301 34.81390687762939)"><path d="M-1.1 1.87 C-1.35 13.84, -1.54 58.15, -1.67 69.21 M3.5 0.42 C2.86 11.92, -2.91 55.14, -4.16 65.69" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(153.3959809829115 291.96031746031736) rotate(0 -0.3315164564070301 34.81390687762939)"><path d="M-8.15 35.78 C-5.5 44.13, -4.91 50.69, -0.7 68.1 M-12.33 36.4 C-8.54 41.49, -7.37 47.65, -4.34 66.81" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(153.3959809829115 291.96031746031736) rotate(0 -0.3315164564070301 34.81390687762939)"><path d="M12.21 38.34 C8.95 45.78, 3.58 51.59, -0.7 68.1 M8.04 38.96 C7.36 43.64, 4.02 49.23, -4.34 66.81" stroke="#c92a2a" stroke-width="1" fill="none"/></g></g><mask/><g stroke-linecap="round" transform="translate(44.6666666666664 485.7777777777778) rotate(0 115.5 39)"><path d="M145 10 M145 10 C162.03 19.72, 175.77 22.64, 202 30 M145 10 C159.69 16.01, 180.29 22.75, 202 30 M202 30 C229.68 38.79, 234.91 36.37, 202 50 M202 30 C234.35 42.28, 233.99 37.91, 202 50 M202 50 C192.22 56.54, 175.36 56.51, 145 68 M202 50 C188.07 54.67, 172.39 58.19, 145 68 M145 68 C115.61 78.88, 117.97 79.22, 87 68 M145 68 C113.83 80.47, 118.56 74.15, 87 68 M87 68 C71.29 61.04, 60.56 59.32, 29 50 M87 68 C74.64 64.74, 64.44 62.94, 29 50 M29 50 C-3.74 39.97, -2.56 38.48, 29 30 M29 50 C-0.37 39.37, 0.33 35.89, 29 30 M29 30 C50.44 21.61, 67.95 19.5, 87 10 M29 30 C39.74 28.07, 53.86 23.06, 87 10 M87 10 C117.55 -3.73, 116.15 -0.35, 145 10 M87 10 C117.11 0.05, 111.75 1.9, 145 10" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(103.6666666666664 515.2777777777778) rotate(0 56.5 9.5)"><text x="56.5" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">是否是 tag 处</text></g><g stroke-linecap="round"><g transform="translate(149.86229137715839 412.9312169312168) rotate(0 4.208753635864298 44.00826718116923)"><path d="M1.74 2.04 C2.05 16.64, 3.37 73.22, 4.27 87.33 M-0.76 0.69 C0.16 14.55, 8.15 69.98, 9.18 83.55" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(149.86229137715839 412.9312169312168) rotate(0 4.208753635864298 44.00826718116923)"><path d="M-1.29 52.77 C4.13 67.04, 8.41 74.67, 7.63 79.71 M-2.42 55.64 C-2.41 61.14, 1.58 70.44, 9.2 82.95" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(149.86229137715839 412.9312169312168) rotate(0 4.208753635864298 44.00826718116923)"><path d="M19.1 50.44 C16.66 65.86, 13.09 74.39, 7.63 79.71 M17.97 53.31 C13.25 59.65, 12.55 69.49, 9.2 82.95" stroke="#c92a2a" stroke-width="1" fill="none"/></g></g><mask/><g mask="url(#mask-lviM0Dprq1R14gecoqO6G)" stroke-linecap="round"><g transform="translate(166.8423381162429 563.3610819644362) rotate(0 -0.029376666403038598 53.384134448982536)"><path d="M0.06 2.21 C0.81 19.68, 2.3 86.2, 3.29 102.65 M-3.35 0.94 C-2.86 19.01, -0.44 88.88, 1.06 105.83" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(166.8423381162429 563.3610819644362) rotate(0 -0.029376666403038598 53.384134448982536)"><path d="M-7.63 78.3 C-9.36 89.25, -8.79 91.6, -1.31 103.66 M-12.18 79.05 C-6.4 85.8, -5.97 92.15, -0.21 106.83" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(166.8423381162429 563.3610819644362) rotate(0 -0.029376666403038598 53.384134448982536)"><path d="M12.86 77.13 C5.84 88.39, 1.15 91.04, -1.31 103.66 M8.31 77.88 C9.45 84.56, 5.22 91.18, -0.21 106.83" stroke="#c92a2a" stroke-width="1" fill="none"/></g></g><mask id="mask-lviM0Dprq1R14gecoqO6G"><rect x="0" y="0" fill="#fff" width="270.10521586848984" height="766.8482905982908"/><rect x="159.47377699236642" y="605.6046862813637" fill="#000" width="18" height="19" opacity="1"/></mask><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(159.47377699236642 605.6046862813635) rotate(0 7.339184457473436 11.140530132055233)"><text x="9" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">是</text></g><g mask="url(#mask-dn1DNiDydmoukLwp9itsL)" stroke-linecap="round"><g transform="translate(272.9215136092465 524.3635848425745) rotate(0 93.08055415379027 2.589871462680776)"><path d="M-2.42 0.27 C29.3 1.24, 156.92 6.29, 188.59 7.23 M1.45 -2.05 C33.19 -1.97, 156.82 2.91, 187.66 3.39" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(272.9215136092465 524.3635848425745) rotate(0 93.08055415379027 2.589871462680776)"><path d="M159.57 16.3 C168.89 13.09, 173.73 7.2, 190.18 3.32 M157.45 12.33 C169.03 10.09, 179.3 6.48, 188.03 3.06" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(272.9215136092465 524.3635848425745) rotate(0 93.08055415379027 2.589871462680776)"><path d="M160.16 -4.22 C169.55 -2.58, 174.25 -3.64, 190.18 3.32 M158.04 -8.18 C169.25 -2.93, 179.3 0.95, 188.03 3.06" stroke="#c92a2a" stroke-width="1" fill="none"/></g></g><mask id="mask-dn1DNiDydmoukLwp9itsL"><rect x="0" y="0" fill="#fff" width="559.084892031994" height="629.4457914278037"/><rect x="357.0032028206201" y="517.4046881351887" fill="#000" width="18" height="19" opacity="1"/></mask><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(357.00320282062034 517.4046881351892) rotate(0 8.99886494241656 9.548768170066296)"><text x="9" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">否</text></g><g stroke-linecap="round" transform="translate(409.9999999999998 321.33333333333326) rotate(0 111.50000000000006 54.5)"><path d="M140 13.75 M140 13.75 C157.74 27.59, 177.39 33.69, 195 41.25 M140 13.75 C155.68 22.1, 172.88 29.02, 195 41.25 M195 41.25 C223.92 57.76, 223.16 52.04, 195 68.75 M195 41.25 C221.74 55.91, 221.28 54.16, 195 68.75 M195 68.75 C174.48 77.98, 156.9 89.76, 140 95.25 M195 68.75 C176.24 79.02, 157.82 86.35, 140 95.25 M140 95.25 C115.54 111.32, 113.06 111.06, 84 95.25 M140 95.25 C110.54 112.93, 109.07 112.88, 84 95.25 M84 95.25 C72.36 88.5, 55.7 82.61, 28 68.75 M84 95.25 C71.99 87.21, 57.91 82.69, 28 68.75 M28 68.75 C-3.55 52.86, 2.53 52.47, 28 41.25 M28 68.75 C-1.04 54.5, -3.77 51.3, 28 41.25 M28 41.25 C47.04 32.45, 64.14 19.94, 84 13.75 M28 41.25 C41.45 36.17, 49.87 29.58, 84 13.75 M84 13.75 C115.99 -3.48, 108.31 3.81, 140 13.75 M84 13.75 C114.89 2.11, 113.09 -1.44, 140 13.75" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(440.4999999999998 366.33333333333326) rotate(0 81.00000000000006 9.5)"><text x="81" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">此页记录是否循环完成</text></g><g mask="url(#mask-xcMQVAjcvj1r3ryoOnPyv)" stroke-linecap="round"><g stroke-opacity="0.8" fill-opacity="0.8" transform="translate(520.0171788653535 317.97819876515473) rotate(0 1.0365626996742208 -65.70638529036205)"><path d="M-0.93 1.37 C-0.81 -8.92, 2.85 -38.98, 2.72 -60.51 C2.59 -82.04, -1.62 -116.07, -1.71 -127.79 M3.76 -0.35 C3.35 -10.26, 0.6 -34.72, 0.61 -56.79 C0.61 -78.86, 3.29 -120.7, 3.78 -132.79" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.8" fill-opacity="0.8" transform="translate(520.0171788653535 317.97819876515473) rotate(0 1.0365626996742208 -65.70638529036205)"><path d="M14.55 -103.79 C9.29 -118.36, 7.19 -123.42, 0.85 -131.58 M12.36 -105.03 C12.28 -112.11, 9.44 -115.41, 5.29 -131.94" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.8" fill-opacity="0.8" transform="translate(520.0171788653535 317.97819876515473) rotate(0 1.0365626996742208 -65.70638529036205)"><path d="M-5.95 -104.84 C-3.57 -118.88, 1.95 -123.56, 0.85 -131.58 M-8.13 -106.09 C-3.76 -112.82, -2.15 -115.89, 5.29 -131.94" stroke="#c92a2a" stroke-width="1" fill="none"/></g></g><mask id="mask-xcMQVAjcvj1r3ryoOnPyv"><rect x="0" y="0" fill="#fff" width="622.5158286778401" height="546.75576390573"/><rect x="513.5158286778401" y="247.80329352153376" fill="#000" width="18" height="19" opacity="1"/></mask><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(513.51582867784 247.80329352153376) rotate(0 7.537912887187588 4.4685199532589195)"><text x="9" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">是</text></g><g stroke-opacity="0.9" fill-opacity="0.9" stroke-linecap="round" transform="translate(56.5555555555552 673.4444444444446) rotate(0 113.5 24.5)"><path d="M12.25 0 M12.25 0 C80.56 1.92, 153.89 -1.93, 214.75 0 M12.25 0 C53.14 1.75, 95.9 2.73, 214.75 0 M214.75 0 C223.7 3.04, 227.3 7.2, 227 12.25 M214.75 0 C219.49 -0.15, 223.59 0.92, 227 12.25 M227 12.25 C223.82 18.43, 225.57 28.52, 227 36.75 M227 12.25 C226.67 21.57, 227.76 28.71, 227 36.75 M227 36.75 C226.75 46.38, 220.69 52.67, 214.75 49 M227 36.75 C227.84 48.84, 227.08 50.17, 214.75 49 M214.75 49 C163.88 47.29, 109.37 51.41, 12.25 49 M214.75 49 C166.16 52.94, 117.26 51.83, 12.25 49 M12.25 49 C7.93 47.41, -3.81 48.45, 0 36.75 M12.25 49 C1.79 52.1, -0.76 40.84, 0 36.75 M0 36.75 C-2.28 29.8, -1.8 17.06, 0 12.25 M0 36.75 C0.07 32.46, -0.16 24.17, 0 12.25 M0 12.25 C2.11 5.72, 6.43 3.54, 12.25 0 M0 12.25 C-3.71 2.03, 0.2 2.71, 12.25 0" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(73.5555555555552 688.4444444444439) rotate(0 96.5 9.500000000000114)"><text x="96.5" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">处理两个 tag 间提交记录</text></g><g stroke-opacity="0.9" fill-opacity="0.9" stroke-linecap="round" transform="translate(461.33333333333326 496.8888888888887) rotate(0 77.00000000000006 27)"><path d="M13.5 0 M13.5 0 C52.54 4.63, 87.08 -1.09, 140.5 0 M13.5 0 C54.78 -0.19, 94.59 -1.46, 140.5 0 M140.5 0 C151.16 2.05, 156.62 7.43, 154 13.5 M140.5 0 C148.78 -4.53, 156.9 4.74, 154 13.5 M154 13.5 C153.67 23.76, 154.01 32.17, 154 40.5 M154 13.5 C153.69 20.03, 155.09 29.48, 154 40.5 M154 40.5 C151.9 48.31, 152.42 55.48, 140.5 54 M154 40.5 C158.58 47.05, 149.9 53.28, 140.5 54 M140.5 54 C92.73 56.56, 44.57 55.85, 13.5 54 M140.5 54 C99.1 54.72, 59.62 55.8, 13.5 54 M13.5 54 C3.64 51.47, 3.88 52.76, 0 40.5 M13.5 54 C3.28 52.41, 2.77 48.88, 0 40.5 M0 40.5 C-3.41 27.56, 0.43 19.97, 0 13.5 M0 40.5 C-1.74 30.09, -0.98 21.58, 0 13.5 M0 13.5 C1.34 3.46, 1.46 -3.49, 13.5 0 M0 13.5 C3.03 0.45, 6.07 3.66, 13.5 0" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(489.33333333333326 514.3888888888887) rotate(0 49 9.5)"><text x="49" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">存储这条记录</text></g><g stroke-linecap="round"><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(526.9611864061793 495.7777777777774) rotate(0 -1.730755265804703 -32.76731269019899)"><path d="M-0.27 -1.78 C0.12 -13.72, 0 -58.07, 0.41 -68.95 M-3.87 3.42 C-3.72 -6.97, -2.95 -54.93, -2.15 -66.12" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(526.9611864061793 495.7777777777774) rotate(0 -1.730755265804703 -32.76731269019899)"><path d="M4.46 -38.39 C2.26 -42.51, 2.85 -47.14, -2.9 -66.91 M5.96 -39.49 C3.91 -47.53, 2.07 -55.37, -2.97 -67.2" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(526.9611864061793 495.7777777777774) rotate(0 -1.730755265804703 -32.76731269019899)"><path d="M-16.05 -39.19 C-13.51 -43.08, -8.2 -47.53, -2.9 -66.91 M-14.55 -40.29 C-9.93 -47.81, -5.1 -55.39, -2.97 -67.2" stroke="#c92a2a" stroke-width="1" fill="none"/></g></g><mask/><g stroke-linecap="round" transform="translate(54.3888888888884 232.99999999999932) rotate(0 98.49999999999997 28.5)"><path d="M14.25 0 M14.25 0 C78.38 -3.38, 134.75 -2.41, 182.75 0 M14.25 0 C64.81 3.59, 113.9 1.23, 182.75 0 M182.75 0 C195.67 0.21, 196.9 6.13, 197 14.25 M182.75 0 C188.16 -3.7, 200.62 2.08, 197 14.25 M197 14.25 C196.7 21.46, 196.24 27.54, 197 42.75 M197 14.25 C197.4 24.64, 198.76 34.94, 197 42.75 M197 42.75 C195.52 51.97, 194.74 61, 182.75 57 M197 42.75 C198.44 53.95, 194.09 52.48, 182.75 57 M182.75 57 C141.09 58.76, 94.28 58.09, 14.25 57 M182.75 57 C116.66 53.79, 53.06 54.36, 14.25 57 M14.25 57 C2.51 55.22, 0.37 55.7, 0 42.75 M14.25 57 C7.7 60.72, -2.38 49.94, 0 42.75 M0 42.75 C1.61 35.14, 2.81 28.04, 0 14.25 M0 42.75 C2.18 33.07, -1.43 23.87, 0 14.25 M0 14.25 C3.61 2.93, 4.27 -2.51, 14.25 0 M0 14.25 C1.43 6.72, 3.94 -0.41, 14.25 0" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g transform="translate(87.88888888888835 251.99999999999932) rotate(0 65 9.5)"><text x="65" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">循环当页提交记录</text></g><g stroke-linecap="round"><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(154.8206469186399 177.6770234674325) rotate(0 0.3185349686685299 26.076701043304183)"><path d="M-0.13 -0.37 C0.98 8.05, 3.6 42.58, 4.29 51.5 M-3.65 -3.04 C-2.45 5.79, 2.27 46.6, 3.46 55.2" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(154.8206469186399 177.6770234674325) rotate(0 0.3185349686685299 26.076701043304183)"><path d="M-8.78 36.03 C-5.42 40.54, -0.57 38.94, -0.26 51.91 M-8.41 33.47 C-5.2 39.99, -0.84 45.72, 4.37 56.78" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(154.8206469186399 177.6770234674325) rotate(0 0.3185349686685299 26.076701043304183)"><path d="M8.66 33.86 C8.31 38.81, 9.42 37.68, -0.26 51.91 M9.04 31.3 C6.57 38.21, 5.28 44.64, 4.37 56.78" stroke="#c92a2a" stroke-width="1" fill="none"/></g></g><mask/><g mask="url(#mask-B-XvH6s17K3nnXY-_28km)" stroke-linecap="round"><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(412.44444444444423 375.7777777777774) rotate(0 -83.27295419193706 3.372453728701089)"><path d="M-2.06 1.1 C-29.78 1.95, -138.77 6.19, -166.13 7.52 M2.02 -0.78 C-26.13 0.44, -140.18 2.16, -168.57 3.13" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(412.44444444444423 375.7777777777774) rotate(0 -83.27295419193706 3.372453728701089)"><path d="M-139.06 -8.31 C-147.4 -5.49, -153.74 1.12, -171.09 3.37 M-140.15 -7.35 C-151.03 -3.83, -162.8 1.33, -169.1 2.37" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(412.44444444444423 375.7777777777774) rotate(0 -83.27295419193706 3.372453728701089)"><path d="M-138.58 12.2 C-147.42 8.7, -153.9 9.01, -171.09 3.37 M-139.67 13.17 C-150.65 8.7, -162.6 5.87, -169.1 2.37" stroke="#c92a2a" stroke-width="1" fill="none"/></g></g><mask id="mask-B-XvH6s17K3nnXY-_28km"><rect x="0" y="0" fill="#fff" width="678.2125603864733" height="482.1529406001787"/><rect x="320.56038647342984" y="369.465359188978" fill="#000" width="18" height="19" opacity="1"/></mask><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(320.56038647342973 369.465359188978) rotate(0 8.611103779077439 9.684872317500435)"><text x="9" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">否</text></g><g stroke-linecap="round"><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(169.11111111111074 386.88888888888846) rotate(0 0.1255754212662623 0.5311599435285643)"><path d="M-1.94 -2.01 C-1.84 -1.87, 1.06 2.74, 0.96 2.71 M2.2 3.07 C1.98 2.33, -0.87 -0.27, -0.76 -0.83" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(169.11111111111074 386.88888888888846) rotate(0 0.1255754212662623 0.5311599435285643)"><path d="M-0.76 -0.83 C-0.76 -0.83, -0.76 -0.83, -0.76 -0.83 M-0.76 -0.83 C-0.76 -0.83, -0.76 -0.83, -0.76 -0.83" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(169.11111111111074 386.88888888888846) rotate(0 0.1255754212662623 0.5311599435285643)"><path d="M-0.76 -0.83 C-0.76 -0.83, -0.76 -0.83, -0.76 -0.83 M-0.76 -0.83 C-0.76 -0.83, -0.76 -0.83, -0.76 -0.83" stroke="#c92a2a" stroke-width="1" fill="none"/></g></g><mask/><g stroke-opacity="0.9" fill-opacity="0.9" stroke-linecap="round" transform="translate(420.11111111111074 99.3333333333328) rotate(0 94.5 46)"><path d="M118.75 11.75 M118.75 11.75 C135.03 21.3, 149.19 30.6, 165.25 35.25 M118.75 11.75 C134.18 19.84, 152.05 28.4, 165.25 35.25 M165.25 35.25 C187.48 45.81, 185.7 50.8, 165.25 58.75 M165.25 35.25 C190 47.22, 186.22 49.04, 165.25 58.75 M165.25 58.75 C151.54 67.12, 132.58 74.51, 118.75 80.25 M165.25 58.75 C154.75 64.96, 145.4 68.12, 118.75 80.25 M118.75 80.25 C94.28 92.54, 93.31 91.04, 71.25 80.25 M118.75 80.25 C92.74 93.24, 95.8 87.97, 71.25 80.25 M71.25 80.25 C57.4 74.18, 42.08 68.79, 23.75 58.75 M71.25 80.25 C59.29 75.01, 48.22 72.31, 23.75 58.75 M23.75 58.75 C0.68 45.28, 0.96 49.41, 23.75 35.25 M23.75 58.75 C-4.55 48.6, -0.31 50.72, 23.75 35.25 M23.75 35.25 C39.63 30.01, 56.54 22.76, 71.25 11.75 M23.75 35.25 C36.36 27.73, 51.16 22.03, 71.25 11.75 M71.25 11.75 C91.68 2.98, 95.92 -3.26, 118.75 11.75 M71.25 11.75 C95.13 -0.89, 98.93 3.17, 118.75 11.75" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(465.61111111111074 135.8333333333328) rotate(0 49 9.5)"><text x="49" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">是否还有下页</text></g><g mask="url(#mask-AIvfQd-vju-X_S_dSBPaU)" stroke-linecap="round"><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(516.8888888888886 100.22222222222172) rotate(0 -110.21043321811385 -31.322581191467634)"><path d="M1.95 1.23 C-0.98 -8.31, 20.56 -46.86, -17.4 -57.53 C-55.37 -68.2, -191.2 -61.99, -225.85 -62.8 M-0.44 -0.57 C-3.62 -9.58, 17.79 -43.72, -18.83 -53.77 C-55.45 -63.82, -185.69 -59.69, -220.13 -60.85" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(516.8888888888886 100.22222222222172) rotate(0 -110.21043321811385 -31.322581191467634)"><path d="M-190.16 -68.91 C-200.21 -70.48, -212.25 -66.55, -222.62 -59.3 M-191.22 -72.17 C-201.37 -66.88, -209.77 -66.92, -220.04 -62.38" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(516.8888888888886 100.22222222222172) rotate(0 -110.21043321811385 -31.322581191467634)"><path d="M-190.22 -48.39 C-200.21 -56.23, -212.23 -58.58, -222.62 -59.3 M-191.28 -51.65 C-201.7 -52.2, -210.09 -58.07, -220.04 -62.38" stroke="#c92a2a" stroke-width="1" fill="none"/></g></g><mask id="mask-AIvfQd-vju-X_S_dSBPaU"><rect x="0" y="0" fill="#fff" width="840.670309653916" height="260.8790323125929"/><rect x="488.99999999999955" y="32.944444444444116" fill="#000" width="18" height="19" opacity="1"/></mask><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(488.9999999999998 32.944444444444116) rotate(0 -82.32154432922493 35.95519658630997)"><text x="9" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">是</text></g><g mask="url(#mask-CU9fllVOFQ9hv_BUEtdnP)" stroke-linecap="round"><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(709.111111111111 149.11111111111086) rotate(0 -203.9724014016603 284.3480313714674)"><path d="M1.47 1.85 C-4.03 88.31, 40.45 427.87, -29.35 519.32 C-99.15 610.77, -352.88 545.12, -417.34 550.53 M5.34 0.38 C-0.48 86.08, 39.39 423.61, -31.38 515.78 C-102.15 607.95, -355.35 546.88, -419.3 553.39" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(709.111111111111 149.11111111111086) rotate(0 -203.9724014016603 284.3480313714674)"><path d="M-387.86 545.53 C-394.94 546.53, -407.83 550.69, -418.15 553.4 M-390.49 546.44 C-396.9 545.93, -404.31 547.57, -418.86 552.24" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(709.111111111111 149.11111111111086) rotate(0 -203.9724014016603 284.3480313714674)"><path d="M-389.19 566.01 C-395.97 561.09, -408.47 559.31, -418.15 553.4 M-391.83 566.92 C-398.26 561.38, -405.35 557.96, -418.86 552.24" stroke="#c92a2a" stroke-width="1" fill="none"/></g></g><mask id="mask-CU9fllVOFQ9hv_BUEtdnP"><rect x="0" y="0" fill="#fff" width="1230.1111111111109" height="800.1111111111109"/><rect x="670.3788246397446" y="656.2208126174994" fill="#000" width="18" height="19" opacity="1"/></mask><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(670.3788246397444 656.2208126174996) rotate(0 -165.24011493029383 -222.76167013492136)"><text x="9" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">否</text></g><g stroke-linecap="round"><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(602.4444444444442 144.6666666666663) rotate(0 53.916350204956984 1.7562233025888645)"><path d="M-1.22 -0.92 C16.39 -0.04, 86.37 6.44, 104.07 7.41 M3.31 -3.89 C21.9 -4.1, 91.13 0.98, 109.06 2.8" stroke="#c92a2a" stroke-width="1" fill="none"/></g></g><mask/><g stroke-opacity="0.9" fill-opacity="0.9" stroke-linecap="round" transform="translate(54.666666666666515 787.9999999999993) rotate(0 107 27.5)"><path d="M13.75 0 M13.75 0 C87.52 5.11, 154.72 3.57, 200.25 0 M13.75 0 C69.94 -1.17, 120.39 -0.6, 200.25 0 M200.25 0 C207.03 2.66, 217.32 4.98, 214 13.75 M200.25 0 C206.48 -0.5, 217.78 5.61, 214 13.75 M214 13.75 C214.97 21.16, 215.94 34.85, 214 41.25 M214 13.75 C213.24 21.11, 214.99 24.12, 214 41.25 M214 41.25 C216.9 51.08, 208.54 54.2, 200.25 55 M214 41.25 C210.64 51.13, 211.66 58.98, 200.25 55 M200.25 55 C158.88 49.84, 117.18 48.88, 13.75 55 M200.25 55 C160.04 55.32, 124.45 55.88, 13.75 55 M13.75 55 C8.02 51.2, 2.47 48.84, 0 41.25 M13.75 55 C0.75 54.33, 1.13 47.7, 0 41.25 M0 41.25 C3.44 35.46, 4.34 28.78, 0 13.75 M0 41.25 C0.1 31.79, -0.96 26.01, 0 13.75 M0 13.75 C0.83 6.06, 2.07 -2.08, 13.75 0 M0 13.75 C1.75 7.83, 1.69 -3.8, 13.75 0" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(66.66666666666652 805.9999999999993) rotate(0 95 9.5)"><text x="95" y="15" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#c92a2a" text-anchor="middle" style="white-space: pre;" direction="ltr">根据规则,将记录生成 MD</text></g><g stroke-linecap="round"><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(165.71746592082616 725.503082527672) rotate(0 -0.7108549617225322 28.413311323170547)"><path d="M0.43 1.36 C0.75 10.84, 1.42 45.89, 1.35 54.82 M-2.78 -0.36 C-2.56 9.57, 0.17 47.65, 0.43 57.19" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(165.71746592082616 725.503082527672) rotate(0 -0.7108549617225322 28.413311323170547)"><path d="M-8.78 34.34 C-11.31 39.76, -7.97 44.68, -1.84 55.08 M-10.46 29.37 C-8.94 38.42, -5.93 44.32, -1.48 58.42" stroke="#c92a2a" stroke-width="1" fill="none"/></g><g stroke-opacity="0.9" fill-opacity="0.9" transform="translate(165.71746592082616 725.503082527672) rotate(0 -0.7108549617225322 28.413311323170547)"><path d="M10.74 33.32 C2.73 39.09, 0.6 44.29, -1.84 55.08 M9.06 28.35 C6.28 37.32, 5.01 43.44, -1.48 58.42" stroke="#c92a2a" stroke-width="1" fill="none"/></g> </g> <mask/> </svg> <p>编写完自定义 Actions 后,使用自定义 Actions。</p> <div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> steps</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">Release</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> uses</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">MaLuns/add-release@指定版本</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> with</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> files</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">Demo.zip</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75"> generate_by_commit</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">true</span></span></code></pre> </div><p>效果图:</p> <p><img src="https://github.com/MaLuns/add-release/blob/master/demo/demo.png?raw=true" alt="效果图" data-tag="post-image" loading="lazy" onload="this.onload=null;this.style.opacity=1;"></p> <p>到此,一个根据 Git tag 自动发布 Npm 和 Release 的工作流编写完成了。你还可以在结合 Github Pages、Vercel 等同时自动化部署你的 Npm 包的文档和示例站点等。</p>

2023/2/10
阅读更多

小程序 swiper 性能优化

<p>事情是这样的,我做了一个在线壁纸小程序,壁纸预览部分为了更好时使用体验,增加了类似于那些短视频上滑下滑快速切换壁纸预览的功能,为了避免重复造轮子直接使用了 swiper 来时实现滑动快速切换壁纸。</p>

2022/12/28
阅读更多

瀑布流使用虚拟列表性能优化

<p>瀑布流算是比较常见的布局了,一个般常见纵向瀑布流的交互,当我们滚动到底的时候加载下一页的数据追加到上去。因为一次加载的数据量不是很多,页面操作是也不会有太大的性能消耗。但是如果当你一直往下滚动加载,加载几十页的时候,就会开始感觉不那么流畅的,这是因为虽然每次操作的很少,但是页面的 DOM 越来越多,内存占用也会增大,而且发生重排重绘时候浏览器计算量耗时也会增大,就导致了慢慢不能那么流畅了。这个时候可以选择结合虚拟列表方式使用,虚拟列表本身就是用来解决超长列表时的处理方案。</p>

2022/11/14
阅读更多

做了个壁纸小程序😀

<p>各种壁纸app,壁纸小程序打开全是各种广告,太影响使用体验,自己整了个壁纸小程序,简单无广告🤣</p> <p>附上小程序码:</p> <p><img src="https://img.lkxin.cn/tu/2022/10/18/634e537320ee3.jpg" alt="xcx.jpg" data-tag="post-image" loading="lazy" onload="this.onload=null;this.style.opacity=1;"><em>壁了个纸</em></p>

2022/10/18
阅读更多

Pjax 下动态加载插件方案

<p>在纯静态网站里,有时候会动态更新某个区域往会选择 Pjax(swup、barba.js)去处理,他们都是使用 ajax 和 pushState 通过真正的永久链接,页面标题和后退按钮提供快速浏览体验。</p>

2022/9/28
阅读更多

hexo-theme-async 使用指北

<p><img src="https://hexo-theme-async.imalun.com/imgs/demo2.png" alt="demo" data-tag="post-image" loading="lazy" onload="this.onload=null;this.style.opacity=1;"><em>预览图</em></p> <h3 id="前提" tabindex="-1">前提 <a class="header-anchor" href="#前提" aria-label="Permalink to &quot;前提&quot;">&ZeroWidthSpace;</a></h3> <p>本主题为 Hexo 主题,请确保您对 Hexo 已有基本了解 。详请参见 <a href="https://hexo.io/" target="_blank" rel="noreferrer">Hexo 官网</a>。</p> <p>开始前,请确保您的 Hexo 初始化工作已经准备完成,请参考 <a href="https://hexo.io/zh-cn/docs/" target="_blank" rel="noreferrer">Hexo 安装</a>。本主题依赖于 <strong>Node 14.x</strong> 以上版本,请注意您本地 <strong>Node</strong> 环境。</p> <h3 id="主题安装" tabindex="-1">主题安装 <a class="header-anchor" href="#主题安装" aria-label="Permalink to &quot;主题安装&quot;">&ZeroWidthSpace;</a></h3> <p>进入您的 Hexo 博客根目录,执行如下命令,安装主题:</p> <div class="vp-code-group vp-adaptive-theme"><div class="tabs"><input type="radio" name="group-_ipin" id="tab-VnTBPvv" checked><label data-title="npm" for="tab-VnTBPvv">npm</label><input type="radio" name="group-_ipin" id="tab-M0xJbBZ" ><label data-title="yarn" for="tab-M0xJbBZ">yarn</label></div><div class="blocks"> <div class="language-bash vp-adaptive-theme active"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> i</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> hexo-theme-async@latest</span></span></code></pre> </div><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">yarn</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> hexo-theme-async@latest</span></span></code></pre> </div></div></div> <p>如果您没有 <strong>ejs</strong> 与 <strong>less</strong> 的渲染器,请先安装:<a href="https://github.com/hexojs/hexo-renderer-ejs" target="_blank" rel="noreferrer">hexo-renderer-ejs</a> 和 <a href="https://github.com/hexojs/hexo-renderer-less" target="_blank" rel="noreferrer">hexo-renderer-less</a>。</p> <div class="vp-code-group vp-adaptive-theme"><div class="tabs"><input type="radio" name="group-DLm2X" id="tab-D2vjv_C" checked><label data-title="npm" for="tab-D2vjv_C">npm</label><input type="radio" name="group-DLm2X" id="tab-kczk0SN" ><label data-title="yarn" for="tab-kczk0SN">yarn</label></div><div class="blocks"> <div class="language-bash vp-adaptive-theme active"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --save</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> hexo-renderer-less</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> hexo-renderer-ejs</span></span></code></pre> </div><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">yarn</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> add</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> hexo-renderer-less</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> hexo-renderer-ejs</span></span></code></pre> </div></div></div> <h3 id="启用主题" tabindex="-1">启用主题 <a class="header-anchor" href="#启用主题" aria-label="Permalink to &quot;启用主题&quot;">&ZeroWidthSpace;</a></h3> <p>修改 Hexo 博客配置文件 <code>_config.yml</code>,到此运行起来就 Hexo-Theme-Async 主题就生效啦。</p> <div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light one-dark-pro vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 将主题设置为 hexo-theme-async</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">theme</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">async</span></span></code></pre> </div><p>关于主题配置修改,可以参考 <a href="https://hexo-theme-async.imalun.com/guide/config.html" target="_blank" rel="noreferrer">hexo-theme-async 文档</a></p> <h3 id="演示视频" tabindex="-1">演示视频 <a class="header-anchor" href="#演示视频" aria-label="Permalink to &quot;演示视频&quot;">&ZeroWidthSpace;</a></h3> <ul> <li>安装 <ul> <li><a href="https://www.bilibili.com/video/BV1Cs4y1J7vv/" target="_blank" rel="noreferrer">npm 安装演示</a></li> <li><a href="https://www.bilibili.com/video/BV1mg4y137Zi/" target="_blank" rel="noreferrer">下载到 themes 目录演示</a></li> </ul> </li> <li>配置 <ul> <li><a href="https://www.bilibili.com/video/BV1cm4y1z7tQ/" target="_blank" rel="noreferrer">常用配置演示</a></li> <li><a href="https://www.bilibili.com/video/BV1Da4y1M7UF/" target="_blank" rel="noreferrer">主题自定义图标、自定义代码高亮演示</a></li> <li><a href="https://www.bilibili.com/video/BV1cs4y1m7RT/" target="_blank" rel="noreferrer">随机封面、友链页、相册页面配置演示</a></li> </ul> </li> <li>运行源码 <ul> <li><a href="https://www.bilibili.com/video/BV19L41127LH/" target="_blank" rel="noreferrer">hexo-theme-async 源码运行演示</a></li> </ul> </li> <li>在线体验 <ul> <li><a href="https://stackblitz.com/edit/node-tshsxq?embed=1&amp;file=README.md" target="_blank" rel="noreferrer">stackblitz</a></li> </ul> </li> </ul> <p>安装示例视频,更多视频前往<a href="https://space.bilibili.com/12763040/channel/seriesdetail?sid=3170241" target="_blank" rel="noreferrer">这里</a></p> <iframe src="//player.bilibili.com/player.html?aid=951750989&bvid=BV1Cs4y1J7vv&cid=1077514563&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" width="100%" height="500"> </iframe>

2022/9/7
阅读更多

云开发又又又涨价了

<p>之前一波搞没了免费额度,这次直接要回收以前开通免费版的资源了。搞成基础套餐+按量计费模式,直接最低39.9块一个月。用不起了,腾讯是真TM的狗。</p>

2022/7/13
阅读更多

关于重写评论插件这件事

<p>因为以前使用的评论插件存在很多 bug 和漏洞,但是也没啥人用,一直没有去修改,最近空闲时间比较多,所以准备对之前插件进行重构一番。原评论插件是使用原生 JS 编写 WebComponents 组件,感觉结构维护起来挺费力的(自己太菜),决定使用 Vue3 构建 WebComponents 。</p>

2022/2/11
阅读更多