webpack相关

发布于:2025-07-17 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、基础打包指令

# 基本打包(默认使用 webpack.config.js 配置)
npx webpack

# 指定模式(开发/生产)
npx webpack --mode development   # 开发模式(未压缩,保留注释)
npx webpack --mode production    # 生产模式(自动压缩、优化)

二、配置文件相关

# 指定自定义配置文件
npx webpack --config 配置文件名.js   # 例如:webpack.config.dev.js

# 显示配置信息(调试用)
npx webpack --config 配置文件 --display-config

三、监控与开发服务器

# 监听文件变化,自动重新打包
npx webpack --watch   # 简写:npx webpack -w

# 使用 webpack-dev-server 启动开发服务器(需先安装)
npx webpack serve               # 启动服务器(默认端口 8080)
npx webpack serve --port 3000   # 指定端口
npx webpack serve --host 0.0.0.0 # 允许外部访问(同局域网设备可访问)
npx webpack serve --open        # 自动打开浏览器
npx webpack serve --https       # 启用 HTTPS 协议
npx webpack serve --hot         # 启用模块热替换(HMR)

四、输出与日志控制

# 显示打包进度
npx webpack --progress

# 显示详细日志(包括模块解析过程)
npx webpack --verbose

# 静默模式(只输出错误信息)
npx webpack --silent

# 输出打包统计信息到文件(用于分析打包内容)
npx webpack --profile --json > stats.json   # 生成 stats.json

五、高级参数

# 缓存打包结果(加速二次打包)
npx webpack --cache   # 默认开启,可通过配置关闭

# 清理输出目录(删除 dist 中未使用的文件)
npx webpack --clean   # 等效于配置 output.clean: true

# 指定目标环境(默认自动识别)
npx webpack --target web     # 浏览器环境(默认)
npx webpack --target node    # Node.js 环境

# 启用实验性特性(需配合具体特性)
npx webpack --experiments topLevelAwait   # 例如:支持顶层 await

六、版本与帮助

# 查看 Webpack 版本
npx webpack --version   # 简写:npx webpack -v

# 查看所有指令帮助
npx webpack --help      # 简写:npx webpack -h

七、核心配置文件(webpack.config.js)

Webpack 的核心功能通过配置文件(默认 webpack.config.js)定义,配置文件是一个导出对象的 JavaScript 模块。以下是关键配置项及用法:

1. 基础配置
// webpack.config.js
const path = require('path');

module.exports = {
  entry: './src/index.js', // 入口文件(项目打包的起点)
  output: {
    filename: 'bundle.js', // 输出文件名(可带哈希值:'[name].[contenthash].js')
    path: path.resolve(__dirname, 'dist'), // 输出目录(必须是绝对路径)
    clean: true, // 打包前清理 dist 目录(等效于 --clean 指令)
  },
  mode: 'development', // 模式('development' / 'production',可被 CLI 指令覆盖)
};
2. 多入口配置(多页面应用)
module.exports = {
  entry: {
    home: './src/home.js', // 首页入口
    about: './src/about.js', // 关于页入口
  },
  output: {
    filename: '[name].bundle.js', // [name] 会被替换为入口名称(home/about)
    path: path.resolve(__dirname, 'dist'),
  },
};
3. 模块处理(module)

用于配置不同类型文件的处理规则(通过 loader 转换非 JS 文件)。

module.exports = {
  module: {
    rules: [
      // 处理 CSS 文件(需安装 style-loader、css-loader)
      {
        test: /\.css$/i, // 匹配 .css 结尾的文件
        use: ['style-loader', 'css-loader'], // 从右到左执行:css-loader 解析 CSS -> style-loader 注入到 DOM
      },
      // 处理图片(需安装 file-loader 或 url-loader)
      {
        test: /\.(png|jpg|jpeg|gif)$/i,
        type: 'asset/resource', // Webpack 5 内置,替代 file-loader
        generator: {
          filename: 'images/[hash][ext][query]', // 输出到 dist/images 目录
        },
      },
      // 处理 JavaScript(使用 Babel 转译 ES6+,需安装 @babel/core、babel-loader、@babel/preset-env)
      {
        test: /\.m?js$/,
        exclude: /node_modules/, // 排除 node_modules
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env'], // 转译 ES6+ 语法
          },
        },
      },
    ],
  },
};
4. 插件(plugins)

