WSL2环境下运行Expo,手机无法连接的问题求助
我之前也踩过WSL2 + Expo的这个网络坑,核心原因是WSL2默认用NAT网络模式,手机作为局域网设备没法直接访问WSL内部的eth0 IP——哪怕你设置了REACT_NATIVE_PACKAGER_HOSTNAME,只要端口没映射到Windows主机的局域网IP上,手机还是连不通。下面给你两个不用依赖tunnel的靠谱解决方案:
方案一:端口转发(保留WSL默认网络)
这个方法不用改动WSL的默认网络配置,通过Windows的端口转发把WSL的Expo端口映射到主机的局域网IP上:
获取关键IP地址
- 在Windows的CMD/PowerShell里执行
ipconfig,找到你的无线/有线网卡的IPv4地址(比如192.168.3.10),这是手机要访问的目标地址。 - 在WSL终端里执行
ip addr show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1,拿到WSL2的eth0内部IP(比如172.17.0.2)。
- 在Windows的CMD/PowerShell里执行
配置Expo主机名
在WSL终端里临时设置环境变量:export REACT_NATIVE_PACKAGER_HOSTNAME=你的Windows局域网IP如果想永久生效,把这条命令加到shell配置文件里:
echo 'export REACT_NATIVE_PACKAGER_HOSTNAME=你的Windows局域网IP' >> ~/.bashrc source ~/.bashrc(用zsh的话就修改
~/.zshrc)设置Windows端口转发
打开管理员权限的PowerShell,执行以下命令转发Expo默认的三个核心端口:netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=19000 connectaddress=你的WSL2内部IP connectport=19000 netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=19001 connectaddress=你的WSL2内部IP connectport=19001 netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=19002 connectaddress=你的WSL2内部IP connectport=19002放行防火墙端口
同样在管理员PowerShell里执行,允许这些端口的入站连接:New-NetFirewallRule -DisplayName "Expo TCP Ports" -Direction Inbound -LocalPort 19000,19001,19002 -Protocol TCP -Action Allow New-NetFirewallRule -DisplayName "Expo UDP Ports" -Direction Inbound -LocalPort 19000,19001,19002 -Protocol UDP -Action Allow启动Expo并连接手机
执行expo start,确保手机和Windows主机在同一个局域网里,扫码或者手动输入exp://你的Windows局域网IP:19000就能正常连接了。
方案二:切换WSL2到桥接模式(更省心)
如果不想每次都做端口转发,可以把WSL2改成桥接模式,让它直接获取局域网IP:
关闭WSL
在Windows PowerShell里执行:wsl --shutdown修改WSL网络配置
打开%USERPROFILE%\.wslconfig文件(如果没有就新建一个),添加以下内容:[wsl2] networkMode=bridge vmSwitch=你的网卡名称这里的
vmSwitch要填你实际用的网卡名称,可以在Hyper-V管理器的“虚拟交换机管理器”里找到对应的桥接交换机名称(一般是物理网卡的名字)。重启WSL
重新打开WSL终端,执行ip addr就能看到WSL已经拿到和Windows同网段的局域网IP了。配置Expo并连接
把REACT_NATIVE_PACKAGER_HOSTNAME设为WSL的新局域网IP,启动expo start后,手机直接扫码就能连接,不用额外做端口转发。
内容的提问来源于stack exchange,提问作者Sayyed Alireza Rezaei Asl

