[{"data":1,"prerenderedAt":77},["ShallowReactive",2],{"case-dev-build-log-silent-auto-update-zh":3,"blog-list-zh":13},{"slug":4,"title":5,"summary":6,"date":7,"featured":8,"seoDescription":9,"series":10,"seriesOrder":11,"html":12},"dev-build-log-silent-auto-update","换掉 Electron 后，自动更新也得重做","DevPeek 换成 Tauri 后，更新的不只是一个窗口，而是 Launcher、Core 和 Shell 三个进程。我们把检查和下载挪到后台，等安装包准备好后，再由托盘完成最后一次重启。","2026-08-28",false,"DevPeek 开发实录：桌面端从 Electron 换到 Tauri 后，如何为 Launcher、Core 和 Shell 重做自动更新，并避免更新过程影响系统代理。","dev-build-log",4,"\u003Ch2>「静默」不是替你点了重启\u003C/h2>\n\u003Cp>DevPeek 往往一开就是半天。代理挂着，\u003Ca href=\"/docs/mock/\">Mock\u003C/a> 和 \u003Ca href=\"/docs/param-transform/\">参数转换\u003C/a> 还在工作，列表里也留着刚才的请求。更新提示偏偏在这时跳出来，问你要不要立即重启。\u003C/p>\n\u003Cp>我们不想做那种发现新版本就催着重启的更新器，也不打算在用户不知情时强制安装。这里说的「静默」很具体：后台检查版本、下载安装包；等一切准备好，再提示一次。只有用户点了「立即更新」，DevPeek 才会退出并替换文件。\u003C/p>\n\u003Cp>重启省不掉，但等待下载的时间可以省掉，也不用让一个进度条占着主窗口。\u003C/p>\n\u003Ch2>updater 还在，应用已经不是原来的应用了\u003C/h2>\n\u003Cp>\u003Ca href=\"/blog/dev-build-log-electron-to-tauri/\">上一篇\u003C/a> 讲过现在的进程结构：Launcher 负责托盘和进程管理，Core 跑代理，Tauri Shell 只负责显示界面。关闭主窗口时，前两个进程仍会留在后台。\u003C/p>\n\u003Cp>Electron 时代用的是 \u003Cstrong>electron-updater\u003C/strong>，桌面主进程既是应用入口，也是更新入口。换壳后，这个前提不存在了。Tauri 也有 updater，但它解决的是 Tauri 应用自身的更新，没法顺手替我们协调外面的 Launcher 和 Core。\u003C/p>\n\u003Cp>难点其实不在「把安装包下载下来」，而在下载完以后谁来收尾：\u003C/p>\n\u003Cul>\n\u003Cli>主窗口可能早就关了；\u003C/li>\n\u003Cli>Core 还占着端口，Shell 和 Launcher 也占着各自的文件；\u003C/li>\n\u003Cli>安装前要停掉三个进程，安装后还要把 Launcher 拉起来；\u003C/li>\n\u003Cli>标准模式和 Lite 模式入口不同，但最后更新的是同一套桌面程序。\u003C/li>\n\u003C/ul>\n\u003Cp>所以更新任务最后落到了 \u003Cstrong>Launcher\u003C/strong>。它本来就在管理 Core 和 Shell，也不会随主窗口一起退出，由它来判断什么时候检查、什么时候通知、什么时候真正安装，进程关系最简单。\u003C/p>\n\u003Ch2>下载可以慢慢来，覆盖必须一次完成\u003C/h2>\n\u003Cp>Windows 和 macOS 会在启动约一分半后检查一次，之后每隔几小时再检查。发现新版本后，安装包在后台下载并校验，不影响正在经过代理的流量。\u003C/p>\n\u003Cp>包准备好后，托盘会显示「更新就绪」。可以立即安装，也可以关掉提示，等手头的联调结束再说。\u003C/p>\n\u003Cp>点下「立即更新」后，Launcher 才开始停 Core 和 Shell，最后退出自己并启动安装。Windows 不再弹安装向导；macOS 替换应用后重新拉起托盘。这个过程中 DevPeek 会短暂离线，因为正在运行的程序不可能一边占着文件，一边安全地覆盖自己。\u003C/p>\n\u003Cp>我们试过考虑差量更新，最后仍然选择完整安装包。v1.2.1 之后目录结构变化较大，差量补丁省下的流量有限，却会多出版本匹配、文件缺失和跨版本升级的问题。对目前的体量来说，整包更容易验证，也更容易把失败范围控制住。\u003C/p>\n\u003Ch2>更新器还得绕开 DevPeek 自己\u003C/h2>\n\u003Cp>还有一个只在代理工具里比较明显的问题：DevPeek 自己可能就是当前的系统代理。\u003C/p>\n\u003Cp>如果检查和下载也读取系统代理设置，请求会先绕进 DevPeek，再由 DevPeek 发往更新服务器。平时这么走未必出错，但安装阶段 Core 会退出，这条路径随时会断。更麻烦的是，一旦更新逻辑本身依赖代理，就可能出现「为了更新先关代理，关了代理又下不完更新」的循环。\u003C/p>\n\u003Cp>因此，更新请求会绕开系统代理，直接连接更新源。正式退出前，Launcher 还会先恢复系统代理设置，避免 Core 已经停了，浏览器却仍指向原来的本机端口。这个处理和正常退出时一致，相关设置见 \u003Ca href=\"/docs/proxy-ssl/\">代理与 SSL 证书\u003C/a>。\u003C/p>\n\u003Ch2>先在 Windows 和 macOS 上落地\u003C/h2>\n\u003Cp>这套更新流程会随 1.3.0 提供，覆盖 Windows 和 macOS。\u003C/p>\n\u003Cp>Lite 模式虽然在浏览器里使用界面，只要 Launcher 仍在运行，也能收到「更新就绪」提示。安装动作仍由 Launcher 完成，不是由浏览器更新桌面程序。关于页的手动检查也会继续保留。\u003C/p>\n\u003Cp>版本发布后，如果遇到安装包已经下载完成、点击后却没有更新，或者重启后系统代理没有恢复，可以到 \u003Ca href=\"https://github.com/GYPengDev/devpeek/discussions\">GitHub Discussions\u003C/a> 留下系统版本，以及使用的是标准模式还是 Lite 模式。完整改动可查看 \u003Ca href=\"/changelog/\">1.3.0 更新日志\u003C/a>。\u003C/p>\n\u003Ch2>相关文档\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"/docs/install/\">安装与首选项\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"/docs/proxy-ssl/\">代理与 SSL 证书\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"/changelog/\">更新日志\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"/docs/faq/\">常见问题\u003C/a>\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Cp>当前版本仍可从 \u003Ca href=\"/\">DevPeek 官网\u003C/a> 下载，并在关于页手动检查更新。\u003C/p>\n",{"items":14},[15,16,23,30,37,44,50,58,64,71],{"slug":4,"title":5,"summary":6,"date":7,"featured":8,"seoDescription":9,"series":10,"seriesOrder":11},{"slug":17,"title":18,"summary":19,"date":20,"featured":8,"seoDescription":21,"series":10,"seriesOrder":22},"dev-build-log-ws-mock-dsl","为什么我们重新设计了 WebSocket Mock DSL，而不是用 YAML、JSON 或 JS","轻量 WebSocket Mock 不该比 HTTP Mock 更重。YAML、JSON、JS 都能做，但写「连上、登录、心跳」太啰嗦。我们自研短 DSL，就是让轻量 Mock 更轻。","2026-08-13","DevPeek 开发实录：为什么 WebSocket Mock 自研 Flow DSL。现成 YAML、JSON、JS 能做重活；轻量顺序剧本用更短的文本来写。",3,{"slug":24,"title":25,"summary":26,"date":27,"featured":8,"seoDescription":28,"series":10,"seriesOrder":29},"dev-build-log-electron-to-tauri","DevPeek 架构改造：抛弃 Electron，拥抱 Tauri","联调工具不该为「开一个窗口」再拖一整套 Chromium。我们把业务收到 Core，桌面壳换成 Tauri，安装更轻、后台更省，关窗后托盘里也能随时唤回来。","2026-08-08","DevPeek 开发实录：桌面壳从 Electron 迁到 Tauri，业务留在 Core，壳只负责窗口与系统能力，体积与资源占用更友好。",2,{"slug":31,"title":32,"summary":33,"date":34,"featured":8,"seoDescription":35,"series":10,"seriesOrder":36},"dev-build-log-sqljs-to-better-sqlite3","抓包历史为什么从 sql.js 迁到原生 SQLite","早期 DevPeek 用纯 JavaScript 版 SQLite 存抓包记录，联调一忙就占内存、列表发紧。我们换成系统级原生 SQLite 后，代理可以连续挂一整天，内存也稳。","2026-08-05","DevPeek 开发实录：抓包历史存储从 sql.js 换成原生 SQLite，解决长时间联调内存上涨、列表卡顿，让代理可以挂一整天。",1,{"slug":38,"title":39,"summary":40,"date":41,"featured":8,"seoDescription":42,"series":43,"seriesOrder":29},"mock-map-route-split-api","API 已迁新服务，前端还没发版？用「转发规则」联调","服务拆分后，前端仍请求旧 API，订单接口却已经迁到新服务。使用 DevPeek「转发规则」无需修改前端代码，即可把指定接口转发到新域名；若新服务未完成，还可以用 Mock 先跑通页面。","2026-07-26","微服务联调与 API 域名迁移：用 DevPeek「转发规则」做 API 转发，不改前端即可把旧域名请求指到新服务；服务迁移未完成时可用 Mock 先验页面。附接口联调 Demo。","api-debug-new-tricks",{"slug":45,"title":46,"summary":47,"date":48,"featured":8,"seoDescription":49,"series":43,"seriesOrder":36},"api-param-encryption-debug","H5 接口参数加密？DevPeek 一键解密调试","联调时接口参数 AES 加密看不到明文？用 DevPeek 参数转换功能，填好密钥和 IV 就能自动解密，还能改参重放。","2026-07-18","用 DevPeek 参数转换功能解密 AES-GCM 加密的 H5 API 请求，支持双向转换、明文编辑、调试重放。",{"slug":51,"title":52,"summary":53,"date":54,"featured":55,"seoDescription":56,"series":57,"seriesOrder":29},"h5-debug-console-mock","H5 调试实战（二）：Android WebView 白屏排查，从 Console 远程定位到 Mock 验证","活动 H5 在部分 Android 设备中点击按钮后白屏，请求全部 200 却没有页面反馈。通过 DevPeek Console 获取线上 WebView 运行日志，远程 eval 确认 polyfill 覆盖问题，再使用 Mock 验证异常状态下的降级页面。","2026-07-13",true,"H5 调试实战第二篇：排查 Android WebView 白屏问题。通过 Console 远程调试定位 JavaScript polyfill 兼容问题，并结合 Mock 验证接口异常场景下的页面降级逻辑。","h5-debug",{"slug":59,"title":60,"summary":61,"date":62,"featured":55,"seoDescription":63,"series":57,"seriesOrder":36},"wechat-h5-storage-debug","H5 调试实战（一）：微信 H5 localStorage 调试，在电脑上修改真机缓存","微信 H5 换测试号后头像仍显示旧用户，抓包确认接口正常，却定位到 localStorage 遗留旧数据。本文记录一次真实联调过程，以及如何在电脑上查看、修改微信 WebView 的 localStorage、sessionStorage 和 IndexedDB。","2026-07-11","微信 H5 调试实战：通过真实案例定位 localStorage、sessionStorage、IndexedDB 导致的数据缓存问题，对比 vConsole、Remote Debug 等方案，介绍真机 WebView 调试思路。",{"slug":65,"title":66,"summary":67,"date":68,"featured":55,"seoDescription":69,"series":70,"seriesOrder":29},"why-we-built-devpeek-h5-debug","我们为什么做 DevPeek（二）：App 里那页 H5，在电脑上也能对着查","登录接口用参数转换啃下来了，活动页 H5 却在 App WebView 里才崩。真机 remote debug 折腾一圈，DOM 和抓包还是两拨窗口——于是把镜像和自研调试面板收进 DevPeek。","2026-07-10","DevPeek 起源系列第二篇：App 内嵌 H5 只在真机出问题、remote debug 与抓包割裂的联调痛点，以及调试 Tab 如何把页面镜像到电脑并用自研面板查 DOM、Console 与 Network。","origin",{"slug":72,"title":73,"summary":74,"date":75,"featured":55,"seoDescription":76,"series":70,"seriesOrder":36},"why-we-built-devpeek","我们为什么做 DevPeek（一）：HTTPS 解密了，Body 还是天书","版本日前那晚，TLS 早就解开了，改请求里一个字段却还要翻脚本加解密。于是萌生做一个把业务加解密收进代理的工具——DevPeek 从这儿开始。","2026-07-09","DevPeek 起源系列第一篇：联调时请求体加解密的手工折腾，以及为什么先做一款把业务加解密收进代理的工具。",1787966596784]