DevTools

Cheatsheet Webpack

Module bundler para aplicações JavaScript modernas

Voltar às linguagens
Webpack
22 cards encontrados
Categorias:
Versões:

Configuração


4 cards
Config básico
module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.[contenthash].js',
  },
  mode: 'production',
};

Estrutura mínima.

Entry e Output
entry: {
  app: './src/app.js',
  vendor: './src/vendor.js',
},
output: {
  filename: '[name].[contenthash].js',
  clean: true,
}

Múltiplos pontos de entrada.

Resolve e aliases
resolve: {
  extensions: ['.js', '.jsx', '.ts'],
  alias: {
    '@': path.resolve(__dirname, 'src'),
    'components': './src/components',
  },
}

Resolução de módulos.

Source maps
devtool: 'source-map'      # completo
devtool: 'eval-source-map' # dev rápido
devtool: 'cheap-module-source-map'
devtool: false            # produção

Opções de source maps.

Loaders


4 cards
Estrutura de rules
module: {
  rules: [
    {
      test: /\.css$/,
      use: ['style-loader', 'css-loader'],
    },
  ],
}

Definir loaders.

Babel (JS/JSX)
{
  test: /\.(js|jsx)$/,
  exclude: /node_modules/,
  use: {
    loader: 'babel-loader',
    options: { presets: ['@babel/preset-env'] }
  },
}

Transpilar JavaScript.

CSS / SASS
// CSS
use: ['style-loader', 'css-loader']

// SASS
use: ['style-loader', 'css-loader',
  'sass-loader']

// Extrair para ficheiro
use: [MiniCssExtractPlugin.loader,
  'css-loader']

Processar estilos.

Assets (imagens/fonts)
{
  test: /\.(png|svg|jpg|gif)$/,
  type: 'asset',
  parser: {
    dataUrlCondition: {
      maxSize: 8 * 1024
    }
  }
}

Asset modules (Webpack 5).

Plugins


4 cards
HtmlWebpackPlugin
new HtmlWebpackPlugin({
  template: './src/index.html',
  title: 'Minha App',
  minify: { collapseWhitespace: true },
})

Gerar HTML com bundles.

MiniCssExtractPlugin
new MiniCssExtractPlugin({
  filename: 'css/[name].[contenthash].css',
})

Extrair CSS para ficheiros.

DefinePlugin
new webpack.DefinePlugin({
  'process.env.API_URL':
    JSON.stringify(process.env.API_URL),
  __DEV__: JSON.stringify(true),
})

Variáveis em tempo de compilação.

CopyPlugin e Clean
new CopyPlugin({
  patterns: [
    { from: 'public', to: '' }
  ],
})

output: { clean: true }

Copiar assets estáticos.

Dev Server


3 cards
Config devServer
devServer: {
  port: 3000,
  hot: true,
  open: true,
  historyApiFallback: true,
  proxy: [{
    context: ['/api'],
    target: 'http://localhost:8080',
  }],
}

Servidor de desenvolvimento.

HMR (Hot Module)
devServer: { hot: true }

// No código:
if (module.hot) {
  module.hot.accept('./app', () => {
    render();
  });
}

Atualização sem reload.

Scripts npm
"scripts": {
  "dev": "webpack serve --mode development",
  "build": "webpack --mode production",
  "watch": "webpack --watch",
  "analyze": "webpack --profile --json > stats.json"
}

Scripts de execução.

Otimização


4 cards
Code splitting
optimization: {
  splitChunks: {
    chunks: 'all',
    cacheGroups: {
      vendor: {
        test: /[\/]node_modules[\/]/,
        name: 'vendors',
      }
    }
  }
}

Dividir bundles.

Dynamic imports
// Lazy loading de rotas
const Page = React.lazy(
  () => import('./pages/Home')
);

// webpackChunkName
import(/* webpackChunkName: "admin" */
  './Admin');

Import dinâmico.

Minificação
optimization: {
  minimize: true,
  minimizer: [
    new TerserPlugin(),
    new CssMinimizerPlugin(),
  ],
}

Minificar JS e CSS.

Tree shaking
// package.json do módulo:
"sideEffects": false

// ou específico:
"sideEffects": ["*.css"]

// mode: 'production' ativa automaticamente

Remover código não usado.

CLI


3 cards
Comandos básicos
npx webpack           # build
npx webpack serve      # dev server
npx webpack --watch   # watch mode
npx webpack --config webpack.prod.js

Executar webpack.

Flags úteis
--mode production
--mode development
--entry ./src/main.js
--output-path ./build
--stats verbose
--progress

Opções de linha de comandos.

Análise de bundle
npm i -D webpack-bundle-analyzer

new BundleAnalyzerPlugin()

// ou:
npx webpack --profile --json > stats.json
npx webpack-bundle-analyzer stats.json

Visualizar tamanho do bundle.