<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Github-Pages on iwmei的博客</title><link>https://iwmei.top/tags/github-pages/</link><description>Recent content in Github-Pages on iwmei的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>iwmei</copyright><lastBuildDate>Mon, 04 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://iwmei.top/tags/github-pages/index.xml" rel="self" type="application/rss+xml"/><item><title>PubArticle2MD 项目复盘：从“能跑”到“可交付”</title><link>https://iwmei.top/p/pubarticle2md-from-working-to-deliverable/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><guid>https://iwmei.top/p/pubarticle2md-from-working-to-deliverable/</guid><description>&lt;img src="https://iwmei.top/p/pubarticle2md-from-working-to-deliverable/cover.png" alt="Featured image of post PubArticle2MD 项目复盘：从“能跑”到“可交付”" />&lt;p>这篇文章记录 &lt;code>PubArticle2MD&lt;/code> 的完整落地过程。&lt;/p>
&lt;p>项目目标不复杂：把公众号文章转成 Markdown 或 PDF，并且给出三种可用形态：&lt;/p>
&lt;ul>
&lt;li>在线可用（GitHub Pages）&lt;/li>
&lt;li>本地源码可跑&lt;/li>
&lt;li>桌面 EXE 可直接用&lt;/li>
&lt;/ul>
&lt;p>真正的难点不在“功能写出来”，而在“交付后别人也能稳定用”。下面按时间顺序展开。&lt;/p>
&lt;h2 id="1-项目目标">1. 项目目标
&lt;/h2>&lt;p>初始目标有 4 个：&lt;/p>
&lt;ol>
&lt;li>参考 &lt;code>wechat2pdf&lt;/code> 思路，实现公众号文章转 &lt;code>Markdown/PDF&lt;/code>。&lt;/li>
&lt;li>支持本地运行，尽量不把内容上传到第三方。&lt;/li>
&lt;li>提供 PWA 入口，发布到 GitHub Pages。&lt;/li>
&lt;li>争取提供普通用户可直接运行的 EXE。&lt;/li>
&lt;/ol>
&lt;p>测试文章：
&lt;code>https://mp.weixin.qq.com/s/5BOAnJ5H4seYxSbXWi5Ibg&lt;/code>&lt;/p>
&lt;h2 id="2-第一版实现先把主链路跑通">2. 第一版实现：先把主链路跑通
&lt;/h2>&lt;p>项目先拆成两层：&lt;/p>
&lt;ul>
&lt;li>前端（PWA）：输入链接、选择抓取模式、预览内容、下载文件。&lt;/li>
&lt;li>后端（Node API）：&lt;code>/api/health&lt;/code>、&lt;code>/api/parse&lt;/code>、&lt;code>/api/export/markdown&lt;/code>、&lt;code>/api/export/pdf&lt;/code>。&lt;/li>
&lt;/ul>
&lt;p>PDF 由 Playwright 在后端渲染，优先保证稳定性。&lt;/p>
&lt;p>核心代码位置：&lt;/p>
&lt;ul>
&lt;li>&lt;code>public/app.js&lt;/code>&lt;/li>
&lt;li>&lt;code>server/index.js&lt;/code>&lt;/li>
&lt;li>&lt;code>desktop/main.js&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>第一版发布后，基本功能可用，但工程问题开始集中出现。&lt;/p>
&lt;h2 id="3-问题一github-pages-404">3. 问题一：GitHub Pages 404
&lt;/h2>&lt;h3 id="现象">现象
&lt;/h3>&lt;p>Pages 地址访问 404，页面提示：
&lt;code>There isn't a GitHub Pages site here.&lt;/code>&lt;/p>
&lt;h3 id="排查结果">排查结果
&lt;/h3>&lt;p>部署日志显示，问题不在前端资源，而在 Pages 发布状态。工作流存在，但站点链路没有完整激活。&lt;/p>
&lt;h3 id="处理方式">处理方式
&lt;/h3>&lt;ol>
&lt;li>检查仓库 Pages 配置。&lt;/li>
&lt;li>重新触发部署。&lt;/li>
&lt;li>部署后回测 URL。&lt;/li>
&lt;/ol>
&lt;p>恢复后的在线入口：
&lt;a class="link" href="https://yourpapayouknow.github.io/PubArticle2MD/" target="_blank" rel="noopener"
>https://yourpapayouknow.github.io/PubArticle2MD/&lt;/a>&lt;/p>
&lt;h2 id="4-问题二有-actions-不代表可直接使用">4. 问题二：有 Actions 不代表“可直接使用”
&lt;/h2>&lt;p>当时发现一个常见误区：流水线很多，但用户路径不清晰。&lt;/p>
&lt;p>后续做了收敛：&lt;/p>
&lt;ol>
&lt;li>&lt;code>CI&lt;/code> 负责基本检查。&lt;/li>
&lt;li>&lt;code>Deploy GitHub Pages&lt;/code> 只负责发布 &lt;code>public/&lt;/code>。&lt;/li>
&lt;li>README 只讲用户需要的路径，删掉不必要的流程噪音。&lt;/li>
&lt;/ol>
&lt;p>目标从“流程完整”改为“用户可用”。这一步很关键。&lt;/p>
&lt;h2 id="5-问题三核心问题exe-是前端壳不是完整应用">5. 问题三（核心问题）：EXE 是前端壳，不是完整应用
&lt;/h2>&lt;h3 id="现象-1">现象
&lt;/h3>&lt;p>桌面版运行后：&lt;/p>
&lt;ul>
&lt;li>选择本地 API 会报“当前环境没有本地 API 服务”。&lt;/li>
&lt;li>运行模式一直显示“纯前端模式（GitHub Pages）”。&lt;/li>
&lt;/ul>
&lt;h3 id="根因">根因
&lt;/h3>&lt;p>桌面进程只做了 &lt;code>loadFile(index.html)&lt;/code>，没有启动本地服务。&lt;/p>
&lt;p>前端会请求 &lt;code>./api/health&lt;/code> 判断本地 API 是否存在。服务没启动，检测自然失败，所以始终落在纯前端模式。&lt;/p>
&lt;h3 id="修复动作">修复动作
&lt;/h3>&lt;ol>
&lt;li>Electron 主进程直接启动本地 API。
&lt;ul>
&lt;li>&lt;code>host=127.0.0.1&lt;/code>&lt;/li>
&lt;li>&lt;code>port=0&lt;/code>（自动分配端口，避免冲突）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>窗口优先加载本地 API URL；失败再降级到本地 HTML。&lt;/li>
&lt;li>在 &lt;code>before-quit&lt;/code> 里关闭 server，避免残留进程。&lt;/li>
&lt;li>&lt;code>/api/health&lt;/code> 增加 &lt;code>runtime&lt;/code> 字段，前端按运行态显示文案：
&lt;ul>
&lt;li>本地 API 模式（桌面 EXE 内置后端）&lt;/li>
&lt;li>本地 API 模式（Node 服务）&lt;/li>
&lt;li>纯前端模式（GitHub Pages）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>修复后，EXE 从“页面容器”变成了“前后端一体应用”。&lt;/p>
&lt;h2 id="6-问题四桌面版要稳定运行环境必须随包">6. 问题四：桌面版要稳定，运行环境必须随包
&lt;/h2>&lt;p>桌面版即使能启动，如果依赖没打进包，用户机器仍会失败。&lt;/p>
&lt;p>这里主要处理两件事：&lt;/p>
&lt;ol>
&lt;li>后端代码进包。&lt;/li>
&lt;li>Playwright Chromium 随包。&lt;/li>
&lt;/ol>
&lt;h3 id="对应改动">对应改动
&lt;/h3>&lt;ol>
&lt;li>&lt;code>package.json&lt;/code> 的 &lt;code>build.files&lt;/code> 增加 &lt;code>server/**/*&lt;/code>。&lt;/li>
&lt;li>新增脚本 &lt;code>scripts/ensure-playwright-browsers.js&lt;/code>：
&lt;ul>
&lt;li>打包前检查 &lt;code>.local-browsers&lt;/code>&lt;/li>
&lt;li>缺失时自动安装 Chromium&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>extraResources&lt;/code> 加入浏览器目录。&lt;/li>
&lt;li>启动时设置 &lt;code>PLAYWRIGHT_BROWSERS_PATH=resources/playwright-browsers&lt;/code>。&lt;/li>
&lt;li>排除 asar 内重复浏览器资源，避免包体翻倍。&lt;/li>
&lt;/ol>
&lt;p>这一步解决了“本机可用、别人不可用”的典型问题。&lt;/p>
&lt;h2 id="7-问题五windows-本地发布脚本首次失败">7. 问题五：Windows 本地发布脚本首次失败
&lt;/h2>&lt;h3 id="现象-2">现象
&lt;/h3>&lt;p>执行以下命令首次失败：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm run release:local -- --tag v1.0.2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>报错停在：&lt;code>npm.cmd run desktop:dist&lt;/code>。&lt;/p>
&lt;h3 id="根因-1">根因
&lt;/h3>&lt;p>Windows 下子进程执行 &lt;code>.cmd&lt;/code> 时，&lt;code>spawnSync&lt;/code> 的默认参数不稳定。&lt;/p>
&lt;h3 id="修复">修复
&lt;/h3>&lt;p>在 &lt;code>scripts/release-local.js&lt;/code> 中对 Windows 开启 &lt;code>shell: true&lt;/code>。&lt;/p>
&lt;p>随后发布链路跑通：&lt;/p>
&lt;ol>
&lt;li>本地构建 EXE&lt;/li>
&lt;li>创建 GitHub Release&lt;/li>
&lt;li>上传发布资产&lt;/li>
&lt;/ol>
&lt;p>版本地址：
&lt;a class="link" href="https://github.com/yourpapayouknow/PubArticle2MD/releases/tag/v1.0.2" target="_blank" rel="noopener"
>https://github.com/yourpapayouknow/PubArticle2MD/releases/tag/v1.0.2&lt;/a>&lt;/p>
&lt;h2 id="8-当前状态">8. 当前状态
&lt;/h2>&lt;p>项目目前可以对外稳定使用：&lt;/p>
&lt;ol>
&lt;li>Pages 在线版可用。&lt;/li>
&lt;li>EXE 内置本地 API，不再是前端壳。&lt;/li>
&lt;li>PDF 依赖环境已随包。&lt;/li>
&lt;li>本地打包和发布流程可复现。&lt;/li>
&lt;li>文档已按用户路径重写。&lt;/li>
&lt;/ol>
&lt;h2 id="9-使用方法">9. 使用方法
&lt;/h2>&lt;h3 id="91-在线版无需安装">9.1 在线版（无需安装）
&lt;/h3>&lt;p>地址：
&lt;a class="link" href="https://yourpapayouknow.github.io/PubArticle2MD/" target="_blank" rel="noopener"
>https://yourpapayouknow.github.io/PubArticle2MD/&lt;/a>&lt;/p>
&lt;p>步骤：&lt;/p>
&lt;ol>
&lt;li>输入公众号链接。&lt;/li>
&lt;li>直连失败时切换“代理 URL”或“粘贴 HTML”。&lt;/li>
&lt;li>点击解析。&lt;/li>
&lt;li>下载 Markdown ZIP 或 PDF。&lt;/li>
&lt;/ol>
&lt;p>示例链接：
&lt;code>https://mp.weixin.qq.com/s/5BOAnJ5H4seYxSbXWi5Ibg&lt;/code>&lt;/p>
&lt;h3 id="92-桌面-exe推荐">9.2 桌面 EXE（推荐）
&lt;/h3>&lt;ol>
&lt;li>打开 Release：
&lt;a class="link" href="https://github.com/yourpapayouknow/PubArticle2MD/releases/tag/v1.0.2" target="_blank" rel="noopener"
>https://github.com/yourpapayouknow/PubArticle2MD/releases/tag/v1.0.2&lt;/a>&lt;/li>
&lt;li>下载并运行 EXE。&lt;/li>
&lt;li>确认运行模式显示为“本地 API 模式（桌面 EXE 内置后端）”。&lt;/li>
&lt;/ol>
&lt;h3 id="93-本地源码运行">9.3 本地源码运行
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm install
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run install:chromium
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm start
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>访问：&lt;code>http://127.0.0.1:8787&lt;/code>&lt;/p>
&lt;h3 id="94-命令行批量转换">9.4 命令行批量转换
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm run convert -- --url &lt;span class="s2">&amp;#34;https://mp.weixin.qq.com/s/5BOAnJ5H4seYxSbXWi5Ibg&amp;#34;&lt;/span> --outdir outputs
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="95-本机打包并发布">9.5 本机打包并发布
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">gh auth login
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run release:local -- --tag v1.0.2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="10-这次复盘的核心结论">10. 这次复盘的核心结论
&lt;/h2>&lt;p>这个项目最大的收获，不是“做完了一个工具”，而是把工具做成了可交付物。&lt;/p>
&lt;p>判断标准很直接：&lt;/p>
&lt;ul>
&lt;li>用户能在线用。&lt;/li>
&lt;li>用户能安装用。&lt;/li>
&lt;li>开发者能本地复现。&lt;/li>
&lt;li>版本能持续发布。&lt;/li>
&lt;/ul>
&lt;p>从结果看，真正推动项目跨过这道线的，往往不是新功能，而是对“不可用细节”的持续修复。&lt;/p></description></item></channel></rss>