更简单的自动化构建

gulp:更简单的自动化构建工具

目前最流行的两种使用JavaScript开发的构建工具是GruntGulp。为什么使用gulp?因为Gulp更简单。Grunt任务拥有大量的配置,会引用大量你实际上并不需要的对象属性,但是Gulp里同样的任务也许只有几行。有兴趣的同学在学完本文后对比使用Grunt,你就会发现Gulp的代码量是最少的。

安装

需要先安装node.js。这里安装的v5.11.0
使用node -v查看版本号。

gulp的安装不是很顺利。按照官方给的安装方法:

npm install --global gulp
npm install --save-dev gulp

先全局安装,然后再在项目的开发目录中安装为本地模块。但是在命令行输入gulp会提示:

Local gulp not found in ...

好吧,百度搜索了一番,知乎上有朋友回答了,不要全局安装,直接安装为本地模块。发现问题解决了一半:

npm install --save-dev gulp

然后调用的问题,在项目目录还是无法执行命令。不过由于安装在node_modules,很快找到了可执行命令的路径:

node_modules/.bin/gulp

非Windows的朋友,可以直接使用:

./node_modules/.bin/gulp 

运行命令,Windows的朋友需要到node_modules/.bin/目录去执行gulp。不过看了gulp.cmd的内容,稍微改改,可以复制一份gulp.cmd到项目根目录:

node  "%~dp0\..\.npminstall\gulp\3.9.1\gulp\bin\gulp.js" %*

改为:

node  "%~dp0\node_modules\.npminstall\gulp\3.9.1\gulp\bin\gulp.js" %*

就行了。当前目录执行:

>gulp
[21:30:58] Using gulpfile D:\Projects\gulp\gulpfile.js
[21:30:58] Task ‘default‘ is not in your gulpfile
[21:30:58] Please check the documentation for proper gulpfile formatting

这里由于安装慢,使用了淘宝的镜像。命令后加

--registry=https://registry.npm.taobao.org

参数即可。或者安装个cnpm命令:

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

下次使用cnpm代替npm。

简单示例

这里以压缩zepto.js为例。

需要先安装gulp插件模块gulp-uglify:

npm install --save-dev gulp-uglify

安装为本地模块。

需要新建配置文件gulpfile.js。项目根目录中的gulpfile.js,是Gulp的配置文件。示例:

var gulp = require(‘gulp‘);
var uglify = require(‘gulp-uglify‘);

gulp.task(‘minify‘, function () {
  gulp.src(‘js/zepto.js‘)
    .pipe(uglify())
    .pipe(gulp.dest(‘build‘))
});

上面代码中,gulpfile.js加载gulpgulp-uglify模块之后,使用gulp模块的task方法指定任务minify

task方法有两个参数,第一个是任务名,第二个是任务函数。在任务函数中,使用gulp模块的src方法,指定所要处理的文件,然后使用pipe方法,将上一步的输出转为当前的输入,进行链式处理。

task方法的回调函数使用了两次pipe方法,也就是说做了两种处理。第一种处理是使用gulp-uglify模块,压缩源码;第二种处理是使用gulp模块的dest方法,将上一步的输出写入本地文件,这里是build.js(代码中省略了后缀名js)。

好,配置完成。如何执行这个任务呢?

很简单,在命令行输入:

gulp minify

就行了。记住,是gulp后面跟任务(task)名。运行结果:

>gulp minify
[21:43:52] Using gulpfile D:\Projects\gulp\gulpfile.js
[21:43:52] Starting ‘minify‘...
[21:43:52] Finished ‘minify‘ after 10 ms

build目录生成了压缩过的zepto.js

没有修过gulp或者gulp.cmd的同学需要执行:

./node_modules/.bin/gulp minify

下面的示例直接使用gulp命令。

压缩多个js文件

假如有js目录下有多个js文件,例如:

zepto.js
util.js
my.js

下面任务将会压缩js目录里所有的js文件:

var gulp = require(‘gulp‘);
var uglify = require(‘gulp-uglify‘);

