gulp学习

3,414 阅读3分钟

gulp是一个优秀的自动化构建的工具,它的核心在于流式的操作和简单易学上手的API,下面我们就来学习搭建一个简单的工程框架。

首先我们来简单建一下文件目录:

dist/
src/
    less/
    js/
    view/
gulpfile.js
package.json

这里我们建一个gulpfile.js,我们所有的配置都写这里,注意的是它的名字只能是gulpfile.js。

  • 然后我们需要根据自己搭建框架的需要来引进一些插件,比如我想用jade,es6,less
npm install gulp gulp-jade gulp-babel gulp-preset-es2015 gulp-less --save-dev

我们安装gulp,这里推荐安装gulp为全局的,即

npm install gulp -g

下面我就来配置一下gulpfile.js:

    //引入插件
    var gulp = require('gulp');
    var jade = require('gulp-jade');
    var babel = require('gulp-babel');
    var less = require('gulp-less');

    //gulp都是task任务,我们建一个任务为jade用来转换jade的代码
    gulp.task('jade', function(){
        //用return gulp.src()来创建一个虚拟文件对象流,然后匹配不同的文件,设置base灵活改变生成文件路径
        return gulp.src(['src/*.jade', 'src/view/*.jade', 'src/view/**/*.jade'], {
        	base: 'src'
        })
        	//转换jade的代码
            .pipe(jade())
            //gulp.dest()指定生成文件路径
            .pipe(gulp.dest('dist'))
    })

    //js任务
    gulp.task('js', function () {
    	return gulp.src(['src/js/*.js', 'src/js/**/*.js'],{
            base: 'src'
        })
        	.pipe(babel({
            	presets: ['babel-preset-es2015']
       		}))
        	.pipe(gulp.dest('dist'))
	});

    //less任务
    gulp.task('less', function () {
    	return gulp.src(['src/less/*.less', 'src/less/**/*.less'])
        	.pipe(less())
        	.pipe(gulp.dest('dist/css/'))
	});

    //gulp有一个default的任务
    gulp.task('default', ['jade', 'js', 'less'], function () {

	});

匹配模式

  • *:匹配单个文件或目录
  • *.*:能匹配带后缀的文件
  • */*/*.js:能匹配 a/b/c.js,但不能匹配a/b.js或a/b/c/d.js
  • **能匹配所有的目录和文件
  • **/*.js 能匹配多级目录下的js文件(也包含当前目录下)
  • ?.js能匹配单字符名的JS文件,如a.js
  • [xyz].js匹配x.js|y.js|z.js
  • [^xyz].js表示取反,不能匹配x.js|y.js|z.js文件

如果需要对代码进行压缩混淆,重命名,我们可以用到一些gulp插件

  • gulp-minify-css:压缩css代码
  • gulp-uglify:压缩混淆js
  • gulp-rename:重命名输出文件

我们可以转译代码了,这是我们需要给工程起一个server,然后监听文件的修改,即使编译刷新页面:

npm install browser-sync --save-dev
gulp.task('serve', ['less', 'js', 'jade'], function () {
    browserSync({
        notify: false,
        files: ["dist/**/**/*", "dist/**/*", "dist/*"],         // 监听文件内容改变,刷新页面
        port: 3000,
        server: {
            baseDir: "./dist/"  //index页面
        }
    });
    gulp.watch('src/**/*', ['less', 'js', 'jade']);
});

这时我们的工程初始模型就出来了,但是编译时如果出现错误,工程会挂掉,这是还要重启gulp serve,比较麻烦,处理方法是引入gulp-plumber

我们的gulpfile.js就是这样了

    var gulp        = require('gulp');
    var browserSync = require('browser-sync');
    var jade        = require('gulp-jade');
    var less        = require('gulp-less');
    var minifyCss   = require('gulp-minify-css');
    var babel       = require('gulp-babel');
    var uglify      = require('gulp-uglify');
    var rename      = require('gulp-rename');
    var plumber     = require('gulp-plumber');

    gulp.task('jade', function () {
        return gulp.src(['src/*.jade', 'src/view/*.jade', 'src/view/**/*.jade'], {
            base: 'src'
        })
            .pipe(plumber(function (error) {
                console.log('----------------------------------------');
                console.log(error);
                console.log('----------------------------------------');
            }))
            .pipe(jade())
            .pipe(plumber.stop())
            .pipe(gulp.dest('dist'))
    });

    gulp.task('less', function () {
        return gulp.src(['src/less/*.less', 'src/less/**/*.less'])
            .pipe(plumber(function (error) {
                console.log('----------------------------------------');
                console.log(error);
                console.log('----------------------------------------');
            }))
            .pipe(less())
            .pipe(minifyCss())
            .pipe(plumber.stop())
            .pipe(rename({ extname: '.min.css' }))
            .pipe(gulp.dest('dist/css/'))
    });

    gulp.task('js', function () {
        return gulp.src(['src/js/*.js', 'src/js/**/*.js'],{
                base: 'src'
            })
            .pipe(plumber(function (error) {
                console.log('----------------------------------------');
                console.log(error);
                console.log('----------------------------------------');
            }))
            .pipe(babel({
                presets: ['babel-preset-es2015']
            }))
            .pipe(uglify())
            .pipe(plumber.stop())
            .pipe(rename({ extname: '.min.js' }))
            .pipe(gulp.dest('dist'))
    });

    gulp.task('serve', ['less', 'js', 'jade'], function () {
        browserSync({
            notify: false,
            files: ["dist/**/**/*", "dist/**/*", "dist/*"],         // 监听文件内容改变,刷新页面
            port: 3000,
            server: {
                baseDir: "./dist/"
            }
        });
        gulp.watch('src/**/*', ['less', 'js', 'jade']);
    });

    gulp.task('default', ['serve'], function () {

    });

在gulp之前会有一大串的插件引用,如果不想这样,可以通过gulp-load-plugins来解决这个问题 参考前端利器 Gulp 介绍

如果还需要其他的功能,可以根据实际情况再进行学习添加,配置。