Usando Babel e Webpack para configurar um projeto React do zero

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 Webpack

O 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.


Babel

Graç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 projeto

O 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 navegador

Para 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?

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


All Articles