--- id: implementation-notes title: Implementation Notes layout: contributing permalink: docs/implementation-notes.html prev: codebase-overview.html next: design-principles.html redirect_from: - "contributing/implementation-notes.html" --- This section is a collection of implementation notes for the [stack reconciler](/docs/codebase-overview.html#stack-reconciler). It is very technical and assumes a strong understanding of React public API as well as how it's divided into core, renderers, and the reconciler. If you're not very familiar with the React codebase, read [the codebase overview](/docs/codebase-overview.html) first. It also assumes an understanding of the [differences between React components, their instances, and elements](/blog/2015/12/18/react-components-elements-and-instances.html). The stack reconciler was used in React 15 and earlier. It is located at [src/renderers/shared/stack/reconciler](https://github.com/facebook/react/tree/15-stable/src/renderers/shared/stack/reconciler). ### Video: Building React from Scratch {#video-building-react-from-scratch} [Paul O'Shannessy](https://twitter.com/zpao) gave a talk about [building React from scratch](https://www.youtube.com/watch?v=_MAD4Oly9yg) that largely inspired this document. Both this document and his talk are simplifications of the real codebase so you might get a better understanding by getting familiar with both of them. ### Overview {#overview} The reconciler itself doesn't have a public API. [Renderers](/docs/codebase-overview.html#renderers) like React DOM and React Native use it to efficiently update the user interface according to the React components written by the user. ### Mounting as a Recursive Process {#mounting-as-a-recursive-process} Let's consider the first time you mount a component: ```js const root = ReactDOM.createRoot(rootEl); root.render(); ``` `root.render` will pass `` along to the reconciler. Remember that `` is a React element, that is, a description of *what* to render. You can think about it as a plain object: ```js console.log(); // { type: App, props: {} } ``` The reconciler will check if `App` is a class or a function. If `App` is a function, the reconciler will call `App(props)` to get the rendered element. If `App` is a class, the reconciler will instantiate an `App` with `new App(props)`, call the `componentWillMount()` lifecycle method, and then will call the `render()` method to get the rendered element. Either way, the reconciler will learn the element `App` "rendered to". This process is recursive. `App` may render to a ``, `Greeting` may render to a `