gulp实现自动化打包、监听文件变化

以往用jq写页面,都是在本地直接打开html文件,修改之后在浏览器F5刷新才能看到变化,实在是相当费劲。为了以后节省更多的开发时间,实现能够监听改动,最后自动构建和打包,我特地学习了gulp。

gulp是一款基于stream(流)的自动化构建工具,主要用来设定程序自动处理静态资源的工作。简单的说,gulp就是用来打包项目的。gulp很容易上手,只要掌握几个api即可。

官网:https://gulpjs.com/

中文官网:https://www.gulpjs.com.cn/docs/

我使用gulp主要是为了想做css、js、image资源的压缩和打包,添加时间戳。这里我引入gulp的几个插件:

images:

gulp-imagemin [ 压缩图片 ]

css:

gulp-sass [ sass编译,我习惯用sass写样式,这里需要这个插件帮助转css ]

gulp-postcss、autoprefixer [ 根据设置浏览器版本自动处理浏览器前缀,使用她我们可以很潇洒地写代码,不必考虑CSS针对浏览器的兼容性问题 ]

postcss-px2rem [ px转rem ]

cssmin [ 压缩css ]

javascript:

gulp-uglify [ 压缩js ]

还有其他几个插件

gulp-clean [ 删除文件、文件夹 ]

run-sequence [ 按顺序执行task ,这个很重要,因为gulp中task是异步进行的,有时候有些任务需要先完成A才能执行B,不然会报错 ]

gulp-rev [ 添加时间戳 ]

gulp-rev-collector [ 时间戳添加后再在html 里面替换原有的文件 ]

browser-sync [ 让浏览器实时、快速响应文件更改(html、js、css、sass、less等)并自动刷新页面 ]

gulp可以让你根据需要自定义你的工作流。在此附上我的项目结构

项目结构

安装:

首先确认你的环境都准备好了,安装gulp。可参考https://gulpjs.com/docs/en/getting-started/quick-start

最后gulp -v # 测试是否安装成功

在根目录下创建gulpfile.js,这个文件用来配置所有任务。

首先将需要用到的插件下载安装:npm install 插件名 --save-dev。

在gulpfile.js中引用所用到的所有插件,注意:gulp要首先被引用。

然后是创建任务,如果任务较多,可以分小任务创建。


// 压缩css

    gulp.task('miniCss', function () {

        return gulp.src(['src/resource/css/*.scss'])

            .pipe(sass().on('error', function (err) {

                console.error('Error', err.message);

            }))

            .pipe(postcss([px2rem({remUnit: 100}), autoprefixer()]))

            // 保留一份原文件

            // .pipe(gulp.dest('dist/resource/css'))

            .pipe(postcss([ autoprefixer() ]))

            .pipe(cssmin())

            .pipe(rev()) //css增加md5版本号,6位

            .pipe(gulp.dest('dist/resource/css'))

            .pipe(rev.manifest())

            .pipe(gulp.dest('rev/css'));

    });

    // 压缩js

    gulp.task('miniScripts', function () {

        return gulp.src('src/resource/js/*.js')

            // .pipe(gulp.dest('dist/resource/js'))

            .pipe(uglify())

            .pipe(rev()) //css增加md5版本号,6位

            .pipe(gulp.dest('dist/resource/js'))

            .pipe(rev.manifest())

            .pipe(gulp.dest('rev/js'));

    });

    // 输出i18n

    gulp.task('copy',  function() {

        return gulp.src('src/resource/i18n/**/*.properties')

        .pipe(gulp.dest('dist/resource/i18n/'))

    });

    // 输出字体

    gulp.task('font', function () {

        return gulp.src('src/resource/fonts/*.{otf,eot,svg,ttf,woff,woff2}')

            .pipe(gulp.dest('dist/resource/fonts'))

    });

    // 输出html

    gulp.task('html', function () {

        return gulp.src(['src/*.html'])

            .pipe(gulp.dest('dist'));

    });

    // 压缩图片

    gulp.task('miniImages', function () {

        return gulp.src('src/resource/images/*.{jpg,png,gif,ico}')

            .pipe(imagemin()) 

            .pipe(gulp.dest('dist/resource/images'))

    });

    // 给有引用静态资源的html更改引用的文件名字

    gulp.task('rev', function() {

        gulp.src(['rev/**/*.json', 'src/*.html'])                    

        .pipe(revCollector())                                   

        .pipe(gulp.dest('dist'));                                

    });

