Webpack配置指南

Webpack 5配置模板

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')

module.exports = (env, argv) => {
  const isProd = argv.mode === 'production'

  return {
    entry: './src/index.js',

    output: {
      path: path.resolve(__dirname, 'dist'),
      filename: isProd ? '[name].[contenthash:8].js' : '[name].js',
      clean: true,
    },

    module: {
      rules: [
        // JavaScript / TypeScript
        { test: /\.[jt]sx?$/, use: 'babel-loader', exclude: /node_modules/ },

        // CSS / Sass
        { test: /\.scss$/, use: [
          isProd ? MiniCssExtractPlugin.loader : 'style-loader',
          'css-loader', 'sass-loader'
        ]},

        // Images
        { test: /\.(png|jpg|svg|gif|webp)$/, type: 'asset/resource' },
      ],
    },

    plugins: [
      new HtmlWebpackPlugin({ template: './public/index.html' }),
      ...(isProd ? [new MiniCssExtractPlugin({ filename: '[name].[contenthash:8].css' })] : []),
    ],

    optimization: {
      splitChunks: { chunks: 'all' },
      runtimeChunk: 'single',
    },

    devServer: {
      port: 3000,
      historyApiFallback: true,
      proxy: { '/api': 'http://localhost:8080' },
    },
  }
}

常用Loader

Loader处理
babel-loaderJS/JSX/TS → modern JS
ts-loader / esbuild-loaderTypeScript
css-loaderCSS imports
style-loader将CSS注入DOM
sass-loaderSCSS → CSS
file-loader / asset/resource图片、字体
url-loader / asset/inline小文件→base64