Panduan Pengembangan Aplikasi React Native 2026: Membangun Aplikasi Produksi dan Pertanyaan Interview

Panduan lengkap pengembangan aplikasi React Native 2026 mencakup New Architecture, Expo SDK 56, Hermes V1, dan pertanyaan interview untuk developer React Native.

Panduan Pengembangan Aplikasi React Native 2026

Pengembangan aplikasi React Native pada tahun 2026 berpusat pada New Architecture, Expo SDK 56, dan tooling siap produksi yang telah matang secara signifikan dalam setahun terakhir. Panduan ini membahas workflow praktis untuk membangun aplikasi produksi dan menjawab pertanyaan interview umum yang membedakan developer React Native berpengalaman.

Stack Produksi 2026

Stack produksi yang direkomendasikan: Expo SDK 56 dengan EAS Build, React Native 0.85+, Hermes V1 engine, dan New Architecture yang aktif secara default. Waktu build turun 16% di iOS dan 60% di Android dibandingkan SDK 55.

Menyiapkan Proyek React Native Siap Produksi

Memulai proyek React Native baru di tahun 2026 berarti memilih antara Expo (direkomendasikan) dan bare React Native. Expo telah berkembang dari wrapper ramah pemula menjadi rekomendasi resmi dari tim React Native untuk sebagian besar aplikasi produksi.

bash
# Membuat proyek Expo baru dengan SDK 56
npx create-expo-app@latest my-production-app
cd my-production-app

# Verifikasi New Architecture aktif (default sejak RN 0.76)
npx expo config --type introspect | grep newArchEnabled

New Architecture, yang mencakup Fabric, TurboModules, dan JSI, menghilangkan JSON bridge asinkron yang menyebabkan bottleneck performa pada aplikasi kompleks. JavaScript kini dapat memanggil modul native secara sinkron, menghilangkan seluruh kategori bug timing.

app.json - Konfigurasi produksitypescript
{
  "expo": {
    "name": "MyProductionApp",
    "slug": "my-production-app",
    "version": "1.0.0",
    "newArchEnabled": true, // Default di SDK 56
    "android": {
      "package": "com.company.myproductionapp",
      "adaptiveIcon": {
        "foregroundImage": "./assets/adaptive-icon.png",
        "backgroundColor": "#ffffff"
      }
    },
    "ios": {
      "bundleIdentifier": "com.company.myproductionapp",
      "supportsTablet": true
    },
    "plugins": [
      "expo-router"
    ]
  }
}

Expo Router telah menjadi standar untuk navigasi, menghadirkan routing berbasis file serupa dengan Next.js. Struktur direktori /app langsung dipetakan ke route.

Hermes V1 Engine dan Performa JavaScript

Hermes V1 diluncurkan sebagai JavaScript engine default di React Native 0.84, menggantikan JavaScriptCore dan Hermes versi lama. Compiler dan virtual machine baru memberikan eksekusi bytecode lebih cepat, footprint memori lebih rendah, dan distribusi pause garbage collection yang lebih baik.

typescript
// Monitoring performa dengan Hermes V1
// HermesInternal tersedia secara global saat berjalan di Hermes
declare global {
  var HermesInternal: {
    getRuntimeProperties: () => Record<string, unknown>;
    enableSamplingProfiler: () => void;
    disableSamplingProfiler: () => string;
  } | undefined;
}

export function checkHermesStatus(): boolean {
  const isHermes = typeof HermesInternal === 'object' && HermesInternal !== null;

  if (isHermes && __DEV__) {
    const props = HermesInternal.getRuntimeProperties();
    console.log('Hermes version:', props['OSS Release Version']);
    console.log('Bytecode version:', props['Bytecode Version']);
  }

  return isHermes;
}

Hermes V1 melakukan precompile JavaScript ke bytecode selama proses build. Ini menghilangkan parsing JavaScript saat runtime, yang menyumbang porsi signifikan dari waktu startup aplikasi. Build produksi mengalami Time to Interactive 10-30% lebih cepat dibandingkan JSC.

Building dengan EAS Build dan Kompilasi Optimal

