Analyse et optimisation des applications React

Des gens comme moi qui luttent pour des sites trĂšs performants y passent souvent beaucoup de temps. Alors maintenant, je vais rĂ©soudre une fois pour toutes le problĂšme des ressources Web Ă  faible vitesse dont l'interface est Ă©crite dans React. À savoir, je suggĂšre que tous ceux qui lisent ceci devraient cesser d'utiliser React aujourd'hui.



L'auteur du matĂ©riel, dont nous publions aujourd'hui la traduction, bien sĂ»r, des blagues. Ici, nous parlerons de la façon d'optimiser les performances des applications React. Soit dit en passant, avant de commencer, rĂ©flĂ©chissons Ă  la raison pour laquelle l'optimisation du site Web est gĂ©nĂ©ralement nĂ©cessaire. Peut-ĂȘtre pouvons-nous dire qu'il est nĂ©cessaire pour que le site soit utilisĂ© par plus de personnes qu'avant l'optimisation.

Présentation


Comment optimiser le site? Comment pouvez-vous évaluer les avantages de l'optimisation pour les utilisateurs du site? Et pourquoi devez-vous penser à de tels indicateurs?

Nous allons essayer de répondre à ces questions en examinant la maniÚre la plus simple de créer des applications React - en utilisant l' outil create-react-app (CRA). Un nouveau projet créé à l'aide de cet outil a les dépendances suivantes:

  • La bibliothĂšque principale de React, qui vous permet de travailler avec des composants React: 2,5 Kb.
  • La bibliothĂšque react-dom , qui permet d'afficher les composants sur la page, en les transformant en structures adaptĂ©es Ă  l'insertion dans l'arborescence DOM: 30,7 Kb.
  • Une petite quantitĂ© de code, qui inclut le modĂšle du premier composant: environ 3 Ko.

Ces données sont obtenues pour React 16.6.3.

Pour savoir combien de temps il faudra pour télécharger une nouvelle application CRA sur votre téléphone Moto G4, vous pouvez utiliser le service WebPageTest .


Temps de chargement du site Web sur Moto G4 en utilisant différents réseaux

Cette application, une variante de «Hello, World», est hébergée sur l'hébergement Firebase, elle est à l'étude en cours de chargement dans le navigateur Chrome à l'aide de trois types de connexions:

  • 4G (9 Mbps)
  • 3G (1,6 Mbps)
  • Connexion 3G lente (400 Kbps)

Ici, vous devez prendre en compte les retards du réseau.

Pourquoi ai-je utilisé le Moto G4 pour l'expérience? Il s'agit d'un simple téléphone bon marché, similaire à ces téléphones qui, sous la forme d'appareils de base, sont utilisés par de nombreuses personnes dans les pays en développement. Sur un réseau 4G, l'application s'est chargée en 2 secondes. Dans un réseau 3G lent, il a fallu plus de 4 secondes pour qu'une page soit mise en ligne.

Bien que ces statistiques soient assez intĂ©ressantes, elles ne sont pas particuliĂšrement utiles si vous ne savez pas qui sont vos utilisateurs. Ce que vous dĂ©finissez comme «lent» peut ĂȘtre complĂštement diffĂ©rent de ce que moi ou quelqu'un d'autre considĂšre comme «lent». Et votre perception du chargement «rapide» du site peut ĂȘtre dĂ©formĂ©e par l'appareil et la connexion rĂ©seau que vous utilisez. Si vous incluez un ordinateur de bureau connectĂ© Ă  Internet via une connexion filaire dans cette expĂ©rience, vous pouvez voir Ă  quel point la diffĂ©rence peut ĂȘtre grande entre le chargement «rapide» et «lent» d'un site.


Temps de chargement du site sur ordinateur de bureau et Moto G4

