Skip to main content
ProductsDesktop toolsTASTECADDrawing reviewTASTEFILESFile managementTASTEFTPFile transferTASTESSHRemote workspaceTASTEZIPCompression and extractionDeveloper toolsTASTECODERust integrated development environmentTASTESTUDIOIntegrated development and test environmentTASTEETLData integration (ETL)ServersTASTEREMOTERemote desktop serverTASTEGEOGeospatial serverTASTEMAILMail workspaceGet startedDownloadsDocumentationBuyAll products
Marketplace
News
TechNewsToday's dev newsDeveloper docsProgramming languagesRustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDartWeb front-end frameworksNext.jsReactVue.js · NuxtSvelteKitAngularServer frameworksSpring BootDjangoFastAPIASP.NET CoreNestJS · ExpressApp & desktop frameworksTauriFlutterReact NativeElectronAlgorithmsAlgorithm basicsCore algorithmsAdvanced algorithmsPractical algorithms
CommunityProjectsDevelopment logsPromptsAI tool issuesShowcaseCommunity guide
Work with usTech transferWebsite buildDesktop app buildRelease and payment pipelineSales partnerContact
ServicesRemote desktopCustom installer packages
TASTEDEV
Products

Desktop tools

TASTECADComplex drawings, opened with easeTASTEFILESJust the files you need, as fast as possibleTASTEFTPThe tidiest path for your filesTASTESSHA stronger link between you and your serversTASTEZIPPack faster, unpack safer

Developer tools

TASTECODEEdit, build, debug and test Rust apps in one windowTASTESTUDIOFrom editing to remote tests and approved AI fixesTASTEETLMove data while you watch the values

Servers

TASTEREMOTEA remote desktop you run on your own serverTASTEGEORebuilding a GeoServer-compatible geospatial server in RustTASTEMAILTake back control of your email

Get started

DownloadsLatest builds of every productDocsHow to use each productBuySubscriptions and perpetual licencesAll productsEvery product at a glance
All products
MarketplaceNews
Tech

News

Today's dev newsOfficial announcements on languages, frameworks, GitHub and AIDeveloper docsGuides to languages, frameworks and algorithms

Programming languages

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

Frameworks

Web front-end frameworksNext.jsReactVue.js · NuxtSvelteKitAngular
Server frameworksSpring BootDjangoFastAPIASP.NET CoreNestJS · Express
App & desktop frameworksTauriFlutterReact NativeElectron

Algorithms

Algorithm basicsComplexity analysis · Sorting · Searching · Basic data structures · Trees and heapsCore algorithmsGraph traversal · Shortest paths & minimum spanning trees · Dynamic programming · Greedy algorithms · Divide and conquer · BacktrackingAdvanced algorithmsString algorithms · Math and number theory · Bit manipulation · Segment trees · Union-findPractical algorithmsCoding interview strategy · LRU cache · Rate limiting · Consistent hashing
All development docs
Community
ProjectsDiscover builders and their workDevelopment logsDecisions and lessons learnedPromptsReusable instructionsAI tool issuesProblems and workarounds for Claude, Codex, GeminiShowcaseFinished resultsCommunity guideHow we build in the open
Work with us
Tech transferNative apps in Rust and eguiWebsite build10 languages, accounts, docs and downloadsDesktop app buildRust and egui, no WebViewRelease and payment pipelineSigning, MSI, deb, rpm, AppImage, hashesSales partnerRecommend us and earn 30%ContactBuilds, partnerships and investment
Services
Remote desktopReach your computer from a browserCustom installer packagesOnly the features you need, settings preloaded
Buy
EN
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
Log in
Log in
TASTEDEV

From small tools to better development.

support@tastedev.netSupport TASTEDEV
ProductsProduct lineupBuyDocsDownloadsMarketplaceSupport
CommunityProjectsDevelopment logsPromptsAI tool issuesShowcase
PoliciesPrivacy policyTerms of serviceSubscription termsRefund policyCommunity guidelines
AccountLog inSign up
Visitors
Today
012345678901234567890123456789012345678901234567890123456789
Yesterday
012345678901234567890123456789012345678901234567890123456789
Total views
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
Company
GXSOFT
Representative
CHOI YOUNG GU
Business registration number
853-44-00368
Address
9F V24, 351 Gyeongin-ro, Michuhol-gu, Incheon, Republic of Korea
Phone
+82-10-4404-1523
Email
whitecalvin@tastedev.net
Privacy officer
CHOI YOUNG GU

