React Native 8081端口被占用时,应先用lsof(macOS/Linux)或Get-NetTCPConnection(Windows PowerShell)查PID,再用taskkill /f /t /pid(Windows)或kill -9(macOS/Linux)彻底终止进程及子线程,并同步更新adb reverse映射与metro.config.js配置。

查端口谁在占着:别信“没进程”,先看 PID
React Native 的 8081(或你改过的其他端口)被占,不是“没人在用”,而是 Node 进程残留、杀毒软件(如 McAfee)、甚至 VS Code 自身的 Code Helper 在监听。直接在 VS Code 内置终端执行对应命令,别切出去:
macOS/Linux:lsof -ni :8081(加 -n 防 DNS 卡住)
Windows PowerShell:Get-NetTCPConnection -LocalPort 8081(直接输出 OwningProcess 字段)
Windows CMD:netstat -ano | findstr :8081(PID 是十进制,需去任务管理器“详细信息”页对照)
如果 lsof 报 command not found,macOS 先运行 xcode-select --install;Windows 若 netstat 不可用,必须换 PowerShell 命令。
杀进程不能只 kill node.exe:子进程会续命
查到 PID 后,别直接 kill -9 或任务管理器“结束任务”。React Native 启动时拉起的 node 进程常挂载 yarn、adb、打包服务等子线程,硬杀主进程后它们还在占端口:
macOS/Linux:先 kill <code>PID(发 SIGTERM),等 2 秒无响应再 kill -9 <code>PID
Windows:必须带 /t 参数——taskkill /f /t /pid <code>PID
更彻底清理 VS Code 相关全家桶:
macOS/Linux:killall -r "Code Helper|Code|Electron"
Windows:taskkill /f /t /im Code.exe && taskkill /f /t /im CodeHelper.exe
杀完立刻验证:lsof -i :8081 或 Get-NetTCPConnection -LocalPort 8081 应无输出。
改端口要对症下药:launch.json 不管用 React Native 的包管理器
VS Code 的 launch.json 里改 port 字段,只影响 Node.js 调试器(如 V8 --inspect),对 React Native 的 Metro 打包服务完全无效。真正要动的是启动命令和底层配置:
临时改:启动时加参数——react-native start --port 9999,然后 react-native run-android --port 9999
配套改 adb 映射:adb reverse tcp:9999 tcp:8081(注意方向:本地 9999 → 设备 8081)
永久改(不推荐但有时必须):
修改 node_modules/react-native/local-cli/server/server.js 中的默认端口(搜索 8081)
Android 端还需同步改 node_modules/react-native/local-cli/runAndroid/runAndroid.js 里的 adb reverse 命令
iOS 端需在 Xcode 工程中全局搜索 8081,替换所有硬编码位置(包括 build Phases 里的脚本)
防复发关键:别让端口写死在代码或命令行里
每次手动改 --port 或编辑 server.js 很容易漏,且多人协作时易冲突。真正省心的做法是把端口变成可注入变量:
启动前设环境变量:PORT=9999 npm start(适用于支持 process.env.PORT 的脚手架)
在 package.json 的 scripts 里避免硬编码:"start": "react-native start" 而不是 "start": "react-native start --port 8081"
VS Code 的 launch.json 中调试配置若涉及 Metro,不要配 port,而应通过 runtimeArgs 注入:["--port", "${env:PORT}"]
注意:React Native 0.73+ 版本已支持 metro.config.js 中用 process.env.PORT 动态读取,优先走这个路径,比改 node_modules 安全得多。
最常被忽略的一点:改完端口后,旧的 adb reverse 映射不会自动清除。真机调试前务必先执行 adb reverse --remove tcp:8081,再跑新的 adb reverse tcp:9999 tcp:8081,否则设备仍连老端口。


















