React Native 0.68 버전부터 도입된 새로운 아키텍처를 알아본다. 참고로 새로운 아키텍처를 적용하기 위해서는 별도의 설정이 필요하다.
Codegen
과 Turno Module
을 켜고 프로덕션 배포 직전에 앱 파일을 생성하기 위해 build
명령어를 입력하면 다음의 흐름이 실행된다.JavaScript code
를 bytecode
로 컴파일한다.Codegen
을 사용해서 native code
또한 생성된다.bytecode
와 native code
가 디바이스에 설치할 수 있는 앱 패키지에 포함된다.Turbo Module
, Fabric
두 개의 큰 컴포넌트가 실행된다.Codegen
은 Turbo Module
과 Fabric
컴포넌트를 위해 Native Code
를 생성하는 역할을 한다.Codegen
은 정적 타입을 체크해서 자바스크립트와 C++ 사이에 타입으로 인한 문제를 해결한다.native code
는 typed JavaScript code
와 직접적으로 소통할 수 있다. JSI
는 C++로 작성되어서 자바스크립트의 객체와 함수에게 native interface
를 제공한다.JSI
로 인해 네이티브 메서드는 C++ 객체를 통한 자바스크립트에 노출된다. 이 객체들은 자바스크립트 코드를 참조하기 때문에 직접적으로 호출할 수 있다.JSI
는 Hermes Engine
, Turbo Module
, Fabric
세 개의 컴포넌트에서 사용된다.Hermes
는 앱을 실행할 때 디바이스에서 실행되는 자바스크립트 엔진이다.Heremes
는 앱의 JavaScript code
와 Native code
를 모두 포함하는 bytecode
를 로드한다.Hermes
는 JSI
를 사용해서 앱의 Native code
와 소통한다. JSI
는 Hermes
가 네이티브 함수와 객체에 직접적으로 접근할 수 있도록 한다.Hermes
는 Fabric
을 이용해서 UI를 업데이트한다.Turbo Module
은 JSI
와 Native Code
를 사용해서 Native Module
을 실행한다.Native Modules
와는 다르게 Turbo Module
은 앱을 시작할 때 Native Modules
에 Lazy Loading
을 적용한다.Fabric
은 디바이스에서 UI를 렌더링하는 역할을 한다.Fabric
은 Hermes
와 native code
와 소통하기 위해 JSI
를 이용하기 때문에 네이티브 사이드와 데이터를 주고받을 때 더욱 성능이 좋다.Fabric renderer
에서 Suspense
, Concurrent
와 같은 리액트 18의 기능들을 사용할 수 있다.React element tree
를 생성한다. React Element
는 순수 자바스크립트 객체로 이루어져 있다.Fabric Renderer
가 React element tree
를 사용해서 C++로 이루어진 React shadow tree
를 생성한다.React element
마다 shadow node
가 생성된다.Yoga
를 호출해서 각 React shadow node
의 위치와 크기 등 레이아웃을 계산한다.React shadow tree
를 마운트 될 다음 트리로 promote한다. 이 promotion은 React element tree
의 최신 상태를 나타낸다.layout calculation
데이터를 포함한 React Shadow Tree
가 렌더링된 픽셀 값과 함께 host view tree
(안드로이드 혹은 IOS와 같은 호스트 트리의 view tree)로 변환된다. Fabric renderer
가 각 React shadow
에 해당하는 host view
를 생성하고 이를 화면에 마운트한다.