Gulp入门基础教程

原文在此

  前言最近流行前端构建工具,苦于之前使用Grunt,代码很难阅读,现在出了Gulp,

真是摆脱了痛苦。发现了一篇很好的Gulp英文教程,整理翻译给大家看看。

为什么使用GulpGulp基于Node.js的前端构建工具,通过Gulp的插件可以实现前端

代码的编译(sass、less)、压缩、测试;图片的压缩;浏览器自动刷新,还有许多

强大的插件可以在这里查找。比起Grunt不仅配置简单而且更容易阅读和维护,我们

可以做一个对比:

Grunt:

    sass: {
dist: {
options: {
style: 'expanded'
},
files: {
'dist/assets/css/main.css': 'src/styles/main.scss',
}
}
},
autoprefixer: {
dist: {
options: {
browsers: [
'last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'
]
},
src: 'dist/assets/css/main.css',
dest: 'dist/assets/css/main.css'
}
},
grunt.registerTask('styles', ['sass', 'autoprefixer']);

在Grunt里面,每个插件使用的方式相对独立,正如上面的代码通过sass插件

将main.sass文件编译成main.css文件,接着autoprefixer插件再对编译好的

main.css文件进行修改,最后覆盖main.css。那么覆盖文件就是多余的了,有没

办法做到sass和autoprefixer一并处理完再生成main.css?我们来看看Gulp是

如何做到的:

Gulp:

 
    gulp.task('sass', function() {
return gulp.src('src/styles/main.scss')
.pipe(sass({ style: 'compressed' }))
.pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
.pipe(gulp.dest('dist/assets/css'))
});


使用Gulp我们只需要放一个路径,通过管道方式使用插件,最后生成文件,是不是

有种jQuery的感觉。这种方式不仅提高效率而且一眼就看清了输入文件和输出

文件,再也不用看gruntfile看得眼花缭乱了。

再打个比喻,Grunt的插件就像独立的工厂,这个工厂生成出来的产品打包封装好后

再送到另一个工厂去加工,使用了Gulp后实现了工厂的合并,所有东西都在一个

工厂里完成了。现在是否对Gulp感兴趣了,那就开始使用Gulp吧!

安装

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

  1. $ npm install gulp -g

复制代码

接着我们要进去到项目的根目录再安装一遍(确保你根目录存在package.json文件):

  1. $ npm install gulp --save-dev

复制代码

—save-dev这个属性会将条目保存到你package.json的devDependencies里面

安装Gulp插件

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

安装这些插件需要运行如下命令:

  1. $ npm
    install gulp-ruby-sass gulp-autoprefixer gulp-minify-css gulp-jshint
    gulp-concat gulp-uglify gulp-imagemin gulp-notify gulp-rename
    gulp-livereload gulp-cache del --save-dev

复制代码

上面是一些常用的插件,如果想要找更多的插件点击这里

加载插件

接着我们要创建一个gulpfile.js在根目录下,然后在里面加载插件:

     var gulp = require('gulp'),
sass = require('gulp-ruby-sass'),
autoprefixer = require('gulp-autoprefixer'),
minifycss = require('gulp-minify-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');

Gulp的插件和Grunt有些许不一样,Grunt插件是为了更好的完成一项任务。

就像Grunt的imagemin插件就利用了缓存来避免重复压缩,而Gulp要利用

gulp-cache来完成,当然啦,不仅限定于缓存图片。

建立任务

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

首先我们编译sass,添加前缀,保存到我们指定的目录下面,还没结束,我们还

