We want to hear from you!Take our 2021 Community Survey!
This site is no longer updated.Go to react.dev

Aperçu du code source

Cette section vous donne un aperçu de l’organisation du code source de React, de ses conventions et de son implĂ©mentation.

Si vous souhaitez contribuer Ă  React, nous espĂ©rons que ce guide vous aidera Ă  vous sentir plus Ă  l’aise pour apporter des modifications.

Nous ne recommandons pas nĂ©cessairement ces conventions dans les applications React. Nombre d’entre elles existent pour des raisons historiques et sont susceptibles d’évoluer avec le temps.

Dossiers racines

AprĂšs avoir clonĂ© le dĂ©pĂŽt React, vous verrez quelques dossiers racines :

  • packages contient des mĂ©tadonnĂ©es (telles que package.json) et le code source (sous-rĂ©pertoire src) de tous les paquets du dĂ©pĂŽt React. Si votre modification est liĂ©e au code, vous passerez le plus clair de votre temps dans le sous-rĂ©pertoire src des diffĂ©rents paquets.
  • fixtures contient quelques petites applications React de test pour les contributeurs.
  • build est la sortie de construction de React. Il ne figure pas dans le dĂ©pĂŽt, mais il apparaĂźtra dans votre clone de React aprĂšs que vous l’aurez construit pour la premiĂšre fois.

La documentation est hébergée dans un dépÎt distinct de React.

Il existe quelques autres dossiers racines, mais ils sont principalement utilisĂ©s par l’outillage et vous n’aurez probablement jamais affaire Ă  eux lorsque vous contribuerez.

Tests colocalisés

Nous n’avons pas de rĂ©pertoire racine pour les tests unitaires. Nous les plaçons plutĂŽt dans un rĂ©pertoire appelĂ© __tests__ situĂ© Ă  cĂŽtĂ© des fichiers qu’ils testent.

Par exemple, un test pour setInnerHTML.js sera placé juste à cÎté, dans __tests__/setInnerHTML-test.js.

Avertissements et invariants

Le code source de React utilise console.error pour afficher les avertissements :

if (__DEV__) {
  console.error('Il y a un souci.');
}

Les avertissements ne sont activĂ©s que dans la phase de dĂ©veloppement. En production, ils sont complĂštement retirĂ©s du code. Si vous avez besoin d’interdire l’exĂ©cution d’une partie de code, utilisez plutĂŽt le module invariant :

var invariant = require('invariant');

invariant(
  2 + 2 === 4,
  'Vous ne passerez pas !'
);

L’invariant est levĂ© lorsque la condition de invariant est false.

Le terme « invariant Â» signifie simplement « cette condition est toujours vraie Â». Vous pouvez voir ça comme une affirmation.

Pour les invariants, il est important d’avoir un comportement similaire en dĂ©veloppement et en production, afin qu’ils soient levĂ©s dans les deux cas. Les messages d’erreur sont automatiquement remplacĂ©s par des codes d’erreur en production afin d’éviter toute incidence nĂ©gative sur la taille (en octets) du fichier.

Développement et production

Vous pouvez utiliser la variable pseudo-globale __DEV__ dans le code source pour délimiter les blocs de code réservés au développement.

La variable est remplacée lors de la compilation et se transforme en contrÎles process.env.NODE_ENV !== 'production' dans les builds CommonJS.

Pour les versions autonomes, la variable devient true dans la version non-minifiĂ©e du fichier produit, alors qu’elle est complĂštement effacĂ©e, ainsi que les blocs if qu’elle contrĂŽle, dans la version minifiĂ©e.

if (__DEV__) {
  // Ce code va uniquement s’appliquer pendant le dĂ©veloppement.
}

Flow

Nous avons rĂ©cemment commencĂ© Ă  introduire des contrĂŽles Flow dans le code source. Les fichiers marquĂ©s avec l’annotation @flow dans le commentaire d’en-tĂȘte de licence sont soumis Ă  vĂ©rification.

Nous acceptons les pull requests qui ajoutent des annotations Flow au code existant. Les annotations Flow ressemblent Ă  ceci :

ReactRef.detachRefs = function(
  instance: ReactInstance,
  element: ReactElement | string | number | null | false,
): void {
  // ...
}

Dans la mesure du possible, le nouveau code devrait utiliser des annotations Flow. Vous pouvez exécuter yarn flow localement pour vérifier votre code avec Flow.

Plusieurs paquets

React est un monorepo. Son dĂ©pĂŽt contient plusieurs paquets distincts afin que leurs modifications puissent ĂȘtre coordonnĂ©es et que les problĂšmes puissent ĂȘtre signalĂ©s dans un seul et mĂȘme endroit.

Le noyau de React

Le « noyau Â» de React inclut toutes les API React de niveau racine, par exemple :

  • React.createElement()
  • React.Component
  • React.Children

