webpack 5 打包实战
近期对以前做的静态网站进行了webpack打包操作,webpack 5 用的时候还是遇到不少问题的,还有一些问题没有解决,以下记录了我使用的loader, plugin,以及最终实现的效果
loader
用于将其它类型文件转换为webpack能够识别处理模块的工具我们就称之为loader。
一般的loader使用都需要 安装再引入,loader放在module中,module的作用是告诉webpack如何处理webpack不能够识别的文件,因为webpack是用来打包js的,但一些其它资源比如css/less/sass, 图片,字体,babel-loader等。
loader的特点: 单一原则,一个loader只干一件事情,多个loader会按从右到左,从下往上的顺序执行
比如 ['style-loader', 'css-loader'] 会先执行css-loader解析js中引入的css关系拿到所有内容,再执行style-loader把内容插入到HTML的HEAD代码中
[{loader: 'style-loader'},{loader: 'css-loader}] 这种配置先解析css文件拿到所有内容,再执行style-loader将内容插入HTML的HEAD中
常用的loader分为:
1、 css loader
- postcss-loader: 解析postcss, 需要配置 postcss.config.js,可方便处理 css sprite,不需要手工切图了
- sass-loader: 解析sass
- less-loader: 解析less
- css-loader: 解析css文件中的@import依赖关系
- style-loader: 将webpack处理之后的内容插入到HTML的HEAD代码中
2、 图片相关loader
- file-loader:将js中引入的图片字体等打包,返回图片字体的url, 并最终生成到指定目录
- url-loader:封装的file-loader, 以指定limit, 小于limit时打包成base64
- html-withimg-loader: 把html中引入(src)的图片打包到指定目录,额外支持#include可以将html模块化拆解(header,content,footer等),但是如果页面中通过style: background 引入的图片是打包不到的,另外如果配置file-uploader, url-loader的话,要指定 esModule: false , 否则 html-withimg-loader不能正确解析图片路径
- image-webpack-loader:
压缩图片
,在file-loader或url-loader下添加这一条
3、 引入库文件相关
- imports-loader:
webpack5测试失败
功能性 Plugin
MiniCssExtractPlugin: 这个插件很关键,用来把js中引入的css文件打包成单独的css文件并放到指定目录中,通过指定css打包规则的 loader: MiniCssExtractPlugin.loader, 并指定 publicPath: "../" 会把css中引用的图片也一同打包到指定的图片文件夹,这样js/css/html中引入的图片就可以分别用 file-loader/url-loader, MiniCssExtractPlugin, html-withimg-loader将图片打包到指定目录了,并且可通过 image-webpack-loader 来
压缩图片
HtmlWebpackPlugin:打包多页应用,可指定打包html模板,启用 collapseWhitespace 可
压缩html
CopyWebpackPlugin:拷贝文件如.doc,.pdf,.txt等文件直接拷贝过去,设置from, to 进行操作
CssMinimizerPlugin:
css 压缩
,配置到 optimization.minimizer数组中TerserPlugin:
js 压缩
, 配置到 optimization.minimizer数组中Webpack.HotModuleReplacementPlugin: HMR热加载模块,
webpack 5 测试失败
CleanWebpackPlugin:每次都删除原来打包后的文件,重新生成, 注意不要在webpack-dev-server下使用
ESLintPlugin:开启ESLint代码规范提示,一般编辑器如visual studio都可开启
提升webpack打包性能 Plugin
Webpack.ProvidePlugin:相当于全局引入库文件,一处引入,到处运行
Webpack.IgnorePlugin:打包时忽略一些文件, 如 new webpack.IgnorePlugin(/^./locale$/, /moment$/)
DllPlugin: 在打包第三方库的时候生成一个清单文件, xx.mainfest.json,即生成动态库文件
DllReferencePlugin:指定的映射文件中查找对应的动态库,找到了那么就不会重新打包动态库中的内容了, 如果找不到才会重新打包
AddAssetHtmlPlugin:HtmlWebpackPlugin使用, 并且需要在HtmlWebpackPlugin后创建,引入动态链接库文件
noParse: /jquery/, 打包时不分析依赖关系,像jquery这种库都是独立的库,不分析时会加快打包速度
externals:告诉webpack 比如 jquery: 'jQuery', 这里的jquery不是node_modules中的jquery,不要打包而使用全局引入的cdn
devServer 配置
devServer: {
contentBase: "./dist",
//启用gzip压缩 Response Content-Encoding: gzip
compress: true,
open: true,
port: 9999,
hot: true,
hotOnly: true
}
babel-loader 配置
npm install babel-loader babel-core babel-preset-env webpack
npm install --save core-js@3.9.1
dev: npm install --save-dev @babel/plugin-transform-runtime
prod: npm install --save @babel/runtime
DEMO:
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
target: "web",
optimization: {
minimize: true
},
mode: "development", // "production" | "development"
entry: "./src/index.js",
output: {
filename: "js/[name].js",
path: path.resolve(__dirname, "dist")
},
module: {
// npm install babel-loader babel-core babel-preset-env webpack
rules: [
// 打包JS规则
{
test: /\.js$/,
exclude: /node_modules/, // 告诉webpack不处理哪一个文件夹
loader: "babel-loader",
options: {
presets: [
[
//for syntax: 箭头函数,let,const,class, 依赖注入 Decorators
"@babel/preset-env",
{
// targets: {
// chrome: "58"
// },
corejs: "3", //npm install --save core-js@3.9.1
//useBuiltIns这样就不用手动引入polyfill了
useBuiltIns: "usage"
}
]
],
//for api: map includes Promise
plugins: [
[
"@babel/plugin-transform-runtime",
{
absoluteRuntime: false,
corejs: 3,//dev: npm install --save-dev @babel/plugin-transform-runtime
helpers: true, //prod: npm install --save @babel/runtime
regenerator: true,
useESModules: false
}
]
]
}
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: "./index.html"
})
]
};
本文由 dealdot <dealdot#163.com> 创作, Full Stack Developer @ DeepBlue
本文最后编辑时间为: Apr 7, 2021 at 10:55 am
转载请注明来源