Expo,React Native:URL 和刷新问题

Posted

技术标签:

【中文标题】Expo,React Native:URL 和刷新问题【英文标题】:Expo, React Native: Issue with URL & Refreshing 【发布时间】:2021-12-11 06:51:37 【问题描述】:

大家好,我遇到了一个小问题,我一直在为以下平台 [Web、Phones、Desktop] 构建一个测试插件

我正在使用的以下框架,

世博会

反应原生

反应原生导航

我的问题是在构建应用程序后进行 PWA 构建时,如果用户想要直接导航到特定路径或刷新页面,当在下面的示例 GIF 中清楚地工作时,网站返回 404 .

-- Expo 开发工具:https://gyazo.com/0abc4161810cb14e74543b3dcb854b49

-- 在运行 expo build:web 然后在 expo 完成构建 PWA 后我运行 npx serve web-build : https://gyazo.com/ed699dcc4b13830647552b07ee112c62

我不确定我需要做什么添加配置或什么?我一直在搜索我的问题,但找不到任何东西

如果有人可以提供帮助,那就是你们!!

补充说明>>>

我没有编写登录系统或任何类型的兑现等代码,这只是一个页面的组件,其中一个页面有一个将用户发送到页面(配置文件)的按钮

App.js

import LoginScreen from './views/login'
import ProfileScreen from './views/profile'

export default function App() 
  return React.createElement(
    (Platform.OS == 'web') ? web_navigator : mobile_navigator
  );


function mobile_navigator() 
  const Tab = createBottomTabNavigator();
  return (
    <NavigationContainer>
        <Tab.Navigator
        screenOptions=
            headerShown: false,
            tabBarStyle: 
              backgroundColor: "#242629",
              borderTopWidth: 0
            ,
            tabBarOptions: 
              showLabel: false,
            
        
        
        >
  
          <Tab.Screen name="Login" component=LoginScreen />

          <Tab.Screen name="Profile" component=ProfileScreen />
        </Tab.Navigator>
    </NavigationContainer>
  );


function web_navigator() 
  const Stack = createStackNavigator();
  
  return (
      <NavigationContainer linking=
        config: 
          screens: 
            Login: "/",
            Profile: "/Profile/:Username?"
          
        ,
        >
        <Stack.Navigator
        screenOptions=
          headerShown: false
        >
          <Stack.Screen name="Login" component=LoginScreen />
          <Stack.Screen name="Profile" component=ProfileScreen />
        </Stack.Navigator>
      </NavigationContainer>
  );

登录.js

    const Login = (navigation) => 
      const [userName, setUserName] = useState('');
      const [userPassword, setUserPassword] = useState('');
    
        return (
          <View style=styles.Body >
    
            Platform.OS === 'web' ?
          
            <View style=styles.Body_left >
              <Image 
                source=require("../assets/LeftPanel3.png") 
                style=styles.Body_left_Picture 
              />
            </View>
    
            : null
    
            <SafeAreaView  style=styles.Body_right >
                <View style=styles.Body_Container >
                  <Image 
                    source=require("../assets/PlaceHolderLogo.png") 
                    style=styles.Logo 
                  />
                  <Text h1 style=styles.Login_Title>Let's Sign In</Text>
                  <Text style=styles.Login_Title_Child>Welcome Back!</Text>
    
                  <View style=styles.Input_Group >
                    <TextInput value=userName placeholder='Enter Username' placeholderTextColor="#fff" onChangeText=(inputOne) => setUserName(inputOne) style=styles.Input />
                    <TextInput value=userPassword placeholder='Enter Password' placeholderTextColor="#fff" onChangeText=(inputTwo) => setUserPassword(inputTwo) style=styles.Input />
    
                    <Pressable style=styles.Btn_Main onPress=() => navigation.navigate("Profile", Username: userName)>
                      <Text style=styles.Btn_Text>Sign In</Text>
                    </Pressable>
                  </View>
    
                </View>
            </SafeAreaView >
    
          </View>
        );
    
    
    export default Login;

Profile.js

