[转]gulp构建前端工程

摘要: Gulp 是一个自动化工具,前端开发者能够使用它来处理常见任务: 搭建web服务器 文件保存时自动重载浏览器 使用预处理器如Sass、LESS 优化资源,好比压缩CSS、JavaScript、压缩图片 固然Gulp能作的远不止这些。若是你够疯狂,你甚至能够使用它搭建一个静态页面生成器。Gulp真的足够强大,但你必须学会驾驭它。 这是这篇文章的主要目的。帮助你了解Gulp的基础用法,助你早日完成一统天下的大业。 在咱们深刻了解以前,咱们先来讲说为何是Gulp。 为何是Gulp? 相似Gulp的工具,咱们一般称之为构建工具。现在最流行的两个构建工具是Gulp和Grunt。 已...php

什么是gulp?

gulp是新一代的前端项目构建工具,你能够使用gulp及其插件对你的项目代码(less,sass)进行编译,还能够压缩你的jscss代码,甚至压缩你的图片,gulp仅有少许的API,因此很是容易学习。 gulp 使用 stream 方式处理内容。Node催生了一批自动化工具,像Bower,Yeoman,Grunt等。css

gulp和grunt的异同点

易于使用:采用代码优于配置策略,Gulp让简单的事情继续简单,复杂的任务变得可管理。 高效:经过利用Node.js强大的流,不须要往磁盘写中间文件,能够更快地完成构建。 高质量:Gulp严格的插件指导方针,确保插件简单而且按你指望的方式工做。 易于学习:经过把API降到最少,你能在很短的时间内学会Gulp。构建工做就像你设想的同样:是一系列流管道。 

由于gulp是用node.js写的,因此你须要在你的终端上安装好npmnpmnode.js的包管理器,因此先在你的机子上安装好node.jshtml

gulp安装命令前端

sudo npm install -g gulp 

在根目录下新建package.json文件node

npm init .

安装gulpjquery

npm install gulp --save-dev 

安装好后再次输入gulp -v查看版本号,以下图显示则为成功:
android

安装插件

安装经常使用插件:ios

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

安装这些插件须要运行以下命令:nginx

$ 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 

-save-save-dev能够省掉你手动修改package.json文件的步骤。git

npm install module-name -save 自动把模块和版本号添加到dependencies部分 npm install module-name -save-dev 自动把模块和版本号添加到devdependencies部分 

gulp命令

你仅仅须要知道的5个gulp命令

gulp.task(name[, deps], fn) 定义任务 name:任务名称 deps:依赖任务名称 fn:回调函数 gulp.run(tasks...):尽量多的并行运行多个task gulp.watch(glob, fn):当glob内容发生改变时,执行fn gulp.src(glob):置须要处理的文件的路径,能够是多个文件以数组的形式,也能够是正则 gulp.dest(path[, options]):设置生成文件的路径 

glob:能够是一个直接的文件路径。他的含义是模式匹配。
gulp将要处理的文件经过管道(pipe())API导向相关插件。经过插件执行文件的处理任务。

gulp.task('default', function () {...}); 

gulp.task这个API用来建立任务,在命令行下能够输入$ gulp [default],(中括号表示可选)来执行上面的任务。

gulp官方API文档:https://github.com/gulpjs/gulp/blob/master/docs/API.md

gulp 插件大全:http://gulpjs.com/plugins/

开始构建项目

在项目根目录下新建一个gulpfile.js文件,粘贴以下代码:

//在项目根目录引入gulp和uglify插件 var gulp = require('gulp'); var uglify = require('gulp-uglify'); gulp.task('compress',function(){ return gulp.src('script/*.js') .pipe(uglify()) .pipe(gulp.dest('dist')); }); 

注:gulpfile.js文件名不可更改。
项目须要用到uglify和rename插件,执行如下命令安装:

npm install --save-dev gulp-uglify npm install --save-dev gulp-rename

以个人为例,进入gulpfile.js所在目录:

cd /Users/trigkit4/gulp-test

而后输入:

var gulp = require('gulp'); var uglify = require('gulp-uglify'); var rename = require('gulp-rename'); gulp.task('compress',function(){ return gulp.src('script/*.js') .pipe(uglify()) .pipe(rename('jquery.ui.min.js')) .pipe(gulp.dest('dist')); });

