Appearance
Webpack
简介
Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时,它会在内部构建一个依赖图,此依赖图对应映射到项目所需的每个模块,然后生成一个或多个 bundle。
核心概念
入口(Entry)
入口起点指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。
javascript
module.exports = {
entry: './path/to/my/entry/file.js'
};
输出(Output)
output 属性告诉 webpack 在哪里输出它所创建的 bundle,以及如何命名这些文件。
javascript
const path = require('path');
module.exports = {
entry: './path/to/my/entry/file.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'my-first-webpack.bundle.js'
}
};
加载器(Loaders)
loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。
javascript
module.exports = {
module: {
rules: [
{ test: /\.css$/, use: ['style-loader', 'css-loader'] },
{ test: /\.ts$/, use: 'ts-loader' }
]
}
};
插件(Plugins)
插件可以用于执行范围更广的任务,包括:打包优化、资源管理和注入环境变量。
javascript
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
plugins: [
new HtmlWebpackPlugin({template: './src/index.html'})
]
};
模式(Mode)
通过选择 development
, production
或 none
之中的一个,来设置 mode
参数,你可以启用 webpack 内置的优化。
javascript
module.exports = {
mode: 'production'
};
常用配置示例
基础配置
javascript
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index.js',
output: {
filename: '[name].[contenthash].js',
path: path.resolve(__dirname, 'dist'),
clean: true
},
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html'
})
],
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource'
}
]
},
optimization: {
splitChunks: {
chunks: 'all'
}
}
};
性能优化技巧
- 代码分割:使用
SplitChunksPlugin
分离公共依赖 - Tree Shaking:移除未引用代码
- 懒加载:按需加载模块
- 缓存:使用 contenthash 进行长效缓存
- 压缩:使用 TerserPlugin 压缩 JavaScript
常见问题与解决方案
构建速度慢
- 使用
cache-loader
缓存编译结果 - 配置
include/exclude
减少处理文件 - 使用
thread-loader
多线程构建
打包体积大
- 分析包大小:使用
webpack-bundle-analyzer
- 优化依赖:使用
purgecss-webpack-plugin
清除未使用的 CSS - 动态导入:使用
import()
语法
与其他打包工具对比
特性 | Webpack | Rollup | Vite |
---|---|---|---|
适用场景 | 大型应用 | 库和框架 | 现代Web应用 |
开发体验 | 配置复杂 | 简单直观 | 极速开发 |
生态系统 | 丰富 | 中等 | 快速成长 |
构建速度 | 较慢 | 较快 | 非常快 |