Skip to main content
移动 指南

React Native中的Splash屏幕:2026年完整指南

了解如何在Expo & CLI中实现专业的Splash屏幕。该指南涵盖了资产准备、原生设置、性能和常见问题。

马丁·多纳迪厄

马丁·多纳迪厄

内容营销人员

React Native 2026 年全面的Splash屏幕指南

当你在真机上点击应用图标时,用户会在一瞬间看到白色闪烁、拉伸的Logo或冻结的启动屏幕,随后它会消失,直到有用内容准备好。这通常是React Native应用停止感觉像生产级应用的时刻。

在React Native中,一个好的启动屏幕不仅仅是品牌问题。它填补了原生启动和第一个有意义的React渲染帧之间的差距。它还迫使你清晰地思考启动顺序、资产准备以及Expo Go开发客户端和真实商店构建之间的区别。如果你错过了这个时间点,用户会马上看到问题。

目录

为什么专业的启动屏很重要

用户从主屏幕点击应用后,启动序列显示一个白屏,直到首个UI出现。生产环境下,这意味着不稳定。即使React Native仍在后台加载JavaScript包或恢复状态,这个第一印象已经错了。

在React Native中,启动屏是应用首个控制的原生界面。它覆盖了进程启动和首个可用React渲染帧之间的过渡。因此,它是一个启动工具,而不是仅仅的品牌资产。如果你时间管理得好,用户会看到一个稳定的启动体验,感觉很有意图。如果你把它隐藏得太早,用户会看到布局抖动、缺失的字体或一个死掉的屏幕,直到认证、导航或远程配置赶上。

一位表情为关切的男子正在看他的智能手机上的白屏。

启动屏实际上在做什么

一个生产环境下的启动屏通常需要处理四个启动问题:

  • 盖住原生到JS的启动工作: 字体加载、持久会话恢复、特性标志读取和初始导航状态都在竞争首个帧。
  • 防止视觉抖动: 避免系统白色闪烁、未样式化的文本或根视图部分加载。
  • 保持启动视觉一致: 背景颜色和Logo可以与应用壳匹配,启动过渡感受更为控制。
  • 强制启动决策: 团队必须在移除启动屏幕之前定义“就绪”是什么。

实用规则: 在第一个真实屏幕可以清晰渲染时隐藏启动屏幕,而不是在任意延迟后。

这也是Expo管理和裸CLI工作流程开始分离的地方。在Expo管理项目中,启动屏幕设置主要是声明式的,主要的工程决策是何时调用hideAPI,基于应用就绪状态。在裸React NativeCLI项目中,您拥有更多的原生设置权限,Android和iOS,这给您带来了更多的控制权,但也更容易引入启动闪烁、主题不匹配或平台特定回归。

在实际项目中,这个权衡很重要。Expo更快地配置,易于在不同环境中保持一致性。裸项目通常是当应用已经依赖于自定义原生模块、自定义启动行为或更严格的启动路径控制时的合适选择。

通常会将启动作为产品质量的一部分进行评估的团队会在更广泛的UX工作中进行评估,而不是将其视为孤立的原生任务。这与 Capgo的应用用户体验指南中所涵盖的相同思维方式。如果您还正在评估React Native栈用于新应用或迁移, 为 React Native 应用程序提供 Nerdify 解决方案 提供对生产有用的概述。

准备完美的启动屏幕资产

大多数启动屏幕错误都是在设计文件中开始的,而不是 code。如果基础资产是错误的,那么无论 Android XML 还是 iOS storyboard 的清理都无法挽救它。

最安全的方法是将启动屏幕视为一个 布局系统,而不是一个全屏幕的单个图片。使用背景颜色加上居中的 logo 或插图。它在 Android 设备、iPhone、平板电脑和更宽的设备方向上缩放得更可预测,而不是试图将一个详细的 poster-style 图像放置在每个地方。

展示四个设计完美的移动应用程序启动屏幕资产必备要求的清单。

在编码之前准备什么

从设计开始使用一个干净的源文件。矢量是最佳选择,即使导出的启动资产是 PNG。

使用这个清单:

  • 源艺术作品: 保持一个 SVG、AI 或可编辑源格式的主标志或标记,以便导出保持一致。
  • 背景颜色: 定义背景颜色的准确颜色,确保它与第一个屏幕或应用程序外壳背景颜色匹配。
  • 安全边距: 在 logo 周围留足够的空白空间,以防止在不寻常的宽高比下进行激进的裁切而损坏设计。
  • 平台变体: 导出您的工作流程需要的图像大小,而不是将一个文件拉伸到所有地方。
  • 暗色模式审查: 如果您的应用程序支持暗色表面,请确认 logo 在选择的背景下仍然清晰可读。