要压缩,给文件添加.min后缀再输出压缩文件到指定目录,最后提醒任务完成了:

 
     gulp.task('styles', function() {
return gulp.src('src/styles/main.scss')
.pipe(sass({ style: 'expanded' }))
.pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
.pipe(gulp.dest('dist/assets/css'))
.pipe(rename({suffix: '.min'}))
.pipe(minifycss())
.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就这么

几个,没什么好可怕的。

js代码校验、合并和压缩

希望大家已经知道如何去创建一个任务了,接下来我们完成scripts的校验、合并和

压缩的任务吧:

     gulp.task('scripts', function() {
return gulp.src('src/scripts/**/*.js')
.pipe(jshint('.jshintrc'))
.pipe(jshint.reporter('default'))
.pipe(concat('main.js'))
.pipe(gulp.dest('dist/assets/js'))
.pipe(rename({suffix: '.min'}))
.pipe(uglify())
.pipe(gulp.dest('dist/assets/js'))
.pipe(notify({ message: 'Scripts task complete' }));
});

需要提醒的是我们要设置JSHint的reporter方式,上面使用的是default默认的,

了解更多点击这里

压缩图片

    gulp.task('images', function() {
return gulp.src('src/images/**/*')
.pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true }))
.pipe(gulp.dest('dist/assets/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/assets/css', 'dist/assets/js', 'dist/assets/img'], cb)
});

在这里没有必要使用Gulp插件了,可以使用NPM提供的插件。我们用一个回调

函数(cb)确保在退出前完成任务。

设置默认任务(default)

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

写好的三个任务:

     gulp.task('default', ['clean'], function() {
gulp.start('styles', 'scripts', 'images');
});

在这个例子里面,clean任务执行完成了才会去运行其他的任务,在gulp.start()里

的任务执行的顺序是不确定的,所以将要在它们之前执行的任务写在数组里面。

监听文件

为了监听文件的是否修改以便执行相应的任务,我们需要创建一个新的任务,然后

利用gulp.watchAPI实现:

     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插件,除此之外还能这样做:页面中添加一段脚本

所有任务放一起

     /*!
* gulp
* $ npm install gulp-ruby-sass gulp-autoprefixer gulp-minify-css gulp-jshint gulp-concat gulp-uglify gulp-imagemin gulp-notify gulp-rename gulp-livereload gulp-cache del --save-dev
*/
// Load plugins
var gulp = require('gulp'),
sass = require('gulp-ruby-sass'),
autoprefixer = require('gulp-autoprefixer'),
minifycss = require('gulp-minify-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');
// Styles
gulp.task('styles', function() {
return gulp.src('src/styles/main.scss')
.pipe(sass({ style: 'expanded', }))
.pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
.pipe(gulp.dest('dist/styles'))
.pipe(rename({ suffix: '.min' }))
.pipe(minifycss())
.pipe(gulp.dest('dist/styles'))
.pipe(notify({ message: 'Styles task complete' }));
});
// Scripts
gulp.task('scripts', function() {
return gulp.src('src/scripts/**/*.js')
.pipe(jshint('.jshintrc'))
.pipe(jshint.reporter('default'))
.pipe(concat('main.js'))
.pipe(gulp.dest('dist/scripts'))
.pipe(rename({ suffix: '.min' }))
.pipe(uglify())
.pipe(gulp.dest('dist/scripts'))
.pipe(notify({ message: 'Scripts task complete' }));
});
// Images
gulp.task('images', function() {
return gulp.src('src/images/**/*')
.pipe(cache(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })))
.pipe(gulp.dest('dist/images'))
.pipe(notify({ message: 'Images task complete' }));
});
// Clean
gulp.task('clean', function(cb) {
del(['dist/assets/css', 'dist/assets/js', 'dist/assets/img'], cb)
});
// Default task
gulp.task('default', ['clean'], function() {
gulp.start('styles', 'scripts', 'images');
});
// Watch
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']);
// Create LiveReload server
livereload.listen();
// Watch any files in dist/, reload on change
gulp.watch(['dist/**']).on('change', livereload.changed);
});

gist上有源码,并且附上Grunt的实现作为对比。
参考链接:http://markgoodyear.com/2014/01/getting-started-with-gulp/

