Webpack干货系列 | Webpack5 怎么处理字体图标、图片资源
程序员优雅哥(youyacoder)简介:十年程序员,呆过央企外企私企,做过前端后端架构。分享vue、Java等前后端技术和架构。
本文摘要:主要讲解在不需要引入额外的loader的条件下运用Webpack 5 如何高效处理字体图标、图片资源的方法与步骤。
网页上需要使用到图片、字体图标等资源,有些网站还会使用到音频、视频等资源。在之前的webpack4版本,默认是不能处理图片资源的,需要额外配置loader(url-loader和file-loader)才能处理。在webpack 5中默认就可以支持对图片的处理,不需要引入额外的依赖。如果需要指定图片编码为base64、输出目录等,只需要简单的配置即可。
1 处理字体图标资源
粗俗的理解,字体图标就是给元素标签设置对应的class,就可以在页面上展示出图标来。本质上,字体图标也是一种字体。
1.1 添加字体图标文件
首先在阿里巴巴矢量图标库网站(Iconfont)上获取字体图标,具体步骤参考《在iconfont上获取图标资源》一文。通过该网站获取到的字体图标文件如下所示:

在浏览器中打开 demo_index.html,可以看到字体图标的使用:

1、将 iconfont.css 文件拷贝到 src/style/css目录下;
2、在src 目录下创建iconfont目录,并将 iconfont.css 中使用到的 iconfont.ttf文件拷贝到刚创建的 src/iconfont目录下;
3、修改 src/style/css/iconfont.css文件中对iconfont.ttf的引用路径:(第三行修改如下)
src: url('../../iconfont/iconfont.ttf?t=1654939069757') format('truetype');
4、在 main.js 文件中导入 iconfont.css
import './style/css/iconfont.css'
5、在 index.html 中使用字体图标
<span class="iconfont icon-mobile"></span>
<span class="iconfont icon-Notebook"></span>
<span class="iconfont icon-rili"></span>
1.2 使用webpack打包编译
yarn build
执行命令后,显示打包成功,说明 webpack5 默认便可以处理字体图标资源。在浏览器中访问 index.html,可以看到字体图标正常显示。

查看打包后的 dist 目录,会看到字体图标文件位于打包根路径下(dist目录中)。我们希望字体图标资源放在 dist/resources目录下。这就需要配置webpack了。
1.3 配置 webpack
在 webpack.config.js 中的 module.rules 中添加对字体图标文件的处理,指定输出文件名称:
module: {
rules: [
...
{
test: /\.ttf$/,
type: 'asset/resource',
generator: {
filename: 'resources/[hash:10][ext][query]'
}
}
]
},
generator 指定输出的规则。 filename 表示输出的文件相对路径及名称,此处配置表示.ttf格式的文件,打包后放在 dist/resources目录下,名字为 hash 值的前10位。
再次打包运行,会发现 dist 目录下多了一个 resources目录,并且字体图标 ttf 文件位于该目录中。
在浏览器中访问index.html,字体图标显示正常。
其实不仅是字体图标文件,其他的媒体资源文件,如avi、mp3等资源,都可以使用该配置。故该配置可以修改 test 属性,使其处理多种格式的媒体资源。
{
test: /\.(avi|mp3|ttf|woff2?)$/,
type: 'asset/resource',
generator: {
filename: 'resources/[hash:10][ext][query]'
}
}
2 处理图片资源
2.1 添加并使用图标文件
1、在src目录下创建目录img,拷贝图片到该目录中。我准备了三张图片,分别是png、jpeg、svg

2、在 src/style/css下创建文件 img-demo.css样式文件,在该样式文件中定义三个样式类,每个样式类使用一个图片作为背景:
.img1 {
width: 200px;
height: 100px;
background: url("../../img/img1.png");
background-size: 100% 100%;
}
.img2 {
width: 200px;
height: 100px;
background: url("../../img/img2.jpeg");
background-size: cover;
}
.img3 {
width: 100px;
height: 100px;
background: url("../../img/img3.svg");
background-size: cover;
}
3、在 src/main.js中引入该样式文件:
import './style/css/img-demo.css'
4、在 template/index.html中创建三个div,并设置对应的class:
<div class="img1"></div>
<div class="img2"></div>
<div class="img3"></div>
2.2 使用webpack编译打包
执行在第一节中配置的build命令:
yarn build
执行命令后,显示打包成功,说明 webpack5 默认便可以处理图片资源。在浏览器中访问 index.html,可以看到三个div背景图正常显示。

