rnn-codebase

작성자: wix

react-native-navigation (RNN) 코드베이스를 탐색하고 작업합니다. 버그 수정, 기능 추가, 명령 흐름 추적, 옵션 이해 등에 사용합니다.

npx skills add https://github.com/wix/react-native-navigation --skill rnn-codebase

React Native Navigation Codebase

Architecture Overview

RNN has three layers that mirror each other:

JS/TS (src/)  →  TurboModule bridge  →  iOS native (ios/)
                                     →  Android native (android/)

A navigation command (e.g. push) flows:

  1. Navigation.push() → Commands.ts → processing pipeline → NativeCommandsSender.ts
  2. TurboModule: RNNTurboModule (iOS) / NavigationTurboModule.kt (Android)
  3. iOS: RNNCommandsHandler → RNNViewControllerFactory → UIKit controllers
  4. Android: Navigator → LayoutFactory → View-based controllers (no Fragments)

Read ARCHITECTURE.md for the full overview.

Key Cross-Layer Mappings

Layout Types → Native Controllers

JS Layout TypeiOS ControllerAndroid Controller
componentRNNComponentViewControllerComponentViewController
stackRNNStackController (UINavigationController)StackController
bottomTabsRNNBottomTabsController (UITabBarController)BottomTabsController
sideMenuRNNSideMenuViewController (MMDrawerController)SideMenuController (DrawerLayout)
topTabsRNNTopTabsViewControllerTopTabsController (ViewPager)
splitViewRNNSplitViewControllerN/A (iOS only)
externalComponentRNNExternalViewControllerExternalComponentViewController

Options → Presenters

Each controller type has a Presenter that applies options to views:

iOS ControlleriOS PresenterAndroid Presenter
RNNComponentViewControllerRNNComponentPresenterComponentPresenter
RNNStackControllerRNNStackPresenter + TopBarPresenterStackPresenter
RNNBottomTabsControllerRNNBottomTabsPresenterBottomTabsPresenter
RNNSideMenuViewControllerRNNSideMenuPresenterSideMenuPresenter

Events (same names both platforms)

EventTrigger
RNN.ComponentDidAppearScreen becomes visible
RNN.ComponentDidDisappearScreen hidden
RNN.NavigationButtonPressedTopBar button tap
RNN.BottomTabSelectedTab changed
RNN.ModalDismissedModal dismissed
RNN.ScreenPoppedScreen popped from stack
RNN.CommandCompletedAny command finished

Where to Find Things

By task: "I need to fix/change X"

