Skip to content

Commit

Permalink
RFC: Decoupling Flipper from React Native core
Browse files Browse the repository at this point in the history
  • Loading branch information
huntie committed May 12, 2023
1 parent d3fe204 commit a1a6d3a
Show file tree
Hide file tree
Showing 2 changed files with 130 additions and 0 deletions.
130 changes: 130 additions & 0 deletions proposals/0641-decoupling-flipper-from-react-native-core.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
---
title: Decoupling Flipper from React Native core
author:
- Alex Hunt <[email protected]>
- Nicola Corti <[email protected]>
- Aleksandar Andelkovic <[email protected]>
date: 2023-05-10
---

# RFC0641: Decoupling Flipper from React Native core

## Summary

We are planning to update the React Native app template to no longer use Flipper by default, and replace Flipper's JS debugging experience with an equivalent one-click debugging flow. This intends to simplify and improve the debugging and upgrade experiences for React Native developers.

It is important to emphasise that Flipper as a product will remain available; only its integration with React Native will no longer be enabled out-of-the-box. We aim to provide a transition process for those who choose to maintain their own integration with Flipper, by externalising this as a separate package.

We encourage React Native contributors to review this document thoroughly and to share your thoughts, ideas, and concerns.

## Motivation

The React team has invested considerable time into understanding the pain points React Native developers are experiencing when developing their applications. Through this research, the top issue highlighted by our users and core contributors was the debugging experience, particularly Flipper ↔ React Native debugging.

Feedback focused on four main areas:

- Instability of the debugging experience with Flipper, frequent crashes, and difficulty performing even core workflows such as initial installation / connection to the host application.
- The performance of the Flipper debugging experience and its user interface responsiveness was subpar compared to all other tools in the RN developer toolchain.
- Flipper had been historically slow in addressing issues needed for the Flipper experience in React Native.
- Flipper adds a number of transitive dependencies on both Android & iOS which is making build times longer and adds complexity to the release process.

The React Native and Flipper teams spent time at the beginning of 2023 trying to find a way to address these issues and fund this work. However, it quickly became clear that the capacity of the Flipper team is prohibitive to them taking on an active role in addressing issues in React Native for Flipper.

After careful analysis and to provide our users with the best developer experience, the React team has put together this proposal to decouple Flipper from React Native and deliver to the community a simple debugging solution relying on industry-standard protocols and tooling (which we can build upon further in future).

The React team is fully aware that a number of our partners are invested in Flipper, and we will be working with the community to find a model that will allow a willing partner or larger ecosystem to take ownership of Flipper for React Native.

## Goals

- **Community feedback**: Validate that we have covered the main React Native use cases of Flipper in this proposal.
- **Decouple from Flipper**: Remove the built-in native Flipper integration from the template in React Native 0.73 (Q3 2023).
- **One-click Hermes debug**: Ship a new default JavaScript debugging experience under Hermes by directly launching from the Dev Menu into Chrome DevTools.
- **[Stretch] Docs improvements**: Expand our docs for native debugging to recommend alternative tools for native Flipper plugins (i.e. guidance for using Android Studio and Xcode Instruments).

## Detailed design

### Removal of native Flipper integration from the template

The native integration code for Flipper currently takes up a significant effort out of our release process and general maintenance of React Native.

As part of this proposal we will **no longer install Flipper** for newly created apps starting from 0.73 — removing all Flipper related code from the new app template.

Here are some alternatives we're evaluating on how to handle the Flipper integration.

#### 1. Create a separate library and look for a maintainer

