zoukankan      html  css  js  c++  java
  • Vue-cli3.0下的雪碧图插件webpack-spritesmith配置方法

    在前端项目中,为了减少对图片的请求次数,一般而言需要进行雪碧图的配置。即将多张小图标合并成一张图片,这样页面中的小图标都在一张图片上,只需请求一张图片,就可以通过CSS设置各个小图标的显示,利于节省带宽和资源。

    雪碧图插件一般还支持快速引用小图标,例如当我们需要在html中放入service.png这张图片时,我们只需要使用<i class="icon icon-service"></i>这样的简单引入方式,省去了繁琐的引入图片的样式编写,大大提升效率。

    在Vue-cli 3.0项目中常用webpack-spritesmith进行相关配置,该插件的文档不太直观,并且文档中基于webpack,而vue-cli 3.0的配置是与webpack有所差异的。本文着眼于探讨基于vue-cli3.0项目的该插件的配置方法,使用vue-cli3.0的链式操作进行配置示例。

    安装

    npm i webpack-spritesmith
    

    引入

    const path = require('path');
     
    const SpritesmithPlugin = require('webpack-spritesmith');
    

    使用插件

    const templateFunction = function(data) {
      var shared = ".icon { display: inline-block; vertical-align: middle; background-image: url(I) }".replace(
        "I",
        data.sprites[0].image
      );
    
      var perSprite = data.sprites
        .map(function(sprite) {
          return ".icon-N {  Wpx; height: Hpx; background-position: Xpx Ypx; }"
            .replace("N", sprite.name)
            .replace("W", sprite.width)
            .replace("H", sprite.height)
            .replace("X", sprite.offset_x)
            .replace("Y", sprite.offset_y);
        })
        .join("
    ");
    
      return shared + "
    " + perSprite;
    };
    
    module.exports = {
      chainWebpack: config => {
        // 将小图标拼接成雪碧图
        config.plugin("webpack-spritesmith").use(Spritesmith, [
          {
            src: {
              cwd: "./src/assets/images/icon/",
              glob: "*.png"
            },
            target: {
              image: "./src/assets/images/sprite/sprite.png",
              css: [
                [
                  path.resolve(__dirname, "./src/assets/scss/icon/_sprite.scss"),
                  {
                    // 引用自己的模板
                    format: "function_based_template"
                  }
                ]
              ]
            },
            apiOptions: {
              cssImageRef: "../../images/sprite/sprite.png"
            },
            customTemplates: {
              function_based_template: templateFunction
            },
            spritesmithOptions: {
              algorithm: "binary-tree",
              padding: 10
            }
          }
        ]);
      }
    }
    

    参数说明

    • src 配置创建雪碧图的源文件
      – cwd 要创建雪碧图的源文件夹
      – glob 要创建雪碧图的源文件类型

    即将src.cwd路径下的所有匹配src.glob的源文件生成雪碧图。以上案例中,./src/assets/images/icon/路径下的所有.png文件都会拼接到雪碧图。

    • target 配置生成的雪碧图文件
      – img 生成的雪碧图路径和文件名
      – css 引用生成的雪碧图的样式文件的路径和模板等配置

    在上述案例中,生成的雪碧图的路径是../src/assets/images/sprite/sprite.png,生成的引用雪碧图的样式文件的路径是./src/assets/scss/icon/_sprite.scss,并且_sprite.scss中的内容在function_based_template中定义,而function_based_template则在customTemplates中定义。

    • apiOptions 可选,配置引用生成的雪碧图的一些细节

      – cssImageRef 配置在样式文件中引用雪碧图的路径

    具体来说,虽然target.img已经配置好了生成的雪碧图路径,但是,生成的样式文件_sprite.scss中,还需要通过scss引用雪碧图,比如background-image: url(../../images/sprite/sprite.png),因此需要使用apiOptions.cssImageRef设置background-image引用雪碧图的路径。

    • customTemplates 可选,配置生成样式文件的样式模板

    具体来说,我们在target.css选项中,将format设置为“function_based_template”,那么,最终生成的样式文件中的内容将是样式模板function_based_template定义的形式。function_based_template便需要在customTemplates 中定义。

    以上案例中,function_based_template的值是templateFunction,那么将按templateFunction中的返回值生成样式内容。即生成的全是.icon {…} .icon-N{…}的形式。

    案例中之所以这样设计,是为了方便直接在html中使用<i class='icon icon-N'></i>的形式,这样将直接加载出对应的图标,其中N是图标的名称。

    • spritesmithOptions 可选, spritesmith的配置。

    spritesmith是另一个插件,webpack-spritesmith使用了spritesmith。spritesmithOptions 选项用来配置在spritesmith中可用的那些配置。

       – algorithm 配置生成雪碧图的算法。比如设为“binary-tree”,则雪碧图看起来正正方方,还可以设为top-down、left-right、diagonal、alt-diagonal,不同值之间拼接小图标的方式不同,因此最终的雪碧图形状不同。
       – padding 配置雪碧图中小图标之间的间距,可根据需要设置。

  • 相关阅读:
    HTML+CSS学习笔记(九)
    HTML+CSS学习笔记(八)
    HTML+CSS学习笔记(七)
    HTML+CSS学习笔记(六)
    HTML+CSS学习笔记(五)
    Numpy学习笔记(五)
    图片和文字放在一行对齐的方法
    CSS控制文字,超出部分显示省略号
    Stylus基本使用
    什么是HTML语义化标签?常见HTML语义化标签大全
  • 原文地址:https://www.cnblogs.com/twodog/p/12134764.html
Copyright © 2011-2022 走看看