开发环境打包命令,但是会有很多多余注释
npx webpack ./src/index.js --mode=development
生产环境打包命令,打包后只剩下最简洁的代码
npx webpack ./src/index.js --mode=production
新建一个webpack.config.js文件在里面写配置,npx webpack就能使用
entry 入口
output 输出
output:{ //自动清空上次打包内容 clean:true }
loader 加载器
plugins 插件
optimization
optimization :{ //压缩 minimizer:[ new CssMinimizerPlugin(), new TerserWebpackPlugin({ parallel: threads //多进程 }) ] }
devServer 开发服务器配置
mode 模式 development开发模式 production生产模式
处理css
安装css-loader
npm install --save-dev css-loader
// 加载器
module:{
rules:[
//loader的配置
{
test:/\.css$/,
use:["style-loader","css-loader"]
}
]
},
处理less或者sass
安装less-loader
npm install --save-dev less-loader
npm install --save-dev sass-loader
module:{
rules:[
//loader的配置
{
test:/\.less$/,
use:["style-loader","css-loader","less-loader","sass-loader"]
}
]
},
处理图片和字体图标资源–图片会转换成base64
module:{
rules:[
{
test:/\.(png|jpe?g|gif|webp|svg)$/,
type:"asset",
parser:{
//转换的文件小于10kb转base64
dataUrlCondition:{
maxSize:10 * 1024,
}
},
generator:{
//图片名称和路径
filename:"static/images/[hash][ext][query]"
}
},
{
test:/\.(ttf|woff2?)$/,
type:"asset/resource",
generator:{
filename:"static/images/[hash][ext][query]"
}
}
]
},
eslint配置创建一个.eslintrc.js配置文件
安装eslint-webpack-plugin插件和eslint
const ESLintPlugin = require("eslint-webpack-plugin")
plugins:[new ESLintPlugin({
//传入选项,其他选项看官网
//context检测那些文件
context:path.resolve(__dirname,"src")
})]
babel处理
安装babel-loader @babel/core @babel/preset-env
module:{
rules:[
{
test:/\.js$/,
exclude:/node_modules/,//排除node_modules中的js文件
loader:"babel-loader",
option:{
// 智能预设,能够编译ES6语法
presets:["@babel/preset-env"]
}
}
]
},
处理html资源
安装html-webpack-plugin
const HtmlWebpackPlugin = require("html-webpack-plugin")
plugins:[new HtmlWebpackPlugin({
//模板,以public/index.html文件创建新的html文件
//新的html文件结构和原来一致,自动引入打包资源
template: path.resolve(__dirname,'public/')
})]
服务器启动配置
devServe:{
host:"localhost",//启动服务器的域名
port:"3000",//启动服务器的端口号
open:true,//是否打开浏览器
hot:true//开启HMR功能--只用于开发环境,只刷新更新的,false时全部刷新
}
将css文件单独提取和css压缩
使用mini-css-extract-plugin单独提取插件
css-minimizer-webpack-plugin压缩插件
html和js生产模式默认压缩
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
module.exports = {
plugins:[
new MiniCssExtractPlugin({
filename:"static/css/main.css"
}),
new CssMinimizerPlugin()
]
module:{
rules:[{
test:/\.css$/i,
use:[MiniCssExtractPlugin.loader,"css-loader"]
}]
}
}
css兼容性处理
npm i postcss-loader postcss postcss-preset-env
module:{
rules:[{
test:/\.css$/i,
use:[
MiniCssExtractPlugin.loader,
"css-loader",
{
loader:"postcss-loader",
options:{
postcssOptions:{
plugins:["postcss-preset-env"]
}
}
}
]
}]
}
SourceMap
devtool:"cheap-module-source-map" //开发模式 能提示哪一行报错
devtool:"source-map" //生产模式 代码压缩后能提示哪一列报错
oneOf 只解析一个loader配置就退出
include 包含要处理的文件
exclude 排除不要处理的文件 include和exclude只能同时使用一种
module:{
rules:[
{
oneOf:[
{
test:/\.css$/i,
//exclude:/node_modules/,
include:path.resolve(__dirname,'../src'),
use:[
MiniCssExtractPlugin.loader,
"css-loader",
]
},
{
test:/\.(ttf|woff2?)$/,
type:"asset/resource",
generator:{
filename:"static/images/[hash][ext][query]"
}
}
]
}]
}
babel缓存和文件压缩
{
test:/\.js$/,
exclude:/node_modules/,//排除node_modules中的js文件
loader:"babel-loader",
option:{
// 智能预设,能够编译ES6语法
//presets:["@babel/preset-env"]
cacheDirectory: true,//开启babel缓存
cacheCompression: false,//关闭缓存文件压缩
}
}
//缓存路径
plugins:[new ESLintPlugin({
cacheLocation: path.resolve(__dirname,'../node_modules/.cache/eslintcahe')
})]
多线程打包
使用thread-loader也可直接使用terser-webpack-plugin插件
const os = require("os")
//cpu核数
const threads = os.cpus.length;
rules:[{
test:/\.js$/i,
use:[{
loader:"thread-loader",//开启多进程对babel进行多进程处理
opthions:{
works:threads
}
},{
loader:"babel-loader",
option:{
cacheDirectory: true,//开启babel缓存
cacheCompression: false,//关闭缓存文件压缩
}
}]
}]
plugins:[
new TerserWebpackPlugin({
parallel: threads
})
]
减少代码体积–禁用babel对每个文件的runtime注入
@babel/plugin-transform-runtime插件
本地图片压缩
image-minimizer-webpack-plugin
无损压缩
npm install imagemin-gifsicle imagemin-jpegtran imagemin-optiong imagemin-svgo
有损压缩
npm install imagemin-gifsicle imagemin-mozjpeg imagemin-pngquant imagemin-svgo
new ImageMinimizerPlugin({
minimizer:{
implementation: ImageMinimizerPlugin.imageminGenerate,
options:{
plugins:[
["gifsicle",{interlaced:true}],
["jpegtran",{progressive:true}],
["optipng",{optimizationLevel:5}],
["svgo",{
plugins:[
"preset-default",
"prefixIds",
{
name:"sortAttrs",
params:{
xmlnsOrder:"alphabetical"
}
}
]
}]
]
}
}
})
多入口
多入口按需引入需要在代码上import引入处理
entry:{
app:"./src/app.js",
main:"./src/main.js"
},
output:{
path:path.resolve(__dirname,"dist"),
filename:"[name].js"//webpack命名方式,[name]以文件名自己名
}
optimization:{
splitChunks:{
chunks:"all",//对所有模块都进行分割 下面的都是默认配置
minSize:20000,//分割代码最小的大小
minRemainingSize:0,//类似于minSize,最后确保提取的文件大小不为0
maxAsyncRequests:30,//按需加载时并行加载的文件的最大数量
maxInitialRequests:30,//入口js文件最大的并行请求数量
enforceSizeThreshold:50000,//超过50kb一定会单独打包
cacheGroups:{
defaultVendors:{
test:/[\\/]node_modules[\\/]/,//需要打包到一起的模块
priority:-10,//权重
reuseExistingChunk:true,//如果当前chunk包含已从主bundle中拆分出的模块,则被重用,而不是生成新的模块
},
default:{
minChunk:2,//这里的minChunks权重更大
priority:-20,
reuseExistingChunk:true,
}
}
}
}
模块命名
import(/* webpackChunkName: "math" */ "./js/main")
output:{
//打包输出文件命名
chunkFilename:"static/js/[name].js"
}
统一图片字体命名
output:{
assetModuleFilename:"static/media/[hash:10][ext][query]"
}