gulp ( http://markpop.github.io/2014/09/17/Gulp入门教程 )

前言

最近流行前端构建工具,苦于之前使用Grunt,代码很难阅读,现在出了Gulp,真是摆脱了痛苦。发现了一篇很好的Gulp英文教程,整理翻译给大家看看。

为什么使用Gulp

Gulp基于Node.js的前端构建工具,通过Gulp的插件可以实现前端代码的编译(sass、less)、压缩、测试;图片的压缩;浏览器自动刷新,还有许多强大的插件可以在这里查找。比起Grunt不仅配置简单而且更容易阅读和维护,我们可以做一个对比:

Grunt:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22


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:


1

2

3

4

5

6


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在根目录下,然后在里面加载插件:


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后缀再输出压缩文件到指定目录,最后提醒任务完成了:


1

2

3

4

5

6

7

8

9

10


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的校验、合并和压缩的任务吧:


1

2

3

4

5

6

7

8

9

10

11


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默认的,了解更多点击这里

压缩图片


1

2

3

4

5

6


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 })))

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

清除文件

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


1

2

3


gulp.task(‘clean‘, function(cb) {

del([‘dist/assets/css‘, ‘dist/assets/js‘, ‘dist/assets/img‘], cb)

});

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

设置默认任务(default)

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


1

2

3


gulp.task(‘default‘, [‘clean‘], function() {

gulp.start(‘styles‘, ‘scripts‘, ‘images‘);

});

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

监听文件

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


1

2

3

4

5

6

7

8


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:


1

2

3

4

5

6


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插件,除此之外还能这样做

所有任务放一起


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69


/*!

* 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的实现作为对比。

时间: 2024-11-08 02:09:18

gulp ( http://markpop.github.io/2014/09/17/Gulp入门教程 )的相关文章

联想机房同传日记--2014/09/17

今天联想的售后来501装网络和联想硬盘保护系统,随便记录一下,经验这种东西还是要慢慢积累的. 501新机房的配置早在暑假就开始忙活了,从粉刷教室到布线,购机,购置新电脑桌,组装,到现在也快两个月了, 我的任务呢主要是装系统和配置各种东西还有机房后期的使用,维护和管理:前期的工作到今天就基本完成了,所以接下来基本就是我的工作了. 机房配置: 两个新的交换机(具体型号忘了,明早补上): 一个新的华为网吧高性能千兆路由器(千兆啊): 电脑配置相当不错:i3处理器,4G内存,一个T的硬盘(真是浪费)加上

12.我们不是在真空里谈软件工程, 软件要运行在硬件芯片上面, 下面看看一个计算机芯片的发展历史: http://perspectives.mvdirona.com/2014/09/august-21-2014-computer-history-museum-presentation/ http://mvdirona.com/jrh/TalksAndPapers/DileepBhandar

电脑芯片的诞生和发展是20世纪最伟大的发明之一,芯片技术决定了计算机升级换代的速度,决定了计算机小型化实现的程度,决定了计算机智能化的程度,决定了计算机普及化的应用深度. 1971年11月15日,英特尔公司推出了第一枚微处理器——4004芯片.这一举措不仅改变了公司的未来,而且对整个工业产生了深远的影响.同年,intel推出了1103DRAM核心内纯. 1974年,英特尔公司推出了划时代的处理器,Intel 8080.采用了复杂的 指令集以及40管脚封装,8080的处理能力大为提高,其功能是80

2014/7/17

1.抽象函数和抽象类 (1)抽象函数:就是只有声明没有实现的函数,称之为抽象函数,在java中抽象函数前面加abstract . 在定义函数类型时,需要被覆盖的函数,一般称为抽象函数. (2)抽象类:有抽象函数的类,称之为抽象类.(可以有不是抽象类的函数) 2.在继承关系中,注意: (1)java中只能进行单继承. (2)继承关系的相关类,必须是"is  a".也就是说作为子类必须是父类型的一种. 3.接口:形式上说,所有的方法均为抽象函数,这时,我们就可以把类型定义成interfac

BASH 脚本制作简单 Workflow - 更新 2014/6/17 12:00

因为需要,我创建了一个脚本叫 wf.sh (随意起什么名字),它可以读取当前目录下的 config.ini 配置文件来解析并执行工作流任务(Workflow). 直接上代码: config.ini Workflow.Name = example Workflow.Description = my work flow example \n and I know what's going on here. #Workflow.StartJob = job1 Workflow.NextJobCount

http://numbbbbb.github.io/the-swift-programming-language-in-chinese/chapter1/02_a_swift_tour.html

http://numbbbbb.github.io/the-swift-programming-language-in-chinese/chapter1/02_a_swift_tour.html

如何在github上展示作品——为你的项目生成一个快速访问的网址如(DaisyWang88.github.io)

(这里值针对Windos系统的,因为本人用的是Window系统,暂时没有条件在其他平台上测试) 1.创建一个仓库命名为 <userName>.github.io 这里的userName为用户名,一般是你注册时的用户名.比如个人主页的网址是https://github.com/DaisyWang88.那这里的userName就是DaisyWang88. 2.将DaisyWang88.github.io这个仓库生成静态网页. 进入DaisyWang88.github.io,点击设置按钮“Setti

新的博客 bincoding.github.io

最近周围的人都在用静态博客,随主流也换了github page搭建hexo. bincoding.github.io 个人网站,用来上线乱七八糟的东西: bincoding.cn

此博客不再维护,请移步http://daiweilai.github.io/

此博客不再维护,请移步新博客 http://daiweilai.github.io/ 新开的这个博客系统,托管在了Github.io上,喜闻乐见的Jekll加借鉴(抄袭)的精美主题构建而成,反正样子应该还看得过去,如果有朋友有兴趣想了解iOS程序员为何日撸万行代码?数百奇巧淫技如何施展?无数干货为何频频送出?究竟编译器背后又隐藏着什么?这一切的背后是技术与生活的碰撞还是高效与投机的权衡?我真TM编不下去了,欢迎前往 [任意门]围观. 严肃地,如果你刚开始学习iOS开发或许可以从博主这里得到一些半

搭建了个人的github.io博客,以后精华博客会收录在此

地址:http://eterrao.github.io/ 说明: 基于github + hexo简易搭建的个人博客,用于收藏经典博文及技术文章,也会用于个人的技术成长记录.我是看到这篇文章搭建的:http://wsgzao.github.io/post/hexo-guide/