Expo 的指导很有用,因为它强调了启动资产现在是构建管道的一部分,而不是后来想起的。其文档建议使用 1024×1024 的正方形 PNG 作为应用程序图标,并注意 EAS Build 可以为使用其创建的项目生成所需大小的项目。 npx create-expo-app现代工具中,资产生成已经从手动重复转变为展示方式。

常见资产错误

最常见的视觉故障是可预测的:

问题 可能原因 更好的方法
模糊的Logo 从低分辨率栅格导出的 从矢量源重新导出
裁剪的边缘 艺术作品放置在边界太近 增加安全内边距
拉伸 全屏图片强制适应多种比例 使用背景颜色并将图片居中
不匹配的过渡 启动屏幕背景与首屏不一致 启动屏幕和应用壳颜色保持一致

启动屏幕不应包含密集的文本、细节或营销文案。启动屏幕只被短暂浏览,并且在严格的原生约束下渲染。

对于频繁发布视觉更新的团队来说,图片管理的重要性不仅仅局限于启动屏幕。同样的习惯也适用于交付包和二进制大小,这就是为什么像 优化图片更新 的指南值得一读的原因。

实用的导出工作流程

在实际项目中有效的设置应该是这样的:

  1. 设计一个以背景为中心的布局 在一个平坦的背景上。
  2. 如果您的工作流程支持单独的背景颜色,则导出透明的 logo PNG 如果您的工作流程支持单独的背景颜色,则导出透明的 logo PNG
  3. 保持命名一致 以便资产交换不会变成猜测。
  4. 尽早在小型和高型模拟器上测试 在绑定启动生命周期之前
  5. 在资产更改后重建 因为启动资源经常在本机缓存中

上述点比人们想象的更重要。许多启动屏幕问题看起来像配置错误,但实际上只是过时的本机资产。

使用 Expo Go 和开发客户端工作流程进行实现

如果您正在使用Expo,请从 expo-splash-screen.它适合管理工作流程,保持大多数配置声明式,并且在splash屏幕消失时给您显式控制。

来自https://reactnative.dev/的截图

理解的关键行为很简单。 保持原生splash屏幕可见,直到第一个有意义的UI帧准备就绪。 Expo的 SplashScreen API preventAutoHideAsync() 在启动时和 hideAsync() 在关键加载完成后支持该模式,Expo警告说隐藏太早可能会在iOS和Android构建中短暂地暴露一个空白屏幕,详见 Expo splash屏幕API.

用声明式方式配置原生splash屏幕

在Expo项目中,视觉部分通常在 app.jsonapp.config.js.

典型的 app.json 设置看起来像这样:

{
  "expo": {
    "plugins": [
      [
        "expo-splash-screen",
        {
          "backgroundColor": "#111111",
          "image": "./assets/splash-icon.png",
          "imageWidth": 200
        }
      ]
    ]
  }
}

具体字段可能根据项目设置有所不同,但模式保持一致。您在配置中定义原生启动外观,然后从 JavaScript 控制可见性。

几个实际的选择在这里很重要:

  • 使用与初始屏幕接近的背景颜色 以便过渡感觉连续。
  • 保持图像简单 因为启动表面不是密集艺术的场所。
  • 避免假的“品牌延迟” 当应用程序已经准备好时,不要让用户在 logo 上等待。

根据可用性而不是时间隐藏启动屏幕

很多教程经常会偏离正轨。它们使用 setTimeout,这是一个容易演示但在生产环境中错误的方法。

使用启动状态。一个常见的根级模式如下:

import { useCallback, useEffect, useState } from 'react';
import { View } from 'react-native';
import * as SplashScreen from 'expo-splash-screen';

SplashScreen.preventAutoHideAsync();

export default function App() {
  const [isReady, setIsReady] = useState(false);

  useEffect(() => {
    async function prepare() {
      try {
        // Load fonts
        // Restore auth state
        // Read persisted settings
      } finally {
        setIsReady(true);
      }
    }

    prepare();
  }, []);

  const onLayoutRootView = useCallback(async () => {
    if (isReady) {
      await SplashScreen.hideAsync();
    }
  }, [isReady]);

  if (!isReady) {
    return null;
  }

  return (
    <View style={{ flex: 1 }} onLayout={onLayoutRootView}>
      {/* Your real app UI */}
    </View>
  );
}