EAS Build menangani build produksi di cloud dengan caching, signing, dan distribusi. SDK 56 memperkenalkan XCFrameworks prebuilt untuk modul Expo di iOS dan plugin compiler Kotlin untuk Android yang menghilangkan reflection saat runtime.

eas.json - Konfigurasi build produksitypescript
{
  "cli": {
    "version": ">= 15.0.0"
  },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal",
      "ios": {
        "simulator": true
      }
    },
    "preview": {
      "distribution": "internal",
      "ios": {
        "resourceClass": "m-medium"
      },
      "android": {
        "buildType": "apk"
      }
    },
    "production": {
      "ios": {
        "resourceClass": "m-large"
      },
      "android": {
        "buildType": "app-bundle"
      },
      "env": {
        "EXPO_USE_PRECOMPILED_MODULES": "1"
      }
    }
  },
  "submit": {
    "production": {}
  }
}

Build aplikasi produksi:

bash
# Build untuk iOS App Store
eas build --platform ios --profile production

# Build untuk Google Play
eas build --platform android --profile production

# Submit ke store setelah build
eas submit --platform all

Fitur precompiled headers untuk Android (usePrecompiledHeaders di expo-build-properties) mengurangi waktu kompilasi CMake dari 17 menit menjadi 6 menit berdasarkan benchmark Expo.

Siap menguasai wawancara React Native Anda?

Berlatih dengan simulator interaktif, flashcards, dan tes teknis kami.

Pola State Management dan Data Fetching

Aplikasi React Native produksi biasanya menggabungkan TanStack Query untuk server state dengan Zustand atau Jotai untuk client state. Pemisahan ini menjaga codebase tetap predictable dan menghindari kompleksitas Redux untuk sebagian besar kasus penggunaan.

hooks/useProducts.tstypescript
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { api } from '@/lib/api';
import type { Product } from '@/types';

// Query key factory untuk cache management yang type-safe
export const productKeys = {
  all: ['products'] as const,
  lists: () => [...productKeys.all, 'list'] as const,
  list: (filters: ProductFilters) => [...productKeys.lists(), filters] as const,
  details: () => [...productKeys.all, 'detail'] as const,
  detail: (id: string) => [...productKeys.details(), id] as const,
};

export function useProducts(filters: ProductFilters) {
  return useQuery({
    queryKey: productKeys.list(filters),
    queryFn: () => api.products.list(filters),
    staleTime: 5 * 60 * 1000, // 5 menit
    gcTime: 30 * 60 * 1000,   // 30 menit (sebelumnya cacheTime)
  });
}

export function useCreateProduct() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: (data: CreateProductInput) => api.products.create(data),
    onSuccess: () => {
      // Invalidate query list untuk refetch
      queryClient.invalidateQueries({ queryKey: productKeys.lists() });
    },
  });
}

Untuk kemampuan offline-first, kombinasikan TanStack Query dengan WatermelonDB atau dukungan SQLite bawaan melalui expo-sqlite:

lib/offline-sync.tstypescript
import * as SQLite from 'expo-sqlite';
import NetInfo from '@react-native-community/netinfo';

const db = SQLite.openDatabaseSync('app.db');

export async function initializeOfflineStorage() {
  await db.execAsync(`
    CREATE TABLE IF NOT EXISTS pending_mutations (
      id TEXT PRIMARY KEY,
      type TEXT NOT NULL,
      payload TEXT NOT NULL,
      created_at INTEGER NOT NULL
    );
  `);
}

export async function queueMutation(type: string, payload: object) {
  const id = crypto.randomUUID();
  await db.runAsync(
    'INSERT INTO pending_mutations (id, type, payload, created_at) VALUES (?, ?, ?, ?)',
    [id, type, JSON.stringify(payload), Date.now()]
  );
}

export async function syncPendingMutations() {
  const state = await NetInfo.fetch();
  if (!state.isConnected) return;

  const pending = await db.getAllAsync<PendingMutation>(
    'SELECT * FROM pending_mutations ORDER BY created_at ASC'
  );

  for (const mutation of pending) {
    try {
      await processMutation(mutation);
      await db.runAsync('DELETE FROM pending_mutations WHERE id = ?', [mutation.id]);
    } catch (error) {
      console.error('Sync gagal untuk mutation:', mutation.id);
      break; // Berhenti pada kegagalan pertama untuk menjaga urutan
    }
  }
}