Afin d'amĂ©liorer les performances des applications React, dont la construction utilise la bibliothĂšque React, comme on dit, «prĂȘt Ă  l'emploi», les amĂ©liorations React DOM sont dĂ©crites dans le but de simplifier certaines choses. Ainsi, le systĂšme d'Ă©vĂ©nements contient de nombreux polyfills, qui, pour de nombreux nouveaux navigateurs, ne sont pas nĂ©cessaires, et l'Ă©quipe de dĂ©veloppement envisage des options pour les supprimer ou les simplifier, si possible. Vous pouvez le regarder ici .

Puis-je mesurer le niveau actuel de performance d'un site Web?


Une application React typique peut contenir de nombreux composants et bibliothÚques tiers. Cela signifie que les performances de l'application "Hello, World" ne nous fournissent pas d'informations particuliÚrement précieuses sur le chargement des applications réelles. Existe-t-il un moyen de connaßtre les performances de la plupart des sites construits à l'aide de certaines technologies (comme React)?

La ressource HTTP Archive peut nous aider Ă  rĂ©pondre Ă  cette question. Il s'agit d'une plateforme open source qui se concentre sur l'observation de la construction du Web. Cela se fait par l'exploration mensuelle de millions de sites, leur analyse Ă  l'aide de WebPageTest et l'enregistrement des informations les concernant. Ces informations incluent le nombre de requĂȘtes, les mesures concernant le chargement des donnĂ©es, la taille des donnĂ©es transmises et d'autres indicateurs.

Voici un autre outil intĂ©ressant - une extension pour Chrome appelĂ©e Library-Detector-for-Chrome . Il vous permet de dĂ©terminer quelles bibliothĂšques JavaScript sont utilisĂ©es sur la page. Il a rĂ©cemment Ă©tĂ© inclus comme outil d'audit de page dans Lighthouse. Cela suggĂšre que les informations fournies par cette extension peuvent ĂȘtre obtenues pour de nombreux sites dont les informations sont stockĂ©es dans l'archive HTTP. Cela peut aider ceux qui souhaitent analyser les rĂ©sultats des tests de milliers de sites qui utilisent une bibliothĂšque JavaScript spĂ©cifique (le mĂ©canisme pour dĂ©terminer React est ici ).

L'ensemble de donnĂ©es complet de l'archive HTTP est accessible au public et peut ĂȘtre trouvĂ© sur BigQuery . AprĂšs avoir recherchĂ© 140 000 sites Ă  l'aide de React pour les charger dans un environnement mobile artificiellement simulĂ© (jeu de donnĂ©es 2019_01_01 ), nous avons rĂ©ussi Ă  dĂ©couvrir les Ă©lĂ©ments suivants:

  • La mĂ©diane de l'indicateur de la premiĂšre peinture significative (premier affichage significatif, temps de dessin des Ă©lĂ©ments importants) Ă©tait de 6,9 ​​s.
  • La mĂ©diane de l'indicateur Time to Interactive (temps d'interactivitĂ©, temps de chargement des Ă©lĂ©ments d'interaction) Ă©tait de 19,7 s.

Vous pouvez explorer ces donnĂ©es vous-mĂȘme.

Il faut prĂšs de 20 secondes Ă  l'utilisateur pour commencer Ă  interagir avec le site. Et cela, en gĂ©nĂ©ral, se produit, pour ainsi dire, ici et maintenant, mĂȘme si cela peut sembler invraisemblable. Cela peut ĂȘtre vu sur de grands sites lorsque vous travaillez avec eux Ă  partir d'appareils faibles sur des lignes de communication lentes. En outre, je voudrais maintenant exprimer plusieurs raisons pour lesquelles ces donnĂ©es doivent ĂȘtre considĂ©rĂ©es avec un certain scepticisme.

  • De nombreux facteurs influencent les performances du site. Parmi eux - la quantitĂ© de code JavaScript envoyĂ© Ă  l'utilisateur, le nombre d'images et d'autres matĂ©riaux affichĂ©s sur la page, etc. Il ne comparera pas correctement les performances de tous les sites React avec les performances d'une page intitulĂ©e «Bonjour, World» si d'autres facteurs ne sont pas pris en compte.
  • Si vous essayez d'obtenir les donnĂ©es en remplaçant le nom d'une autre bibliothĂšque dans la demande React, vous obtiendrez des numĂ©ros trĂšs similaires.

