EADDRINUSE表示端口已被占用,需先查清占用进程并终止,再通过修改package.json脚本或环境变量(如PORT=8081)调整启动端口,避免残留node进程导致问题复发。

直接改 npm run serve 启动的端口就行,Layui 本身不带服务器,你遇到的 Error: listen EADDRINUSE 实际来自它依赖的前端构建工具(比如 Vue CLI、Vite 或 webpack-dev-server),不是 Layui 的错。
查清到底是哪个工具在监听端口
Layui 是纯前端 UI 库,没内置 dev server。你本地启动调试服务,大概率是用了以下之一:
- Vue CLI 项目(
vue create创建):默认走webpack-dev-server,端口 8080 - Vite 项目(
npm create vite@latest):默认端口 5173 - 用
http-server或live-server手动起的服务:端口通常 8080 / 3000 / 8000
报错里出现的 :::8080 或 0.0.0.0:5173 就是线索——先看终端错误完整行,抓出那个端口号。
改 package.json 里的启动命令
找到项目根目录下的 package.json,看 "scripts" 里 "serve" 或 "dev" 对应的命令:
- 如果是 Vue CLI:
"serve": "vue-cli-service serve"→ 改成"serve": "vue-cli-service serve --port 8081" - 如果是 Vite:
"dev": "vite"→ 改成"dev": "vite --port 5174" - 如果是
http-server:"dev": "http-server -p 8080"→ 改成"dev": "http-server -p 8082"
改完保存,再运行 npm run serve(或对应 script 名)即可生效。不需要重启终端或清缓存。
不想每次改命令?用环境变量更灵活
某些工具支持环境变量覆盖端口,比硬编码更可持续:
- Vue CLI:启动前设
PORT=8081(macOS/Linux)或set PORT=8081(Windows),再npm run serve - Vite:同样认
PORT=5174,且会自动 fallback 到下一个可用端口(加--strictPort可禁用该行为) - 注意:
http-server不读PORT环境变量,必须显式传-p
这种写法适合团队协作或 CI 场景,避免把端口写死在脚本里。
为什么改了还报 EADDRINUSE?检查残留 node 进程
常见但容易被忽略的情况:上次 Ctrl+C 没真正杀掉进程,它还在后台占着端口。
- macOS/Linux:运行
lsof -i :8080(把 8080 换成你报错的端口),看有没有node进程;有就kill -9 [PID] - Windows:运行
netstat -ano | findstr :8080,找 PID,再taskkill /PID [PID] /F - 通用清理:执行
pkill -f "node.*serve\|vite\|http-server"(macOS/Linux)或taskkill /IM node.exe /F(Windows,慎用,会杀所有 node)
尤其用过 nodemon 或频繁保存触发热重载的场景,残留概率很高——别只盯着改端口,先确认端口真空着。
真正卡住的点往往不在配置,而在你以为“已经停了”的那个旧进程。查 lsof 或 netstat 一眼就能验证,比反复改端口号快得多。


















