基于gulp的前端脚手架(二)
几天前搭了个小型的gulp
自动化脚手架,运用到实际项目中发现还有一些小问题,今天来统一修复一下。
文章链接 基于gulp的前端脚手架(一)
存在的问题
雪碧图相关
1、使用2倍图后,若2倍图尺寸不是1倍图的2倍,如2x: 37*12
, 1x: 19*6
。
会出现错误:
2、使用gulp.spritesmith-multi
生成雪碧图时会产生1x.png
和2x.png
两个文件。
很多时候我们的项目是不需要使用到1x
图的,这样会造成资源的浪费。所以1x.png
不应该出现在dist/img
目录中
其他
暂没发现其他问题哈哈哈
如何修复
修改图片尺寸为偶数
找了一下午也没有什么比较好的解决办法啊,摔桌 (╯‵□′)╯︵┻━┻ 手动修改图片尺寸太麻烦了
google了一下 发现一般是新增一个图片处理的插件解决。我使用的是gulp-gm
,但是它必须依赖于GraphicsMagick
或者ImageMagick
这两个图片处理引擎
Make sure GraphicsMagick or ImageMagick is installed on your system and properly set up in your PATH.——npmjs gulp-gm
我安装的是ImageMagick
Mac下直接使用brew
安装
brew install imagemagick
无奈实习生用的是win7 QAQ
可以到这里ImageMagick 选择适合自己电脑的版本安装
使用GUI安装时,这一步很重要
一定要勾选黄色那行,不然convert-version
跑不起,就会报错了。而且这错误我排查了一天...捂脸
因为使用了ImageMagick
,所以要在gulpfiles gm task中将imagemagick的
选项设为true
Just Like the following codes
gulp.src('test.png') .pipe(gm(function (gmfile) { return gmfile.resize(100, 100); }, { // 这个是关键 imageMagick: true })) .pipe(gulp.dest('dist'));
再啰嗦地提一句,其实这些插件的使用方法,api
都可以在npmjs上找到~ 只要你看得懂一点点的英文
好了,我们需要把尺寸为奇数的x2
图修改成偶数
把gulpfiles
的代码改成
gulp.task('resizeImg', function resizeImages () { return gulp.src('src/sprite/**/*@2x.png') .pipe(gm(function (gmfile, done) { gmfile.size(function (err, size) { if(size.width%2!==0||size.height%2!==0) { done(null, gmfile.resize( size.width + size.width%2, size.height + size.height%2 )); } }); }, { imageMagick: true } )) .pipe(gulp.dest('src/sprite/')); });
试跑一下...紧张.jpeg
果然没成功 QAQ 发现是那个if
出问题,把它去掉就好了
gulp.task('resizeImg', function resizeImages () { return gulp.src('src/sprite/**/*@2x.png') .pipe(gm(function (gmfile, done) { gmfile.size(function (err, size) { var wid = size.width + size.width%2, hei = size.height + size.height%2; // resize(width,[height],"!") 叹号表示强制按指定大小缩放 done(null, gmfile.resize(wid, hei, "!")); }); }, { imageMagick: true } )) .pipe(gulp.dest('src/sprite/')); });
看一眼我们生成的图片,嗯,尺寸都变成偶数了...
表示血槽已空 (:з」∠) 插件什么的真是太难玩了
然后我们得让gulp
跑sprite
命令时先跑一下resizeImg
修改一下代码
gulp.task('sprite', ['resizeImg'], function (...) })
DONE!
清除不必要文件
这里用gulp-clean
就好。
//======================= // 清除不必要文件 //======================= gulp.task('clean', function() { gulp.src('dist/img/*@2x.png') .on('data',function(file){ // 这里我做了一个判断,在没有2x图的情况下,不需要清除1x图 var cFile = file.history[0].substring(file.history[0].lastIndexOf("\\")+1,file.history[0].lastIndexOf("@2x")); if(cFile) { return gulp.src('dist/img/'+cFile+'.png', {read: false}) .pipe(clean()); } }); })
最后修改一下watch
的代码
gulp.watch("src/sprite/**/*.png", ['sprite','clean']);
Finished~
愉快地玩耍
package.json
和gulpfiles.js
都上传到github上了,大家可以直接clone下来
$ npm install
后就可以跑各种命令啦~