Expo Routerã«ããReact Nativeãã¡ã€ã«ããŒã¹ããã²ãŒã·ã§ã³å®å šã¬ã€ã
Expo Routerã䜿ã£ãReact Nativeã®ãã¡ã€ã«ããŒã¹ã«ãŒãã£ã³ã°ã培åºè§£èª¬ãã¬ã€ã¢ãŠãããã€ãããã¯ã«ãŒããåå®å šãªããã²ãŒã·ã§ã³ãã¿ããã¢ãŒãã«ãããã«ãŠã§ã¢ãŸã§ã2026å¹Žææ°ã®ãã¿ãŒã³ãç¶²çŸ ããŸãã

Expo Routerã¯ãReact Nativeã¢ããªã±ãŒã·ã§ã³ã«ãããããã²ãŒã·ã§ã³ç®¡çã®æ¹æ³ãæ ¹æ¬çã«å€é©ããã©ã€ãã©ãªã§ããNext.jsã§æ®åãããã¡ã€ã«ããŒã¹ã«ãŒãã£ã³ã°ã®ä»çµã¿ãã¢ãã€ã«éçºã«æã¡èŸŒã¿ãappãã£ã¬ã¯ããªå
ã«ãã¡ã€ã«ãäœæããã ãã§ç»é¢é·ç§»ãå®çŸ©ãããŸããExpo SDK 55ãšExpo Router v6ã®çµã¿åããã«ãããReact Navigationã®æåèšå®ã¯äžèŠãšãªããAndroidãiOSãWebã®ãã¹ãŠã®ãã©ãããã©ãŒã ã§çµ±äžçãªããã²ãŒã·ã§ã³äœéšãæäŸã§ããŸãããã£ãŒããªã³ã¯ãåå®å
šãªã«ãŒãã£ã³ã°ããµãŒããŒããã«ãŠã§ã¢ãšãã£ãæ©èœãæšæºã§åããŠãããã¯ãã¹ãã©ãããã©ãŒã éçºã®çç£æ§ã倧å¹
ã«åäžãããŸãã
æ°èŠExpoãããžã§ã¯ãã§ã¯ãExpo Routerãããã©ã«ãã§çµã¿èŸŒãŸããŠããŸããnpx create-expo-app@latest --template default@sdk-55ãå®è¡ãããšããã¡ã€ã«ããŒã¹ã«ãŒãã£ã³ã°ãäºåèšå®ããããããžã§ã¯ããçæãããŸããæ¢åãããžã§ã¯ãã®å Žåã¯ãexpo-routerããã±ãŒãžãã€ã³ã¹ããŒã«ããã¢ããªã±ãŒã·ã§ã³ã®ãšã³ããªãã€ã³ããæŽæ°ããã ãã§å°å
¥ã§ããŸãã
Expo Routerã«ããããã¡ã€ã«ããŒã¹ã«ãŒãã£ã³ã°ã®ä»çµã¿
appãã£ã¬ã¯ããªå
ã«é
眮ããããã¹ãŠã®ãã¡ã€ã«ããèªåçã«ã«ãŒããšããŠèªèãããŸãããã¡ã€ã«ãã¹ããã®ãŸãŸURLãã¹ã«å¯Ÿå¿ãããããéäžåã®ã«ãŒãã£ã³ã°èšå®ãã¡ã€ã«ã¯äžåäžèŠã§ããäŸãã°ãapp/settings.tsxãäœæãããš/settingsãšããã«ãŒããçæãããapp/profile/edit.tsxã¯/profile/editã«å¯Ÿå¿ããŸãã
ãã®èŠçŽããŒã¹ã®ã¢ãããŒãã¯ãåŸæ¥ã®React Navigationã«ããæåèšå®ãšæ¯èŒããŠã以äžã®3ã€ã®å€§ããªå©ç¹ããããããŸãã
- èšå®äžèŠ: ãã¡ã€ã«ãäœæããæç¹ã§ã«ãŒããæå¹ã«ãªã
- èªåãã£ãŒããªã³ã¯: ãã¹ãŠã®ç»é¢ã«URLãä»äžãããå ±æããã¹ãã容æã«ãªã
- åä»ãããã²ãŒã·ã§ã³: TypeScriptãã³ã³ãã€ã«æã«ååšããã«ãŒããèªèãã
import { View, Text, StyleSheet } from 'react-native'
import { Link } from 'expo-router'
export default function HomeScreen() {
return (
<View style={styles.container}>
<Text style={styles.title}>Welcome</Text>
{/* Link maps directly to file path */}
<Link href="/settings" style={styles.link}>
Open Settings
</Link>
<Link href="/profile/edit" style={styles.link}>
Edit Profile
</Link>
</View>
)
}
const styles = StyleSheet.create({
container: { flex: 1, justifyContent: 'center', padding: 24 },
title: { fontSize: 28, fontWeight: 'bold', marginBottom: 16 },
link: { fontSize: 16, color: '#61DAFB', marginTop: 12 },
})Linkã³ã³ããŒãã³ãã¯ããã¹ãŠã®ãã©ãããã©ãŒã ã§ããã²ãŒã·ã§ã³ãåŠçããŸããWebã§ã¯é©åãªhref屿§ãæã€ã¢ã³ã«ãŒã¿ã°ãçæãããSEOã«å¯Ÿå¿ããæ§é ãåŸãããŸãããã€ãã£ããã©ãããã©ãŒã ã§ã¯ãã¹ã¿ãã¯åã®ããã²ãŒã·ã§ã³é·ç§»ãããªã¬ãŒãããŸãã
ãããžã§ã¯ãæ§æãšã¬ã€ã¢ãŠããã¡ã€ã«
Expo Routerã§ã¯ã_layout.tsxãã¡ã€ã«ã䜿çšããŠããã²ãŒã·ã§ã³ã³ã³ãããå®çŸ©ããŸããåãã£ã¬ã¯ããªã«ç¬èªã®ã¬ã€ã¢ãŠããã¡ã€ã«ãé
眮ã§ãããã¹ããããããã²ãŒã·ã§ã³éå±€ã®æ§ç¯ãå¯èœã§ããã«ãŒãã¬ã€ã¢ãŠãã¯ã¢ããªã±ãŒã·ã§ã³å
šäœãå
æ¬ãããã¹ããããã¬ã€ã¢ãŠãã¯ç¹å®ã®ã»ã¯ã·ã§ã³ãå¶åŸ¡ããŸãã
å žåçãªãããžã§ã¯ãæ§æã¯ä»¥äžã®ãšããã§ãã
app/
_layout.tsx # Root layout (Stack or custom)
index.tsx # Home screen (/)
(tabs)/ # Tab group (parentheses = route group)
_layout.tsx # Tab navigator
home.tsx # /home tab
search.tsx # /search tab
profile.tsx # /profile tab
settings/
_layout.tsx # Settings stack layout
index.tsx # /settings
notifications.tsx # /settings/notifications
privacy.tsx # /settings/privacyã«ãŒãã°ã«ãŒãïŒæ¬åŒ§ã§å²ãŸãããã£ã¬ã¯ããªïŒã¯ãURLã«åœ±é¿ãäžããã«ãã¡ã€ã«ãè«ççã«æŽçããããã®ä»çµã¿ã§ããäžèšã®(tabs)ãã£ã¬ã¯ããªã¯ã¿ãããã²ãŒã¿ãæ§æããŸãããURLã¯/tabs/homeã§ã¯ãªã/homeã/searchã/profileã®ãŸãŸã§ãã
import { Stack } from 'expo-router'
export default function RootLayout() {
return (
<Stack
screenOptions={{
headerStyle: { backgroundColor: '#1a1a2e' },
headerTintColor: '#ffffff',
headerTitleStyle: { fontWeight: '600' },
}}
>
<Stack.Screen name="index" options={{ title: 'Home' }} />
<Stack.Screen name="(tabs)" options={{ headerShown: false }} />
<Stack.Screen name="settings" options={{ title: 'Settings' }} />
</Stack>
)
}ã«ãŒãã¬ã€ã¢ãŠãã¯ããã©ã³ãã®èªã¿èŸŒã¿ããããã€ããŒã®èšå®ãã°ããŒãã«èšå®ã®åæåãè¡ãå Žæã§ããããŸããåŸæ¥ã®App.tsxã«ä»£ããã¢ããªã±ãŒã·ã§ã³ã®ãšã³ããªãã€ã³ããšããŠæ©èœããŸãã
Expo Routerã«ããã¿ãããã²ãŒã·ã§ã³ã®æ§ç¯
ã¿ãããã²ãŒã·ã§ã³ãå®è£
ããã«ã¯ãã«ãŒãã°ã«ãŒãå
ã«_layout.tsxãã¡ã€ã«ãé
眮ããŸããExpo Router v6ã§ã¯ããã©ãããã©ãŒã åºæã®ãã€ãã£ãäœéšãæäŸããNativeTabsãå°å
¥ãããŠããŸãããæšæºã®Tabsã³ã³ããŒãã³ãã§ã»ãšãã©ã®ãŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ã§ããŸãã
import { Tabs } from 'expo-router'
import { Ionicons } from '@expo/vector-icons'
export default function TabLayout() {
return (
<Tabs
screenOptions={{
tabBarActiveTintColor: '#61DAFB',
tabBarInactiveTintColor: '#888',
tabBarStyle: {
backgroundColor: '#1a1a2e',
borderTopColor: '#2d2d44',
},
}}
>
<Tabs.Screen
name="home"
options={{
title: 'Home',
tabBarIcon: ({ color, size }) => (
<Ionicons name="home" size={size} color={color} />
),
}}
/>
<Tabs.Screen
name="search"
options={{
title: 'Search',
tabBarIcon: ({ color, size }) => (
<Ionicons name="search" size={size} color={color} />
),
}}
/>
<Tabs.Screen
name="profile"
options={{
title: 'Profile',
tabBarIcon: ({ color, size }) => (
<Ionicons name="person" size={size} color={color} />
),
}}
/>
</Tabs>
)
}åã¿ãç»é¢ã®ãã¡ã€ã«ã¯ãæšæºçãªReactã³ã³ããŒãã³ãããšã¯ã¹ããŒãããã ãã§ããã¿ãããŒã®ã¢ã€ã³ã³ãã©ãã«ããããžãªã©ã®èšå®ã¯ãã¬ã€ã¢ãŠããã¡ã€ã«ã®optionsããããã§å¶åŸ¡ããŸãã
ãã€ãããã¯ã«ãŒããšã«ãŒããã©ã¡ãŒã¿
åçã»ã°ã¡ã³ãã¯ããã¡ã€ã«åã«è§æ¬åŒ§ã䜿çšããŠå®çŸ©ããŸãã[id].tsxãšããååã®ãã¡ã€ã«ã¯åäžã®ã»ã°ã¡ã³ãã«å¯Ÿå¿ãã[...slug].tsxã¯ãã¹å
ã®æ®ãã®ãã¹ãŠã®ã»ã°ã¡ã³ãããã£ããã£ããŸãã
import { View, Text, StyleSheet } from 'react-native'
import { useLocalSearchParams, Stack } from 'expo-router'
export default function ProductScreen() {
// Extract the dynamic parameter from the URL
const { id } = useLocalSearchParams<{ id: string }>()
return (
<View style={styles.container}>
<Stack.Screen options={{ title: `Product ${id}` }} />
<Text style={styles.heading}>Product Details</Text>
<Text style={styles.id}>ID: {id}</Text>
</View>
)
}
const styles = StyleSheet.create({
container: { flex: 1, padding: 24 },
heading: { fontSize: 24, fontWeight: 'bold', marginBottom: 8 },
id: { fontSize: 16, color: '#888' },
})/product/42ã«ã¢ã¯ã»ã¹ãããšããã®ç»é¢ã衚瀺ãããid倿°ã«"42"ãèšå®ãããŸããuseLocalSearchParamsããã¯ã¯ãã«ãŒããã©ã¡ãŒã¿ãžã®åä»ãã¢ã¯ã»ã¹ãæäŸããŸãã
ãã£ãããªãŒã«ã«ãŒãã§ã¯ã[...slug].tsxããã¹ã»ã°ã¡ã³ãå
šäœããã£ããã£ããŸãã
import { useLocalSearchParams } from 'expo-router'
export default function DocsScreen() {
// /docs/getting-started/installation â slug = ['getting-started', 'installation']
const { slug } = useLocalSearchParams<{ slug: string[] }>()
return <DocViewer path={slug.join('/')} />
}React Nativeã®é¢æ¥å¯Ÿçã¯ã§ããŠããŸããïŒ
ã€ã³ã¿ã©ã¯ãã£ããªã·ãã¥ã¬ãŒã¿ãŒãflashcardsãæè¡ãã¹ãã§ç·Žç¿ããŸãããã
åå®å šãªã«ãŒãã£ã³ã°ïŒTyped RoutesïŒ
Expo Routerã¯ãTyped Routesæ©èœãæå¹ã«ãããšãã«ãŒãã®åå®çŸ©ãèªåçæããŸãããã®æ€èšŒæ©èœã«ããããªã³ã¯åããã©ã³ã¿ã€ã ã§ã¯ãªãã³ã³ãã€ã«æã«æ€åºã§ããŸãã
app.jsonã§ä»¥äžã®ããã«èšå®ããŸãã
{
"expo": {
"experiments": {
"typedRoutes": true
}
}
}ãã®èšå®ãæå¹ã«ãããšãLinkã³ã³ããŒãã³ãã®hrefãããããrouter.push()ã®åŒæ°ã«ã¯ãå®éã«ååšããã«ãŒãã«å¯Ÿå¿ããæååã®ã¿ã蚱容ãããŸãã
import { router } from 'expo-router'
function handleCheckout(cartId: string) {
// TypeScript validates this route exists
router.push(`/product/${cartId}`)
// This would cause a compile error if /nonexistent doesn't exist
// router.push('/nonexistent')
}Typed Routesã¯useLocalSearchParamsãšçµã¿åãããããšã§ç¹ã«å¹æãçºæ®ããŸããèªåçæãããåå®çŸ©ã«ãããã«ãŒãå®çŸ©å
ã®ãã©ã¡ãŒã¿åãšã³ã³ã·ã¥ãŒãã³ã³ããŒãã³ãã§äœ¿çšããããã©ã¡ãŒã¿åã®äžèŽãä¿èšŒãããŸããç¹å®ã®ç»é¢ã«é·ç§»ããéã«ã®ã¿çºèŠããããããªåŸ®åŠãªãã°ãæªç¶ã«é²æ¢ã§ããŸãã
ã¢ãŒãã«ç»é¢ãšãã¬ãŒã³ããŒã·ã§ã³èšå®
Expo Routerã«ãããã¢ãŒãã«ã¯ãã¬ã€ã¢ãŠãã§presentation: 'modal'ãæå®ããéåžžã®ç»é¢ã§ãããã¡ã€ã«ããŒã¹ã«ãŒãã£ã³ã°ã®èŠçŽã«å¿ å®ã«ãã¢ãŒãã«ãåãªãã«ãŒãã®1ã€ãšããŠæ±ãããŸãã
import { Stack } from 'expo-router'
export default function RootLayout() {
return (
<Stack>
<Stack.Screen name="index" />
<Stack.Screen name="(tabs)" options={{ headerShown: false }} />
{/* Modal screen slides up from the bottom */}
<Stack.Screen
name="create-post"
options={{
presentation: 'modal',
headerTitle: 'New Post',
}}
/>
</Stack>
)
}import { View, TextInput, Button, StyleSheet } from 'react-native'
import { router } from 'expo-router'
import { useState } from 'react'
export default function CreatePostModal() {
const [title, setTitle] = useState('')
const handleSubmit = () => {
// Submit logic here
router.back() // Dismiss the modal
}
return (
<View style={styles.container}>
<TextInput
style={styles.input}
placeholder="Post title"
value={title}
onChangeText={setTitle}
/>
<Button title="Publish" onPress={handleSubmit} />
</View>
)
}
const styles = StyleSheet.create({
container: { flex: 1, padding: 24 },
input: {
borderWidth: 1,
borderColor: '#333',
borderRadius: 8,
padding: 12,
fontSize: 16,
marginBottom: 16,
},
})/create-postã«ããã²ãŒããããšãã¢ãŒãã«ãã¬ãŒã³ããŒã·ã§ã³ãèµ·åããŸããrouter.back()ãåŒã³åºãããšã§ã¢ãŒãã«ãéããããããã²ãŒã·ã§ã³ã¹ã¿ãã¯ã®åã®ç»é¢ã«æ»ããŸãã
ããã°ã©ã ã«ããããã²ãŒã·ã§ã³ãšRouter API
Linkã³ã³ããŒãã³ã以å€ã«ãExpo Routerã¯routerãªããžã§ã¯ããéããåœä»€çãªAPIãæäŸããŸãããã®APIã«ããããŠãŒã¶ãŒã®çŽæ¥çãªæäœã§ã¯ãªããããžãã¹ããžãã¯ã«åºã¥ããããã²ãŒã·ã§ã³å¶åŸ¡ãå¯èœã«ãªããŸãã
import { router } from 'expo-router'
// Push a new screen onto the stack
router.push('/profile/settings')
// Replace the current screen (no back button)
router.replace('/login')
// Go back to the previous screen
router.back()
// Navigate with parameters
router.push({
pathname: '/product/[id]',
params: { id: '42', source: 'recommendations' },
})
// Check if going back is possible
import { useRouter } from 'expo-router'
function BackButton() {
const router = useRouter()
return router.canGoBack() ? (
<Button title="Back" onPress={() => router.back()} />
) : null
}router.pushãšrouter.replaceã®äœ¿ãåãã¯ãèªèšŒãããŒã«ãããŠç¹ã«éèŠã§ãããã°ã€ã³æååŸã«router.replace('/dashboard')ã䜿çšãããšãæ»ããã¿ã³ã§ãã°ã€ã³ç»é¢ã«æ»ããªããªããé©åãªãŠãŒã¶ãŒäœéšãå®çŸãããŸãã
router.replace()ã¯ããã²ãŒã·ã§ã³å±¥æŽã®çŸåšã®ãšã³ããªã眮ãæããŸããæªèªèšŒãŠãŒã¶ãŒããªãã€ã¬ã¯ãããèªèšŒã¬ãŒãã§ã¯ãã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°å
ã§<Redirect href="/login" />ã䜿çšããããšãæšå¥šãããŸããRedirectã³ã³ããŒãã³ãã¯ã¬ã³ããªã³ã°ãã§ãŒãºã§å®è¡ãããWebã«ããããµãŒããŒãµã€ãã¬ã³ããªã³ã°ãšãæ£ãã飿ºããŸãã
ããã«ãŠã§ã¢ãšã«ãŒãä¿è·
Expo Router v6ã§ã¯ãã«ãŒãã¬ãã«ã®ããžãã¯ãåŠçãããµãŒããŒããã«ãŠã§ã¢ãå°å
¥ãããŠããŸãã+middleware.tsãã¡ã€ã«ã¯ããªã¯ãšã¹ããã«ãŒãã³ã³ããŒãã³ãã«å°éããåã«ã€ã³ã¿ãŒã»ããããèªèšŒãã§ãã¯ããªãã€ã¬ã¯ããHTTPããããŒã®æäœãå¯èœã«ããŸãã
import { type MiddlewareRequest } from 'expo-router/server'
export function middleware(request: MiddlewareRequest) {
const { pathname } = request.nextUrl
// Protect dashboard routes
const protectedPaths = ['/dashboard', '/settings', '/profile']
const isProtected = protectedPaths.some(p => pathname.startsWith(p))
if (isProtected) {
const token = request.cookies.get('session')
if (!token) {
return Response.redirect(new URL('/login', request.url))
}
}
return undefined // Continue to route
}ãã€ãã£ããã©ãããã©ãŒã ã§ã¯ããµãŒããŒããã«ãŠã§ã¢ã¯å®è¡ãããŸããããã®ãããã«ãŒãä¿è·ã«ã¯ã¯ã©ã€ã¢ã³ããµã€ãã®ã¬ãŒããå¿ èŠã§ããæãäžè¬çãªãã¿ãŒã³ã¯ãä¿è·ãããã¬ã€ã¢ãŠããèªèšŒãã§ãã¯ã§å²ãæ¹æ³ã§ãã
import { Redirect, Stack } from 'expo-router'
import { useAuth } from '@/hooks/useAuth'
export default function AuthenticatedLayout() {
const { isLoggedIn, isLoading } = useAuth()
if (isLoading) return null
if (!isLoggedIn) return <Redirect href="/login" />
return <Stack />
}ãµãŒããŒããã«ãŠã§ã¢ã¯ããµãŒããŒãµã€ãã¬ã³ããªã³ã°ã䜿çšããWebã§ã®ã¿å®è¡ãããŸãããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¬ã€ã¢ãŠãã³ã³ããŒãã³ãå ã«ã¯ã©ã€ã¢ã³ããµã€ãã®ã¬ãŒããå¿ ãå®è£ ããå¿ èŠããããŸããäž¡æ¹ã®ã¢ãããŒããçµã¿åãããããšã§ããã¹ãŠã®ãã©ãããã©ãŒã ã«ãããŠäžè²«ããã«ãŒãä¿è·ãå®çŸãããŸãã
ãŸãšã
Expo Router v6ã¯ãWebãã¬ãŒã ã¯ãŒã¯ã§ç¢ºç«ããããã¡ã€ã«ããŒã¹ã«ãŒãã£ã³ã°ã®ææ³ãReact Nativeãšã³ã·ã¹ãã ã«ãããããã¢ãã€ã«ããã²ãŒã·ã§ã³ã®éçºäœéšã倧ããåäžãããŸããæ¬èšäºã§è§£èª¬ããéèŠãªãã€ã³ãã以äžã«ãŸãšããŸãã
- Expo Router v6ã¯ãæåã®ããã²ãŒã·ã§ã³èšå®ããã¡ã€ã«ããŒã¹ã®èŠçŽã«çœ®ãæãã
appãã£ã¬ã¯ããªå ã®ãã¹ãŠã®ãã¡ã€ã«ãèªåçã«ã«ãŒããšããŠæ©èœãã _layout.tsxãã¡ã€ã«ã§å®çŸ©ãããã¬ã€ã¢ãŠãã«ãããã¹ã¿ãã¯ãã¿ããããã¯ãŒãšãã£ãããã²ãŒã·ã§ã³éå±€ãéäžèšå®ãã¡ã€ã«ãªãã§æ§ç¯ã§ãã[param].tsxã«ãããã€ãããã¯ã«ãŒããš[...slug].tsxã«ãããã£ãããªãŒã«ã«ãŒãã¯ãTypeScriptã®å®å šãªãµããŒãã®ããšã§ãã©ã¡ãŒã¿ä»ãããã²ãŒã·ã§ã³ãåŠçããapp.jsonã§Typed Routesãæå¹ã«ãããšãããã²ãŒã·ã§ã³ãªã³ã¯ã®äžæŽåãã³ã³ãã€ã«æã«æ€åºããã- ã¢ãŒãã«ç»é¢ã
router.push/replace/backã«ããããã°ã©ã çããã²ãŒã·ã§ã³ããµãŒããŒããã«ãŠã§ã¢ããã«ãŒãã£ã³ã°ã®å æ¬çãªããŒã«ãããã圢æãã - æ¬åŒ§ã§å²ãŸããã«ãŒãã°ã«ãŒãã¯ãURLã«åœ±é¿ãäžããã«ã³ãŒããè«ççã«æŽçããã¢ããªã±ãŒã·ã§ã³ã®æé·ã«å¿ããå¯èªæ§ãç¶æãã
- ã¬ã€ã¢ãŠãå ã®ã¯ã©ã€ã¢ã³ããµã€ãã¬ãŒãããã€ãã£ããã©ãããã©ãŒã ã§ã®èªèšŒãåŠçãããµãŒããŒããã«ãŠã§ã¢ãWebãã«ããŒããããšã§ãäž¡æ¹ãçµã¿åãããã¯ãã¹ãã©ãããã©ãŒã ã®å®å šãªä¿è·ãå®çŸãã
ä»ããç·Žç¿ãå§ããŸãããïŒ
颿¥ã·ãã¥ã¬ãŒã¿ãŒãšæè¡ãã¹ãã§ç¥èããã¹ãããŸãããã
ã¿ã°
å ±æ
é¢é£èšäº

