<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>代码 on 阿珏酱のBlog</title>
    <link>https://zh.moejue.cn/tags/%E4%BB%A3%E7%A0%81/</link>
    <description>Recent content from 阿珏酱のBlog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    
    <managingEditor>xxx@example.com (MoeJue)</managingEditor>
    <webMaster>xxx@example.com (MoeJue)</webMaster>
    
    <copyright>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</copyright>
    
    <lastBuildDate>Sat, 01 Aug 2026 13:12:42 +0000</lastBuildDate>
    
    
    <atom:link href="https://zh.moejue.cn/tags/%E4%BB%A3%E7%A0%81/index.xml" rel="self" type="application/rss&#43;xml" />
    

    
    

    <item>
      <title>MoeKoe Music Mobile酷狗音乐第三方移动端播放器</title>
      <link>https://zh.moejue.cn/posts/342/</link>
      <pubDate>Sat, 01 Aug 2026 13:12:42 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/posts/342/</guid>
      <description>
        <![CDATA[<h1>MoeKoe Music Mobile酷狗音乐第三方移动端播放器</h1><p>作者：MoeJue（xxx@example.com）</p>
        
          <p><img src="assets/images/icon.png" alt="MoeKoe Music"></p>
<p># MoeKoe Music Mobile</p>
<p>一款开源、简洁、高颜值的第三方酷狗音乐移动端播放器</p>
<p>基于 Expo / React Native 构建，是 [MoeKoeMusic](<a href="https://github.com/iAJue/MoeKoeMusic">https://github.com/iAJue/MoeKoeMusic</a>) 桌面版的移动端实现</p>
<p><a href="https://github.com/MoeKoeMusic/MoeKoeMusic-Mobile"><strong>🌎 GitHub仓库</strong></a>  |  <br>
<a href="https://github.com/MoeKoeMusic/MoeKoeMusic-Mobile/releases"><strong>📦️ 下载安装包</strong></a>  |  <br>
<a href="https://MoeJue.cn"><strong>💬 访问博客</strong></a>  |  <br>
<a href="https://Music.MoeKoe.cn"><strong>🏠 项目主页</strong></a></p>
<p><a href="https://github.com/iAJue"><img src="https://img.shields.io/badge/%F0%9F%8E%89_Create_by_iAJue-with_Love_%E2%9D%A4-pink?style=flat-square" alt=""></a></p>
<p>一款开源、简洁、高颜值的第三方酷狗音乐移动端播放器</p>
<p>基于 Expo / React Native 构建，是 <a href="https://github.com/iAJue/MoeKoeMusic">MoeKoeMusic</a> 桌面版的移动端实现</p>
<p><a href="https://expo.dev/"><img src="https://img.shields.io/badge/Expo-SDK%2057-000020?logo=expo&amp;logoColor=white" alt="Expo SDK"></a> <a href="https://reactnative.dev/"><img src="https://img.shields.io/badge/React%20Native-0.86-61DAFB?logo=react&amp;logoColor=white" alt="React Native"></a> <a href="https://www.typescriptlang.org/"><img src="https://img.shields.io/badge/TypeScript-6.0-3178C6?logo=typescript&amp;logoColor=white" alt="TypeScript"></a> <a href="LICENSE"><img src="https://img.shields.io/badge/License-GPL--2.0-blue.svg" alt="License"></a> <a href=""><img src="https://img.shields.io/badge/Platform-iOS%20%7C%20Android-lightgrey" alt="Platform"></a></p>
<hr>
<h2 id="-特性">
<a class="header-anchor" href="#-%e7%89%b9%e6%80%a7"></a>
✨ 特性
</h2><ul>
<li>🎵 <strong>无需自建服务器</strong> — 酷狗 API 适配层直接直连官方，开箱即用，不依赖外部 API 地址</li>
<li>🏠 <strong>首页推荐</strong> — 每日推荐、精选歌单、排行榜</li>
<li>🧭 <strong>发现页</strong> — 分类歌单、新歌速递等内容探索</li>
<li>🔍 <strong>搜索</strong> — 快速检索歌曲、歌单、专辑</li>
<li>📀 <strong>歌单 / 专辑 / 排行榜</strong> — 完整的详情页与曲目列表</li>
<li>🎧 <strong>播放器</strong> — 滚动歌词、播放队列、迷你播放条（MiniPlayer）、后台播放</li>
<li>🎚️ <strong>音质检测</strong> — 自动探测并选择可用音质</li>
<li>📱 <strong>手机号登录</strong> — 同步酷狗账号的收藏与歌单</li>
<li>🌗 <strong>深色模式</strong> — 跟随系统自动切换明暗主题</li>
</ul>
<h2 id="-todo-list">
<a class="header-anchor" href="#-todo-list"></a>
📝 Todo List
</h2><ul>
<li>[x] 首页每日推荐 / 精选歌单 / 排行榜</li>
<li>[x] 发现页分类内容浏览</li>
<li>[x] 搜索歌曲、歌单、专辑</li>
<li>[x] 歌单 / 专辑 / 排行榜详情页</li>
<li>[x] 播放器：滚动歌词、播放队列、迷你播放条、后台播放</li>
<li>[x] 音质检测与自动选择</li>
<li>[x] 手机号登录</li>
<li>[x] 账号密码登录</li>
<li>[x] 扫码登录(其他设备)</li>
<li>[x] 我喜欢 / 收藏同步</li>
<li>[x] 用户歌单管理（创建 / 收藏 / 编辑）</li>
<li>[ ] 通知栏 / 锁屏播放控制</li>
<li>[ ] 歌曲详情浏览</li>
<li>[ ] 桌面歌词</li>
<li>[ ] 听歌识曲</li>
<li>[ ] 平板与横屏适配</li>
<li>[ ] 性能优化</li>
</ul>
<h2 id="-预览">
<a class="header-anchor" href="#-%e9%a2%84%e8%a7%88"></a>
📸 预览
</h2><table class="table"><tbody><tr><td><img decoding="async" src="https://github.com/MoeKoeMusic/MoeKoeMusic-Mobile/raw/master/images/screen-1.png" alt="Screenshot 1"></td><td><img decoding="async" src="https://github.com/MoeKoeMusic/MoeKoeMusic-Mobile/raw/master/images/screen-2.png" alt="Screenshot 2"></td><td><img decoding="async" src="https://github.com/MoeKoeMusic/MoeKoeMusic-Mobile/raw/master/images/screen-3.png" alt="Screenshot 3"></td></tr><tr><td><img decoding="async" src="https://github.com/MoeKoeMusic/MoeKoeMusic-Mobile/raw/master/images/screen-4.png" alt="Screenshot 4"></td><td><img decoding="async" src="https://github.com/MoeKoeMusic/MoeKoeMusic-Mobile/raw/master/images/screen-5.png" alt="Screenshot 5"></td><td><img decoding="async" src="https://github.com/MoeKoeMusic/MoeKoeMusic-Mobile/raw/master/images/screen-6.png" alt="Screenshot 6"></td></tr></tbody></table>
<h2 id="-快速开始">
<a class="header-anchor" href="#-%e5%bf%ab%e9%80%9f%e5%bc%80%e5%a7%8b"></a>
🚀 快速开始
</h2><h3 id="环境要求">
<a class="header-anchor" href="#%e7%8e%af%e5%a2%83%e8%a6%81%e6%b1%82"></a>
环境要求
</h3><ul>
<li><a href="https://nodejs.org/">Node.js</a> ≥ 22</li>
<li><a href="https://git-scm.com/">Git</a></li>
<li>iOS 模拟器 / Android 模拟器，或安装了开发版客户端的真机</li>
</ul>
<h3 id="开发运行">
<a class="header-anchor" href="#%e5%bc%80%e5%8f%91%e8%bf%90%e8%a1%8c"></a>
开发运行
</h3><pre><code># 克隆仓库（包含 api submodule）
git clone --recurse-submodules https://github.com/MoeKoeMusic/MoeKoeMusic-Mobile.git
cd MoeKoeMusic-Mobile

# 安装依赖
npm install
npm --prefix api install

# 生成移动端 API 入口（api/ 更新后需重新执行）
npm run generate:mobile-api

# 启动开发服务器
npx expo start
</code></pre>
<blockquote>
<p>如果克隆时遗漏了 submodule，可执行 <code>git submodule update --init</code> 补齐。</p>
        
        <hr><p>本文2026-08-01首发于<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>，最后修改于2026-08-01</p>]]>
      </description>
      
        <category>折腾代码</category>
      
    </item>
    
    

    <item>
      <title>MoeKoe Music浏览器插件版本,开箱即用</title>
      <link>https://zh.moejue.cn/posts/339/</link>
      <pubDate>Wed, 15 Jul 2026 17:48:40 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/posts/339/</guid>
      <description>
        <![CDATA[<h1>MoeKoe Music浏览器插件版本,开箱即用</h1><p>作者：MoeJue（xxx@example.com）</p>
        
          <p><img src="https://github.com/MoeKoeMusic/MoeKoeMusic/raw/main/build/icons/linux/256x256.png" alt="MoeKoe Music"></p>
<h2 id="moekoe-music-extension">
<a class="header-anchor" href="#moekoe-music-extension"></a>
MoeKoe Music Extension
</h2><p>MoeKoe Music 浏览器插件版，基于 <a href="https://github.com/MoeKoeMusic/MoeKoeMusic/">MoeKoeMusic Web</a> 构建，并在浏览器扩展内完成 API 路由兼容。</p>
<p><img src="https://img.shields.io/badge/Manifest-V3-4285F4" alt="Manifest V3"> <img src="https://img.shields.io/badge/Vue-3-42b883" alt="Vue"> <img src="https://img.shields.io/badge/Vite-7-646CFF" alt="Vite"> <img src="https://img.shields.io/badge/License-GPL--2.0-blue" alt="License"></p>
<p><a href="https://github.com/MoeKoeMusic/MoeKoe-Music-Extension">🌎 GitHub仓库</a></p>
<h2 id="特性">
<a class="header-anchor" href="#%e7%89%b9%e6%80%a7"></a>
特性
</h2><ul>
<li>点击浏览器插件图标后打开独立窗口运行 MoeKoeMusic。</li>
<li>无需用户配置 API 地址，也无需额外启动本地 API 服务。</li>
<li>保留 MoeKoeMusic 原有 Web 页面与交互，兼容浏览器扩展运行环境。</li>
</ul>
<h2 id="快速开始">
<a class="header-anchor" href="#%e5%bf%ab%e9%80%9f%e5%bc%80%e5%a7%8b"></a>
快速开始
</h2><h3 id="环境要求">
<a class="header-anchor" href="#%e7%8e%af%e5%a2%83%e8%a6%81%e6%b1%82"></a>
环境要求
</h3><ul>
<li>Node.js 20 或更高版本</li>
<li>Git</li>
<li>Chrome / Edge 等 Chromium 内核浏览器</li>
</ul>
<h3 id="安装依赖">
<a class="header-anchor" href="#%e5%ae%89%e8%a3%85%e4%be%9d%e8%b5%96"></a>
安装依赖
</h3><pre><code>git submodule update --init --recursive
npm install
npm run install:app
</code></pre>
<p><code>npm run install:app</code> 会分别安装 <code>MoeKoeMusic</code> 与 <code>MoeKoeMusic/api</code> 的依赖。安装后建议检查子模块工作区，避免把上游 lockfile 的非预期变化提交进去。</p>
        
        <hr><p>本文2026-07-15首发于<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>，最后修改于2026-07-15</p>]]>
      </description>
      
        <category>折腾代码</category>
      
    </item>
    
    

    <item>
      <title>MoeKoe Music 插件市场设计</title>
      <link>https://zh.moejue.cn/posts/337/</link>
      <pubDate>Sun, 05 Jul 2026 12:54:29 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/posts/337/</guid>
      <description>
        <![CDATA[<h1>MoeKoe Music 插件市场设计</h1><p>作者：MoeJue（xxx@example.com）</p>
        
          <p>在做插件市场之前，先有的是 MoeKoe 的普通插件系统。</p>
<p>当时我想解决的问题不是某一个具体功能，而是一个更通用的问题：播放器里总会冒出很多小需求，有些人想改界面，有些人想加一个工具弹窗，有些人想接自己的服务。如果每个想法都往主程序里塞，主程序会越来越重，也越来越难维护。</p>
<p>所以我一开始给插件系统定的方向很明确：主程序只提供插件运行环境和管理入口，具体功能交给插件自己做。插件能独立安装、独立卸载，坏了也尽量不要影响播放器本体。</p>
<p>上一篇我写的是 <a href="https://moejue.cn/archives/334" title="&lt;code&gt;MoeKoeMusic-Plugins&lt;/code&gt;">MoeKoeMusic-Plugins</a> 这个插件登记仓库。那边解决的是“插件市场的数据怎么产生”：用户用 Issue 提交，Action 校验，维护者审核，通过后写进 <code>plugins.json</code>。</p>
<p>但光有登记仓库还不够。真正对用户来说，插件市场不是 GitHub 上的一份 JSON，而是客户端里一个能看、能搜、能安装、能更新的入口。<br>
所以这篇就换到 MoeKoe Music 主项目里，专门聊客户端的插件市场部分。</p>
<h2 id="为什么选-chrome-extension-这一套">
<a class="header-anchor" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e9%80%89-chrome-extension-%e8%bf%99%e4%b8%80%e5%a5%97"></a>
为什么选 Chrome Extension 这一套
</h2><p>MoeKoe 是 Electron 应用，Electron 本身就有加载扩展的能力。既然底层已经能跑 Chrome Extension，那就没必要再从零设计一套插件格式。</p>
<p>这样做有几个好处:</p>
<ul>
<li>第一，插件作者不用学一套完全陌生的格式。<code>manifest.json</code>、<code>popup.html</code>、<code>background.js</code> 都是浏览器扩展里很常见的概念。</li>
<li>第二，插件天然有清单文件。主程序可以先读 <code>manifest.json</code>，判断插件名称、版本、描述、权限、弹窗入口、最低支持版本这些信息。</li>
<li>第三，Electron 可以直接加载插件目录，不需要我自己写一个脚本沙箱。</li>
</ul>
<h2 id="展示搜索分页和状态">
<a class="header-anchor" href="#%e5%b1%95%e7%a4%ba%e6%90%9c%e7%b4%a2%e5%88%86%e9%a1%b5%e5%92%8c%e7%8a%b6%e6%80%81"></a>
展示、搜索、分页和状态
</h2><p>插件市场不是只要能安装就行，还要能快速判断：</p>
<ul>
<li>这个插件是干什么的</li>
<li>我有没有装过</li>
<li>我装的是不是旧版本</li>
<li>这个插件有没有更高版本要求</li>
<li>它有没有联网、文件访问、本地二进制这些风险点</li>
<li>分页,搜索,更新,状态</li>
</ul>
<p>所以市场卡片里展示的不只是“安装”按钮。</p>
<ol>
<li>确保插件目录存在</li>
<li>调用Electron下载安装、卸旧版、装新版</li>
<li>注册插件相关 IPC</li>
<li>加载 Chrome 扩展</li>
<li>加载 Native Host 索引和授权系统</li>
</ol>
<h2 id="已安装插件">
<a class="header-anchor" href="#%e5%b7%b2%e5%ae%89%e8%a3%85%e6%8f%92%e4%bb%b6"></a>
已安装插件
</h2><p>插件管理页里的“已安装插件”不是只读 Electron 当前加载的扩展。它会把两类信息合并：</p>
<ul>
<li><code>session.defaultSession.getAllExtensions()</code> 拿到已加载扩展</li>
<li><code>scanExtensions()</code> 扫描磁盘插件目录，读取 manifest、图标、popup、Native Host 声明</li>
</ul>
<p>前端拿到这些字段后，就能显示：</p>
        
        <hr><p>本文2026-07-05首发于<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>，最后修改于2026-07-05</p>]]>
      </description>
      
        <category>折腾代码</category><category>教程</category>
      
    </item>
    
    

    <item>
      <title>MoeKoeMusic-Plugins设计理念</title>
      <link>https://zh.moejue.cn/posts/334/</link>
      <pubDate>Sat, 20 Jun 2026 11:45:33 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/posts/334/</guid>
      <description>
        <![CDATA[<h1>MoeKoeMusic-Plugins设计理念</h1><p>作者：MoeJue（xxx@example.com）</p>
        
          <p>一开始做 MoeKoe Music 插件生态的时候，还没有在线插件市场这个功能<br>
后来在社区的建议下便有了这个插件市场 <a href="https://github.com/orgs/MoeKoeMusic/discussions/888">增加官方/社区插件仓库以扩展产品功能</a></p>
<blockquote>
<p>插件可以由社区开发，那插件市场应该怎么管？</p>
</blockquote>
<p>最直接的做法当然是把所有插件源码都收进一个大仓库里。但这个方案越想越别扭。每个插件都有自己的作者、自己的发布节奏、自己的构建方式。把它们全塞进官方仓库，不仅维护成本高，也会把责任边界搞得很模糊。</p>
<p>所以这个仓库最后没有被设计成“插件源码仓库”，而是变成了一个“插件登记与索引仓库”。它只做几件事：</p>
<ul>
<li>接收插件上架、更新、下架和举报申请</li>
<li>自动做一轮基础校验和静态识别</li>
<li>把人工审核通过时的插件快照记录下来</li>
<li>维护客户端可以读取的 <code>plugins.json</code></li>
<li>顺手把 README 里的插件列表更新出来，方便人看</li>
</ul>
<p>一个可追溯的登记簿：谁提交的、审核的是哪个版本、下载地址是什么、是否有网络或文件权限，都落在一份清楚的数据里。</p>
<h2 id="市场索引而不是源码仓库">
<a class="header-anchor" href="#%e5%b8%82%e5%9c%ba%e7%b4%a2%e5%bc%95%e8%80%8c%e4%b8%8d%e6%98%af%e6%ba%90%e7%a0%81%e4%bb%93%e5%ba%93"></a>
市场索引，而不是源码仓库
</h2><p>仓库根目录最重要的文件是 <code>plugins.json</code>。它就是插件市场真正消费的数据源。</p>
<pre><code>{
  &quot;id&quot;: &quot;custom-app-background&quot;,
  &quot;name&quot;: &quot;自定义背景图&quot;,
  &quot;description&quot;: &quot;为MoeKoe Music提供自定义背景图能力，支持透明度调节。&quot;,
  &quot;iconUrl&quot;: &quot;...&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;minversion&quot;: &quot;1.6.1&quot;,
  &quot;...&quot;:&quot;....&quot;,
  &quot;buildRequired&quot;: false,
  &quot;networkAccess&quot;: false,
  &quot;fileAccess&quot;: false,
  &quot;binaryContent&quot;: false,
  &quot;snapshot&quot;: {
    &quot;iconUrl&quot;: &quot;...&quot;,
    &quot;repository&quot;: &quot;MoeKoeMusic/custom-app-background-plugin&quot;,
    &quot;commitSha&quot;: &quot;dbf72d38c8cf6b1d1cefdf8ce15798d565678995&quot;,
    &quot;downloadUrl&quot;: &quot;hxx.zip&quot;,
    &quot;release&quot;: null
  }
}
</code></pre>
<p>我不想让市场记录永远指向插件仓库“当前最新代码”。因为作者今天提交的代码，和审核那天看到的代码，可能已经不是同一份东西了。插件市场真正应该承认的是：审核通过时的那个版本。</p>
<p>所以这个项目里面有一个核心原则：</p>
<blockquote>
<p>上架的不是一个会漂移的仓库地址，而是一个已经锁定的快照。</p>
</blockquote>
<p>对于不需要编译的插件，快照锁到默认分支当时的 commit。对于需要编译的插件，快照锁到对应的 Release tag 和发行附件。这样后面真出了问题，也能回头知道当时到底审核了什么。</p>
<h2 id="action-先跑人最后拍板">
<a class="header-anchor" href="#action-%e5%85%88%e8%b7%91%e4%ba%ba%e6%9c%80%e5%90%8e%e6%8b%8d%e6%9d%bf"></a>
Action 先跑，人最后拍板
</h2><p>用户提交 Issue 时，需要选择：</p>
        
        <hr><p>本文2026-06-20首发于<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>，最后修改于2026-06-20</p>]]>
      </description>
      
        <category>折腾代码</category>
      
    </item>
    
    

    <item>
      <title>我用WebGL做18&#43;游戏，输了“掉装备”🔞</title>
      <link>https://zh.moejue.cn/posts/332/</link>
      <pubDate>Sat, 13 Jun 2026 11:38:47 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/posts/332/</guid>
      <description>
        <![CDATA[<h1>我用WebGL做18+游戏，输了“掉装备”🔞</h1><p>作者：MoeJue（xxx@example.com）</p>
        
          <p>紧接上文：<a href="https://moejue.cn/archives/328">《同一个动画，我用三种技术栈实现的区别?》</a></p>
<h4 id="webgl-二次元石头剪刀布小游戏">
<a class="header-anchor" href="#webgl-%e4%ba%8c%e6%ac%a1%e5%85%83%e7%9f%b3%e5%a4%b4%e5%89%aa%e5%88%80%e5%b8%83%e5%b0%8f%e6%b8%b8%e6%88%8f"></a>
WebGL 二次元石头剪刀布小游戏。
</h4><p>规则很普通：</p>
<ul>
<li>石头 &gt; 剪刀</li>
<li>剪刀 &gt; 布</li>
<li>布 &gt; 石头</li>
</ul>
<p>但有趣的是在于：</p>
<h4 id="输了会脱衣服">
<a class="header-anchor" href="#%e8%be%93%e4%ba%86%e4%bc%9a%e8%84%b1%e8%a1%a3%e6%9c%8d"></a>
输了会脱衣服。
</h4><p>对,就是这么简单粗暴。</p>
<hr>
<h2 id="起因其实是我想研究精灵图">
<a class="header-anchor" href="#%e8%b5%b7%e5%9b%a0%e5%85%b6%e5%ae%9e%e6%98%af%e6%88%91%e6%83%b3%e7%a0%94%e7%a9%b6%e7%b2%be%e7%81%b5%e5%9b%be"></a>
起因其实是“我想研究精灵图”
</h2><p>一开始我根本没想做游戏。<br>
我只是想研究：</p>
<ul>
<li>atlas</li>
<li>sprite</li>
<li>图层叠加</li>
<li>动画裁剪</li>
</ul>
<p>这些东西。<br>
然后想着：“总得有个实际应用场景吧？”</p>
<p>于是脑子一抽：</p>
<h4 id="那干脆做个二次元脱衣猜拳">
<a class="header-anchor" href="#%e9%82%a3%e5%b9%b2%e8%84%86%e5%81%9a%e4%b8%aa%e4%ba%8c%e6%ac%a1%e5%85%83%e8%84%b1%e8%a1%a3%e7%8c%9c%e6%8b%b3"></a>
那干脆做个二次元脱衣猜拳。
</h4><p>然后项目开始朝奇怪方向狂奔。</p>
<hr>
<h2 id="这个项目最麻烦的其实不是游戏逻辑">
<a class="header-anchor" href="#%e8%bf%99%e4%b8%aa%e9%a1%b9%e7%9b%ae%e6%9c%80%e9%ba%bb%e7%83%a6%e7%9a%84%e5%85%b6%e5%ae%9e%e4%b8%8d%e6%98%af%e6%b8%b8%e6%88%8f%e9%80%bb%e8%be%91"></a>
这个项目最麻烦的其实不是游戏逻辑
</h2><p>石头剪刀布规则简单得离谱。<br>
真正麻烦的是：<strong>衣服层级</strong><br>
因为角色不是：<strong>“一张完整图片”</strong></p>
<p>而是：</p>
<ul>
<li>底图 (防粿体被抓包,特意加密了)</li>
<li>衣服 A</li>
<li>衣服 B</li>
<li>衣服 C</li>
<li>配饰</li>
<li>遮挡层</li>
</ul>
<p>不停叠。</p>
<hr>
<h2 id="脱衣其实是图层管理">
<a class="header-anchor" href="#%e8%84%b1%e8%a1%a3%e5%85%b6%e5%ae%9e%e6%98%af%e5%9b%be%e5%b1%82%e7%ae%a1%e7%90%86"></a>
“脱衣”其实是图层管理
</h2><p>玩家赢了：</p>
<ul>
<li>按设定好的顺序移除一件衣服</li>
</ul>
<p>电脑赢了：</p>
<ul>
<li>再按逆序穿回来</li>
</ul>
<p>听起来简单。<br>
实际上会遇到一堆问题：</p>
<hr>
<h3 id="比如不能瞬间露底图">
<a class="header-anchor" href="#%e6%af%94%e5%a6%82%e4%b8%8d%e8%83%bd%e7%9e%ac%e9%97%b4%e9%9c%b2%e5%ba%95%e5%9b%be"></a>
比如“不能瞬间露底图”
</h3><p>这个特别关键。<br>
如果你：</p>
<pre><code>先删旧衣服
再加新衣服
</code></pre>
<p>中间可能会闪出底图。<br>
于是视觉效果会特别怪。<br>
所以我后来用了：<strong>reveal 覆盖逻辑</strong></p>
<p>新的层会立刻顶上。<br>
尽量避免：</p>
        
        <hr><p>本文2026-06-13首发于<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>，最后修改于2026-06-13</p>]]>
      </description>
      
        <category>折腾代码</category>
      
    </item>
    
    

    <item>
      <title>同一个动画，我用三种技术栈实现的区别?</title>
      <link>https://zh.moejue.cn/posts/328/</link>
      <pubDate>Fri, 29 May 2026 20:54:39 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/posts/328/</guid>
      <description>
        <![CDATA[<h1>同一个动画，我用三种技术栈实现的区别?</h1><p>作者：MoeJue（xxx@example.com）</p>
        
          <p>最近我做了个挺有意思的小实验。<br>
我把一个二次元角色的小动画效果，分别用：</p>
<ul>
<li>WebGL</li>
<li>Canvas 2D</li>
<li>纯 DOM + CSS</li>
</ul>
<p>实现了三遍。<br>
效果本身不复杂：</p>
<ul>
<li>眨眼</li>
<li>眉毛/下眼皮联动</li>
<li>流汗轻微飘动</li>
<li>呆毛甩动</li>
</ul>
<p>但真正有意思的，其实不是“做出来”。<br>
而是：</p>
<blockquote>
<p>同一个东西，用三种技术栈实现时，到底会差多少？</p>
</blockquote>
<p>本质上就是一次“前端图形学味很浓”的复刻实验。</p>
<hr>
<h3 id="一开始只是想复刻一个呆毛动画">
<a class="header-anchor" href="#%e4%b8%80%e5%bc%80%e5%a7%8b%e5%8f%aa%e6%98%af%e6%83%b3%e5%a4%8d%e5%88%bb%e4%b8%80%e4%b8%aa%e5%91%86%e6%af%9b%e5%8a%a8%e7%94%bb"></a>
一开始只是想复刻一个呆毛动画
</h3><p>灵感来源：<a href="https://tamanidamani.itch.io/nijikas-ahoge">https://tamanidamani.itch.io/nijikas-ahoge</a><br>
我当时想法特别简单：“如果是我,要怎么实现？”<br>
然后越做越上头。最后直接演变成：</p>
<blockquote>
<p>那我干脆把 WebGL、Canvas2D、DOM 三种方案都做一遍算了。</p>
</blockquote>
<p>于是仓库就变成了现在这样：</p>
<ul>
<li><a href="https://iajue.github.io/CanvasGame/canvas/index.html">canvas/</a></li>
<li><a href="https://iajue.github.io/CanvasGame/canvas2D/index.html">canvas2D/</a></li>
<li><a href="https://iajue.github.io/CanvasGame/dom/index.html">dom/</a></li>
</ul>
<p>三个版本同效果实现。</p>
<hr>
<h2 id="先说结论">
<a class="header-anchor" href="#%e5%85%88%e8%af%b4%e7%bb%93%e8%ae%ba"></a>
先说结论
</h2><p>如果只让我说一句话：</p>
<h4 id="webgl-最强但-canvas2d-最舒服dom-最适合业务">
<a class="header-anchor" href="#webgl-%e6%9c%80%e5%bc%ba%e4%bd%86-canvas2d-%e6%9c%80%e8%88%92%e6%9c%8ddom-%e6%9c%80%e9%80%82%e5%90%88%e4%b8%9a%e5%8a%a1"></a>
WebGL 最强，但 Canvas2D 最舒服，DOM 最适合业务
</h4><hr>
<h2 id="1-webgl-版本最像真正游戏开发">
<a class="header-anchor" href="#1-webgl-%e7%89%88%e6%9c%ac%e6%9c%80%e5%83%8f%e7%9c%9f%e6%ad%a3%e6%b8%b8%e6%88%8f%e5%bc%80%e5%8f%91"></a>
1. WebGL 版本：最像“真正游戏开发”
</h2><p>这个版本是最折腾的。<br>
因为它本质上已经不是“前端动画”了, 而是：<strong>GPU 图形编程</strong></p>
<hr>
<h3 id="它到底怎么实现的">
<a class="header-anchor" href="#%e5%ae%83%e5%88%b0%e5%ba%95%e6%80%8e%e4%b9%88%e5%ae%9e%e7%8e%b0%e7%9a%84"></a>
它到底怎么实现的？
</h3><p>核心思路其实就是：</p>
<ul>
<li>底图一层</li>
<li>精灵图一层层贴</li>
<li>shader 控制绘制</li>
<li>JS 驱动动画参数</li>
</ul>
<p>比如：</p>
<ul>
<li>呆毛旋转</li>
<li>眨眼裁剪</li>
<li>alpha 混合</li>
</ul>
<p>这些其实都在 GPU 那边做。<br>
你会开始接触：</p>
<ul>
<li>uniform</li>
<li>texture</li>
<li>shader</li>
<li>UV</li>
<li>顶点坐标</li>
<li>纹理坐标</li>
</ul>
<p>然后人会逐渐失去笑容。</p>
        
        <hr><p>本文2026-05-29首发于<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>，最后修改于2026-05-29</p>]]>
      </description>
      
        <category>折腾代码</category>
      
    </item>
    
    

    <item>
      <title>杀死那个手写代码的人</title>
      <link>https://zh.moejue.cn/posts/324/</link>
      <pubDate>Tue, 05 May 2026 20:22:07 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/posts/324/</guid>
      <description>
        <![CDATA[<h1>杀死那个手写代码的人</h1><p>作者：MoeJue（xxx@example.com）</p>
        
          <p><img src="https://gh-proxy.com/github.com/iAJue/MoeJueBlogPic/blob/master/Images/2026/05/05/ChatGPTImage.jpg" alt="图 90"></p>
<p>最近写代码的时候，我有一种很奇怪的感觉。</p>
<p>不是写不动了，也不是不想写，而是——<br>
<strong>好像越来越不需要我写了。</strong></p>
<p>以前一个功能，从需求到上线，基本是这样的路径：</p>
<p>我理解需求 → 设计方案 → 写代码 → 调试 → 改 bug → 上线</p>
<p>现在变成什么样？</p>
<p>我描述需求 → AI 写代码 → AI 改 bug → 我看一眼 → 上线</p>
<p>中间那一大段“写代码”的过程，突然变得很薄，甚至可以没有。</p>
<p>这件事，一开始挺爽的。<br>
但爽着爽着，会有点不安。</p>
<p>过去程序员，除了「完成任务」后获得的成就感，在整个写代码的过程中也能体会到很多乐趣。<br>
<img src="https://gh-proxy.com/github.com/iAJue/MoeJueBlogPic/blob/master/Images/2026/05/05/AC1D7ECA3FF4B43A59565408847C79A4.jpg" alt="图 86"></p>
<hr>
<h2 id="写代码这件事好像没那么重要了">
<a class="header-anchor" href="#%e5%86%99%e4%bb%a3%e7%a0%81%e8%bf%99%e4%bb%b6%e4%ba%8b%e5%a5%bd%e5%83%8f%e6%b2%a1%e9%82%a3%e4%b9%88%e9%87%8d%e8%a6%81%e4%ba%86"></a>
写代码这件事，好像没那么重要了
</h2><p>我以前一直觉得，程序员最核心的能力，就是写代码。</p>
<p>你写得快不快、优不优雅、抽象得好不好，这些东西构成了“水平”的差异。</p>
<p>但现在，这套标准在慢慢失效。</p>
<p>很多代码，其实 AI 写得比人快，也不一定比人差。</p>
<p>尤其是那种：</p>
<ul>
<li>CRUD</li>
<li>接口对接</li>
<li>常规逻辑处理</li>
</ul>
<p>这些东西，AI 基本是碾压式效率。</p>
<p>有时候我自己写了一段，还会下意识丢给 AI：</p>
<p>“你帮我优化一下”</p>
<p>结果它不仅优化了，还顺手把我没想到的情况补上了。</p>
<p>那一刻会有点微妙——<br>
<strong>你开始分不清，这段代码到底是谁写的。</strong><br>
<img src="https://gh-proxy.com/github.com/iAJue/MoeJueBlogPic/blob/master/Images/2026/05/05/585251391-f52fd2e0-c305-47c6-9ef0-99158effae5f.jpg" alt="图 89"></p>
<hr>
<h2 id="更诡异的是你开始不想自己写了">
<a class="header-anchor" href="#%e6%9b%b4%e8%af%a1%e5%bc%82%e7%9a%84%e6%98%af%e4%bd%a0%e5%bc%80%e5%a7%8b%e4%b8%8d%e6%83%b3%e8%87%aa%e5%b7%b1%e5%86%99%e4%ba%86"></a>
更诡异的是：你开始不想自己写了
</h2><p>这才是最危险的。</p>
<p>以前写代码，是一种“控制感”：</p>
<p>每一行都是我敲出来的，我知道它为什么这样写，也知道哪里可能出问题。</p>
<p>但现在，当你习惯了把问题丢给 AI，你会发现：</p>
<blockquote>
<p>自己写，反而变慢了。</p>
</blockquote>
<p>甚至会有一种感觉：</p>
<p><strong>“我为什么要亲自写？”</strong></p>
<p>这不是偷懒，这是效率的自然选择。</p>
<p>就像你不会手算大整数一样，你也不会再想手写那些“可以被自动完成”的代码。</p>
<hr>
<h2 id="程序员正在变成另外一种角色">
<a class="header-anchor" href="#%e7%a8%8b%e5%ba%8f%e5%91%98%e6%ad%a3%e5%9c%a8%e5%8f%98%e6%88%90%e5%8f%a6%e5%a4%96%e4%b8%80%e7%a7%8d%e8%a7%92%e8%89%b2"></a>
程序员，正在变成另外一种角色
</h2><p>慢慢你会发现，你每天在做的事情变了。</p>
        
        <hr><p>本文2026-05-05首发于<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>，最后修改于2026-05-05</p>]]>
      </description>
      
        <category>谈天说地</category>
      
    </item>
    
    

    <item>
      <title>阿珏のBlog 的国际化之路</title>
      <link>https://zh.moejue.cn/posts/291/</link>
      <pubDate>Sun, 02 Nov 2025 10:12:27 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/posts/291/</guid>
      <description>
        <![CDATA[<h1>阿珏のBlog 的国际化之路</h1><p>作者：MoeJue（xxx@example.com）</p>
        
          <p>最近，我给个人博客来了次“大动作”——<br>
从单语言版本升级到了 <strong>多语言站点</strong>（简体中文、繁体中文、英语、日语），<br>
并且全流程实现了自动化。💪</p>
<p>主要包括：</p>
<ul>
<li>自动同步主站文章</li>
<li>自动 AI 翻译内容</li>
<li>自动构建与部署多语言站点</li>
</ul>
<hr>
<h2 id="为什么选择-hugo">
<a class="header-anchor" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e9%80%89%e6%8b%a9-hugo"></a>
为什么选择 Hugo？
</h2><p>因为它那句自信的口号：</p>
<blockquote>
<p>“The world’s fastest framework for building websites.”</p>
</blockquote>
<p>—— 就这句话，我就决定是它了 😆。</p>
<p>不过我没有采用“一套主题多语言切换”的传统做法，<br>
而是让 <strong>每种语言都有独立主题</strong>。<br>
这样每个语言版本都能保留自己的美学与排版风格，<br>
真正做到“文化层面的本地化”。</p>
<hr>
<h2 id="设计目标与约束-">
<a class="header-anchor" href="#%e8%ae%be%e8%ae%a1%e7%9b%ae%e6%a0%87%e4%b8%8e%e7%ba%a6%e6%9d%9f-"></a>
设计目标与约束 🎯
</h2><ul>
<li><strong>语言</strong>：支持简中、繁中、英文、日文，未来还可扩展。</li>
<li><strong>主题</strong>：每种语言使用最合适的 Hugo 主题，而非强行复用。</li>
<li><strong>内容同步</strong>：所有语言共用一份内容仓库，按需翻译。</li>
<li><strong>部署策略</strong>：各语言独立构建与发布，可部署到不同分支或域名。</li>
<li><strong>定制页面</strong>：像“友链”、“书房”、“归档”等页面要在多语言下保持一致体验。</li>
</ul>
<hr>
<h2 id="多语言配置策略-">
<a class="header-anchor" href="#%e5%a4%9a%e8%af%ad%e8%a8%80%e9%85%8d%e7%bd%ae%e7%ad%96%e7%95%a5-"></a>
多语言配置策略 🧩
</h2><p>我为每个语言单独准备了一个配置文件：<br>
<code>config/&lt;lang&gt;.toml</code>，它们主要负责：</p>
<ol>
<li>指定主题（例如 <code>theme = &quot;PaperMod&quot;</code>）。</li>
<li>定义该语言特有的 <code>title</code> / <code>description</code> / <code>keywords</code>。</li>
<li>重写菜单配置 <code>[[params.menu]]</code>，以匹配不同主题的导航结构。</li>
<li>注入自定义样式，保证整体视觉一致。</li>
</ol>
<p>这种结构非常清晰，也方便未来扩展更多语言版本。</p>
<hr>
<h2 id="github-actions-自动部署矩阵-">
<a class="header-anchor" href="#github-actions-%e8%87%aa%e5%8a%a8%e9%83%a8%e7%bd%b2%e7%9f%a9%e9%98%b5-"></a>
GitHub Actions 自动部署矩阵 ⚙️
</h2><p>CI/CD 部分完全交给 GitHub Actions 来处理。<br>
在 <code>.github/workflows/hugo.yml</code> 中，我使用了 <strong>矩阵构建</strong>，<br>
为每种语言独立构建、发布：</p>
        
        <hr><p>本文2025-11-02首发于<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>，最后修改于2025-11-02</p>]]>
      </description>
      
        <category>折腾代码</category>
      
    </item>
    
    

    <item>
      <title>第三代随机二次元 API 来了！</title>
      <link>https://zh.moejue.cn/posts/288/</link>
      <pubDate>Wed, 15 Oct 2025 01:31:22 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/posts/288/</guid>
      <description>
        <![CDATA[<h1>第三代随机二次元 API 来了！</h1><p>作者：MoeJue（xxx@example.com）</p>
        
          <p>还记得那个被你们玩坏的随机图接口吗？今天它更新了！ 在过去的几年里，<strong>随机图 API</strong> 一直是许多前端开发者、二次元站长、甚至桌面插件爱好者的“小玩具”与“常用工具”。</p>
<h3 id="-第一代简单但笨重的起点">
<a class="header-anchor" href="#-%e7%ac%ac%e4%b8%80%e4%bb%a3%e7%ae%80%e5%8d%95%e4%bd%86%e7%ac%a8%e9%87%8d%e7%9a%84%e8%b5%b7%e7%82%b9"></a>
🥇 第一代：简单但笨重的起点
</h3><p>那时候的随机图 API，说实话—— 就是一个 PHP 小脚本 + 一台云主机。 那时的目标很简单：<strong>提供一个能返回随机图片的接口</strong>。</p>
<p><strong>特点如下：</strong></p>
<ul>
<li>所有请求都集中在一台服务器上；</li>
<li>图片存储与 API 服务耦合在一起；</li>
<li>无缓存，无智能分发，完全依赖单点性能；</li>
<li>高峰期 CPU 飙升、502 报错、访问慢、费流量占储存；</li>
</ul>
<pre tabindex="0"><code>[客户端] ---&gt; [中心服务器(唯一)] ---&gt; [图片文件]
</code></pre><h3 id="-第二代云化与缓存的过渡时代">
<a class="header-anchor" href="#-%e7%ac%ac%e4%ba%8c%e4%bb%a3%e4%ba%91%e5%8c%96%e4%b8%8e%e7%bc%93%e5%ad%98%e7%9a%84%e8%bf%87%e6%b8%a1%e6%97%b6%e4%bb%a3"></a>
🥈 第二代：云化与缓存的过渡时代
</h3><p>进入第二代后，随机图 API 迈入了“云化”阶段。 服务迁上云、引入缓存、CDN、负载分发都安排上。</p>
<p><strong>主要变化：</strong></p>
<ul>
<li>图片统一托管在第三方图床（如新浪图床）；</li>
<li>接口运行在云主机或轻量应用服务器上；</li>
<li>增加了基础缓存逻辑（例如 Redis 或 Nginx 缓存层）；</li>
<li>服务整体更稳定，访问速度也显著提升。</li>
</ul>
<pre tabindex="0"><code>[客户端]
   ↓
[云服务器接口层] --&gt; [CDN 缓存] --&gt; [图床(Sina)]
</code></pre><ul>
<li>访问仍需经过中心服务器中转，遇到高并发或地区网络分布不均时，延迟依旧明显。</li>
<li>所有请求还是得经过“中心服务器”，</li>
<li>一旦服务器抽风，全体陪葬 💀。</li>
</ul>
<h3 id="-第三代随机图-api-来了">
<a class="header-anchor" href="#-%e7%ac%ac%e4%b8%89%e4%bb%a3%e9%9a%8f%e6%9c%ba%e5%9b%be-api-%e6%9d%a5%e4%ba%86"></a>
🚀 第三代随机图 API 来了！
</h3><h4 id="-核心亮点">
<a class="header-anchor" href="#-%e6%a0%b8%e5%bf%83%e4%ba%ae%e7%82%b9"></a>
✨ 核心亮点
</h4><p>第三代随机图 API 是一次 <strong>架构级重生</strong>。</p>
<p>依托于 <strong>腾讯云 EdgeOne</strong> 超过 <strong>3200+ 边缘节点</strong> 的强大能力， 请求可在 <strong>全球范围内自动调度</strong> 到离用户最近的节点执行，实现了真正的 <strong>去中心化分布式架构</strong>。</p>
        
        <hr><p>本文2025-10-15首发于<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>，最后修改于2025-10-15</p>]]>
      </description>
      
        <category>二次元</category><category>折腾代码</category>
      
    </item>
    
    

    <item>
      <title>我不会AE,但是我会Code</title>
      <link>https://zh.moejue.cn/posts/280/</link>
      <pubDate>Sat, 23 Aug 2025 12:29:01 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/posts/280/</guid>
      <description>
        <![CDATA[<h1>我不会AE,但是我会Code</h1><p>作者：MoeJue（xxx@example.com）</p>
        
          <h2 id="-緒山まひろの小窝-">
<a class="header-anchor" href="#-%e7%b7%92%e5%b1%b1%e3%81%be%e3%81%b2%e3%82%8d%e3%81%ae%e5%b0%8f%e7%aa%9d-"></a>
✨ 緒山まひろの小窝 ✨
</h2><p><img src="https://mahiro.moejue.cn/static/images/onimai.png" alt="緒山まひろ"></p>
<h3 id="-欢迎来到緒山まひろの小窝-">
<a class="header-anchor" href="#-%e6%ac%a2%e8%bf%8e%e6%9d%a5%e5%88%b0%e7%b7%92%e5%b1%b1%e3%81%be%e3%81%b2%e3%82%8d%e3%81%ae%e5%b0%8f%e7%aa%9d-"></a>
🌸 欢迎来到緒山まひろの小窝 🌸
</h3><p><img src="https://mahiro.moejue.cn/static/images/Mahiro06.png" alt="緒山まひろ"></p>
<p>哇！你发现了我的秘密基地！(*≧ω≦)</p>
<p>这里是緒山まひろ的个人网站，充满了可爱的动画和有趣的内容！ 我会在这里分享我喜欢的动画、漫画、游戏和一些日常生活中的小确幸~</p>
<h3 id="-关于我-">
<a class="header-anchor" href="#-%e5%85%b3%e4%ba%8e%e6%88%91-"></a>
💕 关于我 💕
</h3><p>我是緒山まひろ，エロゲを愛する引きこもりのダメニート。 喜欢动画、漫画、轻小说和各种可爱的东西！ 最喜欢的颜色是粉色和淡蓝色！</p>
<pre tabindex="0"><code>  ∩∩
（･ω･）  &lt;- 这是我！
＿|　⊃／(＿＿
／ └-(＿＿＿／
</code></pre><p><img src="https://mahiro.moejue.cn/static/images/visual_chara_mahiro-mihari.webp" alt="緒山まひろ"></p>
<h3 id="-网站内容-">
<a class="header-anchor" href="#-%e7%bd%91%e7%ab%99%e5%86%85%e5%ae%b9-"></a>
🎀 网站内容 🎀
</h3><ul>
<li>🌟 精美动画展示</li>
<li>📚 我的私房照</li>
<li>🎵 好听的音乐</li>
<li>📷 日常生活的小片段</li>
</ul>
<h3 id="-关于-">
<a class="header-anchor" href="#-%e5%85%b3%e4%ba%8e-"></a>
🌈 关于 🌈
</h3><ul>
<li>🎭 演示: <a href="https://mahiro.moejue.cn/">https://mahiro.moejue.cn/</a></li>
<li>🏠 个人博客: <a href="https://MoeJue.cn/">https://MoeJue.cn/</a></li>
<li>🐱 GitHub: <a href="https://github.com/iAJue/Mahiro">https://github.com/iAJue/Mahiro</a></li>
<li>📧 官网: <a href="https://onimai.jp/">https://onimai.jp/</a></li>
</ul>
<h3 id="-版权声明-">
<a class="header-anchor" href="#-%e7%89%88%e6%9d%83%e5%a3%b0%e6%98%8e-"></a>
📝 版权声明 📝
</h3><ul>
<li>本网站由 @Moejue 设计和开发</li>
<li>网站中使用的所有动画片段、漫画图片、角色形象及相关内容的版权均归原作者(ねことうふ（Nekotofu）)及其发行公司(Studio Bind、Ichijinsha)所有</li>
<li>如有侵权，请通过以上联系方式告知，我会立即删除相关内容</li>
<li>GNU GENERAL PUBLIC LICENSE Version 2</li>
<li>Copyright © 2025 MoeJue. All rights reserved.</li>
</ul>
<h3 id="-特别感谢-">
<a class="header-anchor" href="#-%e7%89%b9%e5%88%ab%e6%84%9f%e8%b0%a2-"></a>
💌 特别感谢 💌
</h3><p>感谢所有喜欢緒山まひろ的朋友们！(●&rsquo;◡&rsquo;●)</p>
        
        <hr><p>本文2025-08-23首发于<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>，最后修改于2025-08-23</p>]]>
      </description>
      
        <category>折腾代码</category>
      
    </item>
    
  </channel>
</rss>