【转】Gulp入门基础教程的更多相关文章

  1. HTML入门基础教程相关知识

    HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...

  2. jQuery Mobile 入门基础教程

    jQuery Mobile是jQuery在手机上和平板设备上的版本.jQuery Mobile 不仅会给主流移动平台带来jQuery核心库,而且会发布一个完整统一的jQuery移动UI框架. jQue ...

  3. Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级

    前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...

  4. HBase入门基础教程之单机模式与伪分布式模式安装(转)

    原文链接:HBase入门基础教程 在本篇文章中,我们将介绍Hbase的单机模式安装与伪分布式的安装方式,以及通过浏览器查看Hbase的用户界面.搭建HBase伪分布式环境的前提是我们已经搭建好了Had ...

  5. HBase入门基础教程 HBase之单机模式与伪分布式模式安装

    在本篇文章中,我们将介绍Hbase的单机模式安装与伪分布式的安装方式,以及通过浏览器查看Hbase的用户界面.搭建HBase伪分布式环境的前提是我们已经搭建好了Hadoop完全分布式环境,搭建Hado ...

  6. 经典Spring入门基础教程详解

    经典Spring入门基础教程详解 https://pan.baidu.com/s/1c016cI#list/path=%2Fsharelink2319398594-201713320584085%2F ...

  7. 超实用的Flask入门基础教程,新手必备!

    Flask入门基础教程 Flask简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活.轻便.安全且容易上手.它可以很好地结合MVC模式进行开发,开发人员分工合 ...

  8. windows下Gulp入门详细教程 &&gulp安装失败的原因(红色)

    以下教程亲自实践可行: 另外添加一个Gulp自动编译.压缩.更新.测试的教程链接:https://markpop.github.io/2014/09/17/Gulp%E5%85%A5%E9%97%A8 ...

  9. python程序入门 基础教程

    1.VSCode基础使用+VSCode调试python程序入门 2.pip 安装 3.scrapy安装 4.python解析xml

随机推荐

  1. Silverlight跨域访问wcf

    添加文件名为“clientaccesspolicy.xml”的文件 内容: <?xml version="1.0" encoding="utf-8"?&g ...

  2. 6. 支持向量机(SVM)核函数

    1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...

  3. 2. AutoEncoder在NLP中的应用

    1. AutoEncoder介绍 2. Applications of AutoEncoder in NLP 3. Recursive Autoencoder(递归自动编码器) 4. Stacked ...

  4. Android ListView的使用(三)

    前两节关于ListView的,已经使用了ArrayAdapter,SimpleAdapter了,两个比较基本的适配器 这里来用一个用的最多的一个适配器BaseAdapter. 还是先上效果图.大概和微 ...

  5. centos 7 64安装mongodb

    官网连接地址:https://www.mongodb.com/download-center?jmp=nav#community 列表中没有CentOS!!我选的是这个Linux 64-bit leg ...

  6. [uart]设置linux 串口的block方式

    1. 如果设置为非block模式: open(device, O_RDWR | O_NDELAY | O_NONBLOCK); 2. 如果设置为block模式,且读固定字节数返回则termios.c_ ...

  7. Postgres创建管理员角色

    --创建角色,赋予角色属性 ' superuser createrole createdb --添加到角色组 grant postgres to batman 以上是直接创建管理员角色,如果是修改一个 ...

  8. STM32 ADC多通道转换

    描述:用ADC连续采集11路模拟信号,并由DMA传输到内存.ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ.在每次转换结束后,由DMA循环将转换的数据传输到内存中.ADC可以连续采集N ...

  9. [开发笔记]-初学WPF之自学笔记

    一:动态加载背景图片 代码: 在窗体加载时,Window_Loaded 方法中: #region 测试动态加载背景图片 /* 1.图片右键 属性: 复制到输出目录:选择“如果较新则复制” 生成操作选择 ...

  10. win10开始菜单打不开,右下角时间点不开等问题

    服务--“User Manager",启动后,重启桌面进程