两个细节使这个模式可靠。

首先 preventAutoHideAsync() 在应用程序开始呈现有意义的UI之前被调用。其次,隐藏只发生在根视图准备好布局时,这减少了native启动画面和React树之间的闪烁的机会。

不要在异步工作完成时隐藏启动画面。隐藏它当UI依赖于该工作时才能呈现。

这个区别在启动过程中包括身份验证恢复、远程配置或字体加载时最为重要。如果主屏幕依赖于自定义字体和已签名的状态,启动画面应该覆盖这个差距。

下面是一个关于更广泛的React Native启动和启动生态系统的有用指南:

在Expo Go和开发构建中预期的内容

Expo添加了一个额外的复杂性。您在独立构建中期望的启动行为可能与在Expo Go中看到的不一致。

这个不一致性使得很多团队感到困惑。您更改资产或时间逻辑,测试在Expo Go中,然后结论配置是有问题的,而实际问题是开发环境不像生产二进制文件那样行为。

使用这个思维模型:

  • Expo Go 方便迭代,但它并不是原生启动屏幕行为的最后权威。 开发客户端更接近现实,因为它们包含了生成的原生项目。
  • 独立构建是最终检查的阶段,用于检查启动时间、主题行为和资产正确性。 如果您的启动屏幕仍然闪烁或延迟,通常是由于以下三种情况之一:隐藏太早、渲染时间太长后隐藏,或测试环境不反映发布行为。
  • 配置裸露的 React Native __CAPGO_KEEP_0__ 项目 裸露的 React Native 应用程序为您提供了对启动行为的直接控制,这在启动屏幕需要匹配真实的启动工作而不是显示一个固定延迟的 logo 时很有用。这种控制意味着您需要正确地连接 Android 和 iOS,频繁重建,并在实际设备上测试原生启动 UI 和第一个 React 屏幕之间的传递。

在 __CAPGO_KEEP_0__ 项目中,我通常建议 null 裸露的

Configuring for Bare React Native CLI Projects

项目

CLI react-native-bootsplash 适合新项目。它比旧的启动屏幕库更适合当前的React Native项目,native的设置也更容易在升级时进行推理。旧的应用程序仍然会带上 react-native-splash-screen,因此在维护工作中您会遇到它,但对于一个新的设置,目标仍然是相同的。立即显示一个native的启动界面,然后在应用程序可以呈现有意义的UI后才隐藏它。

一个四步的图表,展示了在React Native中设置启动屏幕的过程CLI。

Android项目中的设置

Android启动屏幕设置存在于几个地方:主题资源、drawable、 AndroidManifest.xml。这种分离是为什么小的错误会导致可见的闪烁的原因。 MainActivity通常的流程是这样的:

为Android资源文件夹生成启动屏幕资产。

  1. 定义一个启动主题,正确的背景颜色和启动drawable。
  2. 将该主题应用到启动器活动中
  3. 初始化启动屏幕 AndroidManifest.xml.
  4. Initialize the splash screen in MainActivity.
  5. 在启动任务完成后,阻塞首次渲染的 JavaScript 代码将被隐藏。

简化版 MainActivity.kt 模式通常如下所示:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // initialize splash handling here depending on the library
}

该代码片段是故意通用的,因为具体的调用依赖于库。原生集成点通常是容易的。错误往往来自资源和主题转换。

以下是 Android 在生产环境中出现的问题:

  • 主题不匹配: 如果启动主题的背景颜色与您的第一个应用屏幕不同,用户会在手动切换时看到闪烁的效果。
  • 资产桶不正确: Android 将缺失的预期密度文件夹中的资产拉伸或模糊。
  • 仅使用 Metro 进行测试: 原生资源更改通常需要清洁重建。热重载不会验证启动行为。
  • Android 12 启动规则: 新版 Android 系统会先应用自己的启动画面行为,所以自定义设置需要尊重这些平台约束。
  • 慢速 JS 后隐藏: 如果 React 在根视图可以绘制之前隐藏启动画面,用户会看到一个空白框架而不是smooth 过渡。

最后一点比图像本身更重要。时间问题通常被认为是性能问题。

iOS 在裸项目中的设置

在 iOS 上,重心是 LaunchScreen.storyboard 加上一个小的本机钩子在 AppDelegate。该平台期望启动画面是静态的轻量级的。将其视为第一屏视觉结构的快照,而不是小型引导流程。

