核心概念

  • Webpack:模块打包工具,适合中大型项目
  • Vite:新一代前端构建工具,开发启动快
  • Rollup:专注于打包库的工具

一、Webpack 核心概念

1.1 五大核心模块

模块说明配置示例
entry入口,打包起点entry: './src/index.js'
output出口,打包结果output: { dir: 'dist' }
loader转换器,处理非 JS 文件loader: 'babel-loader'
plugins插件,扩展功能plugins: [new HtmlWebpackPlugin()]
mode模式development / production

1.2 核心功能

  1. 模块转换:将 ES6+、TypeScript、Vue 等转换为浏览器可识别的代码
  2. 资源处理:文件合并拆分、图片压缩、代码压缩
  3. 开发支持:热模块替换 (HMR)、Source Map、开发服务器

二、Webpack Loader

2.1 常用 Loader 大全

Loader作用安装命令
babel-loaderES6+ 转 ES5npm i -D babel-loader @babel/core
css-loader解析 CSS 的 import 和 urlnpm i -D css-loader
style-loader将 CSS 插入 style 标签npm i -D style-loader
sass-loader编译 Sass/SCSSnpm i -D sass-loader sass
less-loader编译 Lessnpm i -D less-loader less
postcss-loader处理 CSS 兼容性npm i -D postcss-loader postcss
url-loader转文件为 base64npm i -D url-loader
file-loader处理文件引用npm i -D file-loader
image-webpack-loader图片压缩npm i -D image-webpack-loader
ts-loaderTypeScript 编译npm i -D ts-loader typescript
vue-loader处理 Vue 单文件组件npm i -D vue-loader
html-loader处理 HTML 中的图片引用npm i -D html-loader

Loader 执行顺序

  • 从右向左 / 从下到上 执行
  • 例如:use: ['style-loader', 'css-loader', 'sass-loader']
  • 先执行 sass-loader,再执行 css-loader,最后执行 style-loader

2.2 Loader 配置示例

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader'],
      },
      {
        test: /\.scss$/,
        use: ['style-loader', 'css-loader', 'sass-loader'],
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: 'babel-loader',
      },
      {
        test: /\.(png|jpg|gif)$/,
        use: {
          loader: 'url-loader',
          options: {
            limit: 8192, // 小于 8kb 转 base64
            name: 'img/[name].[hash:8].[ext]',
          },
        },
      },
    ],
  },
};

三、Webpack Plugins

3.1 常用插件大全

Plugin作用安装命令
html-webpack-plugin生成 HTML 文件npm i -D html-webpack-plugin
clean-webpack-plugin清理构建目录npm i -D clean-webpack-plugin
mini-css-extract-plugin提取 CSS 为独立文件npm i -D mini-css-extract-plugin
css-minimizer-webpack-plugin压缩 CSSnpm i -D css-minimizer-webpack-plugin
terser-webpack-plugin压缩 JS内置,Webpack5 自带
eslint-webpack-pluginESLint 检查npm i -D eslint-webpack-plugin
copy-webpack-plugin复制文件到构建目录npm i -D copy-webpack-plugin
webpack-bundle-analyzer打包体积分析npm i -D webpack-bundle-analyzer
compression-webpack-plugin压缩资源 (Gzip)npm i -D compression-webpack-plugin

3.2 Plugin 配置示例

const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
 
module.exports = {
  plugins: [
    // 清理构建目录
    new CleanWebpackPlugin(),
    
    // 生成 HTML
    new HtmlWebpackPlugin({
      title: '我的应用',
      template: './src/index.html',
      minify: {
        collapseWhitespace: true, // 折叠空白
        removeComments: true,     // 移除注释
      },
    }),
    
    // 提取 CSS
    new MiniCssExtractPlugin({
      filename: '[name].[contenthash].css',
    }),
  ],
};

四、核心概念详解

4.1 Tree Shaking

定义

删除未使用的代码,减小打包体积

前提条件

  • 使用 ES6 Module 语法(import/export
  • production 模式下
  • package.json 中设置 "sideEffects": false
// ✅ 支持 Tree Shaking
import { debounce } from 'lodash-es';
export const fn = () => {};
 
// ❌ 不支持 Tree Shaking
const lodash = require('lodash'); // CommonJS

4.2 Code Splitting(代码分割)

定义

将代码分割成多个 chunk,按需加载

分割方式

  1. 多入口:配置多个 entry
  2. 动态导入:使用 import() 语法
  3. 提取第三方库:splitChunks 配置
// 动态导入
const Home = () => import('./Home.vue');
 
// splitChunks 配置
optimization: {
  splitChunks: {
    chunks: 'all',
    cacheGroups: {
      vendors: {
        test: /[\\/]node_modules[\\/]/,
        name: 'vendors',
        priority: 10,
      },
    },
  },
}

4.3 Bundle、Chunk、Module 的区别

概念说明
Module开发中的单个模块,一个文件一个模块
Chunk代码块,由多个 Module 组成,用于代码分割
Bundle最终输出的打包文件

五、Webpack 配置模板

5.1 基础配置

// webpack.config.js
const path = require('path');
 
module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
    clean: true,
  },
  module: {
    rules: [
      { test: /\.js$/, loader: 'babel-loader' },
      { test: /\.css$/, use: ['style-loader', 'css-loader'] },
    ],
  },
  devServer: {
    port: 3000,
    hot: true,
    open: true,
  },
};

5.2 生产环境配置

// webpack.prod.js
const { merge } = require('webpack-merge');
const common = require('./webpack.common.js');
 
module.exports = merge(common, {
  mode: 'production',
  devtool: 'source-map',
  optimization: {
    minimize: true,
  },
});

六、Webpack vs Vite

特性WebpackVite
启动速度慢(需打包)极快(按需编译)
热更新较快极快
配置复杂度
生态成熟完善快速发展
适用场景中大型项目中小型项目/库

6.1 Vite 优势

// vite.config.js - 简洁的配置
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
 
export default defineConfig({
  plugins: [vue()],
  server: {
    port: 3000,
  },
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          'vue-vendor': ['vue', 'vue-router', 'pinia'],
        },
      },
    },
  },
});

相关链接