gulp基础使用

原文地址

安装

  1. 安装淘宝npm镜像:

    sudo npm install -g cnpm --registry=https://registry.npm.taobao.org

    之后可将npm修改为cnpm

  2. 首先我们要全局安装一遍:

    sudo npm install gulp -g

    • sudo是以管理员身份执行命令,一般会要求输入电脑密码
    • npm是安装node模块的工具,执行install命令
    • -g表示在全局环境安装,以便任何项目都能使用它
    • 最后,gulp是将要安装的node模块的名字
    屏幕快照 2016-07-22 08.44.11.png
  3. 验证是否正确安装

    输入gulp -v验证gulp正确安装。

  4. 到项目目录下安装一遍

    命令行输入cd 当前项目路径,到达当前项目目录后,

    执行npm install gulp --save-dev

    使用—-save-dev来更新package.json文件,更新devDependencies值,以表明项目需要依赖gulp。

    屏幕快照 2016-07-22 08.49.04.png

安装gulp插件

我们将要使用Gulp插件来完成我们以下任务:

插件名称 插件说明
gulp-htmlmin 压缩html
gulp-ruby-sass sass的编译
gulp-autoprefixer 添加CSS前缀
gulp-clean-css 压缩css
gulp-concat 合并文件
gulp-uglify 压缩js
gulp-imagemin 压缩图片
gulp-ng-annotate 添加angular依赖注入
gulp-strip-debug 去掉控制器log等语句
gulp-ngmin 压缩angularJs
gulp-rename 重命名文件
gulp-livereload 自动刷新页面
gulp-cache 图片缓存
gulp-notify 更改提醒
del 清除文件

安装以上所有插件需要运行如下命令:

npm install gulp-htmlmin gulp-ruby-sass gulp-autoprefixer gulp-clean-css  gulp-concat gulp-uglify gulp-imagemin gulp-ng-annotate gulp-strip-debug gulp-ngmin gulp-rename gulp-livereload  gulp-cache gulp-notify  del  --save-dev
屏幕快照 2016-07-22 11.16.46.png

加载插件

接着在项目目录下创建一个gulpfile.js文件,用于配置加载插件:

引入插件:

var gulp = require('gulp'),
    htmlmin = require('gulp-htmlmin'),
    sass = require('gulp-ruby-sass'),
    autoprefixer = require('gulp-autoprefixer'),
    minifycss = require('gulp-clean-css'),
    jshint = require('gulp-jshint'),
    uglify = require('gulp-uglify'),
    imagemin = require('gulp-imagemin'),
    rename = require('gulp-rename'),
    concat = require('gulp-concat'),
    notify = require('gulp-notify'),
    cache = require('gulp-cache'),
    livereload = require('gulp-livereload'),
    del = require('del'),
    ngAnnotate = require('gulp-ng-annotate'),
    stripDebug = require('gulp-strip-debug'),
    ngmin = require('gulp-ngmin');

建立任务

  • 编译sass、自动添加css前缀和压缩

以下代码的主要目的:首先我们编译sass,添加前缀,保存到我们指定的目录下面,还没结束,我们还要压缩,给文件添加.min后缀再输出压缩文件到指定目录,最后提醒任务完成了。

gulp.task('styles', function() {
    return gulp.src('src/www/main.scss')
        .pipe(sass({ style: 'expanded' }))//将sass文件编译为css
        .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))//添加css前缀
        .pipe(gulp.dest('dist/assets/css'))//保存到指定文件夹
        .pipe(rename({ suffix: '.min' }))//重命名文件,添加.min
        .pipe(minifycss())//压缩css
        .pipe(gulp.dest('dist/assets/css'))
        .pipe(notify({ message: 'Styles task complete' }));//提示
});

解释一下:

gulp.task('styles', function () {...});

gulp.task这个API用来创建任务,在命令行下可以输入gulp styles来执行上面的任务。

return gulp.src('src/styles/main.scss')

gulp.src这个API设置需要处理的文件的路径,可以是多个文件以数组的形式[main.scss, vender.scss],也可以是正则表达式/ * / * .scss。

.pipe(sass({ style: 'expanded' }))

我们使用.pipe()这个API将需要处理的文件导向sass插件,那些插件的用法可以在github上找到,为了方便大家查找我已经在上面列出来了。

.pipe(gulp.dest('dist/assets/css'));

