Portless:本地端口号换稳定命名 URL,AI 编程神器
Portless:把本地端口号换成稳定命名 URL,AI 编程助手和人类开发者都在用
本地开发时,端口号是每个工程师心里的痛。两个项目同时跑,一个占 3000 一个占 3001,撞上了就 EADDRINUSE;换台电脑接手,README 里写的 localhost:8080 其实早就改成了 3001;AI 编程助手更惨——它读配置猜端口,一改配置全报错。portless 就是来解决这个问题的:把随机分配的端口号换成稳定的命名 URL,比如 myapp.localhost,人和 AI 都能稳定依赖。
功能与原则
portless 是一个本地 DNS 解析 + 反向代理工具,核心做两件事:为每个本地开发服务分配一个固定的 .localhost 域名(基于项目目录名),自动维护端口到域名的映射关系。它不是另一个端口管理器,而是一个本地代理层——端口可以随机分配,但对外暴露的始终是稳定命名,端口变了 URL 不变。
设计原则:零配置优先,框架自适应,多端共享。
认可度
- GitHub Star:约 11,800+(截至 2026-09-03)
- 今日新增:约 73 stars(GitHub Trending 当天榜单位列前排)
- 所属:Vercel Labs(Vercel 官方团队出品)
- 定位:今年 GitHub Trending 常客,开发工具类项目中增速显著
链接
GitHub:https://github.com/vercel-labs/portless
原作者
vercel-labs(Vercel Labs 团队)——Vercel 官方内部孵化项目,背后维护者包括 ctate、Railly、tomdale 等资深开源工程师。定位是”给人类和 AI agent 用的本地 URL 命名工具”。
介绍
portless 的起源是本地开发中一个长期被忽视的摩擦点:端口号天然不稳定(随机分配、经常冲突),但工程师和 AI 工具都不得不在各种配置文件、测试用例、文档里硬编码它。
使用方式极其简单:
# 安装
npm install -g portless
# 启动本地代理(一次,只需 sudo 权限一次)
portless proxy start
# 用命名 URL 运行你的项目
portless myapp next dev
# → 自动路由到 https://myapp.localhost:1355
项目根目录直接运行 portless,它会自动读取 package.json 的项目名作为 URL 前缀;monorepo 场景下子项目自动生成 api.myapp.localhost、docs.myapp.localhost 等子域名,不需要任何配置。
对于 AI coding agent 来说,这解决了大问题:AI 生成的测试文件和环境变量里写的是 http://localhost:3847,但端口每次启动都会变,AI 写的代码实际运行时全部失效。portless 让 URL 恒定为 https://myservice.localhost,AI 的输出稳定可用。
特点
- 稳定命名:项目名即域名,端口随机分配但 URL 固定,AI 和人类都能放心依赖
- 多端共享:团队成员每人都是同一套 URL(
myapp.localhost),无需问”你这服务跑在哪个端口” - HTTPS 默认启用:自动生成本地 CA 证书并信任,
.localhost域名的 HTTPS 开箱即用 - Monorepo 友好:自动为每个 workspace 包分配子域名,monorepo 根目录一条命令启动全部服务
- Git worktree 自动适配:自动检测 git worktree 并在子域名加分支名前缀(
fix-ui.myapp.localhost),不同分支不打架 - AI Coding Agent 原生支持:专为 Claude Code、Cursor 等 AI 编程工具设计,避免 AI 生成的代码里硬编码错误端口
- 框架自适应:支持 Next.js、Vite、Express、Nuxt、Angular、Expo、React Native 等主流框架,无需手动指定端口参数
使用方法
安装
npm install -g portless
基本使用
# 方式一:在 package.json 脚本里用 portless
{
"scripts": {
"dev": "portless run next dev"
}
}
# 方式二:命令行直接运行
portless myapp next dev
# → https://myapp.localhost
# 方式三:monorepo 根目录一键启动所有服务
cd /my-monorepo
portless
代理管理
# 启动本地 HTTPS 代理
portless proxy start
# 查看当前活跃路由
portless list
# 诊断问题
portless doctor
# 清除状态(重置)
portless clean
分享给队友(借助 Tailscale 或 ngrok)
# Tailscale 网络内自动共享
PORTLESS_TAILSCALE=1 portless myapp next dev
# 公网分享(ngrok)
PORTLESS_NGROK=1 portless myapp next dev
使用场景与人群
适用场景:
- Monorepo 开发:多服务并行运行,子域名天然隔离,不需要记每个包的端口
- 团队协作:统一 URL 规范,README 里的链接对所有人有效
- AI Coding Agent 开发:AI 生成代码里引用稳定的命名 URL,不因端口变化而失效
- 多项目并行:同时跑多个客户/项目的本地环境,浏览器 tab 不再混淆
- 文档与演示:对外分享本地服务 URL,Tailscale/ngrok 一键公网暴露
目标用户:
- 前端/全栈工程师(尤其是 monorepo 重度用户)
- 使用 Claude Code、Cursor、Codex 等 AI 编程工具的开发者
- 需要频繁对外演示本地项目的设计师/产品经理
输入与输出案例
案例一:Monorepo 多服务同时运行
输入命令:
cd my-workspace && portless
输出效果:
[portless] Starting proxy...
[portless] myapp → https://myapp.localhost:1355
[portless] api.myapp → https://api.myapp.localhost:1355
[portless] docs.myapp → https://docs.myapp.localhost:1355
浏览器分别打开这三个 URL,全部正确路由,无需记忆端口。
案例二:AI Coding Agent 生成测试文件
AI 生成的代码中包含:
const API_URL = 'http://localhost:3847/api/users';
但下次启动端口随机分配到了 4521,导致测试失败。
使用 portless 后:
const API_URL = 'http://api.myapp.localhost/api/users';
端口无论怎么变,URL 始终有效,AI 生成的代码拿来就能用。
评论区
登录后可评论。