現代 Web 應用擁有龐大的 JavaScript 代碼庫、複雜的依賴關係、TypeScript/ES6+、Sass/Less 等預處理器。手動處理極其繁瑣,Webpack 作為模塊打包器,以入口文件為起點,遞歸構建依賴圖,經 Loader 轉換、Plugin 優化,輸出瀏覽器可運行的靜態資源。
| 工具 | 定位 | 工作方式 |
|---|---|---|
| Grunt/Gulp | 任務運行器 | 配置文件定義任務流:編譯→合並→壓縮 |
| Webpack | 模塊打包器 | 從入口分析依賴圖,Loader 處理各類文件,打包輸出 |
Webpack 處理速度更快、支持文件類型更豐富、可完全替代 Grunt/Gulp。
mkdir webpack-demo && cd webpack-demo
npm init -y
npm install --save-dev webpack webpack-cli webpack-dev-server
webpack-demo/
├── package.json
├── webpack.config.js
├── src/
│ ├── index.js
│ ├── greeter.js
│ └── style.css
└── dist/ # 輸出目錄(自動生成)
// src/greeter.js
export default function greeter() {
const el = document.createElement('div');
el.textContent = 'Hello Webpack!';
return el;
}
// src/index.js
import greeter from './greeter';
import './style.css';
document.getElementById('root').appendChild(greeter());
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.[contenthash].js',
clean: true
},
devServer: {
static: './dist',
hot: true,
port: 8080
},
plugins: [
new HtmlWebpackPlugin({ template: './src/index.html' })
],
module: {
rules: [
{ test: /\.css$/, use: ['style-loader', 'css-loader'] }
]
}
};
npm install --save-dev style-loader css-loader html-webpack-plugin
"scripts": {
"dev": "webpack serve --mode development",
"build": "webpack --mode production"
}
npm run dev # 開發模式,熱更新
npm run build # 生產構建,輸出到 dist/
將非 JS 文件轉換為 Webpack 可處理的模塊。
| Loader | 用途 | 典型配置 |
|---|---|---|
| babel-loader | ES6+/TS/JSX → ES5 | { test: /\.js$/, exclude: /node_modules/, use: 'babel-loader' } |
| css-loader | 解析 @import/url() | use: ['style-loader', 'css-loader'] |
| sass-loader | SCSS → CSS | use: ['style-loader', 'css-loader', 'sass-loader'] |
| file-loader | 圖片/字體輸出 | { test: /\.(png|jpg|woff2?)$/, type: 'asset/resource' } |
| json-loader | JSON → JS 模塊 | 內置支持(Webpack 5+) |
| Plugin | 作用 |
|---|---|
| HtmlWebpackPlugin | 自動生成 HTML,注入打包後的 JS/CSS,支持模板、哈希緩存 |
| MiniCssExtractPlugin | 將 CSS 提取為獨立文件(生產環境必備) |
| DefinePlugin | 定義全局常量(如 process.env.NODE_ENV) |
| CleanWebpackPlugin | 構建前清理輸出目錄 |
| HotModuleReplacementPlugin | 啟用 HMR 熱更新 |
// 開發環境推薦
devtool: 'eval-cheap-module-source-map'
// 生產環境推薦
devtool: 'source-map'
optimization: {
splitChunks: { chunks: 'all' }, // 提取公共模塊
runtimeChunk: 'single', // 分離 runtime
moduleIds: 'deterministic' // 穩定哈希
}
output: {
filename: '[name].[contenthash].js',
chunkFilename: '[name].[contenthash].chunk.js'
}
webpack.config.js # 基礎配置
webpack.dev.js # 開發配置 (devServer, HMR, source-map)
webpack.prod.js # 生產配置 (minify, extract-css, hash)
webpack.common.js # 共用配置
// 使用 webpack-merge 合併
resolve.extensions、resolve.aliasstyle-loader 在 css-loader 之前if (module.hot) module.hot.accept()cache: { type: 'filesystem' }、使用 thread-loaderWebpack 是現代前端工程化的基石。掌握 入口→依賴圖→Loader 轉換→Plugin 優化→輸出 核心流程,配合 webpack-dev-server 開發體驗與生產構建優化,即可駕馭各類項目。建議動手搭建一個完整 Demo,並在實戰中不斷優化配置。