Webpack
🌸 您好,欢迎您的阅读,等君久矣,愿与君畅谈.
🔭 § 始于颜值 § 陷于才华 § 忠于人品 §
📫 希望我们可以进一步交流,共同学习,共同探索未知的技术世界 稀土掘金 OR GitHub.
# 浏览器兼容性
- browserslist 工具:查询浏览器版本,一个在不同的前端工具之间,共享目标浏览器和 Node.js 版本的配置 (Babel、Autoprefixer、postcss-preset-env 等)
- browserslist 编写规则
- defaults:Browserslist 的默认浏览器
- 5%: 通过全局使用情况统计的信息选择浏览器版本
- dead:24 个月没有官方支持或更新的浏览器
- last 2 version: 每一个浏览器的最后 2 个版本
- not ie <=8: 排除先前查询选择的浏览器
- node 10: 选择最新的的 node.js 版本 (如 current node:Browserslist 现在使用的 Node.js 版本)
- iOS 7: 直接使用 iOS 浏览器版本 7
- supports es6-module: 支持特定功能的浏览器
- browserslist 工具使用 caniuse-lite 工具进行条件查询
,、or: 并集,满足一个即可and: 交集,所有条件都要满足not: 取反
- 在多个 browserslist 共享查询条件时,两种编写方式
- 在
package.json文件里面添加字段1
2
3
4
5"browserslist": [
">1%",
"last 2 version",
"not dead"
] - 新建
.browserslistrc文件1
2
3>1%,
last 2 version,
not dead
- 在
注意:浏览器版本查询的依赖网站:https://caniuse.com/
# postcss
定义:一个通过 JavaScript 来转换样式的工具,但是要实现特定的功能需要借助与 postcss 相应的插件 (如自动添加浏览器前缀,css 样式重置)
- postcss 的使用
- 查找 postcss 在构建工具中的扩展,如 webpack 中的
postcss-loader - 选择添加需要的 postcss 相关插件实现相应的功能
- 查找 postcss 在构建工具中的扩展,如 webpack 中的
- 在命令行中使用 postcss
1
2
3
4
5
6
7
8
9
10// 安装postcss工具
npm install postcss -D
// 安装postcss命令行工具
npm install postcss-cli -D
// 使用postcss工具对test.css文件中样式进行处理,生成目标文件result.css
npx postcss -o result.css ./src/css/test.css
//安装`autoprefixer`插件为了给样式添加浏览器前缀
npm install autoprefixer -D
//`--use autoprefixer`指定使用特性插件
npx postcss --use autoprefixer -o result.css ./src/css/test.css
注意:推荐查询样式适配浏览器的网站:https://autoprefixer.github.io/(告诉你是否需要添加相应的前缀)
- 在 webpack 中使用 postcss
1
2
3
4
5
6
7
8// 安装postcss工具
npm install postcss -D
// 安装postcss-loader
npm install postcss-loader -D
//安装`autoprefixer`插件为了给样式自动添加浏览器前缀
npm install autoprefixer -D
//安装`postcss-preset-env`插件为了使CSS新特性适配大部分浏览器
npm install postcss-preset-env -D postcss-preset-env: 讲一些现代 CSS 特性转成大多数浏览器识别的 CSS,且根据目标浏览器或者运行时环境添加所需的polyfillpostcss-preset-env插件已经包含autoprefixer插件的特性 (自动为浏览器添加前缀)- rgb (#000000):6 位;rgba (#00000000):8 位部分浏览器可以解析识别,最后两位表示透明度
- 在 webpack 中使用
postcss工具时,使用相同的插件时可以进行相同的插件代码抽离,只需新建文件postcss.config.js(特定文件名), 在该文件里面添加以下代码1
2
3
4
5
6
7
8//对webpack中的postcss工具使用postcss-preset-env插件配置单独抽离
module.exports = {
plugins:[
require("postcss-preset-env")
// 该插件可以简写为以下形式,但并不是所有的插件都可以写成简写形式
// "postcss-preset-env"
]
}
# 资源模块类型 (asset module type)
- 4 种新的模块类型
asset/resource: 发送一个单独的文件并导出 URL, 相当于file-loader的作用附加:加载字体文件 (阿里图标库)1
2
3
4
5
6
7{
test:/\.(png|jpe?g|gif|svg)$/,
type:"asset/resource",
generator: {
filename:"img/[name].[hash:6][ext]"
}
}1
2
3
4
5
6
7{
test:/\.ttf|eot|woff2?$/i,
type:"asset/resource",
generator:{
filename:"font/[name].[hash:6][ext]"
}
}asset/inline: 导出一个资源 data URL, 相当于url-loader的作用1
2
3
4{
test:/\.(png|jpe?g|gif|svg)$/,
type:"asset/inline"
}asset/source: 导出资源的源代码,相当于raw-loader的作用asset: 在导出一个 data URL 和发送一个单独文件之间自动选择,相当于url-loader的作用,且配置资源体积限制实现 (大小图片进行筛选)1
2
3
4
5
6
7
8
9
10
11
12
13{
test:/\.(png|jpe?g|gif|svg)$/,
type:"asset",
generator: {
filename:"img/[name].[hash:6][ext]"
},
parser:{
<!-- `url-loader`的limit效果 -->
dataUrlCondition:{
maxSize:160 * 1024
}
}
}
- 将图片放入对应的文件夹里面的两种方式
- 在
output中进行配置1
2
3
4
5output: {
filename: "bundle.js",
path: path.resolve(__dirname, "build"),
assetModuleFilename:"img/[name].[hash:6][ext]"
} - 在
rules中配置1
2
3
4
5
6
7{
test:/\.(png|jpe?g|gif|svg)$/,
type:"asset/resource",
generator: {
filename:"img/[name].[hash:6][ext]"
}
}
- 在
# Plugin (每一个 plugin 是一个类)
- 定义:
Loader用于特定模块类型进行转换;Plugin用于执行更加广泛的任务 (打包优化、资源管理、环境变量注入) Plugin- 安装
clean-webpack-plugin: 修改一些配置后自动生成 dist 文件夹进行替换1
2
3
4
5
6<!-- 第一步引入需要的plugin -->
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
<!-- 第二步使用需要的plugin -->
plugins: [
new CleanWebpackPlugin()
] - 安装
html-webpack-plugin: 根据ejs模板自动生成index.js文件,并引入相关文件;ejs 模板里面可以设置options.title属性,即为生成 index 文件的标题;自定义 HTML 模板,新建 public 文件夹,在里面新建 HTML 文件,使用template进行引入即可;自定义模板数据填充,使用<% 变量 %>,该方式是 ejs 模板填充数据的方式1
2
3
4
5
6
7
8
9<!-- 第一步引入需要的plugin -->
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
<!-- 第二步使用需要的plugin -->
plugins: [
new CleanWebpackPlugin({
title:"自定义index文件的标题名",
template:"./pubilc/index.html"
})
] - 安装
define-plugin: 解决BASE_URL的常量无法找到问题,区分开发与生产环 境,区分 mode 模式等,允许编译时创建配置的全局常量,属于 webpack 内置插件,无需安装1
2
3
4
5
6
7
8
9
10
11
12
13<!-- 第一步进行引入 -->
const { DefinePlugin } = require("webpack");
<!-- 第二步使用 -->
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
title:"XGG",
template:"./public/index.html"
}),
new DefinePlugin({
BASE_URL:'"./"'
})
] - 安装
copy-webpack-plugin: 将指定文件夹里面的文件复制到另一个文件夹1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21plugins: [
new CopyWebpackPlugin({
patterns:[
{
from:"public",
// 可以省略不写,默认会复制到output中生成的文件夹
// to:"build",
// 可以忽略不进行复制的文件
globOptions:{
// ignoreFiles:"index.js"
ignore:[
"**/index.html",
// 若是Mac的话也需要忽略该文件,该文件是记录当前文件夹的状态信息
"**/.DS_Store",
"**/test.txt"
]
}
}
]
})
]
- 安装
Webpack
http://example.com/2020/05/19/7003_Webpack/