Utiliser Babel et Webpack pour configurer un projet React à partir de zéro

De nombreux outils sont disponibles pour préparer l'environnement au développement de React. Par exemple, notre didacticiel React utilise l'outil create-react-app pour créer un projet de modèle contenant tout ce dont vous avez besoin pour développer des applications React. L'auteur de l'article, dont nous publions la traduction aujourd'hui, souhaite expliquer comment configurer indépendamment l'environnement pour développer des projets React à l'aide de Babel et Webpack. Ces outils sont également utilisés dans les projets créés à l'aide des outils create-react-app, et nous pensons que toute personne qui étudie le développement de React sera intéressée à les connaître et à la méthodologie pour créer des projets React à un niveau plus profond. À savoir, nous parlerons de la configuration de Webpack pour que cet outil utilise Babel pour compiler du code JSX en code JavaScript et de la configuration du serveur utilisé pour développer des projets React.



Webpack


Webpack est utilisé pour compiler des modules JavaScript. Cet outil est souvent appelé «bundler» (du bundler) ou «module builder». Après l'avoir installé , vous pouvez l'utiliser avec l'interface de ligne de commande ou son API . Si vous n'êtes pas familier avec Webpack, il est recommandé de lire les principes de base de son fonctionnement et de voir sa comparaison avec d'autres constructeurs de modules. Voici à quoi ressemble à un niveau élevé Webpack.


Travail de Webpack

Webpack prend tout ce dont le projet dépend et le convertit en ressources statiques qui peuvent être transférées au client. L'empaquetage des applications est très important, car la plupart des navigateurs limitent la possibilité de télécharger des ressources simultanément. De plus, il vous permet d'économiser du trafic en n'envoyant au client que ce dont il a besoin. En particulier, Webpack utilise un cache interne, grâce auquel les modules ne sont téléchargés qu'une seule fois sur le client, ce qui conduit finalement à un chargement plus rapide des sites.

Babel


Babel est un transpilateur, qui est principalement utilisé pour convertir les constructions adoptées dans les versions récentes de la norme ECMAScript en un format compréhensible à la fois pour les navigateurs modernes et non pour les derniers navigateurs et autres environnements dans lesquels JavaScript peut s'exécuter. Babel, en plus, peut convertir en code JavaScript et JSX en utilisant @ babel / preset-react .


Babel

Grâce à Babel, nous pouvons, lors du développement d'applications React, utiliser JSX. Par exemple, voici le code qui utilise JSX:

import React from "react"; function App(){ return(  <div>     <b>Hello world!</b>  </div> ) } export default App; 

Un tel code semble soigné, il est clair, il est facile à lire et à modifier. En le regardant, vous pouvez immédiatement comprendre qu'il décrit un composant qui renvoie un élément <div> qui contient le texte Hello world! en gras. Et voici un exemple de code faisant la même chose dans laquelle JSX n'est pas utilisé:

 "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = require("react"); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function App(props) { return _react2.default.createElement(   "div",   null,   _react2.default.createElement(     "b",     null,     "Hello world!"   ) ); } exports.default = App; 

Les avantages du premier exemple par rapport au second sont évidents.

Prérequis


Afin de mettre en place un projet d'application React, nous aurons besoin des modules npm suivants.

  • react - Bibliothèque React.
  • react-dom est une bibliothèque qui nous aidera à utiliser les capacités de React dans le navigateur.
  • babel / core - transpilation JSX en JS.
  • babel / preset-env - crée un code adapté aux navigateurs plus anciens.
  • babel / preset-react - configure le transpilateur pour qu'il fonctionne avec le code React.
  • babel-loader - configure Webpack pour fonctionner avec Babel.
  • css-loader - configuration de Webpack pour travailler avec CSS.
  • webpack - assemblage de modules.
  • webpack-cli - travaillez avec Webpack depuis la ligne de commande.
  • style-loader - chargement de tout le code CSS utilisé dans l'en-tête du fichier HTML.
  • webpack-dev-server - configuration d'un serveur de développement.

Créez maintenant, dans le dossier react-scratch , un nouveau projet en utilisant npm ( npm init ) et installez certains des packages ci-dessus avec la commande suivante:

 npm install --save-dev @babel/core @babel/preset-env @babel/preset-react babel-loader css-loader webpack webpack-cli style-loader webpack-dev-server 

Le point d'entrée du programme sera le fichier index.js , qui est contenu dans le dossier src situé dans le répertoire racine du projet. La structure de ce projet est présentée ci-dessous. Certains fichiers et dossiers sont créés automatiquement, vous devrez en créer vous-même.


Structure du projet

Le projet terminé, que nous traiterons ici, se trouve dans ce référentiel.