// 开启服务,监听代码改动自动刷新页面

gulp.task('browserSyncInit', function () {

        browserSync.init({

            server: {

                baseDir: "./dist",

                index: '/index.html',

            },

            port: 8989

        })

    });

    // 清空dist

    gulp.task('clean', function () {

        return gulp.src('dist', {read: false})

            .pipe(clean());//清除dist目录

    });


上面将多个任务分别声明,然后通过组合将上面的任务串起来:

 // build组合

    gulp.task('build', function(done) {

        runSequence(

            ['font', 'copy', 'miniImages'],

            ['miniCss'],

            ['miniScripts'],

            ['rev'],

            ['browserSyncInit'],

            done);

    });

     // 打包命令

    gulp.task('default', function (done) {

        runSequence(

            ['clean'],

            ['build'],

            done);

    });

默认在命令窗口执行gulp,就会执行名为default的task。于是我们命令打包生成了文件夹dist,并且终端开启了一个localhost:8989服务。我们可以借此查看生成的dist文件在服务上能否正常运行。

上面实现了代码的压缩打包,gulp实现监听文件变化其实也是类似,不多说,附上代码:


// 监听任务

    // 监听css

    gulp.task('listenCss', function () {

        return gulp.src(['src/resource/css/*.scss'])

            .pipe(sass().on('error', function (err) {

                console.error('Error', err.message);

            }))

            .pipe(postcss([px2rem({remUnit: 100}), autoprefixer()]))

            .pipe(postcss([ autoprefixer() ]))

            .pipe(gulp.dest('test/resource/css'))

            .pipe(browserSync.stream());

    })

    // 监听js

    gulp.task('listenScripts', function() {

        return gulp.src(['src/resource/js/*.js'])

            .pipe(gulp.dest('test/resource/js'))

            .pipe(browserSync.stream());

    })

    // 输出i18n

    gulp.task('listenI18n',  function() {

        return gulp.src('src/resource/i18n/**/*.properties')

            .pipe(gulp.dest('test/resource/i18n/'))

            .pipe(browserSync.stream())

    });

    // 刷新html

    gulp.task('htmlReload', function () {

        return gulp.src('src/*.html')

            .pipe(gulp.dest('test'))

            .pipe(browserSync.stream());

    });

    // 监听图片

    gulp.task('listenImages', function () {

        return gulp.src('src/resource/images/*.{jpg,png,gif,ico}')

            .pipe(gulp.dest('test/resource/images'));

    });

    // 输出字体

    gulp.task('listenFonts',  function() {

        return gulp.src('src/resource/fonts/*.{otf,eot,svg,ttf,woff,woff2}')

        .pipe(gulp.dest('test/resource/fonts'));

    });

    // 监听

    gulp.task('watch', function () {

        gulp.watch('src/resource/css/*.scss').on('change', function (file) {

            gulp.start('listenCss');

        });

        gulp.watch('src/resource/js/*.js').on('change', function (file) {

            gulp.start('listenScripts');

        });

        gulp.watch('src/*.html').on('change', function(){

            gulp.start('htmlReload');

        });

        gulp.watch('src/resource/i18n/**/*.properties').on('change', function (file) {

            gulp.start('listenI18n');

        });

    });

// 清空test

    gulp.task('cleanTest', function () {

        return gulp.src('test', {read: false})

            .pipe(clean());//清除test目录

    });

gulp.task('browserSyncTestInit', function () {

        browserSync.init({

            server: {

                baseDir: "./test",

                index: '/index.html',

            },

            port: 8989

        })

    });

// dev组合

    gulp.task('develop', function(done){

        runSequence(

            ['listenFonts', 'listenI18n', 'listenImages'],

            ['listenCss'],

            ['listenScripts'],

            ['htmlReload'],

            ['browserSyncTestInit'],

            done);

    });

    // 本地跑命令

    gulp.task('dev', function (done) {

        runSequence(

            ['cleanTest'],

            ['develop'],

            ['watch'],

            done);

    });


在终端输入“gulp dev”即可。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容