© 2026 TASTEDEVProduct information is based on verified development sources.Released · improving

React Native docs
React Native
Getting Started with React NativeProject StructureCore ConceptsData and StateTestingDeployment
Discussions

React Native guide · 2/6

Project Structure

This chapter looks at the files that make up an Expo project and a Community CLI project: where the app starts, and where settings such as the app name, icon and permissions live.

The Expo default template

A project created with npx create-expo-app@latest looks roughly like this. The exact files vary with the Expo SDK version and template, and some templates use src/app/ instead of app/.

my-app/
  app/                 screens (routes)
    _layout.tsx        root layout
    (tabs)/
      _layout.tsx      tab navigator
      index.tsx        first tab (/)
      explore.tsx      second tab (/explore)
  assets/              images and fonts
  components/          reusable components
  constants/           constants such as colors
  hooks/               custom hooks
  app.json             app configuration
  package.json
  tsconfig.json

The main field in package.json points to expo-router/entry, so on launch Expo Router reads the app/ directory and builds the screens from it. To remove the example screens and start from an empty app/ directory, run the template's npm run reset-project script.

Expo Router file conventions

Expo Router is a file-based router: the path of a file inside app/ becomes the route.

FileRoute or role
app/index.tsx/, the initial screen
app/settings.tsx/settings
app/posts/[id].tsxdynamic route such as /posts/42
app/(tabs)/...group: parentheses keep it out of the URL
app/_layout.tsxlayout wrapping sibling screens (Stack, Tabs and so on)
app/+not-found.tsxshown when no route matches

A layout file decides which navigator presents the screens in its folder. Here is a root layout using a stack navigator:

import { Stack } from "expo-router";

export default function RootLayout() {
  return (
    <Stack>
      <Stack.Screen name="index" options={{ title: "Home" }} />
      <Stack.Screen name="settings" options={{ title: "Settings" }} />
    </Stack>
  );
}

If you choose the blank template without a router (--template blank-typescript), App.tsx is the root component and index.ts registers it with registerRootComponent(App).

app.json and app.config

The app name, icon, splash screen, bundle identifiers, permissions and config plugins go under the expo key in app.json.

{
  "expo": {
    "name": "My App",
    "slug": "my-app",
    "version": "1.0.0",
    "orientation": "portrait",
    "icon": "./assets/images/icon.png",
    "scheme": "myapp",
    "ios": { "bundleIdentifier": "com.example.myapp" },
    "android": { "package": "com.example.myapp" },
    "plugins": ["expo-router"]
  }
}

When values depend on environment variables, use app.config.ts (or app.config.js). It receives the contents of app.json as config and can return a modified version.

import type { ExpoConfig, ConfigContext } from "expo/config";

export default ({ config }: ConfigContext): ExpoConfig => ({
  ...config,
  name: process.env.APP_VARIANT === "development" ? "My App (Dev)" : "My App",
  slug: "my-app",
});

Native folders and prebuild

An Expo project starts without android/ and ios/. Expo follows Continuous Native Generation (CNG): it generates the native projects on demand from app.json and config plugins. npx expo run:android and EAS Build run this step for you, and you can also run it directly:

npx expo prebuild
npx expo prebuild --clean

Treating the native folders as build output and listing them in .gitignore keeps all configuration in one place, app.json. If instead you edit the generated folders and commit them, you take over their maintenance, and native settings you later change in app.json are no longer applied automatically.

Community CLI projects

A project created with the CLI includes the native folders from the start.

File or folderRole
index.jsentry point that registers the root component with AppRegistry
App.tsxroot component
android/Gradle-based Android project
ios/Xcode project and Podfile
metro.config.js, babel.config.jsbundler and transform settings
app.jsonapp name registered with the native side
import { AppRegistry } from "react-native";
import App from "./App";
import { name as appName } from "./app.json";

AppRegistry.registerComponent(appName, () => App);

Summary

  • In an Expo project, the file tree under app/ defines the screens, and _layout.tsx files choose the navigators.
  • Static app settings live in app.json; dynamic ones go in app.config.ts.
  • android/ and ios/ are generated by npx expo prebuild; whether to commit them is a team decision.
  • In a CLI project, AppRegistry in index.js is the entry point and you maintain the native folders yourself.
Questions about this chapter?
Previous chapterGetting Started with React NativeNext chapterCore Concepts

0 comments

Top commentsNewest first

Sign in · Sign in to leave a comment.