一、安装
1)安装nodejs
通过nodejs的npm安装gulp,插件也可以通过npm安装。windows系统是个.msi工具,只要一直下一步即可,软件会自动在写入环境变量中,这样就能在cmd命令窗口中直接使用node或npm指令。
我上面的cmd,已经被git封装过了,字体都变成彩色的了。安装了这个工具后,还可以通过Git Bash打Linux的命令。git是版本控制的工具,这里也不多说了。
2)npm
npm(node package manager)nodejs的包管理器,用于node插件管理(包括安装、卸载、管理依赖等)
gulp赫然出现在npm的首页中。
命令提示符执行:
npm install <name> [-g] [--save-dev]
1. <name>:node插件名称。例:npm install gulp-less --save-dev
2. -g:全局安装。将会安装在C:\Users\Administrator\AppData\Roaming\npm,并且写入系统环境变量;
非全局安装:将会安装在当前定位目录;
全局安装可以通过命令行在任何地方调用它,本地安装将安装在定位目录的node_modules文件夹下,通过require()调用;
3. --save:将保存配置信息至package.json(package.json是nodejs项目配置文件);
4. -dev:保存至package.json的devDependencies节点,不指定-dev将保存至dependencies节点
配置文件package.json是为了方便下载相关的包,只需要在有这个文件的文件夹下面执行“npm install”(如果安装了cnpm就用“cnpm install”),则会根据package.json下载所有需要的包。【注:我用demo中的package文件在另外一台电脑上面直接安装,打“gulp watch”的时候出现了很多错误】
3)cnpm
因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常。
在国内推荐使用淘宝NPM镜像。“这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步”
安装指令如下:
npm install -g cnpm --registry=https://registry.npm.taobao.org
注意安装的时候会出现错误提示,你可以关闭命令窗口再打开,打入“cnpm -v”可以查看版本号。cnpm跟npm用法完全一致。
4)全局安装gulp
cnpm install gulp -g
如果在某个工程文件夹中提示错误,那就手动再安装下“gulp”:
5)新建package.json文件
在命令窗口输入指令“cnpm init”。如果在Git Bash打这个指令,会报“No gulpfile found”的错误。
6)新建gulpfile.js文件
gulpfile.js是gulp项目的配置文件,里面是task的配置。简易代码如下:
var gulp = require(\'gulp\'); gulp.task(\'default\', function() { // 将你的默认的任务代码放在这 });
7)删除node_modules文件夹
当安装了各种插件后,在你相应的目录下面会出现node_modules文件夹,里面又嵌套了很深的文件夹目录,如果你用右键删除的方式,会变得很慢,并且还会提示错误“无法删除”。
这里有个方法,用npm里面一个专门用于删除的模块插件“rimraf”。
cnpm install -g rimraf
只需要打简单的指令就可删除:
1 cd xxx[include node_modules folder] //用cd指令将文件目录设置到包含nod_modules的位置 2 3 rimraf node_modules
二、插件与功能
1)全局配置config
可以将需要在gulpfile中引用的参数,放到这里,包括一些路径,功能的开关等。例如:
module.exports = { name : \'.....\', devPath : \'.....\', //项目根路径,根路径下可以包含多个项目 prodPath : \'....\', //生产路径根路径 sassPath : \'.....\', //SASS包含文件路径 rmHtmlWhitespace : false,//html中是否去除空格 webpackEntry : { index : \'index.js\'//js合并 }, server : { port : 8088 } };
注意下这里使用了module.exports,这是nodejs的语法。在gulpfile中将会用require引用config。
//加载项目配置 var config = require(\'./config\');
2)监控gulp.watch
这个是gulp自带的,就是当你的文件改动了后,就做相应的task。还有一个插件gulp-watch。
监控sass中的文件变化,一有变化就做sass的编译。“**”与“*”这种语法可以参考《Gulp:任务自动管理工具》
gulp.task(\'watch\', function() { livereload.listen(); gulp.watch(\'**.html\', [\'html\']); gulp.watch(\'./sass/*.scss\', [\'sass\']); gulp.watch(\'./css/*.css\', [\'css\']); gulp.watch(\'./js/*.js\', [\'js\']); });
监控了四个地方的修改,js、html、css和sass,并且有做了自动刷新livereload。这个是通过“gulp-livereload”来实现的。
firefox货chrome要分别安装插件才可运行。chrom插件如下:
安装完后会在浏览器中出现个小按钮,,注意是黑色的时候才是在执行中。还有就是要在相应的task中加相应的代码:
.pipe(livereload())
3)sass编译与css压缩
通过sass编写css,能更模块化,多人协作比较方便。安装gulp-sass。
“plumber()”是引用了“gulp-plumber”,任务错误中断自动重传。在使用一段时间后发现,执行了“plumber()”后监控是还继续的,但是sass就不会自动编译了。
后面把“plumber()”去掉,添加红色部分,这样就不会出现不编译的情况了。
gulp.task(\'sass\', function() { gulp.src(\'./sass/*.scss\') .pipe(plumber()) .pipe(sass().on(\'error\', sass.logError)) .pipe(gulp.dest(\'./css\')) .pipe(livereload()); });
gulp-cssnano,压缩CSS代码。
gulp.task(\'css\', [\'sass\'], function() { //先删除dist中的css,有时候会不更新 gulp.src(\'./dist/css/*.css\') .pipe(rimraf({force: true})); gulp.src(\'./css/*.css\') .pipe(cssnano()) .pipe(gulp.dest(\'./dist/css\')) .pipe(livereload()); });
4)js压缩与模块化合并
使用gulp-uglify做js的压缩。gulpRimraf()用来删除文件夹,引用自gulp-rimraf。
gulp.task(\'js\', function() { //先删除dist中的css,有时候会不更新 gulp.src(\'./dist/js/*.js\') .pipe(rimraf({force: true})); gulp.src(\'./js/*.js\') .pipe(plumber()) .pipe(jshint()) .pipe(jshint.reporter(\'default\')) .pipe(uglify()) .pipe(gulp.dest(\'./dist/js\')) .pipe(livereload()); });
上面的jshint是用来分析代码的,例如分号没写。通过打指令“gulp-jshint”。
模块化合并使用webpack-stream,点击查看文档。github上面还有篇说明教程。
gulp.task(\'webpack\', function(){ var entry = {}; for(var name in config.webpackEntry){ entry[name] = \'./js/\' + config.webpackEntry[name]; } //排除bundle文件 return gulp.src(\'./js/*[^bundle].js\') .pipe(plumber()) .pipe(webpack({ entry: entry, output: { filename: \'[name].bundle.js\', } })) .pipe(gulp.dest(\'./js\')); });
5)image图片无损压缩
通过gulp-image压缩的图片,有时候能牙70%以上,非常给力。
gulp.task(\'image\', function(){ gulp.src(\'./img/*.+(jpg|png|gif|svg)\') .pipe(imagemin()) .pipe(gulp.dest(\'./dist/img\')); });
6)html压缩
经过gulp-htmlmin压缩过的html可以缩小很多,可以看到都挤到了一起,有很多参数可以选择,比如去除空格等。
还可以通过gulp-replace来给静态资源文件加个版本号。
gulp.task(\'html\', function() { gulp.src(\'*.html\') .pipe(replace(\'__VERSION\', Date.now().toString(16))) .pipe(htmlmin({collapseWhitespace: true})) .pipe(gulp.dest(\'./dist\')) .pipe(livereload()); });
7)fontmin字体压缩
网上有很多webfont,例如国外的Font Awesome,国内的iconfont。都能做出漂亮的自定义字体。
与西文字体不同,由于字符集过大,中文字体无法享受 webfont 带来的便利。为了让中文字体也乘上这道风,我们需要对其进行min。使用指令“gulp-fontmin”。
gulp.task(\'font\', function() { gulp.src(\'font/*.+(eot|svg|ttf|woff)\') .pipe(fontmin({ text: \'人晒\' })) .pipe(gulp.dest(\'dist/font\')); });
配置的两个字“人晒”与没配置的“国”,明显有区别。
8)CSS自动加浏览器前缀
“gulp-autoprefixer”可以自动加“-webkit”、“-moz”等的前缀,自己可以少写很多兼容代码。可以在上面的sass的编译中添加一个引用。
有多个参数,点击查看说明。“last 2 versions”是浏览器的过滤设置,还有多个值,可以查看这里。插件并不仅仅是加个前缀,还能编译出旧的语法。例如flex的不同写法。
后面又查到一个插件“autoprefixer”,用户量非常,这是一个PostCSS插件,需要引入“gulp-postcss”。更多的PostCSS插件可以查看这里。
gulp.task(\'sass\', function() { gulp.src(\'./sass/*.scss\') .pipe(plumber()) .pipe(sass().on(\'error\', sass.logError)) .pipe(autoprefix({ browsers: [\'last 2 versions\', \'Firefox < 20\'], cascade: false })) .pipe(gulp.dest(\'./css\')) .pipe(livereload()); });
输出:
9)将px自动转换为rem
使用了一个PostCSS插件,“postcss-px2rem”。
如果不想编译成rem单位,就在属性后面写“/*px*/”或“/*no*/”,这两个值也有点不同,具体参考这里。
var postcss = require(\'gulp-postcss\'); var px2rem = require(\'postcss-px2rem\'); gulp.task(\'sass\', function () { var processors = [px2rem({remUnit: 75})]; return gulp.src(\'./sass/*.scss\') .pipe(gulpSass().on(\'error\', gulpSass.logError)) .pipe(postcss(processors)) .pipe(gulp.dest(\'./css/\')).pipe(livereload()); });
10)启动一个本地调试服务器
通过gulp-connect,可以做个server。如果你用notpad++这种开发页面,那这个指令会很有用。
gulp.task(\'server\', function(){ var option = { root : config.devPath, port : config.server.port }; if(config.server.root){ option.root = config.server.root; } connect.server(option); });
上面的localhost可以改成本机的IP地址,手机与电脑在同一个网段的话,就可以直接用手机调试了。
11)node_modules目录
node_modules目录中的内容非常大,如果在每个工程下面都安装,会造成很大的浪费。可以将其放在各个工程的公共父级中,而在各个目录下面使用自己的gulpfile.js,config.js等配置文件。
例如工程都在public文件夹中,我就将node_modules放在public的平级。
demo下载地址:
http://download.csdn.net/download/loneleaf1/9416080
参考资料:
http://www.ydcss.com/archives/18 gulp详细入门教程
http://www.runoob.com/nodejs/nodejs-npm.html NPM 使用介绍
http://javascript.ruanyifeng.com/tool/gulp.html Gulp:任务自动管理工具
http://www.ghostchina.com/module-exports-and-exports-in-node-js/ Node.js 系列之 —— module.exports 与 exports
http://segmentfault.com/a/1190000002658165?utm_source=tuicool JGulp: 利用Gulp 配置的前端项目自动化工作流
http://www.w3ctech.com/topic/935 Fontmin 快速指南