Existem muitas ferramentas disponíveis para preparar o ambiente para o desenvolvimento do React. Por exemplo, nosso 
tutorial React usa a ferramenta 
create-react-app para criar um projeto de modelo que contém tudo o que você precisa para desenvolver aplicativos React. O autor do artigo, cuja tradução estamos publicando hoje, quer falar sobre como configurar independentemente o ambiente para desenvolver projetos React usando Babel e Webpack. Essas ferramentas também são usadas em projetos criados usando as ferramentas create-react-app, e acreditamos que quem estuda o desenvolvimento do React estará interessado em conhecê-los e com a metodologia para criar projetos do React em um nível mais profundo. Nomeadamente, falaremos sobre como configurar o Webpack para que essa ferramenta use o Babel para compilar o código JSX no código JavaScript e como configurar o servidor usado para desenvolver projetos React.

Webpack
O Webpack é usado para compilar módulos JavaScript. Essa ferramenta costuma ser chamada de "empacotador" (do empacotador) ou "construtor de módulos". Após a 
instalação , você pode trabalhar com ele usando 
a interface da linha de comandos ou sua 
API . Se você não estiver familiarizado com o Webpack, é recomendável que você leia sobre os 
princípios básicos de sua operação e veja sua 
comparação com outros construtores de módulos. Aqui está o que, em alto nível, é o que o Webpack faz.
Trabalho no WebpackO Webpack pega tudo o que o projeto depende e o converte em recursos estáticos que podem ser transferidos para o cliente. O empacotamento de aplicativos é muito importante, pois a maioria dos navegadores limita a capacidade de baixar recursos simultaneamente. Além disso, permite economizar tráfego enviando ao cliente apenas o que ele precisa. Em particular, o Webpack usa um cache interno, devido ao qual os módulos são baixados para o cliente apenas uma vez, o que, como resultado, leva a um carregamento mais rápido dos sites.
Babel
O Babel é um transpiler, usado principalmente para converter construções adotadas nas versões recentes do padrão ECMAScript em um formato que seja compreensível para os navegadores modernos e não os mais recentes e outros ambientes nos quais o JavaScript possa ser executado. Além disso, o Babel pode converter em código JavaScript e JSX usando 
@ babel / preset- react.
BabelGraças a Babel, ao desenvolver aplicativos React, podemos usar JSX. Por exemplo, aqui está o código que usa JSX:
import React from "react"; function App(){ return(  <div>     <b>Hello world!</b>  </div> ) } export default App; 
Esse código parece limpo, é claro, é fácil de ler e editar. Olhando para ele, você pode entender imediatamente que ele descreve um componente que retorna um elemento 
<div> que contém o texto 
Hello world! em negrito. E aqui está um exemplo de código fazendo a mesma coisa em que o JSX não é usado:
 "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; 
As vantagens do primeiro exemplo sobre o segundo são óbvias.
Pré-requisitos
Para configurar um projeto de aplicativo React, precisaremos dos seguintes módulos npm.
- react - Reage a biblioteca.
- O react-dom é uma biblioteca que nos ajudará a usar os recursos do React no navegador.
- babel / core - transpilação JSX em JS.
- babel / preset-env - cria código adequado para navegadores mais antigos.
- babel / preset-react - configure o transpiler para funcionar com o código React.
- babel-loader - configure o Webpack para funcionar com o Babel.
- css-loader - configurando o Webpack para trabalhar com CSS.
- webpack - montagem de módulos.
- webpack-cli - trabalhe com o Webpack na linha de comando.
- style-loader - carregando todo o código CSS usado no cabeçalho do arquivo HTML.
- webpack-dev-server - configurando um servidor de desenvolvimento.
Agora crie, na pasta react 
react-scratch , um novo projeto usando o npm ( 
npm init ) e instale alguns dos pacotes acima com o seguinte comando:
 npm install --save-dev @babel/core @babel/preset-env @babel/preset-react babel-loader css-loader webpack webpack-cli style-loader webpack-dev-server 
