React Native Open Source Update June 2019
코드와 커뮤니티 건강
지난 6개월 동안 550명 이상의 기여자가 React Native에 총 2800개의 커밋을 작성했다. 커뮤니티에서 400명의 기여자가 1,150개의 Pull Request를 생성했으며, 이 중 820개의 Pull Request가 병합되었다.
Lean Core 작업을 통해 웹사이트, CLI, 그리고 여러 모듈을 React Native에서 분리했음에도 불구하고, 지난 6개월 동안 하루 평균 Pull Request 수는 3개에서 약 6개로 증가했다. 현재 평균 오픈 Pull Request 수는 25개 미만이며, 대부분 몇 시간에서 며칠 내에 피드백과 리뷰를 제공한다.
의미 있는 커뮤니티 기여
최근 커뮤니티에서 이루어진 몇 가지 멋진 기여를 소개한다:
- 접근성: React Native 0.60은 안드로이드와 iOS 모두에서 접근성 API를 크게 개선한 버전이다. 새로운 기능들은 모두 기본 플랫폼에서 제공하는 API를 직접 사용하므로, 안드로이드와 iOS의 네이티브 접근성 기술과 완벽하게 통합된다. Marc Mulcahy, Alan Kenyon, Estevão Lucas, Sam Mathias Weggersen, 그리고 Janic Duplessis의 기여에 감사한다:
- 추가 접근성 역할 및 상태와 새로운 접근성 상태 API. 다양한 컴포넌트에 누락된 접근성 역할을 추가하고, 향후 웹 지원을 위한 새로운 API를 도입했다.
- AccessibilityInfo.announceForAccessibility. 이전에는 iOS에서만 지원되던 기능을 안드로이드에서도 사용할 수 있게 했다.
- 확장된 접근성 액션 지원. 사용자 정의 액션과 관련된 접근성을 처리하기 위한 콜백을 추가했다.
- iOS 접근성 플래그 지원과 "모션 감소" 지원.
- 안드로이드 키보드 접근성 개선.
clickable
프로퍼티와 키보드 네비게이션을 통해 액션을 호출할 수 있는onClick
콜백을 추가했다 (참고: 이 기능은 곧focusable
로 이름이 변경될 예정). - CALayers를 사용해 텍스트 그리기. iOS에서 텍스트가 확대되었을 때 사라지는 문제를 해결했다.
- 새 앱 화면: 커뮤니티가 새 앱 화면 디자인을 제안했고, 이는 0.60 버전에 구현되었다. 이 화면은 React Native를 처음 사용하는 대부분의 사용자에게 보여진다. 이제 초보 사용자는 문서로 바로 연결되며, 디자인도 곧 출시될 웹사이트 리디자인과 일치한다 🌟. Orta, Adam Shurson, Glauber Castro, Karan Singh, Eli Perkins, Lucas Bento, 그리고 Eric Lewis의 노력과 협업에 큰 감사를 표한다!
- 새로운 앱 화면은 "React Native Show" 비디오 시리즈에서 확인할 수 있다.
- TurboModule 타입: 새로운 TurboModules 시스템은 네이티브에서 타입 안전한 작업을 보장하기 위해 모든 네이티브 모듈의 타입을 요구한다. 단 2주 만에 커뮤니티는 약 40개의 풀 리퀘스트를 보내 이 작업을 완료했다. 앞서 언급한 사람들 외에도 Michał Chudziak, Michał Pierzchała, Wojtek Szafraniec, 그리고 Jean Regisser와 여러 풀 리퀘스트를 보낸 모든 분들에게 감사한다.
- Haste: React Native는 2015년부터 “haste” 모듈 시스템을 사용해왔다. 이 시스템은 상대 경로 대신 전역 ID로 모듈을 가져올 수 있어 편리하지만, 많은 도구에서 잘 지원되지 않는다. James Ide는 React가 몇 년 전에 haste를 제거한 것과 유사하게 haste를 제거하는 것을 제안했다. 그는 umbrella task를 통해 모든 작업을 계획했고, 이를 구현하기 위해 18개의 풀 리퀘스트를 보냈다! 그의 트위터 스레드에서 더 자세한 내용을 확인할 수 있다.
- 안드로이드 프래그먼트: John Shelley가 제안한 안드로이드 프래그먼트를 통해 React Native를 작동하게 하는 아이디어가 합쳐졌고, 이는 0.61 버전에서 사용할 수 있다. 안드로이드 프래그먼트에 대해 더 알아보기.
Lean Core
Lean Core의 주요 목표는 React Native의 모듈을 별도의 저장소로 분리하여 더 나은 유지보수를 가능하게 하는 것이다. 단 6개월 만에 WebView, NetInfo, AsyncStorage, 웹사이트, 그리고 CLI와 같은 저장소에서 총 800개 이상의 Pull Request가 처리되었다. 더 나은 유지보수 외에도, 이러한 프로젝트들은 React Native 자체보다 더 자주 독립적으로 릴리스될 수 있다.
또한, React Native 자체에서 더 이상 필요하지 않은 폴리필과 레거시 컴포넌트를 제거할 기회를 활용했다. 과거에는 JavaScriptCore(JSC)의 구버전에서 Map
과 Set
과 같은 언어 기능을 지원하기 위해 폴리필이 필요했다. 이제 React Native가 새로운 버전의 JSC를 포함하므로, 이러한 폴리필을 제거했다.
이 작업은 아직 진행 중이며, 네이티브와 JavaScript 양쪽에서 더 많은 요소를 분리하거나 제거해야 한다. 하지만 초기 징후로는, 점점 커지는 표면적과 앱 크기의 증가 추세를 뒤집는 데 성공한 것으로 보인다. 예를 들어, JavaScript 번들 크기를 살펴보면, 약 1년 전 버전 0.54에서 React Native의 JavaScript 번들 크기는 530kb였고, 6개월 만에 버전 0.57에서 607kb(+77kb)로 증가했다. 이제는 master 브랜치에서 번들 크기가 28kb 감소한 579kb로, 100kb 이상의 차이를 보이고 있다.
Lean Core 작업의 첫 번째 반복을 마무리하면서, React Native에 추가되는 새로운 API에 대해 더 신중하게 접근할 것이다. 또한, React Native를 더 작고 빠르게 만드는 방법을 지속적으로 평가하고, 커뮤니티가 다양한 컴포넌트의 소유권을 가질 수 있도록 지원할 방법을 모색할 것이다.
사용자 피드백
6개월 전 커뮤니티에 "React Native에서 불편한 점은 무엇인가요?"라는 질문을 던졌다. 이를 통해 사람들이 겪고 있는 문제를 종합적으로 파악할 수 있었다. 몇 달 전에 해당 게시물에 답변을 남겼고, 이제 주요 이슈에 대한 진행 상황을 요약할 때가 되었다:
-
업그레이드: React Native 커뮤니티는 업그레이드 경험을 개선하기 위해 여러 노력을 기울였다. autolinking과 rn-diff-purge를 통한 더 나은 업그레이드 커맨드, 곧 출시될 업그레이드 헬퍼 웹사이트 등이 대표적이다. 또한 각 주요 릴리스마다 블로그 포스트를 발행해 주요 변경 사항과 새로운 기능을 알릴 예정이다. 이러한 개선 사항들은 0.60 릴리스 이후의 업그레이드를 훨씬 쉽게 만들어 줄 것이다.
-
지원 / 불확실성: Pull Request에 대한 활동 부족과 Facebook의 React Native 투자에 대한 불확실성으로 많은 사람들이 불만을 표시했다. 앞서 보여준 것처럼, 이제 더 많은 Pull Request를 받을 준비가 되어 있으며 여러분의 제안과 기여를 기대하고 있다.
-
성능: React Native 0.59는 더 빠른 버전의 JavaScriptCore(JSC)를 포함해 출시되었다. 또한 기본적으로 inline-requires를 쉽게 활성화할 수 있도록 개선했으며, 다음 몇 달 동안 더 흥미로운 업데이트를 준비 중이다.
-
문서: 최근 React Native 문서 전체를 개편하고 재작성하는 작업을 시작했다. 기여하고 싶다면 여러분의 도움을 기대한다.
-
Xcode 경고: 기존의 모든 경고를 제거했으며, 새로운 경고가 발생하지 않도록 노력하고 있다.
-
핫 리로딩: React 팀이 새로운 핫 리로딩 시스템을 개발 중이며, 곧 React Native에 통합될 예정이다.
아쉽게도 아직 모든 부분을 개선하지는 못했다:
-
디버깅: 매일 발생하는 불편한 버그와 이슈를 많이 수정했지만, 디버깅 부분에서는 기대만큼 진전을 이루지 못했다. React Native의 디버깅 경험이 아직 부족하다는 점을 인지하고 있으며, 향후 이를 개선하는 데 우선순위를 둘 예정이다.
-
Metro 심볼릭 링크: 아직 간단하고 직관적인 해결책을 제공하지 못했다. 하지만 React Native 사용자들이 다양한 임시 해결책을 공유했으니 참고하면 도움이 될 것이다.
지난 6개월 동안 많은 변화가 있었기 때문에, 같은 질문을 다시 던져보고자 한다. 최신 버전의 React Native를 사용 중이고 피드백을 남기고 싶다면, “React Native에서 불편한 점은 무엇인가요?”의 새 버전에 의견을 남겨주길 바란다.
지속적 통합
페이스북은 모든 Pull Request와 내부 변경 사항을 먼저 페이스북의 저장소에 병합한 다음 모든 커밋을 GitHub로 동기화한다. 페이스북의 인프라는 일반적인 지속적 통합 서비스와 다르며, 모든 오픈소스 테스트가 페이스북 내부에서 실행되지는 않는다. 이 때문에 GitHub로 동기화된 커밋이 자주 오픈소스 테스트를 깨뜨리며, 이를 수정하는 데 많은 시간이 소요된다.
React Native 팀의 Héctor Ramos는 지난 두 달 동안 페이스북과 GitHub에서 React Native의 지속적 통합 시스템을 개선하는 데 집중했다. 이제 대부분의 오픈소스 테스트는 페이스북에서 React Native에 변경 사항을 커밋하기 전에 실행된다. 이로 인해 커밋이 동기화될 때 GitHub에서 CI가 안정적으로 유지될 것이다.
다음 소식
React Native의 미래에 대한 이야기를 놓치지 마세요! 앞으로 몇 달 동안 Facebook의 React Native 팀 멤버들이 Chain React와 React Native EU에서 발표할 예정입니다. 또한, 곧 출시될 0.60 버전도 기대해 주세요. 정말 흥미로울 거예요 ✨