## 现状问题 `internal/runtime/browser_devserver.go` 中的 `devServerClientFor`(约 61 行)同时承担三件事: 1. 在 `devServerClients` 锁内淘汰空闲客户端、命中缓存直接返回; 2. 缓存失效时查询沙箱端点并双检缓存; 3. 内联构造一整套 `http.Transport`(DialContext 解析端口、走 `devServerDial`、包装 `devServerDialError`,以及连接池/超时参数)和 `http.Client`(禁止跟随重定向)。 第 3 部分约 30 行和缓存逻辑无关,却夹在加锁区域里,读缓存逻辑时要跳过一大段传输配置;传输层的行为(端口解析报错、拨号错误包装、不跟随重定向)也没法单独测试。 ## 重构方案 - 把第 3 部分原样抽成 `newDevServerHTTPClient(endpoint browserEndpoint) *http.Client`; - `devServerClientFor` 只保留缓存淘汰、端点查询和缓存写入,调用新函数拿到 client; - Transport 参数(`MaxIdleConnsPerHost: 8`、`IdleConnTimeout: 90s`、`ResponseHeaderTimeout: 2m`、`ForceAttemptHTTP2: false`)、注释、拨号逻辑和重定向策略逐字不变。 ## 影响范围 仅 `internal/runtime/browser_devserver.go` 一个函数内部;包外接口、调用方、错误类型与文案均不变。新增一个测试文件。 ## 验证方式 - 新增单测覆盖 `newDevServerHTTPClient`:不跟随重定向、Transport 参数、拨号把 endpoint 与端口传给 `devServerDial`、拨号失败被包装为 `devServerDialError`、非法端口直接报错; - `gofmt`、`go vet ./internal/runtime/`、`go test ./internal/runtime/` 通过。
Activity
【架构优化】从 devServerClientFor 中拆出开发服务器 HTTP 客户端构造 newDevServerHTTPClient
Robert0622 commentedon Nov 14, 2026
已对照当前 main 代码核实:
internal/runtime/browser_devserver.go:133的devServerClientFor内确实内联构造了完整的http.Transport/http.Client(连接池、超时、拨号包装、禁止重定向),仓库内未发现newDevServerHTTPClient(grep 无命中),与描述完全匹配,方案与验收标准清晰可执行,非重复。已记入本 Loop 候选,backlog 当前已满(5/5),待腾出名额后建单开发。