React Native ãš TypeScript 2026幎çïŒåå®å šãªã¢ãŒããã¯ãã£ãšé¢æ¥å¯Ÿç
2026幎ã®React Nativeã«ãããTypeScriptã®åå®å šã¢ãŒããã¯ãã£ã解説ãCodegenãTurboModulesãStrict TypeScript APIãåä»ãããã²ãŒã·ã§ã³ã颿¥è³ªåãã³ãŒãäŸãšãšãã«ç޹ä»ããŸãã

React Native 0.85ïŒ2026幎ïŒïŒæ°ã¢ãã¡ãŒã·ã§ã³ããã¯ãšã³ãã峿 ŒãªTypeScript APIãšé¢æ¥å¯Ÿç
React Native 0.85ã®å ±æã¢ãã¡ãŒã·ã§ã³ããã¯ãšã³ãããã¹ãããªããžã¢ãŒããã¯ãã£ãMetro TLSã«ã€ããŠãã³ãŒãäŸãšé¢æ¥è³ªåã亀ããŠåŸ¹åºè§£èª¬ããŸãã

2026幎ã®React Nativeæ°ã¢ãŒããã¯ãã£ïŒHermes V1ãããªããžã¬ã¹ã¢ãŒããšã€ã³ã¿ãã¥ãŒè³ªå
React Nativeã®æ°ã¢ãŒããã¯ãã£ã培åºè§£èª¬ãHermes V1ãšã³ãžã³ãããªããžã¬ã¹ã¢ãŒããTurboModulesãFabricã¬ã³ãã©ãŒã®ä»çµã¿ãããã©ãŒãã³ã¹ãã³ãããŒã¯ãç§»è¡ã¬ã€ããæè¡é¢æ¥ã®è³ªåãšåçãç¶²çŸ ã