可靠的设置如下:

  • 将资产添加到 Xcode 资产目录中。
  • 配置 LaunchScreen.storyboard 使用简单约束。
  • 保持静态布局。背景颜色、Logo和安全间距通常足够。
  • AppDelegate.
  • 仅在应用完全准备好渲染后,从JavaScript隐藏启动画面。

新加入iOS团队经常会过度构建Storyboard。这通常会造成后果。复杂的约束、多层嵌套视图或尝试动画启动屏幕会使设置变得难以维护并且容易在不同设备尺寸上破裂。

简单的启动屏幕是更安全的选择。

裸CLI给你对手动传递的更多控制权。

这是Expo管理和裸CLI之间的关键区别。Expo给你一个更快的通往正确默认的路径。裸CLI给你对原生启动管道的完全责任。

这种权衡在启动时做的工作超过仅仅加载一个捆绑包时变得有用。需要额外控制的应用通常会有认证恢复、加密存储读取、自定义原生SDK初始化或白标品牌规则。裸项目让你可以将启动画面时间与这些工作对齐,而不是强制所有内容通过更高级别的配置。

如果你计划在启动后添加动画过渡,保持原生启动画面静态并将运动移到第一个React屏幕。性能权衡与任何移动启动路径中的原则相同。首次绘制期间进行大量工作是昂贵的。这 关于Capacitor应用动画性能的指南 从另一个堆栈中覆盖了相同的原则,这个教训在React Native中也很清晰。

Expo管理的 versus bare CLI

实践比较更关注的是启动复杂性在哪里

决策点 Expo管理的 bare CLI
设置速度 更快的初始设置 更多的本机工作
本机定制 更受限制 全控制
资源生成流程 More declarative More manual
Debugging surface JS config plus generated native layer Direct Android and iOS files
Best fit Teams optimizing for speed and consistency Teams needing deep native control

If the app is already in Expo and the launch requirements are standard, staying there usually saves time. If the startup path depends on native initialization order, custom themes, or platform-specific boot logic, bare CLI is often the cleaner long-term choice.

Both workflows can ship a polished splash screen. The difference is who owns the launch pipeline, your framework or your team.

Advanced Techniques for Animated and Performant Splash Screens

Animated splash screens look polished when they respect the startup pipeline. They look cheap when they distract from it.

因为我把动画当作增强层,而不是基础。第一项工作仍然是时间。如果应用还未准备好,启动画面就不会消失。如果应用已经准备好,启动动画应该迅速进入第一个可用的屏幕。

启动动画应该遵循现实

常见的模式是,在启动后保持原生启动画面简单,然后在第一个React屏幕上运行轻量级的品牌动画。这比试图动画原生启动表面本身更具灵活性。

Lottie是这种手上的动画交付的实际选择,因为它可以在第一个屏幕上不必构建一个重型自定义动画堆栈来传递运动。关键部分是序列化:

  • 原生启动画面在关键启动工作期间保持可见。
  • React在第一个真正屏幕或一个受控的过渡屏幕上挂载。
  • 可选动画只有在不阻塞交互超过必要时间时才会播放。

不起作用的模式是旧的。 setTimeout(2000) 在快速设备上,这会让应用等待毫无理由。在慢速设备上,它经常只是将一个加载状态替换为另一个。

启动应该被视为协调

一个更好的思维模型是 启动协调. 应用程序显示有意义内容之前,必须完成的确切任务应该被splash屏幕所覆盖。

通常包括一些混合:

  • 认证引导: 恢复会话或决定是否路由到登录页面。
  • 必备存储读取: 主题、语言、引导状态和最后已知的关键偏好。
  • 字体可用性: 尤其是如果第一个屏幕依赖自定义字体来实现布局稳定性。
  • 远程配置,控制UI: 只有在第一个屏幕不能安全地渲染而不依赖它时。

有很多教程忽略了另一个细微差别。splash屏幕行为取决于环境。 Expo splash处理的讨论在开发和生产环境中 指出行为可能在Expo Go中不会与独立构建中相同,并且一旦您手动控制,自动可见性管理就会改变。 这是为什么延迟示例会过时的原因。它们隐藏了实际的启动序列,而不是与其对齐。

启动屏幕不应用于伪造速度。它应该用于防止用户看到未完成的UI。