Afin d'obtenir des données précises sur le type de performances des sites existants de maniÚre réaliste utilisant une certaine bibliothÚque, il faut faire beaucoup de travail.

Croissance du code JavaScript


Le problÚme commun des sites Web modernes, non liés à une bibliothÚque spécifique, est lié à la quantité de code JavaScript qu'un client doit généralement charger lors de la navigation. L'archive HTTP en a déjà un bon compte. En bref, voici à quoi ressemblent les valeurs médianes des volumes JavaScript téléchargés à partir de sites Web au cours des différentes années:

  • 74,7 Ko - pages Web mobiles, 15 dĂ©cembre 2011.
  • 384,4 Ko - pages Web mobiles, 15 dĂ©cembre 2018.

Il convient de garder à l'esprit que ces données ont été obtenues aprÚs le traitement de millions de pages. Il existe probablement des milliers de sites atypiques qui faussent cet indicateur. C'est une idée viable. Par conséquent, nous essaierons de savoir à quoi ressemble cet indicateur pour les 10000 premiers sites du classement Alexa:

  • 381,5 Ko - pages Web mobiles, 15 dĂ©cembre 2018 (voici la demande ).

Tout cela nous permet de conclure que de nos jours, des sites Web sont créés qui incluent plus de code JS que les sites qui ont été créés il y a plusieurs années. Ceci est une observation importante. Les sites sont devenus plus grands, ils sont devenus plus interactifs et plus complexes, et le volume de code JS de ces sites augmente progressivement chaque année. Vous en avez probablement déjà entendu parler, mais plus vous envoyez de code JavaScript au navigateur, plus il faut de temps pour l'analyser, le compiler et l'exécuter. En conséquence, cela ralentit le site.

Il est important de noter que chaque site est unique, ainsi que la base d'utilisateurs de chaque site. De nombreux développeurs, dont les sites contiennent plus de 300 Ko de code JS, ne sont pas confrontés au fait que la plupart de leurs utilisateurs souffrent de problÚmes de performances, ce qui est tout à fait normal. Cependant, si vous craignez qu'il soit difficile pour vos utilisateurs de visualiser votre site React, afin d'évaluer la situation réelle, il est préférable de commencer par le profilage.

Profilage et analyse de pages


Le profilage et l'analyse des applications React peuvent ĂȘtre envisagĂ©s sous deux angles:

  • Il s'agit tout d'abord d'Ă©valuer les performances des composants. Cela affecte la façon dont les utilisateurs interagissent avec le site. Par exemple, si une liste est affichĂ©e en cliquant sur un bouton, cela doit ĂȘtre fait rapidement, mais si des centaines de composants sont restituĂ©s pendant cette opĂ©ration, mĂȘme si cela n'est pas nĂ©cessaire, cette opĂ©ration sera perçue comme lente.
  • DeuxiĂšmement, nous parlons de la rapiditĂ© avec laquelle la demande est mise en condition de travail. Autrement dit, combien de temps aprĂšs le dĂ©but du chargement du site, l'utilisateur pourra interagir avec lui. La quantitĂ© de code envoyĂ©e Ă  l'utilisateur lors du chargement de la premiĂšre page du site est un exemple de facteur affectant la rapiditĂ© avec laquelle l'utilisateur peut commencer Ă  travailler avec l'application.

Évaluation des performances et optimisation des composants