O ponto de entrada para o programa será o arquivo 
index.js , que está contido na pasta 
src localizada no diretório raiz do projeto. A estrutura deste projeto é mostrada abaixo. Alguns arquivos e pastas são criados automaticamente, outros você precisará criar por conta própria.
Estrutura do projetoO projeto final, com o qual trataremos aqui, pode ser encontrado 
neste repositório.
A pasta do 
component conterá os componentes do projeto (no nosso caso, existe apenas um componente aqui). Na pasta 
dist , no arquivo 
main.js , o código compilado será localizado e 
index.html é, como já mencionado, o principal arquivo HTML do nosso aplicativo.
Configuração do Webpack
O Webpack pode ser configurado de várias maneiras. Em particular, as configurações dessa ferramenta podem assumir a forma de argumentos de linha de comando ou estar presentes no projeto como um arquivo de configuração com o nome 
webpack.config.js . Nele, você precisa descrever e exportar o objeto que contém as configurações. Começaremos a configurar este arquivo com uma descrição do objeto que se parece com isso (vamos considerá-lo em partes, e abaixo forneceremos seu código completo):
 { entry: "./src/index.js", mode: "development", output: {   filename: "./main.js" }, } 
A propriedade 
entry define o arquivo principal com o código fonte do projeto. O valor da propriedade 
mode indica o tipo de ambiente a ser compilado (no nosso caso, este é o ambiente de 
development ) e onde colocar o arquivo compilado.
Trabalho de projeto
Coloque o seguinte código no arquivo 
index.html do nosso projeto, localizado na pasta 
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> 
Preste atenção na tag de 
script presente neste arquivo. Aponta para o arquivo 
main.js , que será obtido durante a compilação do projeto. Usaremos o elemento 
<div> com o identificador 
root para exibir o aplicativo React.
Agora instale os pacotes react e react-dom:
 npm install react react-dom 
Adicione o seguinte código ao 
index.js :
 import React, { Component } from "react"; import ReactDOM from "react-dom"; import App from "./component/app.component"; ReactDOM.render(<App />, document.querySelector("#root")); 
Este é o código padrão para esses arquivos de aplicativos React. Aqui, conectamos as bibliotecas, conectamos o arquivo do componente e exibimos o aplicativo na 
<div> com o identificador 
root .
Aqui está o código para o arquivo 
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; 
Aqui está o código para o arquivo 
app.component.css :
 .intro { background-color: yellow; } 
Configurar Babel
Babel é um transportador com grande potencial. Em particular, ele pode converter MENOS em CSS, JSX em JS, TypeScript em JS. Usaremos apenas duas configurações com ele - react e env (elas também são chamadas de "presets"). O Babel pode ser configurado de diferentes maneiras, em particular, estamos falando sobre ferramentas de linha de comando, sobre um arquivo de configurações especiais, sobre o arquivo 
package.json padrão. Estamos satisfeitos com a última opção. Adicione a seguinte seção ao 
package.json :
 "babel": {   "presets": [     "@babel/env",     "@babel/react"   ] } 
Graças a essas configurações, Babel saberá quais predefinições ele precisa usar. Agora configure o Webpack para usar o Babel.
Configurando o Webpack para trabalhar com Babel
Aqui usaremos a biblioteca babel-loader, que permite usar o Babel com o Webpack. De fato, o ponto é que o Babel poderá interceptar e processar arquivos antes de serem processados pelo Webpack.
Arquivos SJS
Aqui estão as regras para trabalhar com arquivos JS (esse código irá para o arquivo 
webpack.config.js ), eles representam uma das propriedades do objeto de configurações exportado por este arquivo:
 module: {   rules: [     {       test: /\.m?js$/,       exclude: /(node_modules|bower_components)/,       use: {         loader: "babel-loader"       }     },   ] } 