Sistem Animasi dengan React Native Reanimated 4

React Native 0.85 memperkenalkan backend animasi baru yang selaras dengan New Architecture. Reanimated 4 memanfaatkan sepenuhnya hal ini, menjalankan animasi di UI thread tanpa melewati JS bridge.

components/AnimatedCard.tsxtypescript
import Animated, {
  useSharedValue,
  useAnimatedStyle,
  withSpring,
  withTiming,
  interpolate,
  Extrapolation,
} from 'react-native-reanimated';
import { Gesture, GestureDetector } from 'react-native-gesture-handler';

const SWIPE_THRESHOLD = 120;

export function SwipeableCard({ onSwipe, children }: SwipeableCardProps) {
  const translateX = useSharedValue(0);
  const opacity = useSharedValue(1);

  const panGesture = Gesture.Pan()
    .onUpdate((event) => {
      translateX.value = event.translationX;
    })
    .onEnd((event) => {
      if (Math.abs(event.translationX) > SWIPE_THRESHOLD) {
        const direction = event.translationX > 0 ? 'right' : 'left';
        translateX.value = withTiming(
          direction === 'right' ? 500 : -500,
          { duration: 200 }
        );
        opacity.value = withTiming(0, { duration: 200 }, () => {
          onSwipe(direction);
        });
      } else {
        translateX.value = withSpring(0, {
          damping: 15,
          stiffness: 150,
        });
      }
    });

  const animatedStyle = useAnimatedStyle(() => ({
    transform: [
      { translateX: translateX.value },
      {
        rotate: `${interpolate(
          translateX.value,
          [-200, 0, 200],
          [-15, 0, 15],
          Extrapolation.CLAMP
        )}deg`,
      },
    ],
    opacity: opacity.value,
  }));

  return (
    <GestureDetector gesture={panGesture}>
      <Animated.View style={animatedStyle}>
        {children}
      </Animated.View>
    </GestureDetector>
  );
}

Directive worklet (implisit di Reanimated 4 untuk fungsi yang dipass ke useAnimatedStyle) memastikan logika animasi berjalan di UI thread. Ini mencapai refresh rate 120Hz yang konsisten pada perangkat yang mendukung.

Pertanyaan Interview untuk Developer React Native

Interview teknis untuk posisi React Native di tahun 2026 sangat berfokus pada New Architecture, optimasi performa, dan deployment produksi. Jelajahi lebih banyak pertanyaan interview React Native untuk mempraktikkan topik spesifik.

Apa yang berubah dengan New Architecture dan mengapa itu penting?

New Architecture menggantikan JSON bridge asinkron dengan JSI (JavaScript Interface), memungkinkan komunikasi sinkron antara JavaScript dan kode native. Tiga komponen membentuk inti:

  1. JSI: Layer C++ yang memungkinkan JavaScript menyimpan referensi ke objek native dan memanggil method mereka secara langsung
  2. Fabric: Sistem rendering baru yang mendukung pengukuran layout sinkron dan concurrent rendering
  3. TurboModules: Modul native yang dimuat secara lazy dan berkomunikasi melalui JSI daripada bridge

Dampak praktis: UI thread contention turun 10-30% pada aplikasi tipikal. Aplikasi dengan penggunaan modul native yang berat mengalami peningkatan hingga 3x dalam performa cross-thread call karena overhead serialisasi dihilangkan.

Bagaimana Hermes V1 berbeda dari JavaScriptCore?

Hermes V1 melakukan precompile JavaScript ke bytecode saat build time, menghilangkan langkah parsing saat runtime. Perbedaan utama:

  • Waktu startup: Hermes melewati parsing, mengurangi Time to Interactive 10-30%
  • Memori: Penggunaan memori baseline lebih rendah karena representasi bytecode yang dioptimalkan
  • Debugging: Hermes menggunakan Chrome DevTools Protocol secara native, sementara JSC memerlukan adapter khusus
  • Garbage collection: Hermes menggunakan GC generational dengan pause time lebih pendek

Tradeoff-nya: Hermes secara historis memiliki kecepatan eksekusi puncak yang lebih lambat untuk kode yang intensif secara komputasional, meskipun V1 telah mempersempit gap ini secara signifikan.

