gulp入门学习实例
好久都没有更新博客了,每天繁忙的工作,下班之后都不想开设备了。前段时间有幸学习了一下gulp这款构建工具,现在和大家分享一下。
为什么使用Gulp
Gulp基于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:
ulp.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插件来完成我们以下任务:
- sass的编译(gulp-ruby-sass)
- 自动添加css前缀(gulp-autoprefixer)
- 压缩css(gulp-minify-css)
- js代码校验(gulp-jshint)
- 合并js文件(gulp-concat)
- 压缩js代码(gulp-uglify)
- 压缩图片(gulp-imagemin)
- 自动刷新页面(gulp-livereload)
- 图片缓存,只有图片替换了才压缩(gulp-cache)
- 更改提醒(gulp-notify)
- 清除文件(del)
安装这些插件需要运行如下命令:
$ 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在根目录下,然后在里面加载插件:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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' }));
});
让我解释一下:
1 |
gulp.task('styles', function () {...}); |
gulp.task
这个API用来创建任务,在命令行下可以输入$ gulp styles
来执行上面的任务。
1 |
return gulp.src('src/styles/main.scss') |
gulp.src
这个API设置需要处理的文件的路径,可以是多个文件以数组的形式[main.scss, vender.scss]
,也可以是正则表达式/**/*.scss
。
1 |
.pipe(sass({ style: 'expanded' })) |
我们使用.pipe()
这个API将需要处理的文件导向sass插件,那些插件的用法可以在github上找到,为了方便大家查找我已经在上面列出来了。
1 |
.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插件,不过要修改一下上面的代码:
将这行代码:
1 |
.pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })) |
修改成:
1 |
.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.satrt()
里的任务执行的顺序是不确定的,所以将要在它们之前执行的任务写在数组里面。
监听文件
为了监听文件的是否修改以便执行相应的任务,我们需要创建一个新的任务,然后利用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插件,除此之外还能这样做
所有任务放一起
/*!
* 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/
https://github.com/gulpjs/gulp/blob/master/docs/API.md
在此声明,本文由本人整理,并非出自本人之手!原文链接已无从查找!
gulp入门学习实例的更多相关文章
- gulp入门学习教程(入门学习记录)
前言 最近在通过教学视频学习angularjs,其中有gulp的教学部分,对其的介绍为可以对文件进行合并,压缩,格式化,监听,测试,检查等操作时,看到前三种功能我的心理思想是,网上有很多在线压缩,在线 ...
- gulp入门学习
一.gulp简介 gulp是一个自动化构建工具.在开发过工程中,能够使用gulp对项目进行自动构建,大大提高工作效率. 二.安装gulp 在安装gulp之前先要确认已经正确安装了node.js,然后在 ...
- java struts2入门学习实例--使用struts2快速实现上传
一.文件上传快速入门 1).关于上传表单三要素 >>尽量以POST请求方式上传,因为GET支持文件大小是有限制的. >>必须要加上enctype="multipart ...
- java struts2入门学习实例--使用struts进行验证
一.为什么要进行验证? 验证几乎是注册登录的必须前提,验证的主要作用有两点: 1.安全性 2.对用户提供差异化服务. 二.如何验证? ActionSupport类中有一个validate()方法,这是 ...
- java struts2入门学习实例--用户注册
一.用户注册示例 register.jsp <%@ page language="java" contentType="text/html; charset=UT ...
- java struts2入门学习实例--将客户端IP地址和访问方式输出到浏览器
实例1:实现客户端IP地址和访问方式输出到浏览器. IpAction.java package com.amos.web.action; import javax.servlet.http.HttpS ...
- java struts2入门学习实例--使用struts2快速实现多个文件上传
一.错误提示信息配置 昨天说到更改默认错误配置信息,我测试很多遍,一直都不对.下面贴出来,待以后有好方法了再补充吧. 首先新建一个properties文件,这里命名为testupload.proper ...
- java struts2入门学习实例--用户注册和用户登录整合
需求: 1.用户注册(user_register.jsp)-->注册成功(UserRegister.action)-->显示注册信息(register_success.jsp)2.用户登录 ...
- JSTL简单入门学习实例
Maven依赖: <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</ ...
随机推荐
- overcast
关于一个利用relative的简单布局,firefox上出现一点问题,暂且不明原因 firefox的 chrome的 代码记录 <!DOCTYPE html> <html lang= ...
- 什么是 Terminal
从用户的角度来看,Terminal 是键盘和显示器的组合,也称为 TTY(电传打字机的缩写).键盘输入字符,显示器显示字符. 从进程的角度来看,终端是字符设备,可以通过 read.write.ioct ...
- 折叠UITableView分组实现方法
做项目的时侯用到了折叠分组,最近就研究了一下,找了一些网上的项目,发现有一些缺点,研究了几天自己终于写出了一个.而且分组的数据源比较灵活,每组之间的状态没有什么影响. 实现的大体思路是每个分组用一个s ...
- C# 导出word文档及批量导出word文档(4)
接下来是批量导出word文档和批量打印word文件,批量导出word文档和批量打印word文件的思路差不多,只是批量打印不用打包压缩文件,而是把所有文件合成一个word,然后通过js来调用 ...
- Sql Server添加用户
1.sa用户登陆之后,在安全性中新建登录名 2.添加登录名,下面的默认数据库选择该用户可访问的默认数据库 3.服务器角色中选择public 4.用户映射中选择该用户可访问的数据库,数据库角色一般选择p ...
- Highcharts使用====一些问题记录
问题1: 图表不显示(但有些浏览器可以显示chrome,IE.火狐不显示),原因可能是前台页面js代码有些问题.highcharts兼容性是比较好的.我遇到的问题是,使用了.replace(/T/, ...
- DOM4J 解析 XML
1.在项目根目录下新建lib文件夹 2.把dom4j文件拷贝到lib文件夹 3.dom4j,右键Build Path---->Add To Build Path 这样就添加dom4j到项目成功 ...
- c++中vector等容器的实现机制
stl容器区别: vector list deque set map-底层实现 stl容器区别: vector list deque set map (转) 在STL中基本容器有: vector.li ...
- hdoj 1233 还是畅通工程---最小生成树---prime算法
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1233 可以用Kruskal来做,不过当图的边比较稠密的时候用prime会更快一些. AC代码:296MS ...
- js版iphone通讯录分组列表效果
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...