在Vagrant Linux环境构建React Native应用,Expo手机访问失败求助
我之前在Vagrant Linux虚拟机里跑React Native + Expo时,也遇到过一模一样的问题!折腾了好几种方法终于搞定,给你分享几个亲测有效的方案:
1. 先配置Vagrant端口转发
Expo默认需要用到19000、19001、19002这几个端口,Vagrant默认没帮我们转发这些,所以得手动改Vagrantfile:
# 添加这几行到你的Vagrantfile里 config.vm.network "forwarded_port", guest: 19000, host: 19000 config.vm.network "forwarded_port", guest: 19001, host: 19001 config.vm.network "forwarded_port", guest: 19002, host: 19002
保存后重启虚拟机:vagrant reload
2. 让Expo绑定到可访问的IP
默认Expo可能只绑定了虚拟机的localhost,手机根本访问不到。启动Expo时直接指定绑定到所有网卡:
expo start --host 0.0.0.0
或者在项目根目录的app.json里配置默认启动方式,省得每次手动加参数:
{ "expo": { // 其他配置... "hostType": "lan", "lanType": "ip" } }
这样Expo会自动绑定到虚拟机的局域网IP,手机就能通过这个IP访问了。
3. 切换Vagrant到桥接网络(更省心的方案)
如果端口转发还是有问题,直接把虚拟机改成桥接模式,这样虚拟机会拿到和你主机同网段的真实IP,手机和主机在同一WiFi下就能直接访问虚拟机IP。修改Vagrantfile:
config.vm.network "public_network"
重启虚拟机后,用ip addr或者ifconfig查看虚拟机的局域网IP(比如192.168.1.105),然后在手机Expo客户端里手动输入exp://[虚拟机IP]:19000,或者扫二维码时确保二维码里的IP是这个桥接IP(如果不对就手动输入)。
4. 检查虚拟机的防火墙
虚拟机里的防火墙可能把Expo的端口挡住了,先临时关闭试试:
- Ubuntu/Debian:
sudo ufw disable - CentOS/RHEL:
sudo systemctl stop firewalld
如果能访问了,再永久开放端口:
# CentOS/RHEL sudo firewall-cmd --add-port=19000-19002/tcp --permanent sudo firewall-cmd --reload # Ubuntu/Debian sudo ufw allow 19000:19002/tcp
5. 最后确认网络连通性
一定要确保你的手机和虚拟机在同一局域网:手机连的WiFi要和主机(或者桥接后的虚拟机)在同一个网段,不能用手机流量。如果是用端口转发,手机就访问主机的IP加端口(比如主机IP是192.168.1.50,就输入exp://192.168.1.50:19000)。
如果还是不行,试试重启Expo(expo r -c清除缓存后重启),或者重启虚拟机,大概率就能解决了!
内容的提问来源于stack exchange,提问作者ThierryMichel

