Configuração Essencial do Webpack para Empacotamento de Módulos em React

Neste guia, abordaremos a configuração de um ambiente de desenvolvimento com Webpack projetos que utilizam React. O foco está em estabelecer uma base sólida com loaders, plugins e ajustes essenciais.

Instalação das Dependências Necessárias

Primeiro, instale o core do Webpack e a interface de linha de comando como dependências de desenvolvimento:

npm install --save-dev webpack webpack-cli

Em seguida, adicione loaders para processar diferentes tipos de arquivos. Para estilos (CSS e SCSS):

npm install --save-dev style-loader css-loader sass-loader postcss-loader

Para transpilação de JavaScript e JSX, incluindo presets específicos para React:

npm install --save-dev babel-loader @babel/core @babel/preset-env @babel/preset-react

Para manipulação de imagens e ativos, use loaders otimizados:

npm install --save-dev file-loader url-loader

Configuração de Plugins Fundamentais

Instale plugins para gerar HTML de saída e limpar a pasta de distribuição durante as compilações:

npm install --save-dev html-webpack-plugin clean-webpack-plugin

Para adicionar automaticamente prefixos CSS para compatibilidade entre navegadores, inclua o Autoprefixer:

npm install --save-dev autoprefixer

Ambientes de Desenvolvimento e Produção

Para o servidor de desenvolvimento, que permite hot-reloading:

npm install --save-dev webpack-dev-server

Em produção, é crucial extrair CSS para arquivos separados, evitando mistura com JavaScript:

npm install --save-dev extract-text-webpack-plugin@next

Para mesclar configurações comuns entre ambientes, utilize o webpack-merge:

npm install --save-dev webpack-merge

Arquivos de Configuração Específicos

O arquivo .babelrc define alvos de compatibilidade do navegador. Um exemplo configura para as últimas duas versões:

{
  "presets": [
    ["@babel/preset-env", {
      "targets": {
        "browsers": ["last 2 versions"]
      }
    }]
  ]
}

O postcss.config.js integra o Autoprefixer com regras de compatibilidade:

module.exports = {
  plugins: [
    require('autoprefixer')({
      overrideBrowserslist: [
        '> 1%',
        'last 2 versions',
        'not dead'
      ]
    })
  ]
};

Arquivo de Configuração Base do Webpack

Um arquivo webpack.base.conf.js contém configurações compartilhadas. Note a estrutura modificada e nomes de variáveis alterados:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

const DIRECTORIES = {
  source: path.resolve(__dirname, '../src/index.js'),
  output: path.resolve(__dirname, '../dist')
};

module.exports = {
  entry: {
    main: DIRECTORIES.source
  },
  output: {
    filename: process.env.NODE_ENV === 'development' ? '[name].[contenthash:8].js' : 'assets/js/[name].[contenthash:8].js',
    path: DIRECTORIES.output,
    publicPath: '/'
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './public/template.html',
      inject: true
    }),
    new CleanWebpackPlugin({
      cleanStaleWebpackAssets: true
    })
  ],
  resolve: {
    extensions: ['.js', '.jsx', '.json'],
    alias: {
      '@components': path.resolve(__dirname, '../src/components')
    }
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            cacheDirectory: true
          }
        }
      },
      {
        test: /\.(png|jpe?g|gif|webp)$/,
        type: 'asset',
        parser: {
          dataUrlCondition: {
            maxSize: 8 * 1024
          }
        },
        generator: {
          filename: 'images/[hash:8][ext][query]'
        }
      },
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/,
        type: 'asset/resource',
        generator: {
          filename: 'fonts/[hash:8][ext][query]'
        }
      }
    ]
  }
};

Após configurar, execute o comando de build para gerar a saída otimizada.

Tags: webpack React babel postcss loaders

Publicado em 6-13 19:59 por Thomas