DevTools

Cheatsheet Webpack

Module bundler para aplicações JavaScript modernas

Volver a los lenguajes
Webpack
22 tarjetas encontradas
Categorías:
Versiones:

Configuração


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

Estructura mínima.

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

Múltiples puntos de entrada.

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

Resolución de módulos.

Source maps
devtool: 'source-map'      # completo
devtool: 'eval-source-map' # dev rápido
devtool: 'cheap-module-source-map'
devtool: false            # producción

Opciones de source maps.

Loaders


4 cards
Estructura 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']

// Extraer a archivo
use: [MiniCssExtractPlugin.loader,
  'css-loader']

Procesar estilos.

Assets (imágenes/fuentes)
{
  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: 'Mi App',
  minify: { collapseWhitespace: true },
})

Generar HTML con bundles.

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

Extraer CSS a archivos.

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

Variables en tiempo de compilación.

CopyPlugin y 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 desarrollo.

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

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

Actualización sin reload.

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

Scripts de ejecución.

Otimização


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

Dividir bundles.

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

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

Import dinámico.

Minificación
optimization: {
  minimize: true,
  minimizer: [
    new TerserPlugin(),
    new CssMinimizerPlugin(),
  ],
}

Minificar JS y CSS.

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

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

// mode: 'production' lo activa automáticamente

Eliminar código no 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

Ejecutar webpack.

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

Opciones de línea de comandos.

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

new BundleAnalyzerPlugin()

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

Visualizar tamaño del bundle.