Le dossier des component contiendra les composants du projet (dans notre cas, il n'y a qu'un seul composant ici). Dans le dossier dist , dans le fichier main.js , le code compilé sera localisé, et index.html est, comme déjà mentionné, le fichier HTML principal de notre application.

Configuration du Webpack


Webpack peut être configuré de plusieurs façons. En particulier, les paramètres de cet outil peuvent prendre la forme d'arguments de ligne de commande ou être présents dans le projet sous forme de fichier de configuration avec le nom webpack.config.js . Dans ce document, vous devez décrire et exporter l'objet contenant les paramètres. Nous allons commencer à configurer ce fichier avec une description de l'objet qui ressemble à ceci (nous le considérerons en partie, et ci-dessous nous donnerons son code complet):

 { entry: "./src/index.js", mode: "development", output: {   filename: "./main.js" }, } 

La propriété d' entry définit le fichier principal avec le code source du projet. La valeur de la propriété mode indique le type d'environnement à compiler (dans notre cas, c'est l'environnement de development ) et où placer le fichier compilé.

Travail de projet


Placez le code suivant dans le fichier index.html de notre projet, situé dans le dossier dist :

 <!DOCTYPE html> <html lang="en" dir="ltr"> <head>   <meta charset="utf-8">   <title>React From Scratch</title> </head> <body>   <div id="root">   </div> </body> <script type="text/javascript" src="main.js"> </script> </html> 

Faites attention à la balise de script présente dans ce fichier. Il pointe vers le fichier main.js , qui sera obtenu lors de la compilation du projet. Nous utiliserons l'élément <div> avec l'identifiant root pour afficher l'application React.

Installez maintenant les packages react et react-dom:

 npm install react react-dom 

Ajoutez le code suivant à index.js :

 import React, { Component } from "react"; import ReactDOM from "react-dom"; import App from "./component/app.component"; ReactDOM.render(<App />, document.querySelector("#root")); 

Il s'agit du code standard pour ces fichiers d'application React. Ici, nous connectons les bibliothèques, connectons le fichier de composant et affichons l'application dans la <div> avec l'identifiant root .

Voici le code du fichier app.component.js :

 import React, { Component } from "react"; import s from "./app.component.css"; class MyComponent extends Component { render() {   return <div className={s.intro}>Hello World</div>; } } export default MyComponent; 

Voici le code du fichier app.component.css :

 .intro { background-color: yellow; } 

Configurer Babel


Babel est un transporteur à fort potentiel. Il peut notamment convertir MOINS en CSS, JSX en JS, TypeScript en JS. Nous n'utiliserons que deux configurations avec elle - react et env (elles sont aussi appelées "presets"). Babel peut être configuré de différentes manières, en particulier, nous parlons d'outils de ligne de commande, d'un fichier de paramètres spéciaux et du fichier package.json standard. Nous sommes satisfaits de la dernière option. Ajoutez la section suivante à package.json :

 "babel": {   "presets": [     "@babel/env",     "@babel/react"   ] } 

Grâce à ces paramètres, Babel saura quels préréglages il doit utiliser. Configurez maintenant Webpack pour utiliser Babel.

Configurer Webpack pour fonctionner avec Babel


Ici, nous utiliserons la bibliothèque babel-loader, qui vous permet d'utiliser Babel avec Webpack. En fait, le fait est que Babel pourra intercepter et traiter des fichiers avant qu'ils ne soient traités par Webpack.

Fichiers JS


Voici les règles concernant l'utilisation des fichiers JS (ce code ira dans le fichier webpack.config.js ), elles représentent l'une des propriétés de l'objet paramètres exporté par ce fichier:

 module: {   rules: [     {       test: /\.m?js$/,       exclude: /(node_modules|bower_components)/,       use: {         loader: "babel-loader"       }     },   ] } 

Un tableau de règles est stocké dans la propriété rules de l'objet représenté ici, selon lequel le fichier spécifié par l'expression régulière décrite dans la propriété test doit être traité. Dans ce cas, la règle sera appliquée à tous les fichiers avec les extensions .m et .js , alors que nous ne voulons pas node_modules fichiers du dossier node_modules et bower_components . De plus, ici, nous indiquons que nous voulons utiliser babel-loader. Après cela, nos fichiers JS seront d'abord traités par Babel, puis emballés à l'aide de Webpack.

Fichiers filesCSS


Ajoutez les paramètres de traitement des fichiers CSS au tableau de rules de l'objet module :

 module: {   rules: [     {       test: /\.m?js$/,       exclude: /(node_modules|bower_components)/,       use: {         loader: "babel-loader"       }     },     {       test: /\.css$/,       use: [         "style-loader",         {           loader: "css-loader",           options: {             modules: true           }         }       ]     },  ] } 

