本地跑项目最烦什么?记端口号。每次新开一个服务,就得想上次开的是 3000 还是 5173,万一跟别的项目撞了还得改。浏览器标签页里全是 `localhost:xxxx` 的无意义字符串,关掉就忘。
Portless 解决的就是这件事——给每个项目发一块固定门牌:`myapp.localhost`,不用管背后跑的哪个端口。
怎么用
装好之后,改一行 package.json script:
- "dev": "next dev" # http://localhost:3000
+ "dev": "portless run next dev" # https://myapp.localhost
或者直接跑命令:
portless myapp next dev
# -> https://myapp.localhost
HTTPS 自动配好,HTTP/2 默认开启。首次跑会自动生成并信任本地 CA,之后每次都是正经的 https://。
核心功能
固定门牌号
每个项目一个 .localhost 子域名。项目名就叫 `myapp`?那地址就是 `myapp.localhost`。下次重开浏览器、换电脑、重启服务,只要项目名不变,地址不变。
自动分配端口 + 自动注入
Portless 在后台跑一个反向代理,自动给项目分配 4000-4999 之间的空闲端口,并注入到 `$PORT` 环境变量。大多数框架(Next.js、Express、Nuxt)直接认这个变量,不用改配置。
HTTPS 开箱即用
第一次跑自动生成本地 CA 并注入系统信任,无需手动配置证书。`--no-tls` 参数可切回纯 HTTP。
Monorepo 原生支持
一个 `portless.json` 放在仓库根目录,自动发现所有 workspace package。无参数跑 `portless` 会同时启动所有有 dev 脚本的 package。子项目子域名规则:`..localhost`。
ngrok 分享(v0.14+)
`--ngrok` 参数把本地服务通过 ngrok 公开到互联网,同时保持本地 `.localhost` 地址可用。子进程收到 `$PORTLESS_NGROK_URL` 环境变量,`portless list` 也会显示 ngrok URL。
Turbo 集成
默认用 turborepo 模式启动子项目,可通过 `portless.json` 的 `turbo: false` 切换到直接 spawn 模式。
Rust 版:portless-rs
还有一个 Rust 重写的版本 portless-rs/portless,二进制只有 1MB。适合不想装 Node.js 环境、追求极致轻量的用户。功能基本一致,但不支持 ngrok 分享这类新特性。
不是没有缺点
需要 root/管理员权限。Linux/macOS 上绑定 443 端口需要 sudo,第一次跑会提示。
Windows 支持一般。Portless 主要面向 macOS/Linux 开发环境,Windows 上需要 WSL2,体验打折扣。
每个项目独立域名。这意味着你机器上跑的项目不能重名,不然域名冲突。比端口号冲突好解决,但还是要稍微管理一下。
安装
npm install -g portless # 推荐全局安装
# 或
npm install -D portless # 项目本地安装
Rust 版:
npm install -g portless-rs
# 或
brew tap portless-rs/portless https://github.com/portless-rs/portless
brew install portless
一句话总结
Portless 适合本地跑多个项目、讨厌记端口号、或者需要稳定 HTTPS 地址(调微信支付、本地 OAuth 等必须 https 的场景)的开发者。9.8K Stars,Vercel Labs 维护,质量有保证。
GitHub:https://github.com/vercel-labs/portless
标签:#Portless #本地开发 #HTTPS #Vercel #开发效率 #Monorepo
关注我,每期分享一个帮你省事的强大工具 🛠️