30分钟让前端学会gulp(纽约的老郑原创)

2016-01-06  本文已影响771人  郑伟的菜园子

尼奥:我亲爱的墨菲斯,请问什么叫gulp?
墨菲斯:...,尼奥你又要学人家伪前端装B了...
尼奥:装B更健康,我愿意装,请你告诉我吧
墨菲斯:....

那么,什么是gulp呢?
我们学过哲学我们都知道,要回答一个东西是什么很难,但是我们毕竟学过语文的,我们知道有一种修辞手法叫类比,所以我想了半天,gulp可以用一个我们在windows里司空见惯的东西来类比,作用是一样的:

gulp稍微比git难一点,所以及15分钟是不够的,要花上30分钟时间。

bat

这个bat不是那三大神一样公司,我说的是

批处理

度娘百科走起

u=2778387390,1823683051&fm=21&gp=0.jpg

恩,骗一个算一个!

亲爱的孩子们懂了没有?

OK,我们开始学习怎么使用吧!!

安装node

点击这里
下载这个:

npm.png

下载完了,一个exe,那么你懂的,下一步下一步

验证你安装成功了

打开命令行CMD,看下面:

555.png

安装taobao源

这一步其实不应该有的,但是GFW,你懂的,所以照做吧!!!
在命令行里输入:

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

安装gulp

cnpm install --global gulp

使用gulp

我认为最快的学会一个东西的办法不是纠结原理,而是直接拿过来用,所以,我们推荐你直接拿我弄好的一个库myQuery来练手就行了。
我已经把你可能用得上的百分之八十的gulp插件直接配套好了,直接用就行了。

安装myQuery

有二种安装方式

第一种:

cnpm install myquery  

第二种:

  git clone https://github.com/moyu-edu/myQuery.git

初始化myQuery

 cnpm install

使用gulp

gulp dev
 开发的时候访问
gulp devsass
 适合使用sass的用户
gulp devless
 适合使用less的用户
gulp
 上线版本执行的命令,会进行eslint检测并进行压缩代码,如果执行成功可以到dist文件夹中看到您的js压缩代码
gulp postcss
 自动加前缀等

解读gulpfile.js

var gulp = require("gulp");//gulp主对象

var util = require("gulp-util");//gulp的工具对象

var notify = require("gulp-notify");

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

var rename = require("gulp-rename");

var eslint = require('gulp-eslint');

var sourcemaps = require('gulp-sourcemaps');

var gls = require('gulp-live-server');

var sass = require("gulp-scss");

var watch = require('gulp-watch');

var autoprefixer = require("gulp-autoprefixer");

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

//dev服务器环境

gulp.task('dev', function() {

//1. serve with default settings 

var server = gls.static(['examples',"node_modules/qunitjs/qunit/","src/"], 80) //equals to gls.static('public', 3000); 

server.start();

});

//编译sass

gulp.task("sass",function(){

gulp.src("examples/scss/*.scss")

.pipe(sass())

.pipe(gulp.dest("examples/css/"))

});

//实时编译sass

gulp.task("sasswatch",function(){

watch("examples/scss/*.scss",function(){

util.log("sass文件改变了");

gulp.start("sass");

})

})

//devSass服务器环境

gulp.task('devsass', function() {

//1. serve with default settings 

var server = gls.static(['examples',"node_modules/qunitjs/qunit/","src/"], 80) //equals to gls.static('public', 3000); 

server.start();

gulp.start("sasswatch");

});

//编译less

gulp.task('less', function () {

return gulp.src('examples/less/*.less')

.pipe(less({}))

.pipe(gulp.dest('examples/css'));

});

//实时编译less

gulp.task("lesswatch",function(){

watch("examples/less/*.less",function(){

util.log("less文件改变了");

gulp.start("less");

})

})

//devLess服务器环境

gulp.task('devless', function() {

//1. serve with default settings 

var server = gls.static(['examples',"node_modules/qunitjs/qunit/","src/"], 80) //equals to gls.static('public', 3000); 

server.start();

gulp.start("lesswatch");

});

//加前缀

