UNPKG

3.27 kBMarkdownView Raw
1# react-reconciler
2
3This is an experimental package for creating custom React renderers.
4
5**Its API is not as stable as that of React, React Native, or React DOM, and does not follow the common versioning scheme.**
6
7**Use it at your own risk.**
8
9## API
10
11```js
12const Reconciler = require('react-reconciler');
13
14const HostConfig = {
15 // You'll need to implement some methods here.
16 // See below for more information and examples.
17};
18
19const MyRenderer = Reconciler(HostConfig);
20
21const RendererPublicAPI = {
22 render(element, container, callback) {
23 // Call MyRenderer.updateContainer() to schedule changes on the roots.
24 // See ReactDOM, React Native, or React ART for practical examples.
25 }
26};
27
28module.exports = RendererPublicAPI;
29```
30
31## Practical Examples
32
33A "host config" is an object that you need to provide, and that describes how to make something happen in the "host" environment (e.g. DOM, canvas, console, or whatever your rendering target is). It looks like this:
34
35```js
36const HostConfig = {
37 createInstance(type, props) {
38 // e.g. DOM renderer returns a DOM node
39 },
40 // ...
41 supportsMutation: true, // it works by mutating nodes
42 appendChild(parent, child) {
43 // e.g. DOM renderer would call .appendChild() here
44 },
45 // ...
46};
47```
48
49**For an introduction to writing a very simple custom renderer, check out this article series:**
50
51* **[Building a simple custom renderer to DOM](https://medium.com/@agent_hunt/hello-world-custom-react-renderer-9a95b7cd04bc)**
52* **[Building a simple custom renderer to native](https://medium.com/@agent_hunt/introduction-to-react-native-renderers-aka-react-native-is-the-java-and-react-native-renderers-are-828a0022f433)**
53
54The full list of supported methods [can be found here](https://github.com/facebook/react/blob/master/packages/react-reconciler/src/forks/ReactFiberHostConfig.custom.js). For their signatures, we recommend looking at specific examples below.
55
56The React repository includes several renderers. Each of them has its own host config.
57
58The examples in the React repository are declared a bit differently than a third-party renderer would be. In particular, the `HostConfig` object mentioned above is never explicitly declared, and instead is a *module* in our code. However, its exports correspond directly to properties on a `HostConfig` object you'd need to declare in your code:
59
60* [React ART](https://github.com/facebook/react/blob/master/packages/react-art/src/ReactART.js) and its [host config](https://github.com/facebook/react/blob/master/packages/react-art/src/ReactARTHostConfig.js)
61* [React DOM](https://github.com/facebook/react/blob/master/packages/react-dom/src/client/ReactDOM.js) and its [host config](https://github.com/facebook/react/blob/master/packages/react-dom/src/client/ReactDOMHostConfig.js)
62* [React Native](https://github.com/facebook/react/blob/master/packages/react-native-renderer/src/ReactNativeRenderer.js) and its [host config](https://github.com/facebook/react/blob/master/packages/react-native-renderer/src/ReactNativeHostConfig.js)
63
64If these links break please file an issue and we’ll fix them. They intentionally link to the latest versions since the API is still evolving. If you have more questions please file an issue and we’ll try to help!