gulp实战(4) - 自动化打包图片(完整版)

原码目录:src
打包目录:build

目标:src 中的图片文件是未压缩的,打包至 build 目录后,生成压缩后的文件,名字与之前保持一致

分析:
1. 打包时,build目录中可能已经存在上一次打包生成的旧文件,所以每次打包都应该先清理掉。
2. 打包时需要执行压缩操作
3. 打包后,每次修改 src 目录下的图片,应该即时重新打包
4. 打包时的执行顺序为:清理 -> 打包 -> 监控修改,而且后一步必须在前一步操作完成后才可以执行。

第一步:设置变量

var config = {
    src: "src",
    dest: "build"
}

第二步:清理

涉及插件 [ gulp-clean ]

gulp-clean:清理文件及文件夹

/**
 * 清理目标目录
 */
gulp.task('clean', function(cb) {
    pump([
        gulp.src(config.dist),
        clean()
    ], cb)
})

第三步:执行文件操作

涉及插件 [ gulp-imagemin, imagemin-pngquant ]

gulp-imagemin: 压缩图片
imagemin-pngquant: 深度压缩PNG格式图片

/**
 * 执行图片压缩
 */
gulp.task('minify:image', [], function(cb) {

    pump([
        // 获取原目录下所有的html文件
        gulp.src(config.src + "/**/*.{png,jpg,gif,ico,jpeg}"),
        imagemin({
            optimizationLevel: 5,   //类型:Number  默认:3  取值范围:0-7(优化等级)
            progressive: true,      //类型:Boolean 默认:false 无损压缩jpg图片
            interlaced: true,       //类型:Boolean 默认:false 隔行扫描gif进行渲染
            multipass: true,        //类型:Boolean 默认:false 多次优化svg直到完全优化
            svgoPlugins: [{removeViewBox: false}],  //不要移除svg的viewbox属性
            use: [pngquant()]       //使用pngquant深度压缩png图片的imagemin插件
        }),
        // 输出至目标目录
        gulp.dest(config.dist)

    ], cb);

});

第四步:监听文件变更

删除文件时似乎并不能被监听到

/**
 * 监听JS文件变改,即时调用任务执行JS增量打包
 */
gulp.task('watch', [], function(cb) {

    gulp.watch(config.src + "/**/*.html", ['minify:image']);

});

第五步:安排执行顺序

涉及插件 [ run-sequence ]

run-sequence:任务同步

/**
 * 开始执行
 */
gulp.task('default', function(cb) {
    sequence('clean', 'minify:image', 'watch', cb);
});

完整版文档

var gulp            = require('gulp'),
    clean           = require('gulp-clean'),
    imagemin        = require('gulp-imagemin'),
    pngquant        = require('imagemin-pngquant'),
    pump            = require('pump'),
    sequence        = require('run-sequence');

var config = {
    src: "src",
    dist: "build"
}

/**
 * 清理目标目录
 */
gulp.task('clean', function(cb) {
    pump([
        gulp.src(config.dist),
        clean()
    ], cb)
})

/**
 * 执行图片压缩
 */
gulp.task('minify:image', [], function(cb) {

    pump([
        // 获取原目录下所有的html文件
        gulp.src(config.src + "/**/*.{png,jpg,gif,ico,jpeg}"),
        imagemin({
            optimizationLevel: 5,   //类型:Number  默认:3  取值范围:0-7(优化等级)
            progressive: true,      //类型:Boolean 默认:false 无损压缩jpg图片
            interlaced: true,       //类型:Boolean 默认:false 隔行扫描gif进行渲染
            multipass: true,        //类型:Boolean 默认:false 多次优化svg直到完全优化
            svgoPlugins: [{removeViewBox: false}],  //不要移除svg的viewbox属性
            use: [pngquant()]       //使用pngquant深度压缩png图片的imagemin插件
        }),
        // 输出至目标目录
        gulp.dest(config.dist)

    ], cb);

});

/**
 * 监控
 */
gulp.task('watch', [], function(cb) {

    gulp.watch(config.src + "/**/*.{png,jpg,gif,ico,jpeg}", ['minify:image']);

});

/**
 * 开始执行
 */
gulp.task('default', function(cb) {
    sequence('clean', 'minify:image', 'watch', cb);
});
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用 `gulp-useref` 并过滤指定 js 文件的示例: ```javascript const gulp = require('gulp'); const useref = require('gulp-useref'); gulp.task('build', function() { return gulp.src('src/*.html') .pipe(useref({ searchPath: ['src', '.'] })) // 过滤掉不需要处理的 js 文件 .pipe(gulp.dest('dist')); }); ``` 在这个示例中,我们使用 `gulp-useref` 来处理 HTML 文件,并将注释块中引用的 JS、CSS 文件合并到一个或多个文件中。同时,我们通过 `searchPath` 属性指定了搜索路径,这样 `gulp-useref` 就能够正确地解析 HTML 文件中的相对路径了。 接着,我们通过 `pipe` 方法将处理后的文件输出到 `dist` 目录中。在这个过程中,我们也可以使用 `gulp-if` 来过滤掉不需要处理的文件。例如,如果我们只想处理所有 `src` 目录下的 JS 文件,可以这样写: ```javascript const gulp = require('gulp'); const useref = require('gulp-useref'); const gulpIf = require('gulp-if'); gulp.task('build', function() { return gulp.src('src/*.html') .pipe(useref({ searchPath: ['src', '.'] })) // 只处理 src 目录下的 js 文件 .pipe(gulpIf('**/*.js', gulp.dest('dist'))) .pipe(gulp.dest('dist')); }); ``` 在这个示例中,我们使用 `gulp-if` 来过滤掉不需要处理的 JS 文件,而只处理 `src` 目录下的 JS 文件。这样,我们就能够只处理我们需要的文件了。 希望这个回答能够帮到你,如果你还有其他问题,可以继续问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值