Essayons d'exprimer en une phrase la signification de l'algorithme de rĂ©conciliation React, ou l'essence de ce qu'on appelle le «DOM virtuel». Il ressemblera Ă  ceci: "React prend des mesures pour faire la distinction entre la nouvelle arborescence DOM et l'ancienne afin de comprendre ce qui doit ĂȘtre mis Ă  jour exactement dans l'interface utilisateur lorsque les donnĂ©es du composant changent." Cela crĂ©e une charge beaucoup moins importante sur le systĂšme que le rendu complet de l'application pour chaque changement d'Ă©tat ou de propriĂ©tĂ©s ( ici, vous pouvez lire la diffĂ©rence entre O (n 3 ) et O (n)). Voici un article de Dan Abramov, oĂč vous pouvez trouver des explications sur la rĂ©conciliation.

MĂȘme en tenant compte du fait que ces optimisations sont intĂ©grĂ©es dans les mĂ©canismes internes de React, on peut toujours rencontrer un problĂšme lorsque les composants de l'application sont rendus de maniĂšre rĂ©pĂ©tĂ©e alors que cela ne devrait pas se produire. Dans les petites applications, cela peut ne pas ĂȘtre visible, mais cela peut sĂ©rieusement affecter les performances des applications qui affichent des centaines de composants sur leurs pages.

Un nouveau rendu inutile des composants est effectuĂ© pour de nombreuses raisons. Par exemple, les fonctions qui fonctionnent Ă  l'intĂ©rieur des composants peuvent ne pas ĂȘtre aussi efficaces qu'elles pourraient l'ĂȘtre, ou peut-ĂȘtre qu'une liste entiĂšre de composants est redessinĂ©e lorsqu'un seul nouvel Ă©lĂ©ment est ajoutĂ© Ă  cette liste. Il existe des outils que vous pouvez utiliser pour dĂ©couvrir les arborescences de composants qui sont restituĂ©es depuis trop longtemps. Parmi eux, on peut noter:

  • Tableau de bord des outils de dĂ©veloppement Chrome.
  • React Developer Tool Profiler.

▍ Analyse des performances Ă  l'aide du panneau de performances des outils de dĂ©veloppement Chrome


React utilise l'API User Timing pour mesurer le temps pris Ă  chaque Ă©tape du cycle de vie du composant. Les informations sur les performances des applications React peuvent ĂȘtre collectĂ©es et analysĂ©es Ă  l'aide des outils de dĂ©veloppement Chrome. Cela vous permet de comprendre l'efficacitĂ© avec laquelle les composants sont connectĂ©s, affichĂ©s sur la page et dĂ©connectĂ©s lors de l'interaction de l'utilisateur avec la page ou lors du rechargement.


Analyse des performances des composants

Voici du bon matériel sur ce sujet, dédié à la recherche des performances des applications écrites à l'aide de React 16 à l'aide des outils de développement Chrome.

L'API de synchronisation utilisateur n'est utilisĂ©e que pendant le dĂ©veloppement. Il, en production, est Ă©teint. Dans de telles conditions, des implĂ©mentations plus rapides de ces mĂ©canismes peuvent ĂȘtre utilisĂ©es, sans avoir un impact sĂ©rieux sur les performances. C'est la nĂ©cessitĂ© de tels mĂ©canismes qui est devenue l'une des raisons du dĂ©veloppement du plus rĂ©cent API Profiler.

▍Analyse des performances Ă  l'aide du profileur des outils de dĂ©veloppement React


Avec la sortie de la bibliothĂšque react-dom 16.5 dans les outils de dĂ©veloppement React, un nouveau panneau appelĂ© Profiler peut ĂȘtre utilisĂ©. Il vous permet d'analyser les performances du rendu des composants. Cela se fait Ă  l'aide de l'API Profiler, qui collecte des informations sur le temps d'exĂ©cution des opĂ©rations pour tous les composants qui sont restituĂ©s.

