【问题标题】:gulp imagemin breaking SVG maskgulp imagemin 破坏 SVG 掩码
【发布时间】:2016-12-08 02:42:58
【问题描述】:

我有一个这样的 SVG 文件:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <linearGradient gradientUnits="objectBoundingBox" id="gradient" x2="0" y2="1">
      <stop stop-offset="0" stop-color="transparent" />
      <stop stop-color="rgba(255, 255, 255, 0.25)" offset="1"/>
    </linearGradient>
    <mask id="mask" maskUnits="objectBoundingBox" maskContentUnits="objectBoundingBox" x="0" y="0" width="100%" height="100%">
      <rect width="1" height="1" fill="url(#gradient)"/>
    </mask>
  </defs>
</svg>

我正在使用 gulp-imagemin 来压缩我的所有图像,包括 SVG。具体任务如下:

gulp.task('images', function() {
  return gulp.src('/src/img/**/*.*')
    .pipe(imagemin().on('error', gutil.log))
    .pipe(gulp.dest('/dist/img'));
});

适用于我的大多数图像。但是对于上面的 SVG 文件,输出是:

<svg xmlns="http://www.w3.org/2000/svg"><defs><linearGradient gradientUnits="objectBoundingBox" id="a" x2="0" y2="1"><stop stop-color="transparent"/><stop stop-color="rgba(255, 255, 255, 0.25)" offset="1"/></linearGradient></defs></svg>

请注意 mask 已被删除(这是必不可少的)并且 id 已更改。有没有办法阻止这种情况发生,甚至可以用这个插件禁用 SVG 压缩?我查看了文档,但看不到方法。

【问题讨论】:

标签: javascript svg gulp imagemin


【解决方案1】:

以下内容对我有用:

gulp.task('images', function() {
  return gulp.src('src/img/**/*.*')
   .pipe(imagemin([
     imagemin.svgo({
       plugins: [ 
         { removeUselessDefs: false },
         { cleanupIDs: false} 
       ]
     }),
     imagemin.gifsicle(),
     imagemin.jpegtran(),
     imagemin.optipng()
   ]).on('error', gutil.log))
   .pipe(gulp.dest('dist/img'));
});

这是它生成的 SVG:

<svg xmlns="http://www.w3.org/2000/svg"><defs><linearGradient gradientUnits="objectBoundingBox" id="gradient" x2="0" y2="1"><stop stop-color="transparent"/><stop stop-color="rgba(255, 255, 255, 0.25)" offset="1"/></linearGradient><mask id="mask" maskContentUnits="objectBoundingBox" x="0" y="0" width="100%" height="100%"><path fill="url(#gradient)" d="M0 0h1v1H0z"/></mask></defs></svg>

我基本上只是禁用了imagemin.svgo() 插件的两个选项:

  • 禁用removeUselessDefs 保留&lt;mask&gt;
  • 禁用cleanupIDs 保留id 属性

如果由于某种原因这对您不起作用或有其他优化导致您出现问题,您可以启用和禁用 a whole list of options。只需尝试它们,直到找到适合您用例的那些。

如果一切都失败了,只需从传递给imagemin() 的数组中删除整个imagemin.svgo() 调用。这样只有.gif.jpg.png 文件将被最小化。

【讨论】:

  • 正是我所追求的!谢谢
猜你喜欢
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
相关资源
最近更新 更多