gulp自动化构建工具学习

原文地址:https://yawuling.com/201706251602.html

Gulp.js 是一个自动化构建工具,开发者可以使用它在项目开发过程中自动执行常见任务。在这里介绍了gulp的入门,插件和gulpfile.js配置文件。

入门
  1. 全局安装gulp

     $ npm install -g gulp
    
  2. 新建一个文件夹作为项目,进入该文件夹,初始化

     $ mkdir example
     $ npm init
    
  3. 安装开发依赖(devDependences

     $ npm install --save-dev gulp
    
  4. 在项目根目录新建 gulpfile.js 文件

     $ touch gulpfile.js
    
  5. 编辑gulpfile.js文件

    var gulp = require('gulp');
    
    gulp.task('default', function () {
        //默认任务代码
    });
    
  6. 命令行运行gulp,即可运行默认任务
    $ gulp


api介绍

这里只列出api常用用法,了解更多请查阅官网http://www.gulpjs.com.cn/docs/api/

  1. gulp.src(globs[, options])

    输出符合匹配的文件并返回一个stream,可pipe到其他插件

    • golbs(类型:StringArray)

      String: 'src/js/*.js'
      Array: ['src/js/*.js', 'src/css/*.css']

  2. gulp.dest(path[, options])

    pipe进来的数据转存为指定文件夹下的文件,若指定文件夹不存在,则自动创建该文件夹

    • path(类型:StringFunction)

      String: 'dist/js'
      Function: 在函数中返回相应路径

  3. gulp.task(name[, deps], fn)

    定义一个任务

    gulp.task('something', functio () {
        doSomething();
    });
    
    • name(类型:String)

      任务的名字,可在命令行中通过name运行任务,$ gulp name

    • deps(类型:Array)

      一个包含任务列表的数组,这些任务会在当前任务运行之前完成

    • fn(类型:Function)

      该任务要执行的内容

  4. gulp.watch(glob[, opts], tasks) 或 gulp.watch(globs[, opts, cb])

    文件监视,当指定匹配文件发生变化时,执行tasks或函数cb

    • glob(类型:StringArray)

    • tasks(类型:StringArray)

      文件变动后执行之前定义好的任务

    • cb(类型: Function)

      传入一个记录文件变动的event对象,event.type记录变动类型:added, changed, deletedevent.path记录变动文件的路径


gulp插件介绍
  1. gulp-less/gulp-sass

    预编译less/sass文件为css文件

    安装:$ npm install --save-dev gulp-less

  2. gulp-autoprefixer

    设置浏览器版本,css文件自动添加浏览器前缀

    安装:$ npm install --save-dev gulp-autoprefixer

  3. gulp-minify-css

    压缩css文件

    安装:$ npm install --save-dev gulp-minify-css

  4. gulp-rename

    重命名要输出的文件,如将.css重命名为.min.css

    安装:$ npm install --save-dev gulp-rename

  5. vinyl-buffer

    将vinyl对象内容中的stream转换为buffer

    安装:$ npm install --save-dev vinyl-buffer

  6. vinyl-source-stream

    将Browserify的bundle()的输出转换为Gulp可用的vinyl流

    安装:$ npm install --save-dev vinyl-source-stream

  7. gulp-sourcemaps

    编写内联sourcemaps

    安装:$ npm install --save-dev gulp-sourcemaps

  8. browserify

    可以让你使用类似于 node 的 require() 的方式来组织浏览器端的 Javascript 代码,在这里用来管理依赖

    安装:$ npm install --save-dev browserify

  9. babelify

    将ES6转换成ES5

    安装:$ npm install --save-dev babelify

  10. gulp-uglify

    压缩 JavaScript 文件

    安装:$ npm install --save-dev gulp-uglify

  11. gulp-imagemin

    压缩 png,jpeg,gif和svg图片资源

    安装:$ npm install --save-dev gulp-imagemin

  12. gulp-cache

    图片缓存,只有图片替换了才压缩

    安装:$ npm install --save-dev gulp-cache

  13. gulp-clean

    移除文件或文件夹

    安装:$ npm install --save-dev gulp-clean

  14. gulp-util

    包含gulp的一些实用功能,在这里用来打印编译错误

    安装:$ npm install --save-dev gulp-util

  15. gulp-notify

    当文件变更时提醒

    安装:$ npm install gulp-notify

  16. gulp-connect

    gulp中用来运行服务器的插件,内含LiveReload,自动刷新浏览器

    安装:$ npm install --save-dev gulp-connect


gulpfile.js文件配置
  • 内含 ES6 转 ES5
var gulp = require('gulp'),
    less = require('gulp-less'),
    autoprefixer = require('gulp-autoprefixer'),
    minifycss = require('gulp-minify-css'),
    uglify = require('gulp-uglify'),
    imagemin = require('gulp-imagemin'),
    rename = require('gulp-rename'),
    clean = require('gulp-clean'),
    cache = require('gulp-cache'),
    notify = require('gulp-notify'),
    browserify = require('browserify'),
    babelify = require('babelify'),
    buffer = require('vinyl-buffer'),
    source = require('vinyl-source-stream'),
    sourcemaps = require('gulp-sourcemaps'),
    gutil = require('gulp-util'),
    connect = require('gulp-connect');

/*
 * styles任务,将'src/less'目录下的less文件转换成css文件,
 * 并加上浏览器前缀,存放于'dist/css'目录下,之后重命名加上.min,压缩,
 * 保存为.min.css文件,之后刷新浏览器,并提醒style任务完成
 */
gulp.task('styles', function() {
    return gulp.src('src/less/*.less')
        .pipe(less())
        .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
        .on('error', gutil.log)
        .pipe(gulp.dest('dist/css'))
        .pipe(rename({suffix: '.min'}))
        .pipe(sourcemaps.init())
        .pipe(minifycss())
        .pipe(sourcemaps.write('./'))
        .pipe(gulp.dest('dist/css'))
        .pipe(connect.reload())
        .pipe(notify({message: 'style task complete'});
});

/*
 * scripts任务,通过browserify设置入口文件,然后用babelify将
 * es6转换成es5,保存在'dist/js'目录下,之后压缩js文件,重命名
 * 保存为.min.js文件
 */
gulp.task('scripts', function() {
    var b = browserify({
        entries: 'src/js/cart.js',
        debug: true
    });

    return b.transform(babelify.configure({
            presets: ["es2015"]
        }))
        .bundle()
        .on('error', gutil.log)
        .pipe(source('cart.js'))
        .pipe(gulp.dest('dist/js'))
        .pipe(buffer())
        .pipe(sourcemaps.init({loadMaps: true}))
        .pipe(uglify())
        .on('error', gutil.log)
        .pipe(sourcemaps.write('./'))
        .pipe(rename({ suffix: '.min'}))
        .pipe(gulp.dest('dist/js'))
        .pipe(connect.reload());
});

/*
 * images任务,读取'src/img'目录下的图片,压缩并保存到'dist/img'目录下
 */
gulp.task('images', function() {
    return gulp.src('src/img/*')
        .pipe(cache(imagemin([
            imagemin.gifsicle({interlaced: true}),
            imagemin.jpegtran({progressive: true}),
            imagemin.optipng({optimizationLevel: 5}),
            imagemin.svgo({plugins: [{removeViewBox: true}]})])))
        .on('error', gutil.log)
        .pipe(gulp.dest('dist/img'))
        .pipe(connect.reload());
});

/*
 * html任务,读取'src'目录下的html文件,并保存到'dist'目录下
 */
gulp.task('html', function() {
    return gulp.src('src/shangcheng/*.html')
        .pipe(gulp.dest('dist/'))
        .pipe(connect.reload());
});

/*
 * connect任务,运行服务器并自动刷新浏览器
 */
gulp.task('connect', function() {
    connect.server({
        livereload: true
    });
});

/*
 * clean任务,将dist目录下的css文件,js文件,图片文件和html文件清除
 */
gulp.task('clean', function() {
    return gulp.src(['dist/css', 'dist/js', 'dist/img', 'dist/*.html'], {read: false})
        .pipe(clean());
});

/*
 * 默认任务,在开始执行styles任务,scripts任务,images任务,html任务之前先执行clean任务
 */
gulp.task('default', ['clean'], function() {
    gulp.start('styles', 'scripts', 'images', 'html');
});

/*
 * 监视任务,监听less文件,js文件,图片文件和html文件的变更
 */
gulp.task('watch', function() {

    //监听所有.less
    gulp.watch('src/less/*.less', ['styles']);

    //监听所有.js文件
    gulp.watch('src/js/*.js', ['scripts']);

    //监听所有图片文件
    gulp.watch('src/img/*', ['images']);

    //监听html文件
    gulp.watch('src/*.html', ['html']);
});

/*
 * server任务,执行connect任务和watch任务
 */
gulp.task('server', ['connect', 'watch']);
  • 不含 ES6 的 js 文件任务
gulp.task('scripts', function() {
    return gulp.src('src/js/*.js')
        .pipe(gulp.dest('dist/js'))
        .pipe(rename({ suffix: '.min' }))
        .pipe(sourcemaps.init({loadMaps: true}))
        .pipe(uglify())
        .pipe(sourcemaps.write('./'))
        .on('error', gutil.log)
        .pipe(gulp.dest('dist/js'))
        .pipe(connect.reload());
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342

推荐阅读更多精彩内容