Le panneau Profiler est un onglet autonome des outils de développement React. Ici, comme avec le panneau Performances de la barre d'outils Chrome Developer Tools, vous pouvez enregistrer des informations sur les actions des utilisateurs et les rechargements de page afin de collecter des données pour analyser les performances des composants.


Collecte de données avec React Developer Tools

Une fois la collecte des données terminée, le soi-disant «graphique ardent» s'affiche, indiquant le temps nécessaire pour rendre les composants sur la page.


Calendrier du profileur enflammé

Ici, vous pouvez basculer entre diffĂ©rents validations ou Ă©tats lorsque des nƓuds DOM ont Ă©tĂ© ajoutĂ©s, supprimĂ©s ou mis Ă  jour. Cela vous permet d'obtenir plus d'informations sur le temps passĂ© sur diverses opĂ©rations avec des composants.


Afficher les informations de validation dans le profileur

Les captures d'écran présentées ici représentent les données obtenues à la suite de l'enregistrement des actions de l'utilisateur effectuées dans une application simple. L'application télécharge une liste des référentiels GitHub tendances lorsqu'un bouton est cliqué. Comme vous pouvez le voir, il n'y a que deux commits ici:

  • L'un est pour l'indicateur de chargement, qui s'affiche pendant le chargement de la liste des articles.
  • Un autre reprĂ©sente le moment oĂč l'appel Ă  l'API est terminĂ© et la liste est affichĂ©e dans le DOM.

La figure de droite montre des métadonnées utiles qui incluent des informations de validation ou des données de composants, telles que les propriétés et l'état.


Métadonnées

Lorsque vous travaillez avec le profileur React, vous pouvez également afficher d'autres données représentées par divers graphiques. Vous pouvez en savoir plus sur le profileur React dans cet article sur le blog React.

Afin de compliquer un peu notre exemple, considérons une situation similaire, mais nous allons maintenant effectuer de nombreux appels d'API pour télécharger des référentiels de tendances dans différents langages de programmation (comme Golang, JavaScript, etc.). Comme vous pouvez vous y attendre, avec cette approche, nous avons plus d'engagements à notre disposition.


Augmenter le nombre de validations tout en compliquant le schéma de travail avec l'application

Les validations ultĂ©rieures se distinguent par des horaires plus longs, elles ont une couleur plus jaune. Cela signifie que le temps nĂ©cessaire Ă  tous les composants pour terminer le rendu augmente Ă  mesure que la taille de la liste des Ă©lĂ©ments sur la page augmente. Cela est dĂ» au fait que chaque composant de la liste subit un nouveau rendu Ă  chaque nouvel appel Ă  l'API. Cela permet d'identifier un problĂšme qui peut ĂȘtre assez facilement rĂ©solu. La solution est que les Ă©lĂ©ments de la liste n'ont pas besoin d'ĂȘtre rendus Ă  nouveau lorsque de nouveaux Ă©lĂ©ments sont ajoutĂ©s Ă  la liste.

▍ Minimiser les opĂ©rations de restitution de composants inutiles


