1. Loader
Loader 用于对模块的源代码进行转换。它可以将非 JavaScript 文件(如 CSS、图片、字体等)转换为 webpack 能够处理的模块。
常用 Loader 及其作用
Loader | 作用 |
---|---|
babel-loader |
将 ES6+ 代码转换为 ES5,兼容旧版浏览器。 |
css-loader |
解析 CSS 文件,处理 @import 和 url() 等语法。 |
style-loader |
将 CSS 插入到 DOM 中,通过 <style> 标签生效。 |
sass-loader |
将 SCSS/SASS 文件编译为 CSS。 |
file-loader |
处理文件(如图片、字体),将其输出到构建目录并返回文件路径。 |
url-loader |
类似于 file-loader ,但可以将小文件转换为 Base64 URL,减少 HTTP 请求。 |
ts-loader |
将 TypeScript 编译为 JavaScript。 |
module.exports = {
module: {
rules: [
{
test: /\.js$/, // 匹配 .js 文件
exclude: /node_modules/, // 排除 node_modules 目录
use: 'babel-loader', // 使用 babel-loader
},
{
test: /\.css$/, // 匹配 .css 文件
use: ['style-loader', 'css-loader'], // 从右到左执行
},
{
test: /\.(png|jpe?g|gif|svg)$/, // 匹配图片文件
use: [
{
loader: 'url-loader',
options: {
limit: 8192, // 小于 8KB 的文件转换为 Base64 URL
name: 'images/[name].[hash:8].[ext]', // 输出路径和文件名
},
},
],
},
],
},
};
2. Plugin
Plugin 用于扩展 webpack 的功能,可以在打包过程的各个阶段执行自定义操作。与 Loader 不同,Plugin 的功能范围更广,比如优化资源、管理环境变量、注入全局变量等。
常用 Plugin 及其作用
Plugin | 作用 |
---|---|
HtmlWebpackPlugin |
自动生成 HTML 文件,并自动注入打包后的资源(如 JS、CSS)。 |
MiniCssExtractPlugin |
将 CSS 提取为单独的文件,而不是嵌入到 JS 中。 |
CleanWebpackPlugin |
在每次构建前清理输出目录,避免旧文件残留。 |
DefinePlugin |
定义全局常量,通常用于区分开发环境和生产环境。 |
CopyWebpackPlugin |
复制静态文件(如图片、字体)到输出目录。 |
HotModuleReplacementPlugin |
启用模块热替换(HMR),在不刷新页面的情况下更新模块。 |
OptimizeCSSAssetsPlugin |
压缩和优化 CSS 文件。 |
TerserWebpackPlugin |
压缩和优化 JavaScript 文件。 |
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const webpack = require('webpack');
module.exports = {
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html', // 指定 HTML 模板
filename: 'index.html', // 输出的 HTML 文件名
}),
new MiniCssExtractPlugin({
filename: 'css/[name].[contenthash:8].css', // 提取 CSS 到单独文件
}),
new CleanWebpackPlugin(), // 清理输出目录
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production'), // 定义环境变量
}),
],
};
3. 其他常用配置
1) entry
指定打包的入口文件。
module.exports = {
entry: './src/index.js', // 单入口
// 多入口
entry: {
app: './src/app.js',
admin: './src/admin.js',
},
};
2) output
指定打包后的文件输出位置和文件名。
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'), // 输出目录
filename: 'js/[name].[contenthash:8].js', // 输出文件名
publicPath: '/', // 公共路径(用于 CDN)
},
};
3) mode
设置打包模式,可选 development
、production
或 none
。
module.exports = {
mode: 'production', // 生产模式(默认启用代码压缩)
};
4) devServer
配置开发服务器,支持热更新、代理等功能。
module.exports = {
devServer: {
contentBase: './dist', // 服务内容目录
hot: true, // 启用热更新
port: 8080, // 端口号
proxy: {
'/api': 'http://localhost:3000', // 代理 API 请求
},
},
};
5) optimization
配置代码分割和压缩优化。
module.exports = {
optimization: {
splitChunks: {
chunks: 'all', // 代码分割
},
minimizer: [
new TerserWebpackPlugin(), // 压缩 JS
new OptimizeCSSAssetsPlugin(), // 压缩 CSS
],
},
};
4. 总结
-
Loader:用于处理特定类型的文件(如 CSS、图片、字体等),将其转换为 webpack 能够处理的模块。
-
Plugin:用于扩展 webpack 的功能,如生成 HTML 文件、提取 CSS、压缩代码等。
-
常用配置 :
entry
、output
、mode
、devServer
、optimization
等。