项目使用的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代码,徒增传输数据。切记。