[{"data":1,"prerenderedAt":83},["ShallowReactive",2],{"case-dev-build-log-sqljs-to-better-sqlite3-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-sqljs-to-better-sqlite3","抓包历史为什么从 sql.js 迁到原生 SQLite","早期 DevPeek 用纯 JavaScript 版 SQLite 存抓包记录，联调一忙就占内存、列表发紧。我们换成系统级原生 SQLite 后，代理可以连续挂一整天，内存也稳。","2026-08-05",false,"DevPeek 开发实录：抓包历史存储从 sql.js 换成原生 SQLite，解决长时间联调内存上涨、列表卡顿，让代理可以挂一整天。","dev-build-log",1,"\u003Ch2>我们遇到的坑：代理挂久了，人比电脑先扛不住\u003C/h2>\n\u003Cp>DevPeek 是联调工具，不是「抓几个包就关」。很多人会让代理开着，手机或 WebView 一直走流量，列表里堆几千条请求，调试页还要翻上午抓过的包。\u003C/p>\n\u003Cp>从 v1.1.4 起，抓包记录会\u003Cstrong>写到本地\u003C/strong>，重启应用也能看近期历史；脚本改过的请求头、响应体也会一并保存。后来协作消息、调试页里的 Network 记录、重发历史，也都需要长期留着。\u003C/p>\n\u003Cp>一开始，我们选了一种\u003Cstrong>跑在 JavaScript 里的 SQLite\u003C/strong>（叫 sql.js，常见于网页里做本地存储）。接入快、不依赖系统原生组件，早期功能少的时候够用。\u003C/p>\n\u003Cp>联调场景一忙起来，坑就暴露了。\u003C/p>\n\u003Ch2>现象：越抓越沉，像「该重启了」\u003C/h2>\n\u003Cp>你自己用 DevPeek 时，如果遇到过下面几种情况，很可能就是同一类问题：\u003C/p>\n\u003Cul>\n\u003Cli>代理从上午开到傍晚，\u003Cstrong>电脑越来越卡\u003C/strong>，任务管理器里 DevPeek 占的内存慢慢往上走。\u003C/li>\n\u003Cli>列表里请求一多，\u003Cstrong>翻页、搜索、点详情\u003C/strong>偶尔顿一下；Mock、断点还在跑，整机像被拖住。\u003C/li>\n\u003Cli>心里默认「联调结束关一下就好」——工具本该在后台默默干活，却像\u003Cstrong>挂久了就得重启\u003C/strong>。\u003C/li>\n\u003C/ul>\n\u003Cp>根因在我们这边：\u003Cstrong>sql.js 把整库放在内存里\u003C/strong>。每来一条抓包、每改一次请求详情，我们都要把\u003Cstrong>越堆越大的整份数据库\u003C/strong>拷贝一遍再写回磁盘——相当于每隔一小段时间，把越堆越厚的笔记本从头到尾复印一次。\u003C/p>\n\u003Cp>抓包越多、每条请求的 Header/Body 越大，复印就越慢、内存峰值越高。代理同时还要解密 HTTPS、跑 Mock、拦断点，卡顿就叠在一起了。\u003C/p>\n\u003Cp>列表看起来能分页、能筛选，但底层仍是「内存里攒一大坨、周期性整库落盘」——和「直接往硬盘上的数据库文件里追加一条」不是一回事。功能继续加（参数转换、页面调试、协作同步）之后，\u003Cstrong>这不是小优化能抹平的\u003C/strong>，而是存储方式选错了。\u003C/p>\n\u003Ch2>我们怎么改的：换成原生 SQLite，为「挂一整天」\u003C/h2>\n\u003Cp>我们\u003Cstrong>一次性\u003C/strong>把抓包、协作等存储，从 sql.js \u003Cstrong>迁到原生 SQLite\u003C/strong>——就是操作系统里那种真正的本地数据库，DevPeek 通过原生模块直接读写磁盘上的文件。\u003C/p>\n\u003Cp>动机很单纯：\u003Cstrong>性能和内存\u003C/strong>。希望 DevPeek 可以\u003Cstrong>连续跑一整天，内存也完全没压力\u003C/strong>。\u003C/p>\n\u003Cp>改完以后，写入方式变了：\u003C/p>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003C/th>\n\u003Cth>以前（sql.js）\u003C/th>\n\u003Cth>现在（原生 SQLite）\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>数据主要在哪\u003C/td>\n\u003Ctd>内存里越堆越大\u003C/td>\n\u003Ctd>在本地数据库文件里\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>怎么保存\u003C/td>\n\u003Ctd>隔一会儿整库拷贝写盘\u003C/td>\n\u003Ctd>来一条记一条，改哪里写哪里\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>挂一整天\u003C/td>\n\u003Ctd>内存容易往上走，偶尔卡\u003C/td>\n\u003Ctd>内存曲线平稳，列表跟手\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Cp>改完以后，\u003Cstrong>代理开着跑一天，列表照常翻、Mock 照点，不用为了「怕卡」而习惯性重启 DevPeek\u003C/strong>。\u003C/p>\n\u003Cp>工程上，原生组件打包、发版会多费些事——我们愿意付这个成本，因为 DevPeek 的定位就是\u003Cstrong>长时间陪联调\u003C/strong>，不能在存储层掉链子。\u003C/p>\n\u003Ch2>改完之后，你能感知到的变化\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>历史保留更多\u003C/strong>：单库可保留的抓包条数，从早期的约 1200 条提高到 \u003Cstrong>5000 条\u003C/strong>（仍会自动删掉最旧的，避免无限膨胀）。\u003C/li>\n\u003Cli>\u003Cstrong>各功能各存各的\u003C/strong>：抓包、协作、调试 Network、重发历史分开存，互不相拖。\u003C/li>\n\u003Cli>\u003Cstrong>长时间联调更放心\u003C/strong>：这是这篇开发实录最想说的——我们踩过的坑是「挂久了内存和卡顿」；换存储之后，才敢说 DevPeek 适合\u003Cstrong>在后台挂一整天\u003C/strong>。\u003C/li>\n\u003C/ul>\n\u003Cp>若你以前某版 DevPeek 有过「越用越卡、只能重启」的体验，欢迎升级后试一下长会话；若仍有问题，到 \u003Ca href=\"https://github.com/GYPengDev/devpeek/discussions\">GitHub Discussions\u003C/a> 说说你的使用场景（大概挂多久、列表多少条），我们对照排查。\u003C/p>\n\u003Ch2>下一篇\u003C/h2>\n\u003Cp>\u003Cstrong>\u003Ca href=\"/blog/dev-build-log-electron-to-tauri/\">DevPeek 架构改造：抛弃 Electron，拥抱 Tauri\u003C/a>\u003C/strong>——业务收到 Core、托盘独立成 Launcher 之后，桌面壳为什么还要再背一整套 Chromium，以及我们怎么换成更薄的 Tauri。\u003C/p>\n\u003Chr>\n\u003Cp>想了解抓包列表与历史记录怎么用，见 \u003Ca href=\"/docs/capture/\">抓包与过滤\u003C/a>。欢迎 \u003Ca href=\"/\">下载 DevPeek 试用\u003C/a>，联调时让代理多挂一会儿，看是否符合你的预期。\u003C/p>\n",{"items":14},[15,23,30,36,43,44,50,56,64,70,77],{"slug":16,"title":17,"summary":18,"date":19,"featured":8,"seoDescription":20,"series":21,"seriesOrder":22},"https-ssl-skip-decrypt","开了 SSL 抓包，有些网站反而打不开？把域名加进「跳过 SSL 代理」","系统代理和证书都没问题，一开 SSL 代理个别站却打不开。多半是源站证书和 Host 对不上。把域名加进「跳过 SSL 代理（隧道）」即可，不必关掉整站 SSL 抓包。","2026-09-01","DevPeek 开了 SSL 代理后部分网站打不开？ERR_TLS_CERT_ALTNAME_INVALID 是源站证书与 Host 不匹配，不是 CA 未信任。用 Include / Exclude：把域名加入「跳过 SSL 代理（隧道）」。","api-debug-new-tricks",3,{"slug":24,"title":25,"summary":26,"date":27,"featured":8,"seoDescription":28,"series":10,"seriesOrder":29},"dev-build-log-silent-auto-update","换掉 Electron 后，自动更新也得重做","DevPeek 换成 Tauri 后，更新的不只是一个窗口，而是 Launcher、Core 和 Shell 三个进程。我们把检查和下载挪到后台，等安装包准备好后，再由托盘完成最后一次重启。","2026-08-28","DevPeek 开发实录：桌面端从 Electron 换到 Tauri 后，如何为 Launcher、Core 和 Shell 重做自动更新，并避免更新过程影响系统代理。",4,{"slug":31,"title":32,"summary":33,"date":34,"featured":8,"seoDescription":35,"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 能做重活；轻量顺序剧本用更短的文本来写。",{"slug":37,"title":38,"summary":39,"date":40,"featured":8,"seoDescription":41,"series":10,"seriesOrder":42},"dev-build-log-electron-to-tauri","DevPeek 架构改造：抛弃 Electron，拥抱 Tauri","联调工具不该为「开一个窗口」再拖一整套 Chromium。我们把业务收到 Core，桌面壳换成 Tauri，安装更轻、后台更省，关窗后托盘里也能随时唤回来。","2026-08-08","DevPeek 开发实录：桌面壳从 Electron 迁到 Tauri，业务留在 Core，壳只负责窗口与系统能力，体积与资源占用更友好。",2,{"slug":4,"title":5,"summary":6,"date":7,"featured":8,"seoDescription":9,"series":10,"seriesOrder":11},{"slug":45,"title":46,"summary":47,"date":48,"featured":8,"seoDescription":49,"series":21,"seriesOrder":42},"mock-map-route-split-api","API 已迁新服务，前端还没发版？用「转发规则」联调","服务拆分后，前端仍请求旧 API，订单接口却已经迁到新服务。使用 DevPeek「转发规则」无需修改前端代码，即可把指定接口转发到新域名；若新服务未完成，还可以用 Mock 先跑通页面。","2026-07-26","微服务联调与 API 域名迁移：用 DevPeek「转发规则」做 API 转发，不改前端即可把旧域名请求指到新服务；服务迁移未完成时可用 Mock 先验页面。附接口联调 Demo。",{"slug":51,"title":52,"summary":53,"date":54,"featured":8,"seoDescription":55,"series":21,"seriesOrder":11},"api-param-encryption-debug","H5 接口参数加密？DevPeek 一键解密调试","联调时接口参数 AES 加密看不到明文？用 DevPeek 参数转换功能，填好密钥和 IV 就能自动解密，还能改参重放。","2026-07-18","用 DevPeek 参数转换功能解密 AES-GCM 加密的 H5 API 请求，支持双向转换、明文编辑、调试重放。",{"slug":57,"title":58,"summary":59,"date":60,"featured":61,"seoDescription":62,"series":63,"seriesOrder":42},"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":65,"title":66,"summary":67,"date":68,"featured":61,"seoDescription":69,"series":63,"seriesOrder":11},"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":71,"title":72,"summary":73,"date":74,"featured":61,"seoDescription":75,"series":76,"seriesOrder":42},"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":78,"title":79,"summary":80,"date":81,"featured":61,"seoDescription":82,"series":76,"seriesOrder":11},"why-we-built-devpeek","我们为什么做 DevPeek（一）：HTTPS 解密了，Body 还是天书","版本日前那晚，TLS 早就解开了，改请求里一个字段却还要翻脚本加解密。于是萌生做一个把业务加解密收进代理的工具——DevPeek 从这儿开始。","2026-07-09","DevPeek 起源系列第一篇：联调时请求体加解密的手工折腾，以及为什么先做一款把业务加解密收进代理的工具。",1788746290285]