gulp.dest()API设置生成文件的路径,一个任务可以有多个生成路径,一个可以输出未压缩的版本,另一个可以输出压缩后的版本。

为了更好的了解Gulp API,强烈建议看一下Gulp API文档,其实Gulp API就这么几个。

样例

以下是我自己创建的任务,仅供参考:

  • 压缩html

      gulp.task('htmlmin', function() { //压缩html
          return gulp.src('src/www/index.html')
              .pipe(htmlmin({
                  removeComments: true, //清除HTML注释
                  collapseWhitespace: true, //压缩HTML
                  minifyJS: true, //压缩页面JS
                  minifyCSS: true //压缩页面CSS        }))
              .pipe(gulp.dest('dist/www/'))
              .pipe(notify({ message: 'htmlmin task complete' }));
      });
    
  • 压缩js

      gulp.task('minCom', function() { //压缩comm.js
          return gulp.src('src/www/app/comm.js')
              .pipe(rename({ suffix: '.min' }))//重命名
              .pipe(uglify())//压缩js
              .pipe(gulp.dest('dist/www/js'))
              .pipe(notify({ message: 'minCom task complete' }));
      });
    
  • 压缩图片

      gulp.task('img', function() {
          return gulp.src('src/www/img/*')
              .pipe(imagemin({
                  optimizationLevel: 3,
                  progressive: true,
                  interlaced: true,
              })) //压缩图片
              .pipe(gulp.dest('dist/www/img'))
              .pipe(notify({ message: 'Images task complete' }));
      });
    

这个任务使用imagemin插件把所有在src/images/目录以及其子目录下的所有图片(文件)进行压缩,我们可以进一步优化,利用缓存保存已经压缩过的图片,使用之前装过的gulp-cache插件,不过要修改一下上面的代码,将这行代码:

.pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true }))

修改成:

.pipe(cache(imagemin({ optimizationLevel: 5, progressive: true, interlaced: true })))

现在,只有新建或者修改过的图片才会被压缩了。

  • 清理数据

在任务执行前,最好先清除之前生成的文件:

gulp.task('clean', function(cb) {
    del(['dist/www/css', 'dist/www/js'], cb)
});

在这里没有必要使用Gulp插件了,可以使用NPM提供的插件。我们用一个回调函数(cb)确保在退出前完成任务。

  • 压缩angularJs

合并压缩angularJs,保证依赖

gulp.task('Angularjs', function() { //合并压缩angular.js
    return gulp.src([
            'src/www/app/main.js',
            'src/www/app/map/init.js',
        ])
        .pipe(ngAnnotate())
        .pipe(ngmin({ dynamic: false }))
        .pipe(stripDebug())
        .pipe(uglify({ outSourceMap: false }))
        .pipe(concat('all.min.js'))
        .pipe(gulp.dest('dist/www/js'));
});

设置默认任务(default)

我们在命令行下输入gulp执行的就是默认任务,现在我们为默认任务指定执行上面写好的三个任务:

gulp.task('default', ['clean'], function() {
    gulp.start( 'htmlmin', 'styles', 'minCom', 'img');
});

在这个例子里面,clean任务执行完成了才会去运行其他的任务,在gulp.start()里的任务执行的顺序是不确定的,所以将要在它们之前执行的任务写在数组里面。

监听文件

为了监听文件的是否修改以便执行相应的任务,我们需要创建一个新的任务,然后利用gulp.watch API实现:

gulp.task('watch', function() {
  // Watch .scss files
  gulp.watch('src/styles/**/*.scss', ['styles']);
  // Watch .js files
  gulp.watch('src/scripts/**/*.js', ['scripts']);
  // Watch image files
  gulp.watch('src/images/**/*', ['images']);
});

我们将不同类型的文件分开处理,执行对应的数组里的任务。现在我们可以在命令行输入gulp watch执行监听任务,当.sass、.js和图片修改时将执行对应的任务。

  • 自动刷新页面

Gulp也可以实现当文件修改时自动刷新页面,我们要修改watch任务,配置LiveReload:

gulp.task('watch', function() {
  // Create LiveReload server  livereload.listen();
  // Watch any files in dist/, reload on change
  gulp.watch(['dist/**']).on('change', livereload.changed);
});

要使这个能够工作,还需要在浏览器上安装LiveReload插件。

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

推荐阅读更多精彩内容