Le noyau React n’inclut que les API nĂ©cessaires Ă  la dĂ©finition des composants. Il n’inclut pas l’algorithme de rĂ©conciliation ni aucun code spĂ©cifique Ă  une plate-forme. Il est utilisĂ© Ă  la fois par les composants de React DOM et de React Native.

Le code pour le noyau React se trouve dans packages/react au sein de l’arborescence source. Il est disponible sur npm via le module react. La version autonome correspondante pour l’utilisation Ă  mĂȘme le navigateur est appelĂ©e react.js, et exporte une variable globale appelĂ©e React.

Moteurs de rendu

React a Ă©tĂ© créé Ă  l’origine pour le DOM, mais il a ensuite Ă©tĂ© adaptĂ© pour prendre Ă©galement en charge les plates-formes natives avec React Native. C’est ainsi qu’est nĂ© le concept de « moteurs de rendu Â» (renderers, terme que nous utiliserons sans italiques dans la suite de ce texte, NdT) au sein de React.

Les renderers gùrent la transformation d’une arborescence React en appels à la plate-forme sous-jacente.

Les renderers sont Ă©galement situĂ©s dans packages/ :

Le seul autre moteur de rendu officiellement pris en charge est react-art. Auparavant, il se trouvait dans un dĂ©pĂŽt GitHub sĂ©parĂ©, mais nous l’avons dĂ©placĂ© dans l’arborescence source principale pour le moment.

Remarque

Techniquement, le react-native-renderer est une couche trĂšs mince qui apprend Ă  React Ă  interagir avec l’implĂ©mentation de React Native. Le vĂ©ritable code spĂ©cifique Ă  la plate-forme, qui gĂšre les vues natives et fournit les composants, rĂ©side quant Ă  lui dans le dĂ©pĂŽt React Native.

Réconciliateurs

MĂȘme des moteurs de rendu trĂšs diffĂ©rents comme React DOM et React Native doivent partager beaucoup de logique. En particulier, l’algorithme de rĂ©conciliation doit ĂȘtre aussi similaire que possible afin que le rendu dĂ©claratif, les composants personnalisĂ©s, l’état local, les mĂ©thodes de cycle de vie et les refs fonctionnent de maniĂšre cohĂ©rente sur toutes les plates-formes prises en charge.

Pour rĂ©soudre ce problĂšme, diffĂ©rents moteurs de rendu partagent du code entre eux. Nous appelons cette partie de React un « rĂ©conciliateur Â». Lorsqu’une mise Ă  jour telle que setState() est planifiĂ©e, le rĂ©conciliateur appelle render() sur les composants de l’arborescence et les monte, les met Ă  jour ou les dĂ©monte.

Les rĂ©conciliateurs ne font pas l’objet de modules sĂ©parĂ©s, car ils ne disposent actuellement d’aucune API publique. Ils sont exclusivement utilisĂ©s par les moteurs de rendu tels que React DOM et React Native.

Réconciliateur Stack

Le rĂ©conciliateur “stack” est l’implĂ©mentation qui sous-tend React 15 et les versions antĂ©rieures. Nous avons depuis cessĂ© de l’utiliser, mais il reste dĂ©crit en dĂ©tail dans la prochaine page.

Réconciliateur Fiber

Le rĂ©conciliateur “fiber” reprĂ©sente une nouvelle tentative de rĂ©soudre les problĂšmes inhĂ©rents au rĂ©conciliateur “stack” en plus de quelques problĂšmes anciens. C’est le rĂ©conciliateur par dĂ©faut depuis React 16.

Ses objectifs principaux sont :

  • la capacitĂ© Ă  diviser un travail interruptible en segments ;
  • la capacitĂ© Ă  hiĂ©rarchiser, dĂ©placer et rĂ©utiliser des travaux en cours ;
  • la capacitĂ© Ă  jongler entre parents et enfants pour exĂ©cuter une mise en page avec React ;
  • la capacitĂ© Ă  renvoyer plusieurs Ă©lĂ©ments depuis render() ;
  • une meilleure prise en charge des pĂ©rimĂštres d’erreur.

Vous pouvez en apprendre davantage sur l’architecture React Fiber ici et ici. Bien qu’elles soient livrĂ©es avec React 16, les fonctionnalitĂ©s asynchrones ne sont pas encore activĂ©es par dĂ©faut.

Son code source est situé dans packages/react-reconciler.

SystĂšme d’évĂ©nements

React implĂ©mente une abstraction par-dessus les Ă©vĂ©nements natifs afin de lisser les disparitĂ©s d’un navigateur Ă  l’autre. Son code source se trouve dans packages/react-dom/src/events.

Et maintenant ?

Lisez la prochaine page pour en apprendre davantage sur l’implĂ©mentation du rĂ©conciliateur utilisĂ© avant React 16. Nous n’avons pas encore documentĂ© les dĂ©tails internes d’implĂ©mentation du nouveau rĂ©conciliateur.

Avez-vous trouvĂ© cette page utile ?Modifier cette page