Webpack 使用教程

131 阅读3分钟

Webpack 使用教程

Webpack 是一个功能强大的模块打包器,它可以将各种资源(JavaScript、CSS、图片等)作为模块进行处理和打包。本教程将带你从入门到精通 Webpack 的使用。

一、安装 Webpack

1. 全局安装(不推荐)

npm install webpack webpack-cli -g

2. 项目本地安装(推荐)

首先进入项目目录,然后初始化项目:

# 初始化项目
npm init -y

# 安装 Webpack 作为开发依赖
npm install webpack webpack-cli --save-dev

二、Webpack 核心概念

1. 入口(Entry)

入口是 Webpack 开始构建依赖图的起点。

2. 输出(Output)

输出配置 Webpack 在哪里输出它创建的 bundles,以及如何命名这些文件。

3. 加载器(Loaders)

Loaders 让 Webpack 能够处理非 JavaScript 文件(如 CSS、图片等)。

4. 插件(Plugins)

Plugins 用于执行范围更广的任务,如打包优化、资源管理和环境变量注入。

5. 模式(Mode)

模式有 development、production 和 none 三种,用于设置构建环境。

三、基础配置

1. 创建基本项目结构

my-webpack-project/
├── src/
│   ├── index.js      # 入口文件
│   ├── style.css     # CSS 文件
│   └── components/   # 组件目录
├── index.html
├── webpack.config.js # Webpack 配置文件
└── package.json

2. 基本配置文件

创建 webpack.config.js 文件:

const path = require('path');

module.exports = {
  mode: 'development', // 模式:development 或 production
  entry: './src/index.js', // 入口文件
  output: {
    path: path.resolve(__dirname, 'dist'), // 输出目录
    filename: 'bundle.js', // 输出文件名
    clean: true, // 清理旧的输出文件
  },
};

3. 配置 package.json 脚本

package.json 中添加构建脚本:

{
  "name": "my-webpack-project",
  "version": "1.0.0",
  "scripts": {
    "build": "webpack",
    "dev": "webpack serve --open"
  },
  "devDependencies": {
    "webpack": "^5.74.0",
    "webpack-cli": "^4.10.0",
    "webpack-dev-server": "^4.11.0"
  }
}

四、加载器配置

1. 处理 CSS

安装所需 loader:

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

在 webpack.config.js 中配置:

module.exports = {
  // ... 其他配置
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader'], // 从右到左执行
      },
    ],
  },
};

2. 处理 SCSS/SASS

安装所需 loader:

npm install sass-loader sass --save-dev

配置:

module.exports = {
  // ... 其他配置
  module: {
    rules: [
      // ... 其他规则
      {
        test: /\.(scss|sass)$/,
        use: ['style-loader', 'css-loader', 'sass-loader'],
      },
    ],
  },
};

3. 处理图片

module.exports = {
  // ... 其他配置
  module: {
    rules: [
      // ... 其他规则
      {
        test: /\.(png|jpg|gif|svg)$/i,
        type: 'asset/resource', // Webpack 5 内置资源模块
      },
    ],
  },
};

4. 处理 JavaScript(使用 Babel)

安装所需依赖:

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

配置:

module.exports = {
  // ... 其他配置
  module: {
    rules: [
      // ... 其他规则
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env'],
          },
        },
      },
    ],
  },
};

五、插件配置

1. HtmlWebpackPlugin

自动生成 HTML 文件并注入打包后的脚本。

安装:

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

配置:

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  // ... 其他配置
  plugins: [
    new HtmlWebpackPlugin({
      title: 'Webpack App',
      template: './index.html', // 使用自定义模板
      minify: {
        collapseWhitespace: true, // 压缩空白
      },
    }),
  ],
};

2. MiniCssExtractPlugin

将 CSS 提取到单独的文件中。

安装:

npm install mini-css-extract-plugin --save-dev

配置:

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  // ... 其他配置
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, 'css-loader'], // 替换 style-loader
      },
    ],
  },
  plugins: [
    // ... 其他插件
    new MiniCssExtractPlugin({
      filename: '[name].[contenthash].css',
    }),
  ],
};

六、开发服务器配置

1. 安装 webpack-dev-server

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

2. 配置开发服务器

module.exports = {
  // ... 其他配置
  devServer: {
    static: {
      directory: path.join(__dirname, 'public'),
    },
    compress: true,
    port: 9000,
    hot: true, // 启用热模块替换
    open: true, // 自动打开浏览器
  },
};

七、代码分割

1. 手动代码分割

module.exports = {
  // ... 其他配置
  optimization: {
    splitChunks: {
      chunks: 'all',
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all',
        },
      },
    },
  },
};

2. 动态导入

在代码中使用动态导入实现按需加载:

// 动态导入模块
button.addEventListener('click', async () => {
  const module = await import('./heavy-module.js');
  module.doSomething();
});

八、生产环境优化

1. 优化配置

module.exports = {
  mode: 'production',
  // ... 其他配置
  optimization: {
    minimize: true,
    minimizer: [
      // 可以配置自定义的压缩插件
    ],
    splitChunks: {
      chunks: 'all',
    },
    runtimeChunk: 'single',
  },
  output: {
    filename: '[name].[contenthash].js',
    path: path.resolve(__dirname, 'dist'),
  },
};

2. Source Maps

开发环境使用:

module.exports = {
  // ... 其他配置
  devtool: 'eval-cheap-module-source-map',
};

生产环境使用:

module.exports = {
  // ... 其他配置
  devtool: 'source-map',
};

九、完整的配置示例

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

module.exports = {
  mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[contenthash].js',
    clean: true,
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env'],
          },
        },
      },
      {
        test: /\.css$/,
        use: [
          process.env.NODE_ENV === 'production' 
            ? MiniCssExtractPlugin.loader 
            : 'style-loader',
          'css-loader',
        ],
      },
      {
        test: /\.(png|jpg|gif|svg)$/i,
        type: 'asset/resource',
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: 'Webpack App',
      template: './index.html',
      minify: process.env.NODE_ENV === 'production' ? {
        collapseWhitespace: true,
      } : false,
    }),
    ...(process.env.NODE_ENV === 'production' ? [
      new MiniCssExtractPlugin({
        filename: '[name].[contenthash].css',
      }),
    ] : []),
  ],
  optimization: {
    splitChunks: {
      chunks: 'all',
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
        },
      },
    },
    runtimeChunk: 'single',
  },
  devtool: process.env.NODE_ENV === 'production' ? 'source-map' : 'eval-cheap-module-source-map',
  devServer: {
    static: {
      directory: path.join(__dirname, 'public'),
    },
    compress: true,
    port: 9000,
    hot: true,
    open: true,
  },
};

十、使用命令

1. 开发环境

npm run dev

2. 生产构建

npm run build

十一、常见问题与解决方案

1. 模块找不到

确保正确安装了依赖,并检查路径是否正确。

2. Loader 问题

确保安装了所有必需的 loader,并正确配置了 rules。

3. 性能问题

对于大型项目,可以:

  • 使用代码分割
  • 优化 loader 配置(使用 include/exclude)
  • 使用缓存
  • 考虑使用 DllPlugin

十二、总结

Webpack 是一个强大而灵活的打包工具,通过本教程,你应该已经掌握了 Webpack 的基本配置和使用方法。随着项目需求的变化,你可以进一步探索 Webpack 的高级功能,如自定义插件、更复杂的代码分割策略等。

参考资源