Gulp--手把手教你搭建前端自动化平台

gulp是啥?官方的解释是基于流的自动化构建工具。好,那什么是流呢?这个流是从英语单词stream翻译过来的,不过还是不好理解。其实可以这么理解,流就是工厂的一个生产车间生产出来的半成品,一个个半成品在输送带上送往下一个加工车间的过程。把运动的半成品看成是数据,那么流动的数据就是流。唉!好难解释啊!还是看代码吧。我已经把代码上传到github了,需要的同学自取,麻烦点个小星星 https://github.com/NicknameID...

1.依赖npm

由于npm在国内比较慢,所以推荐大家使用淘宝的cnpm或者tnpm,在国内访问比较快(搞不懂国家为什么立堵墙,难受)。

2.cnpm init 初始化package.json文件

-y的作用可以跳过询问步骤直接生成默认的package.json文件


3.安装依赖包

由于依赖包太多了,就不一个一个写了 主要通过 cnpm install --save-dev 包的名字的方式来安装的,

下图所列的就是自动化工具要用的包,我已经上传到github上了点击这里获取

下载后只要 cnpm install就可以了,就会根据package.json里的依赖去下载安装

在package.json中添加gulp字段方便调用本地安装的gulp命令,到这里package.json配置好了.


4.gulpfile.js文件的内容(重点

功能1---自动化生成项目目录


//gulpfile.js/*首先在全局上加载gulp,这个很重要*/constgulp =require('gulp');/*在全局上定义项目的目录结构,供应后面使用*/constdirs = {  dist:'./dist',  src:'./src',  css:'./src/css',  less:'./src/less',  js:'./src/js',  img:'./src/img',};gulp.task('create-directory',()=>{constmkdirp =require('mkdirp');//这里要依赖mkdirp这个包,通过cnpm 安装for(letiindirs) {    mkdirp(dirs[i],err=>{      err ?console.log(err) :console.log('mkdir-->'+ dirs[i]);;    });  }});//在终端运行cnpm run gulp create-directory

生成需要生成的项目目录,再也不用每次都去手工创建了,幸福感爆棚有木有!!!


功能2---编译less,并且实现less注入功能,热更新页面,方便开发时调试

这个功能要依赖的插件有

1.gulp-less

2.browser-sync

3.gulp-notify

4.gulp-plumber

/*全局定义要处理的文件*/constfiles = {  lessFiles:'./src/less/go.less',  cssFiles:'./src/css/*.css',  jsFiles:'./src/js/*.js',  imgFiles:'./src/img/*.*'}//编译lessgulp.task('compile-less',()=>{constless =require('gulp-less');//依赖gulp-less的插件constnotify =require('gulp-notify');constplumber =require('gulp-plumber');constbrowserSync =require('browser-sync').create();//browser-sync同步服务器constreload = browserSync.reload;//将browser-sync的reload方法存起来,方便调用returngulp.src(files.lessFiles)  .pipe(plumber({ errorHandler: notify.onError('Error: <%= error.message %>') }))//使用gulp-notify和gulp-plumber用来阻止因为less语法写错跳出监视程序发生.pipe(less())  .pipe(gulp.dest(dirs.css +'/'))  .pipe(reload({stream:true}));});// 本地服务器功能,自动刷新(开发环境)gulp.task('server', ['compile-less'],()=>{constbrowserSync =require('browser-sync').create();constreload = browserSync.reload;  browserSync.init({    server:'./'});  gulp.watch(dirs.less+'/**/*.less', ['compile-less']);//监视less文件夹中的所有less文件,有改动就调用compile-less任务编译lessgulp.watch('./*.html').on('change', reload);//监视html文件,有改动就刷新浏览器gulp.watch(dirs.js+'/**/*.js').on('change', reload);//监视所有js文件有改动就刷新浏览器});//在cmd运行cnpm run gulp server

/*全局定义要处理的文件*/

constfiles = { lessFiles:'./src/less/go.less', cssFiles:'./src/css/*.css', jsFiles:'./src/js/*.js', imgFiles:'./src/img/*.*'}//编译

lessgulp.task('compile-less',()=>{constless =require('gulp-less');//依赖gulp-less的插件

constnotify =require('gulp-notify');constplumber =require('gulp-plumber');constbrowserSync =require('browser-sync').create();//browser-sync同步服务器

constreload = browserSync.reload;//将browser-sync的reload方法存起来,方便调用returngulp.src(files.lessFiles) .pipe(plumber({ errorHandler: notify.onError('Error: <%= error.message %>') }))

//使用gulp-notify和gulp-plumber用来阻止因为less语法写错跳出监视程序发生.pipe(less()) .pipe(gulp.dest(dirs.css +'/')) .pipe(reload({stream:true}));});// 本地服务器功能,自动刷新(开发环境)gulp.task('server', ['compile-less'],()=>{constbrowserSync =require('browser-sync').create();constreload = browserSync.reload; browserSync.init({ server:'./'}); gulp.watch(dirs.less+'/**/*.less', ['compile-less']);//监视less文件夹中的所有less文件,有改动就调用compile-less任务编译lessgulp.watch('./*.html').on('change', reload);//监视html文件,有改动就刷新浏览器gulp.watch(dirs.js+'/**/*.js').on('change', reload);//监视所有js文件有改动就刷新浏览器});//在cmd运行cnpm run gulp server

可以看到程序正在后台运行,正在监听文件改动

这样就可以左边开着编辑器写代码,右边开着浏览器看效果了,有木有很爽,人生别无他求了(感动中!!!),在跟目录下建立index.html的页面。

功能3---添加浏览器私有前缀

要用到的插件包

1.gulp-postcss

2.gulp-sourcemaps

3.autoprefixer

//添加浏览器私有前缀(生产环境)gulp.task('autoprefixer',()=>{constpostcss =require('gulp-postcss');constsourcemaps =require('gulp-sourcemaps');constautoprefixer =require('autoprefixer');returngulp.src(files.cssFiles)    .pipe(sourcemaps.init())//添加sourcemap,方便调试.pipe(postcss([ autoprefixer() ]))//添加浏览器私有前缀,解决浏览器的兼容问题.pipe(sourcemaps.write('.'))    .pipe(gulp.dest(dirs.css+'/'))});

功能4---压缩css

要用到的插件包

1.gulp-minify-css

2.gulp-rename

// 压缩css(生产环境)gulp.task('minify-css',function(){constminifyCSS =require('gulp-minify-css');constrename =require("gulp-rename");returngulp.src(dirs.css+'/**/*.css')    .pipe(minifyCSS({/*keepBreaks: true*/}))    .pipe(rename(path=>path.basename +='.min'))//重命名文件输出后的样式为 原文件名.min.css.pipe(gulp.dest('./dist/css/'))});

功能5---合并压缩JavaScript文件

要用到的插件包

1.gulp-concat

2.gulp-uglify

3.gulp-rename

// js文件--合并--压缩(生产环境)gulp.task('js-concat-compress',(cb)=>{letname ='';//先定义一个变量将用于后面存文件名constconcat =require('gulp-concat');constuglify =require('gulp-uglify');constrename =require("gulp-rename");returngulp.src(dirs.js+'/**/*.js')  .pipe(rename(path=>{path.basename +='';name=path.basename;}))  .pipe(concat('bundle.js'))//合并js文件.pipe(uglify())//压缩js文件.pipe(rename(path=>{    path.basename = name+'.'+path.basename+'.min';//改文件名加上 .min}))  .pipe(gulp.dest('dist/js/')); });

功能6---图片无损压缩

要用到的插件包

1.gulp-imagemin

// 图片无损压缩gulp.task('img-handl',()=>{constimagemin =require('gulp-imagemin');returngulp.src(files.imgFiles)    .pipe(imagemin())//imagemin()里是可以写参数的,有需要的可以去github的页面看看.pipe(gulp.dest('./dist/img/'))});

功能7---项目的打包

有时候我们做完东西需要打包,方便传输,而有些文件又是不需要打包进去的,比如说node_modules文件夹,一键打包的快感体验过绝对会爱上的

依赖的插件包

1.gulp-zip

// 项目打包(生产环境)gulp.task('zip',()=>{constzip =require('gulp-zip');returngulp.src(['./*.html','**/dist/**/*.*','!**/node_modules/**/*.*'])//这里需要注意的是,在写要打包的文件时,避免打包的文件不能写在开头,这里'!**/node_modules/**/*.*'放在了最后.pipe(zip('project.zip'))//打包后的文件名,自己随意取.pipe(gulp.dest('./'))});

5.整理任务执行,方便调用任务

因为gulp执行任务时是以最大的任务并发数同时进行的,所以有时候我们需要按步骤进行,就需要插件gulp-sequence,将任务按顺序写入,就会按顺序执行

写了这么多功能模块,需要好好的整理一下,方便调用。我已经把完整的代码上传到github了,需要的同学自取,麻烦点个小星星 https://github.com/NicknameID...

// ------------------开发阶段命令----------------------------------------------------gulp.task('start', ['create-directory']);//项目初始化的第一个命令gulp.task('dev-watch', ['server']);//开始编写项目后开启服务器实时更新// ------------------生产阶段命令------------------------------------------------------gulp.task('prefixer', ['autoprefixer']);//给css文件添加浏览器私有前缀 files.cssFiles ==>> .src/css/gulp.task('min-css', ['minify-css']);//压缩css文件 files.cssFiles ==>> dist/css/gulp.task('js-handl', ['js-concat-compress']);//合js文件  dirs.js/**/*.js ==>> ./dist/js/concated.jsgulp.task('img-handl', ['img-handl'])//处理图片,对图片进行无损的压缩//----------------一键生成项目文件命令-----------------------------------------------//因为gulp执行任务时是以最大的任务并发数同时进行的,所以有时候我们需要按步骤进行,就需要插件`gulp-sequence`,将任务按顺序写入,就会按顺序执行const runSequence = require('gulp-sequence').use(gulp);gulp.task('bunld-project',runSequence('clean-dist','compile-less','autoprefixer','minify-css','js-concat-compress','img-handl','zip'))

6.小结

看到没有,使用gulp其实并没有用到很多本身的API,都是通过不同的插件来实现的处理过程,所以gulp更加像一个处理平台,而非大包大揽的处理程序,他只负责数据的流向,从pipe(管道)的这头流向另外一头,剩下的事情就交给各个插件了,像不像现代社会的细化分工。分工明确才能提高效率,这是社会发展的经验总结。文章有点长,感谢看完的小伙伴!!!

原文地址:https://segmentfault.com/a/1190000010428396#articleHeader5

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容