Nous allons résoudre la tâche de traitement des fichiers CSS à l'aide de style-loader et css-loader. La propriété use peut accepter un tableau d'objets ou de chaînes. Les chargeurs sont appelés, à partir du dernier, donc nos fichiers seront traités en premier avec css-loader. Nous avons configuré cet outil en écrivant true dans la propriété modules de l'objet options . Grâce à cela, les styles CSS ne seront appliqués qu'aux composants dans lesquels ils sont importés. Css-loader autorisera les commandes d'importation dans les fichiers CSS, après quoi le style-loader ajoutera ce qu'il se présente sous la forme d'une balise de style dans la section <head> de la page:

 <style> <--  css --> </style> 

▍Ressources statiques


Nous continuerons à travailler sur l'objet de paramètres du module , décrivant les règles de traitement des ressources statiques qu'il contient:

 module: {   rules: [     {       test: /\.m?js$/,       exclude: /(node_modules|bower_components)/,       use: {         loader: "babel-loader"       }     },     {       test: /\.css$/,       use: [         "style-loader",         {           loader: "css-loader",           options: {             modules: true           }         }       ]     },     {       test: /\.(png|svg|jpg|gif)$/,       use: ["file-loader"]     }   ] } 

Si le système rencontre un fichier avec l'extension PNG, SVG, JPG ou GIF, le chargeur de fichiers sera utilisé pour traiter un tel fichier. Le traitement de ces fichiers est important pour la bonne préparation et l'optimisation du projet.

Configuration d'un serveur de développement


Maintenant, dans le fichier webpack.config.js , configurez le serveur de développement:

 devServer: {   contentBase: path.join(__dirname, "dist"),   compress: true,   port: 9000,   watchContentBase: true,   progress: true }, 

La propriété contentBase devServer paramètres contentBase pointe vers le dossier dans lequel se trouvent nos ressources et le fichier index.html . La propriété port vous permet de spécifier le port sur lequel le serveur écoutera. La propriété watchContentBase permet de surveiller les modifications des fichiers dans le dossier spécifié par la propriété contentBase .

Voici le code complet du fichier webpack.config.js :

 const path = require("path"); module.exports = { entry: "./src/index.js", mode: "development", output: {   filename: "./main.js" }, devServer: {   contentBase: path.join(__dirname, "dist"),   compress: true,   port: 9000,   watchContentBase: true,   progress: true }, module: {   rules: [     {       test: /\.m?js$/,       exclude: /(node_modules|bower_components)/,       use: {         loader: "babel-loader"       }     },     {       test: /\.css$/,       use: [         "style-loader",         {           loader: "css-loader",           options: {             modules: true           }         }       ]     },     {       test: /\.(png|svg|jpg|gif)$/,       use: ["file-loader"]     }   ] } }; 

Nous allons maintenant ajouter au package.json , dans la section scripts , la commande pour démarrer le serveur de développement et la commande pour commencer à construire le projet:

 "scripts": {   "dev": "webpack-dev-server",   "start": "webpack" }, 

Maintenant, tout est prêt pour démarrer le serveur de développement avec la commande suivante:

 npm run dev 

Si vous allez maintenant à l'adresse http: // localhost: 9000 , vous pouvez voir la page de notre projet.


Page de projet dans le navigateur

Afin de construire un projet, utilisez la commande suivante:

 npm run start 

Après cela, vous pouvez ouvrir le fichier index.html dans un navigateur et voir la même chose que vous pouvez voir en démarrant le serveur de développement et en allant à l'adresse http: // localhost: 9000 .

Résumé


Cet article fournit une vue d'ensemble de la configuration de Webpack et Babel pour une utilisation dans les projets React. En fait, des configurations beaucoup plus complexes peuvent être créées sur la base que nous avons démontée aujourd'hui. Par exemple, au lieu de CSS, vous pouvez utiliser MOINS, au lieu de JS normal, écrire en TypeScript. Si nécessaire, vous pouvez, par exemple, configurer la minification des fichiers et bien plus encore. Bien sûr, si aujourd'hui votre première connaissance du processus d'auto-réglage des projets React a eu lieu, vous pouvez penser que tout cela est très difficile et beaucoup plus facile à utiliser le modèle prêt à l'emploi. Cependant, après avoir compris un peu, vous vous rendrez compte qu'une légère augmentation de la complexité des paramètres vous donne plus de liberté, vous permettant de personnaliser vos projets exactement comme vous en avez besoin, sans dépendre complètement de certaines solutions «standard» et réduire votre dépendance à eux.

Chers lecteurs! Quelle approche utilisez-vous le plus souvent lors de la préparation de votre environnement de travail pour les projets React?

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


All Articles