Uma matriz de regras é armazenada na propriedade de regras do objeto representado aqui, segundo a qual o arquivo especificado pela expressão regular descrita na propriedade de 
test deve ser processado. Nesse caso, a regra será aplicada a todos os arquivos com as extensões 
.m e 
.js , e não queremos 
node_modules arquivos da pasta 
node_modules e 
bower_components . Além disso, aqui indicamos que queremos usar o babel-loader. Depois disso, nossos arquivos JS serão processados por Babel primeiro e depois empacotados usando o Webpack.
▍ arquivos CSS
Inclua as configurações para processar arquivos CSS na matriz de 
rules do objeto do 
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           }         }       ]     },  ] } 
Nós resolveremos a tarefa de processar arquivos CSS usando o style-loader e o css-loader. A propriedade 
use pode aceitar uma matriz de objetos ou seqüências de caracteres. Os carregadores são chamados, começando pelo último, para que nossos arquivos sejam processados primeiro com o css-loader. Configuramos essa ferramenta escrevendo 
true na propriedade 
modules do objeto 
options . Graças a isso, os estilos CSS serão aplicados apenas aos componentes para os quais são importados. O Css-loader permitirá comandos de importação em arquivos CSS, após o qual o style-loader adicionará o que é mostrado na forma de uma marca de 
style na seção 
<head> da página:
 <style> <--  css --> </style> 
ResourcesRecursos estáticos
Continuaremos trabalhando no objeto de configurações do 
module , descrevendo as regras para o processamento de recursos estáticos:
 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"]     }   ] } 
Se o sistema encontrar um arquivo com a extensão PNG, SVG, JPG ou GIF, o carregador de arquivos será usado para processar esse arquivo. O processamento desses arquivos é importante para a preparação e otimização adequadas do projeto.
Configurando um Servidor de Desenvolvimento
Agora, no arquivo 
webpack.config.js , configure o servidor de desenvolvimento:
 devServer: {   contentBase: path.join(__dirname, "dist"),   compress: true,   port: 9000,   watchContentBase: true,   progress: true }, 
A propriedade 
contentBase devServer configurações 
contentBase aponta para a pasta na qual nossos recursos e o arquivo 
index.html estão localizados. A propriedade 
port permite especificar a porta na qual o servidor escutará. A propriedade 
watchContentBase permite monitorar alterações nos arquivos na pasta especificada pela propriedade 
contentBase .
Aqui está o código completo do arquivo 
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"]     }   ] } }; 
Agora adicionaremos ao 
package.json , na seção 
scripts , o comando para iniciar o servidor de desenvolvimento e o comando para começar a compilar o projeto:
 "scripts": {   "dev": "webpack-dev-server",   "start": "webpack" }, 
Agora tudo está pronto para iniciar o servidor de desenvolvimento com o seguinte comando:
 npm run dev 
Se você agora acessar o endereço 
http: // localhost: 9000 , poderá ver a página do nosso projeto.
Página do projeto no navegadorPara criar um projeto, use o seguinte comando:
 npm run start 
Depois disso, você pode abrir o arquivo 
index.html em um navegador e ver a mesma coisa que pôde ver iniciando o servidor de desenvolvimento e acessando o endereço 
http: // localhost: 9000 .
Sumário
Este artigo fornece uma visão geral da configuração do Webpack e do Babel para uso em projetos React. De fato, configurações muito mais complexas podem ser criadas na base que separamos hoje. Por exemplo, em vez de CSS, você pode usar LESS, em vez de JS comum, escrever no TypeScript. Se necessário, você pode, por exemplo, configurar a minificação de arquivos e muito mais. Certamente, se hoje ocorreu seu primeiro conhecimento do processo de autoajuste de projetos React, você pode pensar que tudo isso é muito difícil e muito mais fácil de usar o modelo pronto. No entanto, depois de descobrir um pouco, você perceberá que um pequeno aumento na complexidade das configurações oferece mais liberdade, permitindo que você personalize seus projetos da maneira que você precisar, sem depender completamente de algumas soluções "padrão" e reduzindo sua dependência de eles.
Caros leitores! Que abordagem você costuma usar ao preparar seu ambiente de trabalho para projetos React?