gulp.task("postcss",function(){

return gulp.src("examples/scss/*.scss")

.pipe(sass())

.pipe(autoprefixer({

browsers:["Android 4.1", "iOS 5.1", "Chrome > 0", "ff > 0", "ie >= 0"]

}))

.pipe(gulp.dest("examples/css/"))

})

//上线前服务器环境

gulp.task('pub', function() {

//1. serve with default settings 

var server = gls.static(['examples',"node_modules/qunitjs/qunit/","dist/"], 80) //equals to gls.static('public', 3000); 

server.start();

});

gulp.task('compress', function() {

return gulp.src('src/*.js')

.pipe(sourcemaps.init())

.pipe(uglify())

.on("error", notify.onError(function (error) {

return "the step of uglify has some error: " + error.message;

}))

.pipe(rename(function(path){

path.basename = "myquery.min"

}))

.on("error", notify.onError(function (error) {

return "the step of rename has some error: " + error.message;

}))

.pipe(sourcemaps.write('../maps'))

.pipe(gulp.dest('dist'))

.pipe(notify({

message : 'no bug,congratulations,you are doing a good job!!'

}));

});

gulp.task('lint', function () {

// ESLint ignores files with "node_modules" paths. 

// So, it's best to have gulp ignore the directory as well. 

// Also, Be sure to return the stream from the task; 

// Otherwise, the task may end before the stream has finished. 

return gulp.src(['**/*.js','!node_modules/**'])

// eslint() attaches the lint output to the "eslint" property 

// of the file object so it can be used by other modules. 

.pipe(eslint())

// eslint.format() outputs the lint results to the console. 

// Alternatively use eslint.formatEach() (see Docs). 

.pipe(eslint.format())

// To have the process exit with an error code (1) on 

// lint error, return the stream and pipe to failAfterError last. 

.pipe(eslint.failAfterError());

});

gulp.task( 'default', ['lint',"compress"], function(){

//blablabla

});

这么长的文件是不是有点晕?我们直接定位到第29行这几行代码,就明白了:


//编译less

gulp.task('less', function () {

return gulp.src('examples/less/*.less')

.pipe(less({}))

.pipe(gulp.dest('examples/css'));

});

看到没有,我们这个文件是个js文件,gulp是一个对象,类似我们的window一样,这个对象有一个属性叫task,就像批处理一样的执行一个具体的任务,然后形式最外在长得像这样:

gulp.task("你随便起一个名字",回调函数)

看到没有,基本上你刚才已经见识了gulp的百分之七十的核心了就是这个形式。但是我们要想进一步的了解,我们还得学一个抽象的东西,打起精神来,我们要学习的是东西叫"流"。

那么什么是流呢?(停顿几秒环视四周)
OK,说到流我们想起什么呢?当然是水啦。我找一段经典的乐百氏广告词:

乐百氏27层净化
第一层石英粗型沙过滤悬浮杂质
第二层石英粗型沙过滤泥沙杂质
第三层石英粗型沙过滤铁锈杂质
第四层石英粗型沙过滤胶体杂质
第五层石英粗型沙过滤有机物杂质
第六层石英中型沙过滤悬浮杂质
第七层石英中型沙过滤泥沙杂质
第八层石英中型沙过滤铁锈杂质
第九层石英中型沙过滤胶体杂质
第十层石英中型沙过滤有机物杂质
第十一层石英细型沙过滤悬浮杂质
第十二层石英细型沙过滤泥沙杂质
第十三层石英细型沙过滤铁锈杂质
第十四层石英细型沙过滤胶体杂质
第十五层石英细型沙过滤有机物杂质

看到没有,我们可以把最开始的流想像成原水,然后经过一层一层的过滤,慢慢的就形成了最终的纯净水了。

我们再来看一眼我们上面提到的回调:


//编译less

gulp.task('less', function () {

return gulp.src('examples/less/*.less')

.pipe(less({}))

.pipe(gulp.dest('examples/css'));

});

看到没有,gulp.src(examples/less/*.less")你就想像成是原来一开始的水,然后这个pipe你就想像成过滤器,这样一层一层的就会到最后一次输入我们最终的纯净水啦! --> gulp.dest("examples/css")

OK,如果你看完了,gulp最重要的东西你已经学到了,新技能get!!!

上一篇下一篇

猜你喜欢

热点阅读