如果您正在添加动画在混合堆栈中或评估更广泛的渲染性能, 有关Capacitor应用的动画性能指南 是有用的背景,因为同样的纪律适用。保持启动工作简洁,避免不必要的阻塞,让动画支持响应性而不是与其竞争。

对于团队正在外部发布可视修复的团队: Capgo Capacitor

处理JavaScript、CSS、复制、配置和资产更新的__CAPGO_KEEP_0__和Electron应用,但React Native中的原生启动屏幕更改仍然属于原生构建管道,因为真正的启动屏幕在JavaScript应用启动之前就出现了。

常见启动屏幕问题的故障排除 大多数启动屏幕问题都属于重复犯错误的少数。 一旦您将, 资产问题, 和 原生集成问题.

近期的React Native指南中,社区模式已经趋同于核心流程:添加库,配置原生启动资产,调用 show 启动时,隐藏应用就绪后 MainActivity Android设置通常涉及 LaunchScreen.storyboard 或资源 AppDelegate,而iOS则集中在 。同一份概述指出Expo推荐使用 npx create-expo-app1024×1024 PNG 作为应用图标,并且EAS Build可以为使用.

创建的项目生成所需大小,如本React Native启动屏幕指南所述

症状: Logo看起来模糊、被裁剪或不规则缩放。

原因: 基准图像未正确导出,或者布局依赖于一个全屏的栅格图像,它不适应。

解决方案: 用一个居中的Logo替换海报式的艺术作品。从原始设计源重新导出,重新生成密度特定的资产,验证您的Android drawables或iOS asset catalog包含所需的文件。

启动屏幕后出现白屏

症状: 原生启动屏幕消失,用户在看到第一个屏幕之前看到一个空白框架。

原因: 您的应用程序在根UI渲染有意义的内容之前隐藏了启动屏幕。

解决方案: 将启动画面与就绪状态绑定,而不是时间。 在 Expo 中,这通常意味着在根视图可以布局时才显示启动画面。在裸项目中,使用等效模式并确保首屏渲染时不立即阻塞异步工作。

某个平台上缺少启动画面

症状: Android 上显示,iOS 不显示,或者反之。

原因: 一个原生侧面没有完全配置。通常是忘记了 storyboard 引用、主题连接问题或未将资产添加到正确的目标。

解决方案: 逐一检查平台特定的文件。 在 Android 上,检查启动主题和资源引用。在 iOS 上,确认 asset catalog 成员资格和 Xcode 中的应用目标设置。 LaunchScreen.storyboard添加启动配置后,构建会中断

症状:

在引入库或更改启动文件后,应用停止编译。 __CAPGO_KEEP_0__

原因: 原生项目文件和生成的配置可能会因为插件或资产的变化而脱离同步,尤其是在插件或资产发生变化后。

解决方案: 清理构建,重新安装依赖项如果需要,并完全重建原生项目。如果您在Expo中使用生成的原生层,仔细重新生成并验证插件配置。如果您在一个裸应用中,审查 MainActivity, AppDelegate资源名称和任何plist或清单编辑的小差异。

最快的团队将启动屏幕视为发布工程的一部分,而不是一次性视觉任务。即使启动资产、UI文本或应用外壳行为需要快速更改后发布,也更重要。 Capgo 为Electron和Capacitor团队提供了在下一次启动时使用JavaScript、CSS、复制、配置和资产修复的方法,具有滚动控制和回滚支持,这对于问题出在应用层而不是原生启动屏幕本身时非常有用。

从React Native:2026年完整指南的Splash Screen中继续:

如果您正在使用 Splash Screen in React Native: A Complete Guide for 2026 来规划原生媒体和界面行为,连接它 使用 @capgo/capacitor-live-activities 为使用 @capgo/capacitor-live-activities 的原生能力 @capgo/capacitor-live-activities 为 @capgo/capacitor-live-activities 的实现细节 使用 @capgo/capacitor-video-player 为使用 @capgo/capacitor-video-player 的原生能力 @capgo/capacitor-video-player 为 @capgo/capacitor-video-player 的实现细节,以及 使用 @capgo/capacitor-native-navigation 为使用 @capgo/capacitor-native-navigation 的原生能力

实时更新Capacitor应用

当web层bug出现时,通过Capgo将修复直接推送给用户,而不是等待几天的app store审批。用户在后台接收更新,而native层的变化仍然在正常的审批路径中。

立即开始

博客最新文章

Capgo为您提供创建真正专业的移动应用所需的最佳见解。