Expo Router适配Web端导航(返回、刷新、前进)问题求助
嘿,我看了你遇到的Expo Router在Web端处理导航(返回、刷新、前进)时出现「Not Found」的问题,刚好之前做类似项目踩过同款坑,给你几个针对性的建议,你可以挨个试试:
1. 先搞定Firebase Hosting的重写规则
因为你用的是**静态输出(web.output: static)**部署到Firebase Hosting,单页应用的核心问题就是:刷新非根路径时,Firebase会默认去找对应路径的物理文件,但这些路由其实是Expo Router虚拟出来的,根本不存在,所以会返回404。
解决方法是在你的firebase/firebase.json里添加重写规则,把所有请求都转发到入口的index.html:
{ "hosting": { "public": "app/dist", // 这里要和你Firebase部署的目录对应,看你的项目结构是app/dist "rewrites": [ { "source": "**", "destination": "/index.html" } ] } }
配置完之后重新部署Firebase Hosting,这一步大概率能解决刷新和前进后退的404问题。
2. 检查Expo Router的路由href配置
看你(tabs)/_layout.tsx里的Screen配置,href写的是/(tabs)/page,但Expo Router的**分组路由(带括号的目录)**是用于布局逻辑的,实际Web端的URL里不会包含括号。比如app/(tabs)/page.tsx对应的实际Web路由是/page,而不是/(tabs)/page。
你需要把Screen的href改成实际的路径:
<Tabs.Screen name="page" options={{ href: "/page", // 去掉括号部分 title: "Page" }} /> <Tabs.Screen name="anotherPage" options={{ href: "/anotherPage", title: "Another Page" }} />
如果href配置错误,Web端的URL就会和Expo Router的路由不匹配,自然会出现NotFound。
3. 验证静态构建的产物
先在本地跑一遍静态构建:
npx expo export:web
然后检查app/dist目录下是否生成了index.html和对应的静态资源(js、css文件)。如果构建产物有问题,部署后肯定会出问题。你可以用本地静态服务器(比如npx serve app/dist)测试,看看刷新页面会不会出现404,如果本地也有问题,那就是路由配置的问题,不是Firebase的问题。
4. 路由配置的小细节检查
- 确保你的
_layout.tsx里的unstable_settings配置的initialRouteName都是存在的页面,比如(tabs)布局里的initialRouteName: 'page',要确保page.tsx确实在(tabs)目录下。 - 如果用的是较新版本的Expo Router,建议尽量避免用
unstable_settings,改用更稳定的配置方式(比如在_root.tsx里设置初始路由),不过旧版本如果能用的话也没问题。
先从这几点入手排查,应该能解决你遇到的导航问题~
内容来源于stack exchange