Il existe de nombreuses façons de se débarrasser des opérations inutiles pour le rendu des composants React, ou du moins de minimiser le nombre de ces opérations. Examinons certains d'entre eux.

  • Vous pouvez utiliser la mĂ©thode de cycle de vie des composants de shouldComponentUpdate () :

     shouldComponentUpdate(nextProps, nextState) { // true        } 
  • Vous pouvez utiliser PureComponent pour construire des composants basĂ©s sur une classe:

     import React, { PureComponent } from 'react'; class AvatarComponent extends PureComponent { } 
  • Pour les composants fonctionnels, vous pouvez utiliser le mĂ©mo :

     import React, { memo } from 'react'; const AvatarComponent = memo(props => { }); 
  • Vous pouvez mĂ©moriser les sĂ©lecteurs Redux (par exemple, en utilisant resĂ©lectionner ).
  • Vous pouvez optimiser la sortie de listes trĂšs longues en utilisant la virtualisation (par exemple, en utilisant react-window ).

Ici et là - quelques vidéos utiles qui discutent de l'utilisation du profileur React pour trouver des goulots d'étranglement dans les applications.

Évaluation des performances et optimisation des applications


En plus d'analyser les mutations DOM et les opĂ©rations de restitution des composants, il existe d'autres phĂ©nomĂšnes de niveau supĂ©rieur qui mĂ©ritent d'ĂȘtre explorĂ©s. Pour une Ă©valuation complĂšte des performances du site, vous pouvez utiliser Lighthouse .

Il existe trois façons de tester une page Web à l'aide de Lighthouse:

  • Utilisation de l'interface de ligne de commande Node.js.
  • Utilisation de l'extension Chrome.
  • Utilisez la barre d'outils Audits des outils de dĂ©veloppement Chrome.

Voici Ă  quoi ressemble Lighthouse dans le panneau Audits.


Phare sur le panneau Audits

Lighthouse ne nécessite généralement pas beaucoup de temps pour collecter toutes les données dont il a besoin sur la page et pour effectuer de nombreuses vérifications de ces données. Une fois ces opérations terminées, Lighthouse affiche un rapport contenant des informations résumées.

Afin de comprendre que le chargement d'une page dans le navigateur implique de charger trop de code JavaScript, et pour conclure que la quantitĂ© de ce code doit ĂȘtre rĂ©duite, vous devez faire attention aux phrases suivantes du rapport:

  • Élimine les ressources bloquant le rendu
  • Le temps de dĂ©marrage de JavaScript est trop long
  • Évitez les Ă©normes charges utiles du rĂ©seau

Si Lighthouse signale ces problĂšmes parce que la page utilise un bundle JS trop volumineux, la toute premiĂšre chose Ă  considĂ©rer comme moyen de rĂ©soudre le problĂšme est de fractionner le bundle. Le fait est que si le code peut ĂȘtre divisĂ© en fragments, dont certains ne sont nĂ©cessaires que pour travailler avec certaines pages du site, nous n'avons aucune raison de ne pas saisir cette opportunitĂ©.

▍ SĂ©paration des faisceaux JS


Une façon de diviser le code en parties consiste à utiliser les importations dynamiques:

   import('lodash.sortby')   .then(module => module.default)   .then(module => doSomethingCool(module)) 

La syntaxe d'importation peut ressembler à un appel de fonction, mais elle vous permet d'importer n'importe quel module de maniÚre asynchrone à l'aide du mécanisme de promesses. Dans cet exemple, la méthode sortby est d'abord importée de la bibliothÚque lodash , puis la méthode doSomethingCool() est doSomethingCool() .


Demande de tri des numéros

Dans cet exemple, les événements suivants se produisent:

  1. L'utilisateur clique sur un bouton pour trier les trois nombres.
  2. lodash.sortby importé.
  3. La mĂ©thode doSomethingCool() est doSomethingCool() , qui trie les nombres et les affiche dans le nouveau nƓud DOM.

Il s'agit d'un exemple artificiel extrĂȘmement simple, car si quelqu'un a besoin de trier des nombres sur une page Web, il utilisera probablement la mĂ©thode Array.prototype.sort() . , , .

, JavaScript TC39. Chrome Safari , Webpack , Rollup Parcel .
React, , . — React.lazy :

 import React, { lazy } from 'react'; const AvatarComponent = lazy(() => import('./AvatarComponent')); 

, , , . Suspense , , «» . React.lazy , , , :

 import React, { lazy, Suspense } from 'react'; import LoadingComponent from './LoadingComponent'; const AvatarComponent = lazy(() => import('./AvatarComponent')); const PageComponent = () => ( <Suspense fallback={LoadingComponent}>   <SomeComponent /> </Suspense> ) 

Suspense . React-, , , , React, loadable-components .

 import React from 'react'; import loadable from '@loadable/component' import LoadingComponent from './LoadingComponent'; const AvatarComponent = loadable(() => import('./AvatarComponent'), {   LoadingComponent: () => LoadingComponent }); 

LoadingComponent loadable-component .

, , loadable-components , - .

, . , , . React , React Suspense .

▍ , ?


, react-loadable-visibility , loadable-components -API Intersection Observer. , .

 import React from 'react'; import loadableVisibility from 'react-loadable-visibility/loadable-components' const AvatarComponent = loadableVisibility(() => import('./AvatarComponent'), { LoadingComponent: Loading, }) 

▍ ,


- — -, . - , , . , , , -, -, , .





Workbox
— , -, . CRA 2.0 , , src/index.js . - .

   import React from 'react'; //... //   ,          //    ,     // unregister()  register().    ,     - //    . //     : http://bit.ly/CRA-PWA serviceWorker.unregister(); 

- Workbox .

▍


- HTML-, , , . , , , , , JS-, .

, , DOM-, , , (, hydrate() React). , , , , .

React 16, . renderToString() HTML-, renderToNodeStream() Readable- Node.

HTML- , . , , .

React , , , renderToStaticNodeStream .

▍ ,


- , , , , - , , . , , .

, , , . HTML- , .

, react-snap , Puppeteer .

, .

▍ , CSS-in-JS


React-, , CSS-in-JS- emotion styled-components . , , , , , . CSS-in-JS , , , . , , JavaScript- , , . , , , .


, ( )

- , . emotion styled-components . Readable- Node. Glamor , .

, .


Preact-, ( )

, CSS-in-JS — , , , , , astroturf . , , , , .

▍


«», , . , , .

, Lighthouse. , React-, React A11y .

, react-axe , , JSX-.

▍


? -, , ? , ?

, - . «» . , — , .

create-react-app -:

 { "short_name": "React App", "name": "Create React App Sample", "icons": [   {     "src": "favicon.ico",     "sizes": "64x64 32x32 24x24 16x16",     "type": "image/x-icon"   } ], "start_url": ".", "display": "standalone", "theme_color": "#000000", "background_color": "#ffffff" } 


, . , , . — . Pourquoi en est-il ainsi? , , .

▍Atomic CSS


CSS- (Atomic CSS) , . , , :

 <button class="bg-blue">Click Me</button> 

padding :

 <button class="bg-blue pa2">Click Me</button> 

Et ainsi de suite. class DOM, , , CSS-, . , . Tachyons .

. tachyon-components API, API styled-components :

 import styled from 'tachyons-components' const Button = styled('button')` bg-blue pa2 ` <Button>Click Me</Button> 

, , CSS- «» , CSS-, , .

▍


, , . — :

 import { useState } from 'react'; function AvatarComponent() { const [name, setName] = useState('Houssein'); return (   <React.Fragment>     <div>       <p>This is a picture of {name}</p>       <img align="center" src="avatar.png" />     </div>     <button onClick={() => setName('a banana')}>       Fix name     </button>   </React.Fragment> ); } 

:


, . , , recompose .

React Conf, .

, , JavaScript- . , React , 1.5 ( ). , - , , , , , , , .

Résumé


, React-. , , :

  1. , :

    • Performance Chrome.
    • React.


    • , , shouldComponentUpdate() .
    • , , PureComponent .
    • React.memo .
    • Redux (, reselect ).
    • (, react-window ).
  2. Lighthouse.
  3. , :

    • — React.lazy .
    • — loadable-components .
    • - , . Workbox .
    • — ( renderToNodeStream renderToStaticNodeStream ).
    • ? react-snap .
    • , CSS-in-JS.
    • , . React A11y react-axe .
    • - , , , .

, React, , :

  • API, , .
  • , , , .

« » . -, .

Chers lecteurs! React-?

Source: https://habr.com/ru/post/fr442650/


All Articles