The render flow of a sample app is described by the below diagram, Fabric is used to demonstrate things, but the same ideas translate over to any other wrapper library:
![render-flow](./render-flow.svg)
- Things in brown are app modules and components.
- Things in gray are from `office-ui-fabric-react` (or any other React UI library).
- Things in green are from `@angular-react/core`.
- Things in red are from `@angular-react/fabric` (or any other wrapper library).
## The flow
### Initial bootstrap (in general and of each component)
Usually Angular apps' `AppModule` include [`BrowserModule`](https://angular.io/api/platform-browser/BrowserModule). When using `@angular-react`, you replace this with `AngularReactBrowserModule`, which in turn renders **all components in the app**.
When a component is created, Angular creates a renderer (`Renderer2`) for it, using the renderer factory `ɵDomRendererFactory2`. We `extend ɵDomRendererFactory2`, and when `createRenderer(element, type)` is called, we either return a singleton instance of `ReactRenderer`, or delegate the work to `super` - depending on whether the element is a React wrapper one or not, respectively.
### `RenderRenderer`
`ReactRenderer` is an implementation of Angular's `Renderer2`, which for the most part - is just a manager of `ReactNode`s, mostly for adding and removing them from the DOM. The `ReactNode`s themselves handle the React rendering part and interoperability with Angular (or delegate it further down to other stuff).
### `ReactNode`
Finally, a `ReactNode` is what introduces React into Angular-land (all other stuff up until now had nothing to do with the `react` or `react-dom` packages, and would theoretically translate over to other frameworks like Vue etc.).
A `ReactNode` is a logical representation of everything needed to render a React element in the DOM, and includes two key components:
1. `type` - the type of React element to render. Either a `React.ReactType` or a `string`.
2. `domElement` - the DOM element to render to.
Furthermore, it also includes methods to update its underlying React element, these include (but not limited to):
- `setProperties` - pass down `props` to the React element.
- `addChild` - to add another `ReactNode` as a child of this one.
- `render` - trigger a render of the node.
- Calls `ReactDOM.render()` under the hood, so think of this like React's `render`, without the VDOM abstraction. This does indeed mean calling this method is costly, as you may expect.
- `destroyNode` - trigger `ReactDOM.unmountComponentAtNode()` on the node.