最近遇到一个grunt配置问题,涉及使用imagemin时需要把多个不同目录下的images文件统一压缩到一个目录下,因为要保持目录结构所以使用cwd使用通配符去匹配images目录,结果发现grunt在cwd里面不能使用通配符,研究了半天发现其实可以使用rename去灵活修改生成目录,而src里面是允许通配符的。

rename参数接收目标路径和源文件路径作为参数,而返回一个最终的文件路径即为文件最终路径(需要注意rename的优先级很低,开发中如果配置了ext等配置,rename中接收到的为处理过的数据信息!)。

下面是目录结构:

错误的配置:

// 图片压缩
imagemin: {
	dist: {
		files: [{
			expand: true,
			cwd: 'extends/*/res/images',
			src: ['**/*.{png,jpg,gif}'],
			dest: 'res/dist/images'
		}]
	}
},

解决办法:

// 图片压缩
imagemin: {
	dist: {
		files: [{
			expand: true,
			src: ['extends/*/res/images/**/*.{png,jpg,gif}'],
			dest: 'res/dist/images',
			rename: function (dest, src) {
				return dest + src.replace(/extends\/.*?\/res\/images/, '');
			}
		}]
	}
},