gulp.task(‘minify‘, function () {
  gulp.src(‘js/*.js‘)
    .pipe(uglify())
    .pipe(gulp.dest(‘build‘))
});

在build文件夹会生成压缩过的所有js文件:

zepto.js
util.js
my.js

文件名还是一样的。

gulp模块的src方法,用于产生数据流。它的参数表示所要处理的文件,这些指定的文件会转换成数据流。参数的写法一般有以下几种形式。

js/app.js:指定确切的文件名。
js/*.js:某个目录所有后缀名为js的文件。
js/**/*.js:某个目录及其所有子目录中的所有后缀名为js的文件。
!js/app.js:除了js/app.js以外的所有文件。

同时使用多个组件

除了压缩,我们可能还需要进行代码检查(jshint)、合并(concat)等工作:

var gulp = require(‘gulp‘);
var jshint = require(‘gulp-jshint‘);
var uglify = require(‘gulp-uglify‘);
var concat = require(‘gulp-concat‘);

gulp.task(‘js‘, function () {
  return gulp.src(‘js/*.js‘)
    .pipe(jshint())
    .pipe(uglify())
    .pipe(concat(‘all.min.js‘))
    .pipe(gulp.dest(‘build‘));
});

需要先安装依赖组件:

npm install jshint gulp-jshint --save-dev
npm install gulp-concat --save-dev

uglify前面我们已经安装了。安装jshint需要注意,还要安装jshint本身,否则会报错:

Error: Cannot find module ‘jshint/src/cli‘

安装插件完成后,执行:

gulp js

即可。会在build目录生成all.min.js压缩合并后的文件。

gulp常用插件

插件地址:http://gulpjs.com/plugins/

压缩css(gulp-minify-css)
合并文件(gulp-concat)
js代码校验(gulp-jshint)
压缩js代码(gulp-uglify)
less编译(gulp-less)
sass编译(gulp-sass)
stylus编译(gulp-stylus)
自动添加css前缀(gulp-autoprefixer)
压缩图片(gulp-imagemin)
自动刷新页面(gulp-livereload)
图片缓存,只有图片替换了才压缩(gulp-cache)
更改提醒(gulp-notify)

可以一条命令一次性安装:

npm install gulp-sass gulp-minify-css gulp-jshint gulp-concat gulp-uglify --save-dev

使用watch监视文件变动

本例通过监听less文件的变动生成编译好的css文件。
准备好css/demo.less文件:

@color: #4D926F;
#header {
    color: @color;
}
h2 {
    color: @color;
}

gulpfile.js任务内容:

var gulp = require(‘gulp‘);
var less = require(‘gulp-less‘);

gulp.task(‘doless‘, function () {
  return gulp.src(‘css/*.less‘)
    .pipe(less())
    .pipe(gulp.dest(‘build‘));
});

gulp.task(‘watch‘, function () {
   gulp.watch(‘css/*.less‘, [‘doless‘]);
});

注意要先安装好gulp-less组件。当css/文件夹里任意less文件发送了变化 ,将执行doless任务:使用less方法编译生成对应的demo.css文件。

运行:

gulp watch

显示:

>gulp watch
[22:23:21] Using gulpfile D:\Projects\gulp\gulpfile.js
[22:23:21] Starting ‘watch‘...
[22:23:21] Finished ‘watch‘ after 13 ms

我们现在去编辑css/demo.less文件,发现命令行自动执行了doless任务:

[22:23:25] Starting ‘doless‘...
[22:23:25] Finished ‘doless‘ after 66 ms

build/文件夹生成了demo.css

#header {
  color: #4D926F;
}
h2 {
  color: #4D926F;
}

当然,可以添加更多任务:

var gulp = require(‘gulp‘);
var less = require(‘gulp-less‘);
var minify = require(‘gulp-minify-css‘);
var concat = require(‘gulp-concat‘);
var autoprefix = require(‘gulp-autoprefixer‘);

gulp.task(‘doless‘, function () {
  return gulp.src(‘css/*.less‘)
    .pipe(less())
    .pipe(autoprefix(‘last 2 version‘, ‘ie 8‘, ‘ie 9‘))
    .pipe(gulp.dest(‘build‘))
    .pipe(minify())
    .pipe(concat(‘all.min.css‘))
    .pipe(gulp.dest(‘build‘));
});

gulp.task(‘watch‘, function () {
   gulp.watch(‘css/*.less‘, [‘doless‘]);
});

API

gulp只有四个API: task,watch,srcdest

task 这个API用来创建任务
watch 这个API用来监听任务
src 这个API设置需要处理的文件的路径,可以是多个文件以数组的形式
dest 这个API设置生成文件的路径,一个任务可以有多个生成路径,一个可以输出未压缩的版本,另一个可以输出压缩后的版本

参考

1、Gulp:任务自动管理工具 -- JavaScript 标准参考教程(alpha)
http://javascript.ruanyifeng.com/tool/gulp.html
2、入门指南 - gulp.js 中文文档 | gulp.js 中文网
http://www.gulpjs.com.cn/docs/getting-started/
3、Gulp学习指南之CSS合并、压缩与MD5命名及路径替换 - YuanWing Notes - SegmentFault
https://segmentfault.com/a/1190000002932998
4、gulp入门教程 - 王叨叨 - SegmentFault
https://segmentfault.com/a/1190000002698606
5、nimojs/gulp-book: Gulp 入门指南
https://github.com/nimojs/gulp-book
6、Gulp开发教程(翻译) - w3ctech - 中国最大的前端技术社区
http://www.w3ctech.com/topic/134

时间: 2024-08-04 06:41:57

更简单的自动化构建的相关文章

在Maven+Spring项目中使用Node.js的Gulp进行前端自动化构建

刚开始打算进行前后端分离开发,后来发现在使用JSP或者Freemarker做动态页面时,想发挥这些自动化构建工具牛逼闪闪的livereload功能并不是那么的轻易,因为我们必须还得调教它们去调用Java容器.现在全球社区似乎还没有成熟的插件可以自动帮我们调教Java容器,百度Fis的Jello也只是做了一下velocity的自动化,自己写感觉就是自虐,所以在这个问题上倒不如把Gulp当成一个Maven来使用,反正J2EE开发人员应该大都习惯了修改代码之后漫长无尽的build.相反,如果对Gulp

运维技巧:简单4步完成自动化构建发布

各位看官,这不是一个揭发单身有为青年因同事们天天秀恩爱而受到一万点暴击伤害的故事.这里指的狗粮,不是真正的"狗粮"--当然,也不是你们认为的狗粮. 事实上,现在很多涉足产品开发的互联网公司,都会提到"吃狗粮"这一概念(出自"Eating yourown dog food -- 吃你自家的狗粮"),它的意思是公司内部员工使用自己生产的产品进行日常工作.这么做有什么好处呢,比方说一家公司做美颜APP的,结果他们自己员工却用某图秀秀P图,这产品对外怎么

浅谈前端自动化构建

前言 现在的前端开发已经不再仅仅只是静态网页的开发了,日新月异的前端技术已经让前端代码的逻辑和交互效果越来越复杂,更加的不易于管理,模块化开发和预处理框架把项目分成若干个小模块,增加了最后发布的困难,没有一个统一的标准,让前端的项目结构千奇百怪.前端自动化构建在整个项目开发中越来越重要. 我们首先来回想一下之前我们是如何来开始做一个项目的. ① 首先要确定这个项目要使用什么样的技术来实现,然后开始规划我们的项目目录,接着就要往项目增加第三方库依赖,比如: 拷贝 CSS库(Yui Reset |

Android自动化构建之Ant多渠道打包实践(上)

前言 Ant是历史比较悠久的一个自动化构建工具,Android开发者可以通过它来实现自动化构建,也可以实现多渠道打包,关于apk打包的方式一般有Ant.Python.Gradle三种,这三种打包方式都各自有优点和缺点,本篇博文先给大家介绍如何使用Ant来实现自动构建和多渠道发布. 开发环境 Window7 Ant jdk android sdk mac系统下所需要的运行环境也是类似的,我们都需要配置Ant.jdk.sdk的环境变量,我们可以看一下window下是环境变量配了些什么: ANT_HO

自动化构建1——一致性关键之道

android studio 采用gradle 进行android应用程序的构建,而在eclipse时代,默认是ant,其实java程序也是ant.我不是科班出身,即使是在培训班中,也没有涉及到ant(也许是我那时什么都不懂,没注意?什么时候回顾视频的时候注意下,万一真用上了,这里补上),更不用说是gradle. 什么意思都不知道,以上就提gradle,ant,甚至是maven?多可笑.外国人也是真有意思,喜欢拿个字典里都查不到的单词来作为某一种工具的名字.我们也是,例如城会玩.其实gradle

gulp自动化构建工具

gulp    自动化构建工具,实时监控.代码合并.压缩... http://www.gulpjs.com.cn/     中文网 http://gulpjs.com/plugins/     英文网 ,插件   本文假设你之前没有用过任何任务脚本(task runner)和命令行工具,一步步教你上手Gulp.不要怕,它其实很简单,我会分为五步向你介绍gulp并帮助你完成一些惊人的事情.那就直接开始吧. 第一步:安装Node 首先,最基本也最重要的是,我们需要搭建node环境.访问 http:/

利用apache+svn+jenkins+maven 实现java环境的自动化构建和部署(一)(网内首发超详细版)

目录结构如下: 目录 1说明及环境介绍3 1.1说明3 1.2环境准备及格式约定4 2 Linux下apache搭建svn服务器4 2.1 apache安装部署4 2.2 svn安装部署5 2.3整合svn和apache6 2.4 ssl方式部署apache7 2.4.1安装apache7 2.4.2安装svn7 2.4.2 部署认证8 3 Linux下svn独立服务器方式部署9 3.1安装SVN9 3.2 配置环境10 3.3 权限配置样例11 3.4 启动SVN服务器12 3.5 访问方式1

前端自动化构建工具Webpack开发模式入门指南

Webpack Webpack是时下最流行的模块打包器 它的主要任务就是将各种格式的JavaScript代码,甚至是静态文件 进行分析.压缩.合并.打包,最后生成浏览器支持的代码 特点: 代码拆分方案:webpack可以将应用代码拆分成多个块,每个块包含一个或多个模块,块可以按需异步加载,极大提升大规模单页应用的初始加载速度 智能的静态分析:webpack的智能解析器几乎可以处理任何第三方库 Loader加载器:webpack只能处理原生js模块,但是loader可以将各种资源转换为js模块 p

前端开发自动化工作流工具:JavaScript自动化构建工具grunt、gulp、webpack介绍

前端开发自动化工作流工具,JavaScript自动化构建工具grunt.gulp.webpack介绍 前端自动化,这样的一个名词听起来非常的有吸引力,向往力.当今时代,前端工程师需要维护的代码变得及为庞大和复杂,代码维护.打包.发布等流程也变得极为繁琐,同时浪费的时间和精力也越来越多,当然人为的错误也随着流程的增加而增加了更多的出错率.致使每一个团队都希望有一种工具,能帮助整个团队在开发中能精简流程.提高效率.减少错误率.随之讨论自动化部署也越来越多,并且国内很多大型团队也都有自己成熟的自动化部