export default function App(route) 

  const Profile_Username = route.params ? route.params.Username : "UnKnown"

  const Profile_Picture = "https://www.trickscity.com/wp-content/uploads/2019/02/pubg-dp.jpeg"

  return (
      <View style= position: 'relative', backgroundColor: "#242629", flex: 1  >
        
        <View style= position: 'relative', backgroundColor: "#242629", flex: 0.3  ></View>


        

        <View style= position: 'relative', backgroundColor: "#16161a", flex: 1  >

          <View style=styles.ProfileParent >

            <View style=styles.ProfilePictureParent>
              <Image 
                source=uri: Profile_Picture 
                style=styles.ProfilePicture 
              />
            </View>

            <View style=styles.ProfileTitleBox>
              <Text style=styles.ProfileName>Profile_Username</Text>
              <Text style=styles.ProfileTag>Member</Text>
            </View>

          </View>

        </View>


      </View>
      
  );

---[ PWA 文件 ]---

serve.json


  "headers": [
    
      "source": "static/**/*.js",
      "headers": [
        
          "key": "Cache-Control",
          "value": "public, max-age=31536000, immutable"
        
      ]
    
  ]

ma​​nifest.json


  "background_color": "#ffffff",
  "display": "standalone",
  "lang": "en",
  "name": "DevBuild",
  "short_name": "DevBuild",
  "start_url": "/?utm_source=web_app_manifest",
  "orientation": "portrait",
  "icons": [
    
      "src": "\\pwa\\chrome-icon\\chrome-icon-144.png",
      "sizes": "144x144",
      "type": "image/png"
    ,
    
      "src": "\\pwa\\chrome-icon\\chrome-icon-192.png",
      "sizes": "192x192",
      "type": "image/png"
    ,
    
      "src": "\\pwa\\chrome-icon\\chrome-icon-512.png",
      "sizes": "512x512",
      "type": "image/png"
    
  ]

【问题讨论】:

【参考方案1】:

解决方案

感谢@pfndesign

告诉我编辑 serve.json 以包含

  "rewrites": [
     "source": "/**", "destination": "/index.html"
  ]

请注意,我不能 100% 确定它的作用,但它对我有用,

pfndesign 也将我链接到此:https://github.com/vercel/serve-handler#options

希望这对阅读本文的人有所帮助:D

【讨论】:

【参考方案2】:

您的问题不是 expo 或 react-native,您需要在主机中使用 htaccess 将所有请求发送到您的 PWA 所在的 index.html 。 第一次导航到 PWA 时,它将加载 index.html 并且每个路由都加载到该 HTML 文件中,并且 URL 地址栏会根据您的链接配置而变化,但是当您刷新页面主机时认为它必须转到子文件夹,因为它不知道您的路线不存在于您的 PWA 之外

只需在您的 PWA 文件夹中创建一个 .htaccess 文件并将此代码添加到其中,它应该可以解决您的问题

<IfModule mod_rewrite.c>
  RewriteEngine On  
  RewriteCond %DOCUMENT_ROOT%REQUEST_URI -f [OR]
  RewriteCond %DOCUMENT_ROOT%REQUEST_URI -d
  RewriteRule ^ - [L]
  RewriteRule ^ /index.html [L]
</IfModule>

为您的本地环境编辑 serve.json 并添加以下代码

"rewrites": [
     "source": "/**", "destination": "/index.html" 
]

有关重写的更多信息,您可以查看https://github.com/vercel/serve-handler#options

【讨论】:

我刚试过这个,似乎没有解决问题? ;( @Volvic RBX 您的 pwa 在子域或文件夹中?您的主机是否允许访问创建 htaccess 并启用 mod_rewrite ? ATM 在我的本地主机上运行,​​但我的主要目标是使用指向 nodejs 的 ngnix 这是一个 img:cdn.discordapp.com/attachments/393372510076403713/… @Volvic RBX htaccess 适用于运行 php 的 Apache 服务器。对于 nginx,您可以阅读此问题 https://***.com/questions/43951720/react-router-and-nginx 我现在可以为本地主机做些什么吗?

以上是关于Expo,React Native:URL 和刷新问题的主要内容,如果未能解决你的问题,请参考以下文章

我如何在javascript中向url请求添加变量,更具体地说,expo和react native

在 React Native Expo WebBrowser 中监听 url 变化

React Native:登录或注销时如何以编程方式刷新应用程序?

全局变量在 React Native 中不起作用 - Expo

React-native refs 和 Expo Camera

React-Native 和 Expo:create-react-native-app 和 react-native init 之间的区别