项目使用的WEB font技术,有几个图标是SVG,图标都是在1KB以内。如果不使用webpack打包,单独发布上去,客户请求时会多很多HTTP连接。而浏览器单次请求只能10个连接,这样会多几次会话,影响浏览效果。
1、命令行使用 vue inspect > output.js查看到当前的配置
/* config.module.rule('images') */
test: /\.(png|jpe?g|gif|webp)(\?.*)?$/,
use: [
/* config.module.rule('images').use('url-loader') */
2、以为只要在test正则中加上|svg就可以了,配置如下:
module.exports = {
chainWebpack: config => {
config.module
.rule('images')
.test(/\.(png|jpe?g|gif|webp|svg)(\?.*)?$/)
.use('url-loader')
.loader('url-loader')
.tap(options => Object.assign(options, { limit: 10240 }));
3、结果翻车了。SVG还是生成在dist目录中。再继续查看output.js
发现本来配了svg的loader,
/* config.module.rule('svg') */
test: /\.(svg)(\?.*)?$/,
use: [
/* config.module.rule('svg').use('file-loader') */
4、找到问题就好办了,先把原svg的配置清除,再使用images的rule,配置如下:
chainWebpack: config => {
const svgRule = config.module.rule('svg');
// 清除已有的所有 loader。
// 如果你不这样做,接下来的 loader 会附加在该规则现有的 loader 之后。
svgRule.uses.clear();
// 添加要替换的 loader
config.module
.rule('images')
.test(/\.(png|jpe?g|gif|webp|svg)(\?.*)?$/)
.use('url-loader')
.loader('url-loader')
.tap(options => Object.assign(options, { limit: 10240 }));
上面的配置的意思是让10KB以下的图片及svg图片以base64的方式嵌入页面中。至此,大功告成。
提示:如果是图标,请不要在每个地方用image标签引入图片,而是应该在css文件中使用background-image的方式引入。不然页面上会重复引用同一段base64代码,徒增传输数据。切记。