diff --git a/content/docs/implementation-notes.md b/content/docs/implementation-notes.md
index a035a5edf..056b482d3 100644
--- a/content/docs/implementation-notes.md
+++ b/content/docs/implementation-notes.md
@@ -1,6 +1,6 @@
---
id: implementation-notes
-title: Implementation Notes
+title: Notes d’implémentation
layout: contributing
permalink: docs/implementation-notes.html
prev: codebase-overview.html
@@ -9,93 +9,93 @@ redirect_from:
- "contributing/implementation-notes.html"
---
-This section is a collection of implementation notes for the [stack reconciler](/docs/codebase-overview.html#stack-reconciler).
+Cette section fournit un ensemble de notes relatives à l’implémentation du [réconciliateur *“stack”*](/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.
+C'est très technique et suppose une solide compréhension de l’API publique de React ainsi que de sa structure divisée en noyau, moteurs de rendu et réconciliateur. Si vous ne connaissez pas bien la base de code React, lisez d'abord l'[aperçu du code source](/docs/codebase-overview.html).
-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).
+Ça suppose également de comprendre les [différences entre les composants React, leurs instances et leurs éléments](/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).
+Le réconciliateur *“stack”* était utilisé jusqu’à React 15 inclus. Il se trouve dans [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}
+### Vidéo : construire React à partir de zéro {#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.
+[Paul O'Shannessy](https://twitter.com/zpao) a donné une conférence (en anglais) sur la [construction de React à partir de zéro](https://www.youtube.com/watch?v=_MAD4Oly9yg) qui a largement inspiré ce 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.
+Ce document et sa conférence sont des simplifications de la véritable base de code : en vous familiarisant avec ces deux sources, vous devriez mieux comprendre.
-### Overview {#overview}
+### Aperçu {#overview}
-The reconciler itself doesn't have a public API. [Renderers](/docs/codebase-overview.html#stack-renderers) like React DOM and React Native use it to efficiently update the user interface according to the React components written by the user.
+Le réconciliateur lui-même n’a pas d’API publique. Les [moteurs de rendu](/docs/codebase-overview.html#stack-renderers) comme React DOM et React Native l'utilisent pour mettre à jour efficacement l'interface utilisateur en fonction des composants React écrits par l'utilisateur.
-### Mounting as a Recursive Process {#mounting-as-a-recursive-process}
+### Le montage, un processus récursif {#mounting-as-a-recursive-process}
-Let's consider the first time you mount a component:
+Intéressons-nous à la première fois que vous montez un composant :
```js
ReactDOM.render(, rootEl);
```
-React DOM 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:
+React DOM passera `` au réconciliateur. Rappelez-vous que `` est un élément React, c’est-à-dire une description de *quoi* afficher. Vous pouvez le considérer comme un simple objet :
```js
console.log();
// { type: App, props: {} }
```
-The reconciler will check if `App` is a class or a function.
+Le réconciliateur vérifiera si `App` est une classe ou une fonction.
-If `App` is a function, the reconciler will call `App(props)` to get the rendered element.
+Si `App` est une fonction, le réconciliateur appellera `App(props)` pour obtenir le rendu de l’élément associé.
-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.
+Si `App` est une classe, le réconciliateur instanciera une `App` avec `new App(props)`, appellera la méthode de cycle de vie `componentWillMount()`, puis appellera la méthode `render()` pour obtenir le rendu de l’élément.
-Either way, the reconciler will learn the element `App` "rendered to".
+Dans les deux cas, le réconciliateur saura quel élément « a été produit par le rendu » de `App`.
-This process is recursive. `App` may render to a ``, `Greeting` may render to a ``, and so on. The reconciler will "drill down" through user-defined components recursively as it learns what each component renders to.
+Ce processus est récursif. Le rendu de `App` peut produire un ``, celui de `Greeting` peut produire un ``, et ainsi de suite. Le réconciliateur « creusera » récursivement dans les composants définis par l'utilisateur, et saura ainsi ce que produit le rendu de chacun.
-You can imagine this process as a pseudocode:
+Vous pouvez imaginer ce processus comme un pseudo-code :
```js
function isClass(type) {
- // React.Component subclasses have this flag
+ // Les sous-classes de React.Component ont ce drapeau
return (
Boolean(type.prototype) &&
Boolean(type.prototype.isReactComponent)
);
}
-// This function takes a React element (e.g. )
-// and returns a DOM or Native node representing the mounted tree.
+// Cette fonction prend en paramètre un élément React (par exemple )
+// et renvoie un nœud DOM ou natif représentant l’arbre monté.
function mount(element) {
var type = element.type;
var props = element.props;
- // We will determine the rendered element
- // by either running the type as function
- // or creating an instance and calling render().
+ // Nous déterminerons l’élément rendu
+ // soit en exécutant le type comme une fonction
+ // soit en créant une instance puis en appelant render().
var renderedElement;
if (isClass(type)) {
- // Component class
+ // Composant basé classe
var publicInstance = new type(props);
- // Set the props
+ // Initialise les props
publicInstance.props = props;
- // Call the lifecycle if necessary
+ // Appelle le cycle de vie si besoin
if (publicInstance.componentWillMount) {
publicInstance.componentWillMount();
}
- // Get the rendered element by calling render()
+ // Obtient l’élément rendu en appelant render()
renderedElement = publicInstance.render();
} else {
- // Component function
+ // Fonction composant
renderedElement = type(props);
}
- // This process is recursive because a component may
- // return an element with a type of another component.
+ // Ce processus est récursif parce qu’un composant peut
+ // renvoyer un élément avec un autre type de composant.
return mount(renderedElement);
- // Note: this implementation is incomplete and recurses infinitely!
- // It only handles elements like or .
- // It doesn't handle elements like
or yet.
+ // Remarque : cette implémentation est incomplète et la récursivité est infinie !
+ // Ça gère uniquement les éléments comme ou .
+ // Ça ne gère pas pour l’instant les éléments comme ou .
}
var rootEl = document.getElementById('root');
@@ -103,81 +103,81 @@ var node = mount();
rootEl.appendChild(node);
```
->**Note:**
+>Remarque
>
->This really *is* a pseudo-code. It isn't similar to the real implementation. It will also cause a stack overflow because we haven't discussed when to stop the recursion.
+>C’est *vraiment* du pseudo-code. L'implémentation actuelle diffère pas mal. Ce code saturerait la pile car nous n’avons pas précisé de condition d’arrêt pour la récursivité.
-Let's recap a few key ideas in the example above:
+Récapitulons quelques idées clés dans l’exemple ci-dessus :
-* React elements are plain objects representing the component type (e.g. `App`) and the props.
-* User-defined components (e.g. `App`) can be classes or functions but they all "render to" elements.
-* "Mounting" is a recursive process that creates a DOM or Native tree given the top-level React element (e.g. ``).
+* Les éléments React sont des objets simples représentant le type du composant (par exemple `App`) et les props.
+* Les composants définis par l'utilisateur (par exemple `App`) peuvent être des classes ou des fonctions mais toutes « font un rendu » avec des éléments comme résultat.
+* Le « montage » est un processus récursif qui crée un arbre DOM ou natif à partir de l'élément racine React (par exemple ``).
-### Mounting Host Elements {#mounting-host-elements}
+### Montage d'éléments hôtes {#mounting-host-elements}
-This process would be useless if we didn't render something to the screen as a result.
+Ce processus serait inutile si nous n'affichions pas quelque chose à l'écran au final.
-In addition to user-defined ("composite") components, React elements may also represent platform-specific ("host") components. For example, `Button` might return a `` from its render method.
+En plus des composants définis par l'utilisateur (« composites »), les éléments React peuvent également représenter des composants pour des plates-formes spécifiques (« hôtes »). Par exemple, la méthode de rendu de `Button` pourrait renvoyer une ``.
-If element's `type` property is a string, we are dealing with a host element:
+Si la propriété `type` de l'élément est une chaîne de caractères, il s’agit d’un élément hôte :
```js
console.log();
// { type: 'div', props: {} }
```
-There is no user-defined code associated with host elements.
+Il n’y a aucun code défini par l’utilisateur associé aux éléments hôtes.
-When the reconciler encounters a host element, it lets the renderer take care of mounting it. For example, React DOM would create a DOM node.
+Lorsque le réconciliateur rencontre un élément hôte, il laisse le moteur de rendu s'occuper du montage. Par exemple, React DOM créerait un nœud DOM.
-If the host element has children, the reconciler recursively mounts them following the same algorithm as above. It doesn't matter whether children are host (like `
`), composite (like ``), or both.
+Si l'élément hôte a des enfants, le réconciliateur les monte de manière récursive en suivant le même algorithme que celui décrit plus haut. Peu importe que les enfants soient hôtes (comme `
`), composites (comme ``) ou un mélange des deux.
-The DOM nodes produced by the child components will be appended to the parent DOM node, and recursively, the complete DOM structure will be assembled.
+Les nœuds DOM produits par les composants enfants seront ajoutés au nœud DOM parent, et donc de manière récursive, l’ensemble de la structure DOM sera constituée.
->**Note:**
+>Remarque
>
->The reconciler itself is not tied to the DOM. The exact result of mounting (sometimes called "mount image" in the source code) depends on the renderer, and can be a DOM node (React DOM), a string (React DOM Server), or a number representing a native view (React Native).
+>Le réconciliateur lui-même n'est pas lié au DOM. Le résultat exact du montage (parfois appelé *“mount image”* dans le code source) dépend du moteur de rendu, et donc peut être un nœud DOM (React DOM), une chaîne de caractères (React DOM Server) ou un nombre représentant une vue native (React Native).
-If we were to extend the code to handle host elements, it would look like this:
+Si nous devions étendre le code pour gérer des éléments hôtes, il ressemblerait à ceci :
```js
function isClass(type) {
- // React.Component subclasses have this flag
+ // Les sous-classes de React.Component ont ce drapeau
return (
Boolean(type.prototype) &&
Boolean(type.prototype.isReactComponent)
);
}
-// This function only handles elements with a composite type.
-// For example, it handles and , but not a .
+// Cette fonction gère uniquement les éléments avec un type composite.
+// Par exemple, elle gère et , mais pas une .
function mountComposite(element) {
var type = element.type;
var props = element.props;
var renderedElement;
if (isClass(type)) {
- // Component class
+ // Composant basé classe
var publicInstance = new type(props);
- // Set the props
+ // Initialise les props
publicInstance.props = props;
- // Call the lifecycle if necessary
+ // Appelle le cycle de vie si besoin
if (publicInstance.componentWillMount) {
publicInstance.componentWillMount();
}
renderedElement = publicInstance.render();
} else if (typeof type === 'function') {
- // Component function
+ // Fonction composant
renderedElement = type(props);
}
- // This is recursive but we'll eventually reach the bottom of recursion when
- // the element is host (e.g. ) rather than composite (e.g. ):
+ // C’est récursif mais nous atteindrons finalement le bas de la récursion lorsque
+ // l’élément sera hôte (par exemple ) au lieu de composite (par exemple ) :
return mount(renderedElement);
}
-// This function only handles elements with a host type.
-// For example, it handles and but not an .
+// Cette fonction gère uniquement les éléments avec un type hôte.
+// Par exemple, il gère et , mais pas un .
function mountHost(element) {
var type = element.type;
var props = element.props;
@@ -187,9 +187,9 @@ function mountHost(element) {
}
children = children.filter(Boolean);
- // This block of code shouldn't be in the reconciler.
- // Different renderers might initialize nodes differently.
- // For example, React Native would create iOS or Android views.
+ // Ce bloc de code ne devrait pas être dans le réconciliateur.
+ // Les différents moteurs de rendu peuvent initialiser les nœuds différemment.
+ // Par exemple, React Native crée des vues iOS ou Android.
var node = document.createElement(type);
Object.keys(props).forEach(propName => {
if (propName !== 'children') {
@@ -197,29 +197,29 @@ function mountHost(element) {
}
});
- // Mount the children
+ // Monte les enfants
children.forEach(childElement => {
- // Children may be host (e.g. ) or composite (e.g. ).
- // We will also mount them recursively:
+ // L’enfant peut être hôte (par exemple ) ou composite (par exemple ).
+ // Nous les monterons également de manière récursive :
var childNode = mount(childElement);
- // This line of code is also renderer-specific.
- // It would be different depending on the renderer:
+ // Cette ligne de code est également spécifique au moteur de rendu.
+ // Ce serait différent en fonction du moteur de rendu :
node.appendChild(childNode);
});
- // Return the DOM node as mount result.
- // This is where the recursion ends.
+ // Renvoie le nœud DOM comme résultat de montage.
+ // C’est ici que se termine la récursion.
return node;
}
function mount(element) {
var type = element.type;
if (typeof type === 'function') {
- // User-defined components
+ // Composants définis par l’utilisateur
return mountComposite(element);
} else if (typeof type === 'string') {
- // Platform-specific components
+ // Composants spécifiques aux plates-formes
return mountHost(element);
}
}
@@ -229,40 +229,40 @@ var node = mount();
rootEl.appendChild(node);
```
-This is working but still far from how the reconciler is really implemented. The key missing ingredient is support for updates.
+Ça fonctionne mais ça reste loin de la manière dont le réconciliateur est réellement implémenté. L’ingrédient clé manquant est la prise en charge des mises à jour.
-### Introducing Internal Instances {#introducing-internal-instances}
+### Voici venir les instances internes {#introducing-internal-instances}
-The key feature of React is that you can re-render everything, and it won't recreate the DOM or reset the state:
+La principale caractéristique de React est que vous pouvez refaire tout le rendu sans recréer le DOM ni réinitialiser l'état :
```js
ReactDOM.render(, rootEl);
-// Should reuse the existing DOM:
+// Devrait réutiliser le DOM existant :
ReactDOM.render(, rootEl);
```
-However, our implementation above only knows how to mount the initial tree. It can't perform updates on it because it doesn't store all the necessary information, such as all the `publicInstance`s, or which DOM `node`s correspond to which components.
+Cependant, notre implémentation ci-dessus sait uniquement monter l'arbre initial. Elle ne peut pas effectuer de mises à jour dans l'arborescence car elle ne stocke pas toutes les informations nécessaires, telles que toutes les références `publicInstance` ou les nœuds DOM qui correspondent aux composants.
-The stack reconciler codebase solves this by making the `mount()` function a method and putting it on a class. There are drawbacks to this approach, and we are going in the opposite direction in the [ongoing rewrite of the reconciler](/docs/codebase-overview.html#fiber-reconciler). Nevertheless this is how it works now.
+La base de code du réconciliateur *“stack”* résout ce problème en faisant de la fonction `mount()` une méthode au sein d’une classe. Cette approche présente des inconvénients et nous allons dans la direction opposée pour la [réécriture en cours du réconciliateur](/docs/codebase-overview.html#fiber-reconciler). Cependant, voici comment ça fonctionne dans le réconciliateur historique.
-Instead of separate `mountHost` and `mountComposite` functions, we will create two classes: `DOMComponent` and `CompositeComponent`.
+Plutôt que deux fonctions distinctes `mountHost` et `mountComposite`, nous créerons deux classes : `DOMComponent` et `CompositeComponent`.
-Both classes have a constructor accepting the `element`, as well as a `mount()` method returning the mounted node. We will replace a top-level `mount()` function with a factory that instantiates the correct class:
+Les deux classes ont un constructeur acceptant `element`, ainsi qu'une méthode `mount()` qui renvoie le nœud monté. Nous remplacerons la fonction racine `mount()` par une fabrique _(factory, NdT)_ qui instanciera la bonne classe :
```js
function instantiateComponent(element) {
var type = element.type;
if (typeof type === 'function') {
- // User-defined components
+ // Composants définis par l’utilisateur
return new CompositeComponent(element);
} else if (typeof type === 'string') {
- // Platform-specific components
+ // Composants spécifiques aux plates-formes
return new DOMComponent(element);
- }
+ }
}
```
-First, let's consider the implementation of `CompositeComponent`:
+Tout d’abord, examinons l'implémentation de `CompositeComponent` :
```js
class CompositeComponent {
@@ -273,7 +273,7 @@ class CompositeComponent {
}
getPublicInstance() {
- // For composite components, expose the class instance.
+ // Pour les composants composites, exposons l’instance de la classe.
return this.publicInstance;
}
@@ -285,45 +285,45 @@ class CompositeComponent {
var publicInstance;
var renderedElement;
if (isClass(type)) {
- // Component class
+ // Composant basé classe
publicInstance = new type(props);
- // Set the props
+ // Initialise les props
publicInstance.props = props;
- // Call the lifecycle if necessary
+ // Appelle le cycle de vie si besoin
if (publicInstance.componentWillMount) {
publicInstance.componentWillMount();
}
renderedElement = publicInstance.render();
} else if (typeof type === 'function') {
- // Component function
+ // Fonction composant
publicInstance = null;
renderedElement = type(props);
}
- // Save the public instance
+ // Sauvegarde l’instance publique
this.publicInstance = publicInstance;
- // Instantiate the child internal instance according to the element.
- // It would be a DOMComponent for or ,
- // and a CompositeComponent for or :
+ // Construit l’instance interne de l’enfant en fonction de l’élément.
+ // Ce sera un DOMComponent pour ou ,
+ // et un CompositeComponent pour ou :
var renderedComponent = instantiateComponent(renderedElement);
this.renderedComponent = renderedComponent;
- // Mount the rendered output
+ // Monte le résultat du rendu
return renderedComponent.mount();
}
}
```
-This is not much different from our previous `mountComposite()` implementation, but now we can save some information, such as `this.currentElement`, `this.renderedComponent`, and `this.publicInstance`, for use during updates.
+Ce n'est pas très différent de notre implémentation précédente de `mountComposite()`, mais maintenant, nous pouvons sauver certaines informations, telles que `this.currentElement`, `this.renderedComponent` et `this.publicInstance`, pour les utiliser lors des mises à jour d’éléments.
-Note that an instance of `CompositeComponent` is not the same thing as an instance of the user-supplied `element.type`. `CompositeComponent` is an implementation detail of our reconciler, and is never exposed to the user. The user-defined class is the one we read from `element.type`, and `CompositeComponent` creates an instance of it.
+Remarquez qu’une instance de `CompositeComponent` n’est pas la même chose qu’une instance du `element.type` fourni par l'utilisateur. `CompositeComponent` est un détail d'implémentation de notre réconciliateur et n'est jamais exposé à l'utilisateur. La classe définie par l'utilisateur est celle que nous avons lue dans `element.type`, et `CompositeComponent` crée une instance de celle-ci.
-To avoid the confusion, we will call instances of `CompositeComponent` and `DOMComponent` "internal instances". They exist so we can associate some long-lived data with them. Only the renderer and the reconciler are aware that they exist.
+Pour éviter toute confusion, nous appellerons les instances de `CompositeComponent` et `DOMComponent` des « instances internes ». Elles existent pour nous permettre de leur associer des données durables. Seuls le moteur de rendu et le réconciliateur s’en servent.
-In contrast, we call an instance of the user-defined class a "public instance". The public instance is what you see as `this` in the `render()` and other methods of your custom components.
+En revanche, nous appelons une instance de classe définie par l'utilisateur « instance publique ». L'instance publique, c'est ce que vous voyez comme `this` dans `render()` et les autres méthodes de vos composants personnalisés.
-The `mountHost()` function, refactored to be a `mount()` method on `DOMComponent` class, also looks familiar:
+La fonction `mountHost()` a été refactorisée pour devenir la méthode `mount()` dans la classe `DOMComponent`, et son code a des airs familiers :
```js
class DOMComponent {
@@ -334,7 +334,7 @@ class DOMComponent {
}
getPublicInstance() {
- // For DOM components, only expose the DOM node.
+ // Pour les composants DOM, expose uniquement le nœud du DOM.
return this.node;
}
@@ -347,36 +347,36 @@ class DOMComponent {
children = [children];
}
- // Create and save the node
+ // Crée et sauvegarde le nœud
var node = document.createElement(type);
this.node = node;
- // Set the attributes
+ // Initialise les attributs
Object.keys(props).forEach(propName => {
if (propName !== 'children') {
node.setAttribute(propName, props[propName]);
}
});
- // Create and save the contained children.
- // Each of them can be a DOMComponent or a CompositeComponent,
- // depending on whether the element type is a string or a function.
+ // Crée et sauvegarde les enfants contenus.
+ // Chacun d’eux peut être un DOMComponent ou un CompositeComponent,
+ // selon que le type de l’élément est une chaîne de caractères ou une fonction.
var renderedChildren = children.map(instantiateComponent);
this.renderedChildren = renderedChildren;
- // Collect DOM nodes they return on mount
+ // Collecte les nœuds DOM qui sont renvoyés lors du montage
var childNodes = renderedChildren.map(child => child.mount());
childNodes.forEach(childNode => node.appendChild(childNode));
- // Return the DOM node as mount result
+ // Renvoie le nœud DOM comme résultat du montage
return node;
}
}
```
-The main difference after refactoring from `mountHost()` is that we now keep `this.node` and `this.renderedChildren` associated with the internal DOM component instance. We will also use them for applying non-destructive updates in the future.
+Après la refactorisation de `mountHost()`, la différence principale est que nous conservons `this.node` et `this.renderedChildren`, qui sont maintenant associés à l'instance interne du composant DOM. Nous les utiliserons également à l'avenir pour appliquer des mises à jour non destructives.
-As a result, each internal instance, composite or host, now points to its child internal instances. To help visualize this, if a function `` component renders a `