You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native引用assets下splash.png资源找不到问题求助

问题原因

你的代码存在以下导致资源加载失败、运行报错的问题:

  • require() 引用React Native本地静态资源时,必须使用相对于当前代码文件的相对路径,你写的/talesrunner23/assets/splash.png/是系统根目录的绝对路径,打包器无法扫描到对应资源
  • 图片路径末尾多写了斜杠/,将文件路径写成了目录路径,打包器会把它识别为文件夹而非png文件
  • 没有从react-native包中导入Image组件,即使路径正确组件也无法正常渲染
  • 残留无效代码:handleBack回调里有复制代码时带入的`enter code here`占位符,会触发语法错误
  • 启动页延迟逻辑错误:setTimeout的时间单位是毫秒,你写的30 * DELAY_BEFORE_WEBVIEW实际仅300毫秒,启动页会一闪而过,和注释标注的10秒展示时长不符
修正前提

请先确认你的项目目录为标准React Native结构,即你编写代码的App.js文件位于项目根目录,和assets文件夹同级:

talesrunner23/
├── App.js
└── assets/
    └── splash.png

如果你的App.js放在其他子目录(比如src/文件夹),只需要对应调整图片引用的相对路径层级即可,每深一级目录多写一个../。

完整修正后可运行代码
import React, { useRef, useState, useCallback, useEffect } from 'react';
import {
  View,
  BackHandler,
  Platform,
  StyleSheet,
  Image,
} from 'react-native';
import { WebView } from 'react-native-webview';

// 启动页展示时长,单位:秒
const DELAY_BEFORE_WEBVIEW = 10;
export default function App() {
  const webView = useRef();
  const [canGoBack, setCanGoBack] = useState(false);
  const [isLoading, setIsLoading] = useState(true);

  // 安卓物理返回键处理
  const handleBack = useCallback(() => {
    if (canGoBack && webView.current) {
      webView.current.goBack();
      return true;
    }
    return false;
  }, [canGoBack]);

  useEffect(() => {
    BackHandler.addEventListener('hardwareBackPress', handleBack);
    return () => {
      BackHandler.removeEventListener('hardwareBackPress', handleBack);
    };
  }, [handleBack]);

  useEffect(() => {
    setTimeout(() => {
      setIsLoading(false);
    }, DELAY_BEFORE_WEBVIEW * 1000);
  }, []);

  return (
    <View style={styles.container}>
      <WebView
        ref={webView}
        source={{ uri: 'https://www.talesrunnerbestguild.co.kr/' }}
        style={styles.webView}
        onLoadProgress={(event) => setCanGoBack(event.nativeEvent.canGoBack)}
      />
      {isLoading && <CenterLoader />}
    </View>
  );
}

const CenterLoader = () => (
  <View style={styles.loaderContainer}> 
    <Image 
      source={require('./assets/splash.png')} 
      style={{height: 100, width: 100}}
    />
  </View>
);

const styles = StyleSheet.create({
  container: { flex: 1 },
  loaderContainer: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    position: 'absolute',
    width: '100%',
    height: '100%',
    backgroundColor: 'white'
  },
  webView:
    Platform.OS === 'ios'
      ? { marginTop: 30, marginBottom: 40 }
      : { marginTop: 30 },
});
排障提示

替换代码后如果仍然提示资源找不到,执行以下命令清除打包缓存后重新运行项目即可:
npx react-native start --reset-cache

注意:require()引用本地静态资源时,路径不能拼接变量,React Native打包器会在编译阶段静态扫描所有require路径,使用变量会导致资源无法被打包进安装包。

内容的提问来源于stack exchange,提问作者김준석

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:18:22