该命令会安装package.json下的所有依赖,以下图所示:

完整的gulpfile.js

// 载入外挂 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'), clean = require('gulp-clean'), concat = require('gulp-concat'), notify = require('gulp-notify'), cache = require('gulp-cache'), livereload = require('gulp-livereload'); // 样式 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' })); }); // 脚本 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' })); }); // 图片 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' })); }); // 清理 gulp.task('clean', function() { return gulp.src(['dist/styles', 'dist/scripts', 'dist/images'], {read: false}) .pipe(clean()); }); // 预设任务 gulp.task('default', ['clean'], function() { gulp.start('styles', 'scripts', 'images'); }); // 看守 gulp.task('watch', function() { // 看守全部.scss档 gulp.watch('src/styles/**/*.scss', ['styles']); // 看守全部.js档 gulp.watch('src/scripts/**/*.js', ['scripts']); // 看守全部图片档 gulp.watch('src/images/**/*', ['images']); // 创建即时重整伺服器 var server = livereload(); // 看守全部位在 dist/ 目录下的档案,一旦有更动,便进行重整 gulp.watch(['dist/**']).on('change', function(file) { server.changed(file.path); }); }); 

注:pipe()stream模块里传递数据流的一个方法,第一个参数为插件方法,插件会接收从上游流下的文件,进行处理加工后,再往下流。

gulp.task('任务名称', function () { return gulp.src('文件路径') .pipe(...) .pipe(...) // 直到任务的最后一步 .pipe(...); }); 

若是想使用gulp直接启动服务器

添加gulp-connect

npm install gulp-connect --save-dev 添加task gulp.task('webserver', function() { connect.server({ livereload: true, port: 8888 }); });

gulp插件

  • gulp-gh-pages:使用gulp来把markdown生成html文档并上传到git pages

https://github.com/shinnn/gulp-gh-pages

var gulp = require('gulp'); var ghPages = require('gulp-gh-pages'); gulp.task('deploy', function() { return gulp.src('./dist/**/*') .pipe(ghPages()); }); 
  • gulp-jade插件:将jade编译成html文件

  • gulp-less插件:将less编译成css文件

var less = require('gulp-less'); var path = require('path'); gulp.task('less', function () { return gulp.src('./less/**/*.less') .pipe(less({ paths: [ path.join(__dirname, 'less', 'includes') ] })) .pipe(gulp.dest('./public/css')); }); 
  • gulp-live-server 插件:方便的,轻量级的服务器

var gulp = require('gulp'); var gls = require('gulp-live-server'); gulp.task('serve', function() { //1. serve with default settings var server = gls.static(); //equals to gls.static('public', 3000); server.start(); //2. serve at custom port var server = gls.static('dist', 8888); server.start(); //3. serve multi folders var server = gls.static(['dist', '.tmp']); server.start(); //use gulp.watch to trigger server actions(notify, start or stop) gulp.watch(['static/**/*.css', 'static/**/*.html'], function (file) { server.notify.apply(server, [file]); }); }); 
  • gulp-livereload,能够实时保存刷新,那样就不用按F5和切换界面了

  • gulp-load-plugins:在你的package.json文件中自动加载任意的gulp插件

$ npm install --save-dev gulp-load-plugins 

例如一个给定的package.json文件以下:

{

    "dependencies": { "gulp-jshint": "*", "gulp-concat": "*" } } 

gulpfile.js中添加以下代码:

var gulp = require('gulp'); var gulpLoadPlugins = require('gulp-load-plugins'); var plugins = gulpLoadPlugins(); 

plugins.jshint = require('gulp-jshint');

plugins.concat = require('gulp-concat');

  • gulp-babel:gulp 的babel插件,

$ npm install --save-dev gulp-babel babel-preset-es2015

使用方法:

const gulp = require('gulp'); const babel = require('gulp-babel'); gulp.task('default', () => { return gulp.src('src/app.js') .pipe(babel({ presets: ['es2015'] })) .pipe(gulp.dest('dist')); });

官方github: https://github.com/gulpjs/gulp

相关文章
相关标签/搜索