用于扩展 Webpack 功能(如生成 HTML、压缩代码等),需先安装对应插件。

const HtmlWebpackPlugin = require('html-webpack-plugin'); // 生成 HTML(需安装)
const MiniCssExtractPlugin = require('mini-css-extract-plugin'); // 提取 CSS 为单独文件(需安装)

module.exports = {
  plugins: [
    // 生成 HTML 并自动引入打包后的资源
    new HtmlWebpackPlugin({
      template: './src/index.html', // 模板文件
      filename: 'index.html', // 输出文件名
      minify: { collapseWhitespace: true }, // 生产环境压缩 HTML
    }),
    // 提取 CSS 到单独文件(替代 style-loader,适合生产环境)
    new MiniCssExtractPlugin({
      filename: 'css/[name].[contenthash].css', // 输出到 dist/css 目录
    }),
  ],
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: [MiniCssExtractPlugin.loader, 'css-loader'], // 用 MiniCssExtractPlugin.loader 替代 style-loader
      },
    ],
  },
};
5. 开发工具(devtool)

控制源码映射(Source Map),用于调试(开发环境)或隐藏源码(生产环境)。

module.exports = {
  // 开发环境:快速生成,便于调试
  devtool: 'eval-cheap-module-source-map', 
  // 生产环境:不暴露源码(或只生成精简映射)
  // devtool: 'source-map' // 完整映射(体积大,适合生产调试)
  // devtool: false // 不生成映射(默认生产模式)
};
6. 开发服务器(devServer)

配置 webpack-dev-server 的行为(替代 serve 指令的参数配置)。

module.exports = {
  devServer: {
    static: './dist', // 静态文件目录
    port: 3000, // 端口
    host: '0.0.0.0', // 允许外部访问
    open: true, // 自动打开浏览器
    hot: true, // 启用 HMR
    compress: true, // 启用 gzip 压缩
  },
};
7. 优化配置(optimization)

用于生产环境的代码优化(压缩、分割、缓存等)。

const TerserPlugin = require('terser-webpack-plugin'); // 压缩 JS(Webpack 5 内置)
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); // 压缩 CSS(需安装)

module.exports = {
  optimization: {
    minimizer: [
      new TerserPlugin(), // 压缩 JS(生产模式默认启用)
      new CssMinimizerPlugin(), // 压缩 CSS
    ],
    splitChunks: {
      chunks: 'all', // 分割公共代码(如 node_modules 中的依赖)
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors', // 输出为 vendors.bundle.js
          chunks: 'all',
        },
      },
    },
    runtimeChunk: 'single', // 提取运行时代码(便于长期缓存)
  },
};
8. 解析配置(resolve)

配置模块解析规则(如别名、扩展名)。

module.exports = {
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'), // 别名:@ 指向 src 目录
    },
    extensions: ['.js', '.jsx', '.json'], // 省略文件扩展名(import 时可省略)
  },
};

八、常用场景配置示例

1. 开发环境配置(webpack.dev.js)
module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  devtool: 'eval-cheap-module-source-map',
  devServer: {
    static: './dist',
    port: 3000,
    hot: true,
    open: true,
  },
  module: {
    rules: [
      { test: /\.css$/, use: ['style-loader', 'css-loader'] },
      { test: /\.(png|jpg)$/, type: 'asset/resource' },
    ],
  },
  plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],
};
2. 生产环境配置(webpack.prod.js)
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: '[name].[contenthash].js', // 带哈希值,便于缓存
    path: path.resolve(__dirname, 'dist'),
    clean: true,
  },
  optimization: {
    minimizer: [new CssMinimizerPlugin()],
    splitChunks: { chunks: 'all' },
  },
  module: {
    rules: [
      { test: /\.css$/, use: [MiniCssExtractPlugin.loader, 'css-loader'] },
      { test: /\.(png|jpg)$/, type: 'asset/resource' },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({ 
      template: './src/index.html',
      minify: { collapseWhitespace: true }
    }),
    new MiniCssExtractPlugin({ filename: 'css/[name].[contenthash].css' }),
  ],
};


网站公告

今日签到

点亮在社区的每一天
去签到