查看打包后的 dist 目录,看到三个图片文件都位于打包根路径下(dist目录中),这样显得比较杂乱,我们希望图片资源放在 dist/img目录下。这就需要配置webpack了。
2.3 配置 webpack
在 webpack.config.js 中的 module.rules 中添加对图片文件的处理,指定输出文件名称,并且在图片大小小于10kb时,将其转为base64放在js中(可以减少网络请求数):
{
test: /\.(png|jpe?g|gif|svg?)$/,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 10 * 1024
}
},
generator: {
filename: 'img/[hash:10][ext][query]'
}
}
maxSize 就是指小于该大小的图片,就转为base64。这里要注意 type属性为 asset。上面处理字体图片等媒体资源时,type属性为asset/resource。asset和asset/resource的区别就是,后者只做拷贝,不能配置转base64。
重新执行打包命令,可以看到dist目录下只有一张图片,因为 img1 和 img3 都小于10kb,被转为base64了。在浏览器测试访问,显示正常。
总而言之,webpack 5 默认可以处理图片和字体图标等资源,不需要引入额外的loader,定制化打包只需要简单配置即可。
今日优雅哥(youyacoder)学习结束,期待关注留言分享~~
Webpack干货系列 | Webpack5 怎么处理字体图标、图片资源的更多相关文章
- Webpack干货系列 | 在 Webpack 5 集成 ESLint 的方法
程序员优雅哥(youyacoder)简介:十年程序员,呆过央企外企私企,做过前端后端架构.分享vue.Java等前后端技术和架构. 本文摘要:主要讲解运用Webpack 5 中集成 ESLint 的方 ...
- Webpack干货系列 | 怎么运用 Webpack 5 处理css/scss/sass、less、stylus样式资源
程序员优雅哥简介:十年程序员,呆过央企外企私企,做过前端后端架构.分享vue.Java等前后端技术和架构. 本文摘要:主要讲解webpack 5 如何高效处理CSS 资源.scss/sass 资源.l ...
- Webpack学习系列 - Webpack5 怎么集成Babel ?
程序员优雅哥简介:十年程序员,呆过央企外企私企,做过前端后端架构.分享vue.Java等前后端技术和架构. 本文摘要:主要通过实操讲解运用Webpack 5 如何集成 Babel Babel 对于前端 ...
- vue项目打包部署elementUI的字体图标丢失问题
自己搭建的Vue项目,没有使用vue-cli,引入elementUI时,使用的是webpack直接打包工具,发现字体图标丢失你 记录一下解决办法: webpack module配置:(build目录下 ...
- webpack热更新问题和antd design字体图标库扩展
标题也不知道怎么写好,真是尴尬.不过话说回来,距离上一次写文快两个月了,最近有点忙,一直在开发新项目, 今天刚刚闲下来,项目准备提测.借这个功夫写点东西,把新项目上学到的一些好的干活分享一下,以便之后 ...
- react+webpack 引入字体图标
在使用react+webpack 构建项目过程中免不了要用到字体图标,在引入过程中报错,不能识别字体图标文件中的@符,报错 Uncaught Error: Module parse failed: U ...
- webpack打包字体图标报错的解决办法
webpack打包字体图标需要两个加载器 url-loader 和 file-loader 另外 字体图标的引入方式 本来应该是 url("....") 这样的方式,但是w ...
- webpack打包绝对路径引用资源和element ui字体图标不显示的解决办法
webpack打包绝对路径引用资源解决办法: 打开webpack.prod.conf.js 找到output:增加 publicPath: './', 即可,如图 element ui字体图标不显 ...
- 绝对干货!!css3字体图标—丰富的阿里图标库iconfont的使用详解
在移动端Web项目开发中,我们往往需要用到一些小图标,比如搜索,返回,小菜单,小箭头等等..这如果还用切图你就OUT了.. 而这时CSS3提供的字体图标无疑是我们最好的选择,它就像字体一样,可以设置大 ...
随机推荐
- Linux C++ Reactor模式
文件结构 reactor_main.cpp reactor_server.cpp reactor_server.h CMakeLists.txt CMakeLists.txt cmake_minimu ...
- fxksmdb.exe 是什么进程?
今天打开电脑应用进程发现fxksmdb.exe.fxksmpl.exe.fxksmW.exe三个进程,经过查看文件路径发现原来是施乐打印机的驱动程序自带的应用,平时都没注意到这个,这下放心了. 我这里 ...
- hover特效
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 解决mysq服务无法正常启动问题
在mysql的启动过程中,遇到什么问题都可以反馈给我,我都会尽力帮你们解决 第一种:通过net start mysql启动MySQL服务器时,出现以下信息 是因为在MySQL5.7以上的版本中默认的没 ...
- mysql忘记root密码实现免密登录
1.配置my.cnf文件,跳过授权表: skip-grant-tables 2.重启mysqld服务 3.z直接mysql登录 4.use mysql这个数据库 5.设置密码: update user ...
- unity---点击事件
点击事件 点击触发的事件脚本 脚本挂载方式 On Click() 如果点击后触发,调用Button物体下,Button_lick脚本中的func函数/func_text 结果
- 论文解读(SCGC))《Simple Contrastive Graph Clustering》
论文信息 论文标题:Simple Contrastive Graph Clustering论文作者:Yue Liu, Xihong Yang, Sihang Zhou, Xinwang Liu论文来源 ...
- CSS基础学习(二)
11.CSS背景 ①设置背景颜色(颜色值通常可以用十六进制(如#000000)或者颜色名称(如red)来表示) 属性:background-color 例: body { background-col ...
- 题解 P3831 [SHOI2012]回家的路
什么叫分层图最短路,我不会/kk 感觉自己做法和其他题解不大一样所以过来发篇题解了. 未刻意卡常拿下最优解 题目大意 就是说给你一个 \(n \times n\) 的网格图和 \(m\) 个可换乘点, ...
- 分布式任务调度ScheduleMaster
1.什么是ScheduleMaster ScheduleMaster是分布式任务调度系统.简称:集中任务调度系统,最简单的理解ScheduleMaster,就是对不同的系统里面的调度任务做统一管理的框 ...