简介
webpack是一个静态资源打包工具,会以某个文件为入口,将所有文件编译组合成一个或多个文件输出,让其能够在浏览器运行。
其本身功能非常局限,两种模式
1、开发模式:编译js
2、生产模式:编译js,压缩js
webpack五大核心概念
- 入口
- 输出
- 加载器
- 插件
- 模式
配置文件
module.exports = {
// 入口
entry: "",
// 输出
output: {},
// 加载器
module: {
rules: [],
},
// 插件
plugins: [],
// 模式
mode: "",
};
常用
处理各种资源
- 样式资源:
- 加载
- css-loader,
- style-loader,
- less-loader,
- sass-loader
- 优化
- 提取css为单独文件:MiniCssExtractPlugin
- 兼容性处理:postcss-loader
- 压缩:CssMinizerPlugin
- 加载
- 图片资源:file-loader,url-loader(现在用type:asset,其中加入parser{dataUrlConditon来压缩})
- 音频视频等:type:asset/resource
- js资源:
- Eslint插件(需要配置文件,直接extends属性用写好的)
- Babel-loader(需要配置文件,以及preset插件)
- html资源:HtmlWebpackPlugin(需要配置模板文件)
优化
- 提升开发体验
- webpack-dev-derver:开发服务器,自动化(需要在对象中加入devServer配置项)
- SourceMap:开启映射,
- 生产模式:devtool:“source-map”
- 开发模式:devetool:“cheap-module-source-map”
- 提升打包构建速度
- HMR:修改某个模块代码,就只有这个模块代码需要重新打包编译,其他模块不变
- css开启:devServer中添加hot
- js开启:vue-loader
- OneOf:
匹配上一个 loader, 剩下的就不匹配了(oneOf包裹所有处理相同文件的配置项)
-
inClude/Exclude:匹配什么路径
-
Cache:Eslint,Babel开启缓存
-
babel:
options: { cacheDirectory: true, // 开启babel编译缓存 cacheCompression: false, // 缓存文件不要压缩 }
-
Eslint:
new ESLintWebpackPlugin({ // 指定检查文件的根目录 context: path.resolve(__dirname, "../src"), exclude: "node_modules", // 默认值 cache: true, // 开启缓存 // 缓存目录 cacheLocation: path.resolve( __dirname, "../node_modules/.cache/.eslintcache" ), })
-
- HMR:修改某个模块代码,就只有这个模块代码需要重新打包编译,其他模块不变
-
减少代码体积
-
压缩图片:ImageMinizerPlugin
-
Babe按需引入:
@babel/plugin-transform-runtime
: 禁用了 Babel 自动对每个文件的 runtime 注入,而是引入@babel/plugin-transform-runtime
并且使所有辅助代码从这里引用
-
-
优化代码性能
-
Code SPlit:在统一与拆分中取得均衡
-
功能
-
分割文件
-
按需加载
-
-
使用:对象中加入
optimization: { // 代码分割配置 splitChunks: { chunks: "all", // 对所有模块都进行分割 }, }
-
-
Preload
-
preload插件,允许预先加载资源(new PreloadWebpackPlugin)
-
-
PWA
-
支持离线功能(通过service Woekers实现)
-
new WorkboxPlugin.GenerateSW({ // 这些选项帮助快速启用 ServiceWorkers // 不允许遗留任何“旧的” ServiceWorkers clientsClaim: true, skipWaiting: true, }),
-
-
生产模式
webpack不能识别样式资源,需要借助loader来帮助webpack解析样式资源。
1、需要引入两个loader
loader:可以帮助识别更多的文件
css-loader
:负责将 Css 文件编译成 Webpack 能识别的模块style-loader
:会动态创建一个 Style 标签,里面放置 Webpack 中 Css 模块内容
2、module的数组中添加配置项reules【】
- test:匹配规则
- use: 使用的loader
- type:内置的loader
- parser:支持各种高级转换(转base64)
- generator:选择文件的输出路径和名称
const path = require("path");
module.exports = {
entry: "./src/main.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "main.js",
},
module: {
rules: [
{
// 用来匹配 .css 结尾的文件
test: /\.css$/,
// use 数组里面 Loader 执行顺序是从右到左
use: ["style-loader", "css-loader"],
},
{
test: /\.(ttf|woff2?|map4|map3|avi)$/,
type: "asset/resource",
generator: {
filename: "static/media/[hash:8][ext][query]",
},
},
{
test: /\.(png|jpe?g|gif|webp|svg)$/,
type: "asset",
parser: {
dataUrlCondition: {
// 小于10kb的图片转base64
// 优点:减少请求数量 缺点:体积会更大
maxSize: 10 * 1024, // 10kb
},
},
generator: {
// 将图片文件输出到 static/imgs 目录中
// 将图片文件命名 [hash:8][ext][query]
// [hash:8]: hash值取8位
// [ext]: 使用之前的文件扩展名
// [query]: 添加之前的query参数
filename: "static/imgs/[hash:8][ext][query]",
},
}
],
},
plugins: [],
mode: "development",
};
type: "asset/resource"
将文件转化成 Webpack 能识别的资源,其他不做处理,处理各种各样的资源type: "asset"
将文件转化成 Webpack 能识别的资源,同时小于某个大小的资源会处理成base64(parse)
处理js资源
- eslint
- 创建.eslintrc.js(配置项)/eslintignore
-
module.exports = { // 继承 Eslint 规则 extends: ["eslint:recommended"], env: { node: true, // 启用node中全局变量 browser: true, // 启用浏览器中全局变量 }, // parserOptions 解析选项 parserOptions: { ecmaVersion: 6, // es6 sourceType: "module", // es module }, // 定义规则 rules: { "no-var": 2, // 不能使用 var 定义变量 }, };
-
- 在插件中使用
plugins: [ new ESLintWebpackPlugin({ // 指定检查文件的根目录 context: path.resolve(__dirname, "src"), }), ],
- 创建.eslintrc.js(配置项)/eslintignore
2、Babel(loader)
1、babel.config.js (配置文件)
module.exports = {
// 预设
presets: [],
};
@babel/preset-env: 一个智能预设,允许您使用最新的 JavaScript。
@babel/preset-react:一个用来编译 React jsx 语法的预设
@babel/preset-typescript:一个用来编译 TypeScript 语法的预设
#3. 在 Webpack 中使用
2、在loader中使用
module.exports = {
entry: "./src/main.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "static/js/main.js", // 将 js 文件输出到 static/js 目录中
clean: true, // 自动将上次打包目录资源清空
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/, // 排除node_modules代码不编译
loader: "babel-loader",
},
],
},
plugins: [
],
mode: "development",
};
处理html资源
自动引入打包的js和css资源
htmlwebpackPlugin (插件)
1、下载引入
2、使用
plugins: [
new ESLintWebpackPlugin({
// 指定检查文件的根目录
context: path.resolve(__dirname, "src"),
}),
new HtmlWebpackPlugin({
// 以 public/index.html 为模板创建文件
// 新的html文件有两个特点:1. 内容和源文件一致 2. 自动引入打包生成的js等资源
template: path.resolve(__dirname, "public/index.html"),
}),
],
开发服务器
为了防止每次都得打包,引入了这个插件,搭建了服务,时时刻刻自动打包。
开发环境没有输出,直接在内存中打包。
生产模式
CSS提取单独文件
MiniCssExtractPlugin
提取文件再用link引入
1、下载
2、配置
module.exports = {
entry: "./src/main.js",
output: {
path: path.resolve(__dirname, "../dist"), // 生产模式需要输出
filename: "static/js/main.js", // 将 js 文件输出到 static/js 目录中
clean: true,
},
module: {
rules: [
{
// 用来匹配 .css 结尾的文件
test: /\.css$/,
// use 数组里面 Loader 执行顺序是从右到左
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
{
test: /\.less$/,
use: [MiniCssExtractPlugin.loader, "css-loader", "less-loader"],
},
{
test: /\.s[ac]ss$/,
use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"],
},
{
test: /\.styl$/,
use: [MiniCssExtractPlugin.loader, "css-loader", "stylus-loader"],
},
{
test: /\.(png|jpe?g|gif|webp)$/,
type: "asset",
parser: {
dataUrlCondition: {
maxSize: 10 * 1024, // 小于10kb的图片会被base64处理
},
},
generator: {
// 将图片文件输出到 static/imgs 目录中
// 将图片文件命名 [hash:8][ext][query]
// [hash:8]: hash值取8位
// [ext]: 使用之前的文件扩展名
// [query]: 添加之前的query参数
filename: "static/imgs/[hash:8][ext][query]",
},
},
{
test: /\.(ttf|woff2?)$/,
type: "asset/resource",
generator: {
filename: "static/media/[hash:8][ext][query]",
},
},
{
test: /\.js$/,
exclude: /node_modules/, // 排除node_modules代码不编译
loader: "babel-loader",
},
],
},
plugins: [
new ESLintWebpackPlugin({
// 指定检查文件的根目录
context: path.resolve(__dirname, "../src"),
}),
new HtmlWebpackPlugin({
// 以 public/index.html 为模板创建文件
// 新的html文件有两个特点:1. 内容和源文件一致 2. 自动引入打包生成的js等资源
template: path.resolve(__dirname, "../public/index.html"),
}),
// 提取css成单独文件
new MiniCssExtractPlugin({
// 定义输出文件名和目录
filename: "static/css/main.css",
}),
],
// devServer: {
// host: "localhost", // 启动服务器域名
// port: "3000", // 启动服务器端口号
// open: true, // 是否自动打开浏览器
// },
mode: "production",
};
兼容性处理
postcss
(use【】:直接使用是默认配置项,像自定义配置需要写成对象形式)
1、下载插件
2、在package.json中
browsersList【】
3、在配置项中加入
rules: [
{
// 用来匹配 .css 结尾的文件
test: /\.css$/,
// use 数组里面 Loader 执行顺序是从右到左
use: [
MiniCssExtractPlugin.loader,
"css-loader",
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [
"postcss-preset-env", // 能解决大多数样式兼容性问题
],
},
},
},
],
},
{
test: /\.less$/,
use: [
MiniCssExtractPlugin.loader,
"css-loader",
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [
"postcss-preset-env", // 能解决大多数样式兼容性问题
],
},
},
},
"less-loader",
],
},
{
test: /\.s[ac]ss$/,
use: [
MiniCssExtractPlugin.loader,
"css-loader",
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [
"postcss-preset-env", // 能解决大多数样式兼容性问题
],
},
},
},
"sass-loader",
],
},
{
test: /\.styl$/,
use: [
MiniCssExtractPlugin.loader,
"css-loader",
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [
"postcss-preset-env", // 能解决大多数样式兼容性问题
],
},
},
},
"stylus-loader",
],
},
{
test: /\.(png|jpe?g|gif|webp)$/,
type: "asset",
parser: {
dataUrlCondition: {
maxSize: 10 * 1024, // 小于10kb的图片会被base64处理
},
},
generator: {
// 将图片文件输出到 static/imgs 目录中
// 将图片文件命名 [hash:8][ext][query]
// [hash:8]: hash值取8位
// [ext]: 使用之前的文件扩展名
// [query]: 添加之前的query参数
filename: "static/imgs/[hash:8][ext][query]",
},
},
{
test: /\.(ttf|woff2?)$/,
type: "asset/resource",
generator: {
filename: "static/media/[hash:8][ext][query]",
},
},
{
test: /\.js$/,
exclude: /node_modules/, // 排除node_modules代码不编译
loader: "babel-loader",
},
],
},
css压缩(插件)
1、安装
CssMinimizerPlugin
2、配置
plugins: [
new ESLintWebpackPlugin({
// 指定检查文件的根目录
context: path.resolve(__dirname, "../src"),
}),
new HtmlWebpackPlugin({
// 以 public/index.html 为模板创建文件
// 新的html文件有两个特点:1. 内容和源文件一致 2. 自动引入打包生成的js等资源
template: path.resolve(__dirname, "../public/index.html"),
}),
// 提取css成单独文件
new MiniCssExtractPlugin({
// 定义输出文件名和目录
filename: "static/css/main.css",
}),
// css压缩
new CssMinimizerPlugin(),
],