/** * Created by littledu on 15/5/2. */ var rd = require('rd'); var gulp = require('gulp'); var path = require('path'); var gulpWebp = require('gulp-webp'); var rename = require('gulp-rename'); var replace = require('gulp-replace'); var util = require('./../lib/util'); var fs = require('fs'); module.exports = function (config, done) { var webpScript = ''; var webpMap = {}; //为了筛选webp而构建的对象 var imgArr = []; //筛选出来需要转换成 webp 的图片 var imgMap = {}; //返回给全局作 preload 判断使用{"img_name": 1, "img_name": 0} 1 为可优化成 webp var reg = null; function render_webp(src) { if (!fs.existsSync(src)) return; rd.eachFileSync(src, function (file, stats) { var extname = path.extname(file); var basename = path.basename(file, extname); if (!(basename in webpMap)) { webpMap[basename] = {}; webpMap[basename]['size'] = stats.size; webpMap[basename]['extname'] = extname; } else { if ((webpMap[basename]['size'] > stats.size) && (extname === '.webp')) { imgArr.push(basename + webpMap[basename]['extname']); imgMap[basename + webpMap[basename]['extname']] = 1; } else { imgMap[basename + webpMap[basename]['extname']] = 0; } } }); } return function () { return gulp.series( function compileSprite() { return gulp.src('./tmp/sprite/**/*') .pipe(gulpWebp()) .pipe(gulp.dest('./tmp/sprite')); }, function compileImg () { return gulp.src('./tmp/img/**/*') .pipe(gulpWebp()) .pipe(gulp.dest('./tmp/img')); }, //智能寻找 webp function find2Webp (cb) { render_webp('./tmp/sprite'); render_webp('./tmp/img'); if(imgArr.length){ reg = eval('/(' + imgArr.join('|') + ')/ig'); } cb(); }, function compileCss () { return gulp.src(['./tmp/css/**/*.css', '!./tmp/css/**/*.webp.css']) .pipe(rename({suffix: '.webp'})) .pipe(replace(reg, function (match) { if(match){ return match.substring(0, match.lastIndexOf('.')) + '.webp'; } })) .pipe(gulp.dest('./tmp/css')); }, function insertWebpJs () { var preload_script = ''; return gulp.src('./tmp/html/**/*.html') .pipe(replace('data-href', 'href')) .pipe(replace(/(link.*?)href/ig, '$1data-href')) .pipe(replace('', webpScript)) .pipe(replace('', preload_script)) .pipe(gulp.dest('./tmp/html')); } ); } }