TaskJS File(s)iOS File(s)Android File(s)
Command executionsrc/commands/Commands.tsios/RNNCommandsHandler.mmreact/NavigationTurboModule.kt
Layout creationsrc/commands/LayoutTreeParser.tsios/RNNViewControllerFactory.mmoptions/LayoutFactory.java
Options processingsrc/commands/OptionsProcessor.tsios/RNNNavigationOptions.mmoptions/Options.java
Options application—ios/*Presenter.mmviewcontrollers/*Presenter.java
TopBarsrc/interfaces/Options.ts (TopBarOptions)ios/TopBarPresenter.mm, ios/RNNUIBarButtonItem.mmviews/stack/topbar/
Bottom tabssrc/interfaces/Options.ts (BottomTabsOptions)ios/RNNBottomTabsPresenter.mmviewcontrollers/bottomtabs/
Modalssrc/commands/Commands.tsios/RNNModalManager.mmviewcontrollers/modal/ModalStack.java
Overlayssrc/commands/Commands.tsios/RNNOverlayManager.mmviewcontrollers/overlay/OverlayManager.kt
Animationssrc/interfaces/Options.ts (AnimationOptions)ios/ScreenAnimationController.mmviewcontrollers/stack/StackAnimator.kt
React view rendering—ios/RNNReactView.mmreact/ReactView.java
Events to JSsrc/adapters/NativeEventsReceiver.tsios/RNNEventEmitter.mmreact/events/EventEmitter.java
Component registrationsrc/components/ComponentRegistry.ts——
Deep linking (URL → screen)src/linking/ (LinkingHandler, URLParser, RouteMatcher, DeferredLinkQueue, ModalLayoutBuilder)ios/RNNAppDelegate.mm (dispatchDeepLinkURL:, cold-start queue, RCTContentDidAppearNotification)NavigationActivity.onNewIntent → ReactGateway

By directory

  • src/ — JS public API, commands, processing pipeline. See src/ARCHITECTURE.md
  • ios/ — All Obj-C/C++ native code. See ios/ARCHITECTURE.md
  • ios/TurboModules/ — New architecture entry points (RNNTurboModule, RNNTurboManager, RNNTurboCommandsHandler)
  • android/src/main/java/com/reactnativenavigation/ — All Java/Kotlin native code. See android/ARCHITECTURE.md
  • playground/ — Demo app for development and E2E tests
  • playground/src/screens/ — Test screens exercising every feature
  • playground/e2e/ — Detox E2E tests

Options Resolution Order

Options are applied in ascending priority:

  1. Default options (from Navigation.setDefaultOptions()) — lowest priority
  2. Static options (from component class or Navigation.registerComponent)
  3. Options passed in the layout call (e.g. push, setRoot)
  4. mergeOptions() — runtime override, highest priority

JS Processing Pipeline (exact order)

API layout → OptionsCrawler.crawl() → LayoutProcessor.process()
  → LayoutTreeParser.parse() → LayoutTreeCrawler.crawl()
  → OptionsProcessor (colors, assets, custom) → NativeCommandsSender

iOS Patterns

  • All controllers conform to RNNLayoutProtocol
  • RNNBasePresenter subclasses apply options — applyOptionsOnInit:, applyOptions:, mergeOptions:resolvedOptions:
  • Commands run on main thread (RCTExecuteOnMainQueue)
  • React views: RNNReactView wraps RCTSurfaceHostingView (new arch)
  • Overlays use separate UIWindow instances (RNNOverlayWindow)
  • RNNReactComponentRegistry caches React component instances

Android Patterns

  • View-based, NOT Fragment-based
  • All commands dispatched via UiThread.post()
  • ViewController<T extends ViewGroup> is the base — createView() is abstract
  • ParentController extends ChildController extends ViewController
  • Bottom tabs use AHBottomNavigation library
  • Three root layouts in NavigationActivity: rootLayout, modalsLayout, overlaysLayout
  • Tab attachment modes: Together, OnSwitchToTab, AfterInitialTab

Development Workflow

Playground app

  • yarn start — Metro bundler
  • yarn xcode — Open iOS project
  • yarn studio — Open Android project
  • yarn pod-install — Install iOS pods

Testing

  • yarn test-js — Jest unit tests
  • yarn test-unit-ios — iOS native unit tests (XCTest)
  • yarn test-unit-android — Android native unit tests (JUnit + Robolectric)
  • yarn test-e2e-ios-ci / yarn test-e2e-android-ci — Detox E2E tests

Building

  • yarn prepare — Builds src/ → lib/ (ESM + types)
  • Codegen config: rnnavigation in package.json

Common Gotchas

  • iOS uses UIKit subclasses (UINavigationController, UITabBarController); Android uses custom View hierarchy
  • splitView is iOS-only
  • Side menu: iOS uses MMDrawerController (3rd party); Android uses DrawerLayout (native)
  • Options that exist in JS types may not be implemented on both platforms — check the presenter
  • passProps are stored in JS Store, not sent to native (cleared before bridge crossing)
  • The lib/ folder is generated — never edit it, edit src/ instead
  • Deep links are processed only after the first setRoot() resolves; pre-bridge URLs on iOS are queued natively in RNNAppDelegate and flushed on RCTContentDidAppearNotification (bridgeless mode — RCTJavaScriptDidLoadNotification does NOT fire)
  • ModalLayoutBuilder strips React-reserved keys (ref, key) from URL query params before they reach passProps, to avoid React 19 ref-validation crashes

wix의 다른 스킬

wds-docs
wix
Wix 디자인 시스템 컴포넌트 참조. @wix/design-system으로 UI를 구축하거나, 컴포넌트를 선택하거나, props와 예제를 확인할 때 사용합니다. "what…"에서 트리거됩니다.
rp-source-wordpress
wix
WordPress 및 WooCommerce 소스 어댑터: REST 캡처, 인증, 페이지네이션 및 코드 생성을 위한 읽기 계약. 소스 플랫폼이 WordPress 또는...인 경우 사용합니다.
rp-execute-setup
wix
가져오기 전에 필요한 Wix 측 설정을 확인하고 프로비저닝합니다. setup-requirements.md를 대상에 대해 검증하거나 실행해야 할 때 코드 생성 후에 사용합니다…
wix-manage
wix
Wix 비즈니스 솔루션 관리 레시피 — Wix 비즈니스 솔루션을 구성하고 관리하기 위한 REST API 작업입니다. 스토어, 예약, 결제, CMS 등으로 연결됩니다.
rp-orchestration
wix
RePlatform 소스에서 Wix로의 마이그레이션을 마이그레이션 프로젝트 아티팩트를 검사하여 다음 워크플로 단계로 라우팅합니다. 마이그레이션을 시작, 계속 또는 복구할 때 사용합니다.
rp-mapper
wix
발견된 소스 엔티티와 필드를 Wix 대상에 매핑하고 손실 정도를 문서화합니다. discovery 이후 mapping-plan.md와 mapping-summary.md를 작성할 때 사용합니다.
rp-target-wix
wix
Wix 타겟 어댑터로, 검증된 쓰기 프리미티브(wix-writers.js)와 계약 테스트를 포함합니다. Wix 라이터를 벤더링하거나, API 형태를 검증하거나, Wix…
site-management
wix
Wix 사이트 선택 및 전환을 관리합니다. 액세스 토큰 권한에 따라 Wix API에서 사이트를 동적으로 가져옵니다.