Our preferred alternative is to create a `@react-native-community/flipper-integration` library that will encapsulate and handle the Flipper integration for our users. [Flipper configuration files](https://github.com/facebook/react-native/blob/main/packages/react-native/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.kt) from the template should be moved there.

This library should ideally be agnostic of both the React Native version and the Flipper version, so we foresee a low maintenance cost.

**If you're interested in maintaining this library, please let us know.**

#### 2. Create a module inside React Native to encapsulate the integration code

Should we be unable to find a maintainer, we could encapsulate all the template logic (i.e. [files in user space](https://github.com/facebook/react-native/blob/main/packages/react-native/template/android/app/src/debug/java/com/helloworld/ReactNativeFlipper.kt)) into a separate module inside the React Native repository. For instance for Android, the library would live inside `packages/react-native/ReactAndroid/flipper/` or `packages/react-native-flipper-android/`.

This package would still be published as part of the React Native release workflow, but will **not** be used by default by the app template. Users will be able to enable it with a one-line configuration if needed (or via autolinking).

#### 3. Drop entirely and refer users to official Flipper documentation

As a last resort, we can point users to the documentation of the Flipper website (which should be reviewed) and would replicate the current template setup:
https://fbflipper.com/docs/getting-started/react-native-android/
https://fbflipper.com/docs/getting-started/react-native-ios/

### New "Open Debugger" flow: One-click Hermes debug

To replace the current Flipper-based "Open Debugger" flow in the Dev Menu (Hermes only), we will introduce a minimal one-click flow that connects the Hermes debugger endpoint with a local Chrome (or Microsoft Edge) DevTools instance. This is similar to the old way we allowed debugging React Native apps, but will now work with Hermes, connecting directly to the device to debug your app.

This will become the new default experience for direct JS debugging in apps using Hermes, and will remove the requirement of having Flipper set up on a developer machine to reach this core debugging capability.

We plan to implement this experience in React Native CLI via a new `/open-debugger` endpoint. This replaces the current "Open Debugger" flow (which attempts to open Flipper via a `flipper://` URL scheme and fails otherwise).

![Sketch architecture for one-click Hermes debug](./assets/0641-one-click-hermes-debug.png)

Since this new debugging flow fills a gap when users do not have Flipper installed, we aim to add this logic against the "Open Debugger" button by default — replacing previous `flipper://` URL actions in the Dev Menu.

### Replacing "Open React DevTools"

We will also aim to replace the “Open React DevTools” flow in the Dev Menu, via a similar endpoint in React Native CLI that opens the standalone React DevTools app (or in a browser window). This is less of a priority than the above, as today we have a [standalone React DevTools connection flow](https://reactnative.dev/docs/next/react-devtools) that works without this button.

### Documenting alternative existing native debugging tools

We understand that Chrome DevTools alone won't replace the functionality of the current suite of Flipper native debugging plugins, and will be supporting this by improving our docs on debugging with first-party native debugging tools.

- [Crash Reporter](https://fbflipper.com/docs/features/plugins/crash-reporter/) — Android Studio/Logcat and Xcode
- [Databases Plugin](https://fbflipper.com/docs/features/plugins/databases/)[Android Studio](https://developer.android.com/studio/inspect/database)
- [Network Plugin](https://fbflipper.com/docs/features/plugins/network/)[Charles Proxy](https://www.charlesproxy.com/documentation/configuration/browser-and-system-configuration/), [mitmproxy](https://medium.com/@rotxed/how-to-debug-http-s-traffic-on-android-7fbe5d2a34#.hnhanhyoz) (Android), [Fiddler](https://www.telerik.com/fiddler), [Chucker](https://github.com/ChuckerTeam/chucker)
- [Shared Preferences Viewer](https://fbflipper.com/docs/features/plugins/preferences/) — TBC
- [UI Debugger Plugin](https://fbflipper.com/docs/features/plugins/ui-debugger/) — Android Studio and Xcode

### Note: This is not the end state for React Native debugging

We acknowledge that the "Open Debugger" and "Open React DevTools" flows previously launched Flipper, which offered the promise of a cohesive, easy to teach, and extensible experience for users. From that perspective, these proposed changes aren’t strictly better.

We see this — decoupling from Flipper to simplify React Native core and reset the baseline reliability of the debugging experience — as one of the first steps in our journey to up-level the debugging experience for React Native developers.

The React Native and Hermes teams are committed to continue our investments in this area. We hope to ship improvements to Chrome DevTools Protocol (CDP) support for Hermes and enhancements to the debugging experience by establishing a stable foundation for seamless communication between the application at runtime and debugging clients (such as Chrome DevTools Frontend).

## Adoption strategy

### Target release: React Native 0.73 (Q3 2023)

We aim to complete this work within the next React Native development cycle. This is motivated by unburdening the React Native release crew from Flipper-introduced overheads for the next release, and our desire to ship debugging improvements to users quickly, that we can build upon in future.

We are open to feedback regarding this timeline.

## How we teach this

### General communication

> It is important to emphasise that Flipper as a product will remain available; only its integration with React Native will no longer be supported out-of-the-box.
- Highlight the availability of the new one-click Hermes debug experience.
- Communicate that Flipper is no longer the default recommended tool.
- Highlight the ability to re-integrate Flipper via new external library.

### User guide for re-integrating Flipper

- We'd like a partner to own this.
- Can live on the React Native website or in the README of the separate repo.
- Document the availability of this prominently in the React Native changelog.
Binary file added proposals/assets/0641-one-click-hermes-debug.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit a1a6d3a

Please sign in to comment.