Skip to main content

React Native Open Source Update June 2019

· 14 min read
Christoph Nakazawa
Christoph Nakazawa
Former Engineer at Facebook

코드와 커뮤니티 건강

지난 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개 미만이며, 대부분 몇 시간에서 며칠 내에 피드백과 리뷰를 제공한다.

의미 있는 커뮤니티 기여

최근 커뮤니티에서 이루어진 몇 가지 멋진 기여를 소개한다:

Lean Core

Lean Core의 주요 목표는 React Native의 모듈을 별도의 저장소로 분리하여 더 나은 유지보수를 가능하게 하는 것이다. 단 6개월 만에 WebView, NetInfo, AsyncStorage, 웹사이트, 그리고 CLI와 같은 저장소에서 총 800개 이상의 Pull Request가 처리되었다. 더 나은 유지보수 외에도, 이러한 프로젝트들은 React Native 자체보다 더 자주 독립적으로 릴리스될 수 있다.

또한, React Native 자체에서 더 이상 필요하지 않은 폴리필과 레거시 컴포넌트를 제거할 기회를 활용했다. 과거에는 JavaScriptCore(JSC)의 구버전에서 MapSet과 같은 언어 기능을 지원하기 위해 폴리필이 필요했다. 이제 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 커뮤니티는 업그레이드 경험을 개선하기 위해 여러 노력을 기울였다. autolinkingrn-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 ReactReact Native EU에서 발표할 예정입니다. 또한, 곧 출시될 0.60 버전도 기대해 주세요. 정말 흥미로울 거예요