{"componentChunkName":"component---src-templates-blog-js","path":"/blog/2019/08/08/react-v16.9.0.html","result":{"data":{"markdownRemark":{"html":"<div class=\"scary\">\n<blockquote>\n<p>This blog site has been archived. Go to <a href=\"https://react.dev/blog\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react.dev/blog</a> to see the recent posts.</p>\n</blockquote>\n</div>\n<p>React 16.9 sort aujourd’hui.  Cette version contient quelques nouvelles fonctionnalités, des correctifs et de nouveaux avertissements de dépréciation pour vous aider à préparer votre passage à la prochaine version majeure.</p>\n<h2 id=\"new-deprecations\"><a href=\"#new-deprecations\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Nouvelles dépréciations </h2>\n<h3 id=\"renaming-unsafe-lifecycle-methods\"><a href=\"#renaming-unsafe-lifecycle-methods\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Renommage des méthodes de cycle de vie dangereuses </h3>\n<p><a href=\"/blog/2018/03/27/update-on-async-rendering.html\">Il y a plus d’un an</a>, nous annonçions le renommage des méthodes de cycle de vie dangereuses :</p>\n<ul>\n<li><code class=\"gatsby-code-text\">componentWillMount</code> → <code class=\"gatsby-code-text\">UNSAFE_componentWillMount</code></li>\n<li><code class=\"gatsby-code-text\">componentWillReceiveProps</code> → <code class=\"gatsby-code-text\">UNSAFE_componentWillReceiveProps</code></li>\n<li><code class=\"gatsby-code-text\">componentWillUpdate</code> → <code class=\"gatsby-code-text\">UNSAFE_componentWillUpdate</code></li>\n</ul>\n<p><strong>React 16.9 ne rompt pas la compatibilité ascendante, et les anciens noms continuent à fonctionner dans cette version.</strong>  Mais vous verrez désormais un avertissement si vous les utilisez encore :</p>\n<p><img src=\"https://i.imgur.com/sngxSML.png\" alt=\"Attention : componentWillMount a été renommée, et ne devrait plus être utilisée. (Warning: componentWillMount has been renamed, and is not recommended for use.)\"></p>\n<p>Comme le suggère l’avertissement, vous devriez opter pour <a href=\"/blog/2018/03/27/update-on-async-rendering.html#migrating-from-legacy-lifecycles\">de meilleures approches</a> pour chacune de ces méthodes dangereuses. Ceci étant dit, vous n’avez peut-être pas le temps de migrer ou de tester ces composants.  Dans ce cas, nous vous conseillons d’exécuter un script de <a href=\"https://medium.com/@cpojer/effective-javascript-codemods-5a6686bb46fb\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">« codemod »</a> pour procéder automatiquement à ces renommages :</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token builtin class-name\">cd</span> your_project\nnpx react-codemod rename-unsafe-lifecycles</code></pre></div>\n<p><em>(Remarquez que la commande est ici <code class=\"gatsby-code-text\">npx</code>, pas <code class=\"gatsby-code-text\">npm</code>. <code class=\"gatsby-code-text\">npx</code> est un utilitaire fourni par défaut avec Node 6+.)</em></p>\n<p>Ce codemod remplacera les anciens noms tels que <code class=\"gatsby-code-text\">componentWillMount</code> par leurs équivalents ajustés comme <code class=\"gatsby-code-text\">UNSAFE_componentWillMount</code> :</p>\n<p><img src=\"https://i.imgur.com/Heyvcyi.gif\" alt=\"Le codemod en action\"></p>\n<p>Les nouveaux noms tels que <code class=\"gatsby-code-text\">UNSAFE_componentWillMount</code> <strong>continueront à fonctionner à la fois dans React 16.9 et React 17.x</strong>.  En revanche, le nouveau préfixe <code class=\"gatsby-code-text\">UNSAFE_</code> fera mieux ressortir les composants qui recourent à des approches problématiques lors des revues de code et sessions de débogage.  (Si vous le souhaitez, vous pouvez en décourager l’utilisation au sein de votre appli en activant le <a href=\"/docs/strict-mode.html\">mode strict</a>.)</p>\n<blockquote>\n<p>Remarque</p>\n<p>Vous pouvez en apprendre davantage sur <a href=\"/docs/faq-versioning.html#commitment-to-stability\">notre politique de gestion des versions et notre engagement en termes de stabilité</a>.</p>\n</blockquote>\n<h3 id=\"deprecating-javascript-urls\"><a href=\"#deprecating-javascript-urls\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Dépréciation des URL <code class=\"gatsby-code-text\">javascript:</code> </h3>\n<p>Les URL commençant par <code class=\"gatsby-code-text\">javascript:</code> constituent une surface d’attaque dangereuse car il est facile de les inclure verbatim par inadvertance dans une balise de type <code class=\"gatsby-code-text\">&lt;a href></code>, créant ainsi une faille de sécurité :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">const</span> userProfile <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">website</span><span class=\"token operator\">:</span> <span class=\"token string\">\"javascript: alert('je suis un gros pirate')\"</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// Ça déclenchera désormais un avertissement :</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span> <span class=\"token attr-name\">href</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>userProfile<span class=\"token punctuation\">.</span>website<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Profil</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p><strong>Dans React 16.9,</strong> cette approche continuera à fonctionner, mais loguera un avertissement.  Si vous utilisez des URL <code class=\"gatsby-code-text\">javascript:</code> pour votre logique applicative, essayez plutôt d’utiliser les gestionnaires d’événements de React.  (En dernier recours, vous pouvez contourner la protection avec <a href=\"/docs/dom-elements.html#dangerouslysetinnerhtml\"><code class=\"gatsby-code-text\">dangerouslySetInnerHTML</code></a>, mais nous le déconseillons fortement dans la mesure où ça conduit souvent à des failles de sécurité.)</p>\n<p><strong>Dans une future version majeure,</strong> React lèvera une erreur s’il rencontre une URL <code class=\"gatsby-code-text\">javascript:</code>.</p>\n<h3 id=\"deprecating-factory-components\"><a href=\"#deprecating-factory-components\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Dépréciation des composants « Fabrique » </h3>\n<p>Avant que la compilation de classes JavaScript grâce à Babel ne devienne monnaie courante, React prenait en charge les composants « fabriques », qui renvoyaient un objet doté d’une méthode <code class=\"gatsby-code-text\">render</code> :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">FactoryComponent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span> <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Cette approche est déroutante car elle ressemble trop à une fonction composant—alors que ce n’en est pas une.  (Dans cet exemple, une fonction composant se contenterait de renvoyer le <code class=\"gatsby-code-text\">&lt;div /></code>.)</p>\n<p>On ne trouve cette approche presque nulle part en production, et sa prise en charge rend React un brin plus gros et plus lent que nécessaire.  C’est pourquoi nous la déprécions avec la 16.9, et loguons un avertissement si nous la rencontrons.  Si vous vous en servez, une solution de contournement possible consiste à rajouter <code class=\"gatsby-code-text\">FactoryComponent.prototype = React.Component.prototype</code>.  Vous pouvez aussi choisir de convertir un tel composant soit sous forme de classe, soit en tant que fonction composant.</p>\n<p>Nous estimons que cette dépréciation aura un impact très limité.</p>\n<h2 id=\"new-features\"><a href=\"#new-features\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Nouvelles fonctionnalités </h2>\n<h3 id=\"async-act-for-testing\"><a href=\"#async-act-for-testing\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><a href=\"/docs/test-utils.html#act\"><code class=\"gatsby-code-text\">act()</code></a> asynchrone pour vos tests </h3>\n<p><a href=\"/blog/2019/02/06/react-v16.8.0.html\">React 16.8</a> a introduit une nouvelle fonction utilitaire pour les tests appelée <a href=\"/docs/test-utils.html#act\"><code class=\"gatsby-code-text\">act()</code></a>, qui vise à rapprocher le comportement de vos tests de celui au sein d’un navigateur. Par exemple, de multiples mises à jour de l’état local au sein d’un même <code class=\"gatsby-code-text\">act()</code> sont traitées comme un lot. Ça correspond au comportement existant de React lorsqu’il gère de véritables événements navigateur, et vous aide à préparer vos composants pour un avenir dans lequel React regroupera davantage les mises à jour sous forme de lots.</p>\n<p>Cependant, dans la 16.8 <code class=\"gatsby-code-text\">act()</code> n’autorisait que les fonctions synchrones. Vous pouviez parfois rencontrer un avertissement comme ce qui suit lors d’un test, mais <a href=\"https://github.com/facebook/react/issues/14769\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ce n’était pas facile à corriger</a> :</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"gatsby-code-text\"><code class=\"gatsby-code-text\">An update to SomeComponent inside a test was not wrapped in act(...).</code></pre></div>\n<p><em>(Une mise à jour de SomeComponent dans un test n’a pas été enrobée par act(…), NdT)</em></p>\n<p><strong>Avec React 16.9, <code class=\"gatsby-code-text\">act()</code> autorise aussi les fonctions asynchrones,</strong> et vous pouvez faire un <code class=\"gatsby-code-text\">await</code> sur son appel :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">await</span> <span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Voilà qui règle les cas où vous ne pouviez pas utiliser <code class=\"gatsby-code-text\">act()</code> jusque-là, par exemple une mise à jour de l’état local au sein d’une fonction asynchrone.  Résultat, <strong>vous devriez enfin pouvoir éliminer les avertissements restants sur <code class=\"gatsby-code-text\">act()</code> au sein de vos tests.</strong></p>\n<p>Vous êtes également nombreux à nous avoir signalé qu’on ne trouvait pas assez d’informations sur la façon d’écrire des tests avec <code class=\"gatsby-code-text\">act()</code>.  Le nouveau guide <a href=\"/docs/testing-recipes.html\">Recettes de test</a> décrit les scénarios courants, et explique en quoi <code class=\"gatsby-code-text\">act()</code> peut vous aider à écrire de bons tests.  Les exemples utilisent les API DOM natives, mais vous pouvez utiliser <a href=\"https://testing-library.com/docs/react-testing-library/intro\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React Testing Library</a> pour réduire le volume de code générique.  Nombre de ses méthodes utilisent déjà <code class=\"gatsby-code-text\">act()</code> en interne.</p>\n<p>Si vous rencontrez d’autres scénarios dans lesquels <code class=\"gatsby-code-text\">act()</code> ne fonctionne pas bien pour vous, n’hésitez pas à <a href=\"https://github.com/facebook/react/issues\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ouvrir un ticket</a> et nous tenterons de vous aider.</p>\n<h3 id=\"performance-measurements-with-reactprofiler\"><a href=\"#performance-measurements-with-reactprofiler\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Mesurer les performances avec <a href=\"/docs/profiler.html\"><code class=\"gatsby-code-text\">&lt;React.Profiler></code></a> </h3>\n<p>Dans React 16.5 nous avions introduit un nouveau <a href=\"/blog/2018/09/10/introducing-the-react-profiler.html\">profileur React pour les DevTools</a>, qui aidait à repérer les goulots d’étranglement dans les performances de votre application. <strong>Avec React 16.9, nous ajoutons une manière <em>programmatique</em> de collecter ces mesures</strong>, appelée <code class=\"gatsby-code-text\">&lt;React.Profiler></code>.  Nous estimons que la plupart des petites applis ne s’en serviront pas, mais que ça peut s’avérer utile pour pister les régressions de performance au fil du temps dans les applis de plus grande taille.</p>\n<p>Le <code class=\"gatsby-code-text\">&lt;Profiler></code> mesure la fréquence des rendus d’une appli React et le « coût » de ces rendus.  L’objectif est de vous aider à identifier les parties d’une application qui sont lentes et pourraient bénéficier <a href=\"/docs/hooks-faq.html#how-to-memoize-calculations\">d’optimisations telles que la mémoïsation</a>.</p>\n<p>Vous pouvez ajouter un <code class=\"gatsby-code-text\">&lt;Profiler></code> dans une arborescence React pour mesurer le coût de rendu de cette partie de l’arbre de composants.  Le composant requiert deux props : un <code class=\"gatsby-code-text\">id</code> (chaîne de caractères) et une <a href=\"/docs/profiler.html#onrender-callback\">fonction de rappel <code class=\"gatsby-code-text\">onRender</code></a>, que React appelle chaque fois qu’un composant au sein de l’arbre « finalise » <em>(commits, NdT)</em> une mise à jour.</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token function\">render</span><span class=\"token punctuation\">(</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Profiler</span></span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>application<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">onRender</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>onRenderCallback<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Navigation</span></span> <span class=\"token spread\"><span class=\"token punctuation\">{</span><span class=\"token operator\">...</span>props<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Main</span></span> <span class=\"token spread\"><span class=\"token punctuation\">{</span><span class=\"token operator\">...</span>props<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">App</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">  </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Profiler</span></span><span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Pour en apprendre davantage sur le <code class=\"gatsby-code-text\">Profiler</code> et sur les paramètres passés à la fonction de rappel <code class=\"gatsby-code-text\">onRender</code>, jetez un coup d’œil aux <a href=\"/docs/profiler.html\">docs de <code class=\"gatsby-code-text\">Profiler</code></a>.</p>\n<blockquote>\n<p>Remarque</p>\n<p>Le profilage pénalise légèrement les performances effectives, il est donc <strong>désactivé dans <a href=\"https://reactjs.org/docs/optimizing-performance.html#use-the-production-build\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">le build de production</a></strong>.</p>\n<p>Pour activer le profilage en production, React fournit un build de production spécifique avec le profilage\nactivé.  Vous pouvez apprendre comment l’utiliser sur <a href=\"https://fb.me/react-profiling\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">fb.me/react-profiling</a>.</p>\n</blockquote>\n<h2 id=\"notable-bugfixes\"><a href=\"#notable-bugfixes\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Correctifs importants </h2>\n<p>Cette version comprend quelques autres améliorations notables :</p>\n<ul>\n<li>Nous <a href=\"https://github.com/facebook/react/pull/15312\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">avons corrigé</a> un crash qui survenait lorsqu’on appelait <code class=\"gatsby-code-text\">findDOMNode()</code> dans une arborescence <code class=\"gatsby-code-text\">&lt;Suspense></code>.</li>\n<li>Nous <a href=\"https://github.com/facebook/react/pull/16115\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">avons corrigé</a> une fuite de mémoire due à des sous-arbres qui restaient référencés après leur retrait.</li>\n<li>En cas de boucle infinie due à un <code class=\"gatsby-code-text\">setState</code> au sein d’un <code class=\"gatsby-code-text\">useEffect</code>, nous <a href=\"https://github.com/facebook/react/pull/15180\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">loguons désormais une erreur</a>. (Notez la cohérence avec l’erreur que l’on constate lorsqu’on appelle <code class=\"gatsby-code-text\">setState</code> dans le <code class=\"gatsby-code-text\">componentDidUpdate</code> d’une classe.)</li>\n</ul>\n<p>Nous aimerions en profiter pour remercier tous les contributeurs qui nous ont aidé à faire émerger puis corriger ces bugs et d’autres.  Vous pouvez retrouver la liste complète <a href=\"#changelog\">plus bas</a>.</p>\n<h2 id=\"an-update-to-the-roadmap\"><a href=\"#an-update-to-the-roadmap\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Une feuille de route révisée </h2>\n<p>En <a href=\"/blog/2018/11/27/react-16-roadmap.html\">novembre 2018</a>, nous avions publié la feuille de route suivante pour les versions 16.x :</p>\n<ul>\n<li>Une version 16.x mineure avec les Hooks (initialement prévue au Q1 2019)</li>\n<li>Une version 16.x mineure avec le mode concurrent (initialement prévue au Q2 2019)</li>\n<li>Une version 16.x mineure avec Suspense pour la récupération de données (initialement prévue à la mi-2019)</li>\n</ul>\n<p>Ces prévisions étaient trop optimistes, et nous avons dû les ajuster.</p>\n<p><strong>TL;PL :</strong> nous avons sorti les Hooks dans les temps, mais nous regroupons le mode concurrent et Suspense pour la récupération de données dans une unique version que nous avons l’intention de sortir d’ici la fin de l’année.</p>\n<p>En février, nous <a href=\"/blog/2019/02/06/react-v16.8.0.html\">avons sorti la version stable 16.8</a> avec les Hooks React, suivie <a href=\"https://react-native.dev/blog/2019/03/12/releasing-react-native-059\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">un mois plus tard</a> par leur prise en charge dans React Native.  Néanmoins, nous avons sous-estimé le travail restant pour cette version, y compris les règles d’analyse statique <em>(linting, NdT)</em>, les outils de développement, les exemples et les compléments de documentation.  Tout ça a décalé la chronologie de quelques mois.</p>\n<p>À présent que les Hooks sont sortis, le travail sur le mode concurrent et Suspense pour la récupération de données est en plein essor.  Le <a href=\"https://twitter.com/facebook/status/1123322299418124289\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">nouveau site Facebook, actuellement en développement</a>, est construit à l’aide de ces fonctionnalités.  Les tester sur du véritable code de production nous a permis de découvrir et corriger de nombreux problèmes avant qu’ils n’affectent nos utilisateurs open source.  Certains de ces correctifs ont nécessité des changements de conception pour ces fonctionnalités, ce qui a contribué à décaler la chronologie de sortie.</p>\n<p>Forts de cette expérience, voici comment nous avons l’intention de procéder.</p>\n<h3 id=\"one-release-instead-of-two\"><a href=\"#one-release-instead-of-two\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Une version au lieu de deux </h3>\n<p>Le mode concurrent et Suspense <a href=\"https://developers.facebook.com/videos/2019/building-the-new-facebookcom-with-react-graphql-and-relay/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">sont au cœur du nouveau site Facebook</a> actuellement en plein développement, c’est pourquoi nous avons de bonnes raisons de penser qu’elles sont près de se stabiliser techniquement.  Nous avons par ailleurs une meilleure compréhension désormais des étapes concrètes à suivre pour leur adoption dans l’open source.</p>\n<p>À l’origine nous pensions pouvoir découper le mode concurrent et Suspense pour la récupération de données à travers deux versions.  Nous avons constaté que ce séquençage allait être plus déroutant qu’autre chose car ces deux fonctionnalités sont plus étroitement liées que nous ne le pensions au départ.  C’est pourquoi nous comptons plutôt sortir une prise en charge à la fois du mode concurrent et de Suspense pour la récupération de données dans une unique version combinée.</p>\n<p>Nous ne voulons pas à nouveau trop nous avancer sur la date de sortie.  Dans la mesure où nous nous reposons sur ces deux fonctionnalités pour du code de production, nous estimons que nous pourrons sortir cette année une version 16.x dans laquelle vous pourrez choisir de les utiliser.</p>\n<h3 id=\"an-update-on-data-fetching\"><a href=\"#an-update-on-data-fetching\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Des nouvelles de la récupération de données </h3>\n<p>React n’est pas prescriptif sur la façon de récupérer les données, alors la première version de Suspense pour la récupération de données se concentrera probablement sur l’intégration avec <em>des bibliothèques de récupération de données prescriptives</em>.  Par exemple, chez Facebook nous utilisons une API expérimentale de Relay qui s’intègre avec Suspense.  Nous ferons en sorte que les autres bibliothèques de ce genre aient la documentation nécessaire pour mettre en place des intégrations similaires.</p>\n<p>Pour la première version, nous <em>ne souhaitons pas</em> nous concentrer sur la solution <em>ad hoc</em> au besoin « lancer une requête HTTP » utilisée dans nos démos antérieures (également connue sous le terme « React Cache »).  Ceci dit, il est probable que notre équipe et la communauté React exploreront ce type de sujet dans les mois qui suivront la sortie initiale.</p>\n<h3 id=\"an-update-on-server-rendering\"><a href=\"#an-update-on-server-rendering\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Des nouvelles du rendu côté serveur </h3>\n<p>Nous avons démarré le travail sur le <a href=\"/blog/2018/11/27/react-16-roadmap.html#suspense-for-server-rendering\">nouveau moteur de rendu côté serveur compatible avec Suspense</a>, mais il <em>ne sera probablement pas</em> prêt pour la version initiale du mode concurrent.  Cette version fournira, ceci dit, une solution temporaire qui permettra au moteur de rendu côté serveur existant de produire immédiatement du HTML avec des appels de repli Suspense, pour ensuite produire le véritable contenu côté client.  Nous utilisons actuellement nous-mêmes cette solution chez Facebook en attendant que le moteur de rendu en streaming soit prêt.</p>\n<p>Pourquoi est-ce si long ?</p>\n<p>Nous avons publié les éléments préalables au mode concurrent à chaque fois qu’ils atteignaient la stabilité, y compris la <a href=\"/blog/2018/03/29/react-v-16-3.html\">nouvelle API de contexte</a>, le <a href=\"/blog/2018/10/23/react-v-16-6.html\">chargement différé avec Suspense</a>, et les <a href=\"/blog/2019/02/06/react-v16.8.0.html\">Hooks</a>.  Nous avons hâte de sortir les parties manquantes, mais auparavant <a href=\"/docs/design-principles.html#dogfooding\">les essayer à grande échelle</a> est une partie importante de notre processus.  Pour être honnêtes, ça représentait juste davantage de travail que ce qu’on estimait initialement.  Comme toujours, nous serons ravis de lire vos questions et retours sur <a href=\"https://twitter.com/reactjs\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Twitter</a> et dans notre <a href=\"https://github.com/facebook/react/issues\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gestion de tickets</a>.</p>\n<h2 id=\"installation\"><a href=\"#installation\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Installation </h2>\n<h3 id=\"react\"><a href=\"#react\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>React </h3>\n<p>React v16.9.0 est disponible sur le référentiel npm.</p>\n<p>Pour installer React 16 avec Yarn, exécutez :</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">yarn</span> <span class=\"token function\">add</span> react@^16.9.0 react-dom@^16.9.0</code></pre></div>\n<p>Pour installer React 16 avec npm, exécutez :</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"gatsby-code-bash\"><code class=\"gatsby-code-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> <span class=\"token parameter variable\">--save</span> react@^16.9.0 react-dom@^16.9.0</code></pre></div>\n<p>Nous fournissons aussi des builds de React sur un CDN :</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"gatsby-code-html\"><code class=\"gatsby-code-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">crossorigin</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>https://unpkg.com/react@16/umd/react.production.min.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">crossorigin</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>https://unpkg.com/react-dom@16/umd/react-dom.production.min.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>Consultez la documentation pour des <a href=\"/docs/installation.html\">instructions d’installation détaillées</a>.</p>\n<h2 id=\"changelog\"><a href=\"#changelog\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Changelog </h2>\n<h3 id=\"react\"><a href=\"#react\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>React </h3>\n<ul>\n<li>Ajout de l’API <code class=\"gatsby-code-text\">&lt;React.Profiler></code> pour collecter programmatiquement des mesures de performances. (<a href=\"https://github.com/bvaughn\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@bvaughn</a> dans <a href=\"https://github.com/facebook/react/pull/15172\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15172</a>)</li>\n<li>Retrait de <code class=\"gatsby-code-text\">unstable_ConcurrentMode</code> en faveur de <code class=\"gatsby-code-text\">unstable_createRoot</code>. (<a href=\"https://github.com/acdlite\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@acdlite</a> dans <a href=\"https://github.com/facebook/react/pull/15532\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15532</a>)</li>\n</ul>\n<h3 id=\"react-dom\"><a href=\"#react-dom\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>React DOM </h3>\n<ul>\n<li>Dépréciation des anciens noms pour les méthodes de cycle de vie <code class=\"gatsby-code-text\">UNSAFE_*</code>. (<a href=\"https://github.com/bvaughn\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@bvaughn</a> dans <a href=\"https://github.com/facebook/react/pull/15186\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15186</a> et <a href=\"https://github.com/threepointone\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@threepointone</a> dans <a href=\"https://github.com/facebook/react/pull/16103\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#16103</a>)</li>\n<li>Dépréciation des URL <code class=\"gatsby-code-text\">javascript:</code> en tant que surfaces d’attaque courantes. (<a href=\"https://github.com/sebmarkbage\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@sebmarkbage</a> dans <a href=\"https://github.com/facebook/react/pull/15047\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15047</a>)</li>\n<li>Dépréciation des composants rarement utilisés “module pattern” (fabrique). (<a href=\"https://github.com/sebmarkbage\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@sebmarkbage</a> dans <a href=\"https://github.com/facebook/react/pull/15145\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15145</a>)</li>\n<li>Prise en charge de l’attribut <code class=\"gatsby-code-text\">disablePictureInPicture</code> sur <code class=\"gatsby-code-text\">&lt;video></code>. (<a href=\"https://github.com/eek\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@eek</a> dans <a href=\"https://github.com/facebook/react/pull/15334\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15334</a>)</li>\n<li>Prise en charge de l’événement <code class=\"gatsby-code-text\">onLoad</code> sur <code class=\"gatsby-code-text\">&lt;embed></code>. (<a href=\"https://github.com/cherniavskii\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@cherniavskii</a> dans <a href=\"https://github.com/facebook/react/pull/15614\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15614</a>)</li>\n<li>Capacité à modifier l’état de <code class=\"gatsby-code-text\">useState</code> dans les DevTools. (<a href=\"https://github.com/bvaughn\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@bvaughn</a> dans <a href=\"https://github.com/facebook/react/pull/14906\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#14906</a>)</li>\n<li>Capacité à (dés)activer Suspense dans les DevTools. (<a href=\"https://github.com/gaearon\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@gaearon</a> dans <a href=\"https://github.com/facebook/react/pull/15232\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15232</a>)</li>\n<li>Avertir de l’utilisation de <code class=\"gatsby-code-text\">setState</code> au sein d’un <code class=\"gatsby-code-text\">useEffect</code>, qui crée une boucle. (<a href=\"https://github.com/gaearon\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@gaearon</a> dans <a href=\"https://github.com/facebook/react/pull/15180\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15180</a>)</li>\n<li>Correction d’une fuite de mémoire. (<a href=\"https://github.com/paulshen\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@paulshen</a> dans <a href=\"https://github.com/facebook/react/pull/16115\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#16115</a>)</li>\n<li>Correction d’un crash dans <code class=\"gatsby-code-text\">findDOMNode</code> pour les composants enrobés par <code class=\"gatsby-code-text\">&lt;Suspense></code>. (<a href=\"https://github.com/acdlite\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@acdlite</a> dans <a href=\"https://github.com/facebook/react/pull/15312\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15312</a>)</li>\n<li>Correction du traitement trop tardif d’effets en attente. (<a href=\"https://github.com/acdlite\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@acdlite</a> dans <a href=\"https://github.com/facebook/react/pull/15650\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15650</a>)</li>\n<li>Correction d’un ordre incorrect d’arguments dans un message d’avertissement. (<a href=\"https://github.com/brickspert\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@brickspert</a> dans <a href=\"https://github.com/facebook/react/pull/15345\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15345</a>)</li>\n<li>Correction du masquage des nœuds de secours de Suspense en présence d’un style <code class=\"gatsby-code-text\">!important</code>. (<a href=\"https://github.com/acdlite\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@acdlite</a> dans <a href=\"https://github.com/facebook/react/pull/15861\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15861</a> and <a href=\"https://github.com/facebook/react/pull/15882\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15882</a>)</li>\n<li>Légère amélioration des performances de l’hydratation. (<a href=\"https://github.com/bmeurer\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@bmeurer</a> dans <a href=\"https://github.com/facebook/react/pull/15998\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15998</a>)</li>\n</ul>\n<h3 id=\"react-dom-server\"><a href=\"#react-dom-server\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>React DOM Server </h3>\n<ul>\n<li>Corrections d’une sortie incorrecte pour les noms de propriétés CSS personnalisées en casse camel. (<a href=\"https://github.com/bedakb\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@bedakb</a> dans <a href=\"https://github.com/facebook/react/pull/16167\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#16167</a>)</li>\n</ul>\n<h3 id=\"react-test-utilities-and-test-renderer\"><a href=\"#react-test-utilities-and-test-renderer\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Utilitaires de test React et moteur de rendu de test </h3>\n<ul>\n<li>Ajout de <code class=\"gatsby-code-text\">act(async () => ...)</code> pour tester les mises à jour d’état asynchrones. (<a href=\"https://github.com/threepointone\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@threepointone</a> dans <a href=\"https://github.com/facebook/react/pull/14853\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#14853</a>)</li>\n<li>Prise en charge d’appels imbriqués à <code class=\"gatsby-code-text\">act</code> depuis plusieurs moteurs de rendu. (<a href=\"https://github.com/threepointone\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@threepointone</a> dans <a href=\"https://github.com/facebook/react/pull/16039\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#16039</a> and <a href=\"https://github.com/facebook/react/pull/16042\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#16042</a>)</li>\n<li>Avertir en mode strict si des effets sont planifiés hors d’un appel à <code class=\"gatsby-code-text\">act()</code>. (<a href=\"https://github.com/threepointone\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@threepointone</a> dans <a href=\"https://github.com/facebook/react/pull/15763\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15763</a> and <a href=\"https://github.com/facebook/react/pull/16041\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#16041</a>)</li>\n<li>Avertir lors d’un appel à <code class=\"gatsby-code-text\">act</code> depuis le mauvais moteur de rendu. (<a href=\"https://github.com/threepointone\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@threepointone</a> dans <a href=\"https://github.com/facebook/react/pull/15756\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#15756</a>)</li>\n</ul>","excerpt":"This blog site has been archived. Go to react.dev/blog to see the recent posts. React 16.9 sort aujourd’hui.  Cette version contient quelques nouvelles fonctionnalités, des correctifs et de nouveaux avertissements de dépréciation pour vous aider à préparer votre passage à la prochaine version majeure. Nouvelles dépréciations  Renommage des méthodes de cycle de vie dangereuses  Il y a plus d’un an, nous annonçions le renommage des méthodes de cycle de vie dangereuses :  →   →   →  React 16.9 ne…","frontmatter":{"title":"React v16.9.0 et feuille de route révisée","next":null,"prev":null,"author":[{"frontmatter":{"name":"Dan Abramov","url":"https://twitter.com/dan_abramov"}},{"frontmatter":{"name":"Brian Vaughn","url":"https://github.com/bvaughn"}}]},"fields":{"date":"2019-08-08T00:00:00.000Z","formattedDate":"8 August 2019","path":"content/blog/2019-08-08-react-v16.9.0.md","slug":"/blog/2019/08/08/react-v16.9.0.html"}},"allMarkdownRemark":{"edges":[{"node":{"frontmatter":{"title":"React Labs: What We've Been Working On – June 2022"},"fields":{"slug":"/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022.html"}}},{"node":{"frontmatter":{"title":"React v18.0"},"fields":{"slug":"/blog/2022/03/29/react-v18.html"}}},{"node":{"frontmatter":{"title":"How to Upgrade to React 18"},"fields":{"slug":"/blog/2022/03/08/react-18-upgrade-guide.html"}}},{"node":{"frontmatter":{"title":"React Conf 2021 Recap"},"fields":{"slug":"/blog/2021/12/17/react-conf-2021-recap.html"}}},{"node":{"frontmatter":{"title":"The Plan for React 18"},"fields":{"slug":"/blog/2021/06/08/the-plan-for-react-18.html"}}},{"node":{"frontmatter":{"title":"Introducing Zero-Bundle-Size React Server Components"},"fields":{"slug":"/blog/2020/12/21/data-fetching-with-react-server-components.html"}}},{"node":{"frontmatter":{"title":"React v17.0"},"fields":{"slug":"/blog/2020/10/20/react-v17.html"}}},{"node":{"frontmatter":{"title":"Introducing the New JSX Transform"},"fields":{"slug":"/blog/2020/09/22/introducing-the-new-jsx-transform.html"}}},{"node":{"frontmatter":{"title":"React v17.0 Release Candidate : pas de nouvelles fonctionnalités"},"fields":{"slug":"/blog/2020/08/10/react-v17-rc.html"}}},{"node":{"frontmatter":{"title":"React v16.13.0"},"fields":{"slug":"/blog/2020/02/26/react-v16.13.0.html"}}}]}},"pageContext":{"slug":"/blog/2019/08/08/react-v16.9.0.html"}},"staticQueryHashes":[]}