Jelaskan perbedaan antara useCallback, useMemo, dan React.memo di React Native

Ketiganya adalah tool memoization, tetapi melayani tujuan yang berbeda:

typescript
// useCallback: memoize referensi fungsi
const handlePress = useCallback(() => {
  navigation.navigate('Detail', { id: item.id });
}, [item.id, navigation]);

// useMemo: memoize nilai yang dihitung
const sortedItems = useMemo(() => {
  return items.slice().sort((a, b) => a.price - b.price);
}, [items]);

// React.memo: memoize output render komponen
const ProductCard = React.memo(function ProductCard({ product, onPress }: Props) {
  return (
    <Pressable onPress={onPress}>
      <Text>{product.name}</Text>
    </Pressable>
  );
});

Di React Native, React.memo sangat penting untuk item list yang di-render oleh FlatList. Tanpanya, setiap item akan re-render ketika state parent berubah, menyebabkan frame drop selama scrolling.

Bagaimana cara menangani deep linking di aplikasi React Native produksi?

Deep linking memerlukan konfigurasi di beberapa layer: URL scheme native, universal/app links, dan JavaScript router.

app.json - Konfigurasi URL schemetypescript
{
  "expo": {
    "scheme": "myapp",
    "ios": {
      "associatedDomains": ["applinks:myapp.com"]
    },
    "android": {
      "intentFilters": [
        {
          "action": "VIEW",
          "autoVerify": true,
          "data": [
            {
              "scheme": "https",
              "host": "myapp.com",
              "pathPrefix": "/product"
            }
          ],
          "category": ["BROWSABLE", "DEFAULT"]
        }
      ]
    }
  }
}

Expo Router menangani parsing secara otomatis ketika struktur direktori app sesuai dengan path URL. Untuk penanganan kustom:

app/_layout.tsxtypescript
import { useURL } from 'expo-linking';
import { useEffect } from 'react';
import { router } from 'expo-router';

export default function RootLayout() {
  const url = useURL();

  useEffect(() => {
    if (url) {
      const parsed = parseDeepLink(url);
      if (parsed.requiresAuth && !isAuthenticated) {
        // Simpan destinasi yang dituju, redirect ke login
        router.replace('/login');
      }
    }
  }, [url]);

  return <Slot />;
}

Universal links (iOS) dan App Links (Android) memerlukan konfigurasi server-side: file apple-app-site-association dan file assetlinks.json masing-masing, disajikan dari domain root.

Mulai berlatih!

Uji pengetahuan Anda dengan simulator wawancara dan tes teknis kami.

Poin Penting Pengembangan React Native di 2026

  • New Architecture adalah wajib: bridge lama dinonaktifkan di React Native 0.82, dan 85% package npm kini mendukung arsitektur baru
  • Expo SDK 56 dengan EAS Build menyediakan jalur tercepat ke produksi, dengan modul prebuilt memangkas waktu build iOS 16% dan kompilasi CMake Android 60%
  • Hermes V1 adalah engine default tanpa perlu konfigurasi, memberikan startup 10-30% lebih cepat dibandingkan JSC
  • TanStack Query plus library client state ringan (Zustand/Jotai) mencakup sebagian besar kebutuhan manajemen data produksi tanpa kompleksitas Redux
  • Reanimated 4 dengan backend animasi baru mencapai animasi 120Hz dengan berjalan sepenuhnya di UI thread
  • Persiapan interview harus fokus pada mekanisme JSI, Fabric rendering, profiling performa dengan Hermes, dan deployment produksi dengan EAS
Tantangan harian

Bisakah kamu menemukan bug di React Native?

Satu potongan kode nyata, satu bug tersembunyi, satu percobaan per hari. Tanpa akun untuk mencoba.

Anthony Fillion-Maillet

Ditulis oleh

Anthony Fillion-Maillet

Pendiri SharpSkill

Developer fullstack selama lebih dari 10 tahun. Ia menjalankan SharpSkill dan bertanggung jawab atas semua yang diterbitkan di sini.

Diperbarui 14 September 2026

Tag

#react-native
#mobile-development
#expo
#hermes
#new-architecture

Bagikan

Artikel terkait