利用 Gulp 处理前端工做流程

基本用法

// gulpfile.js
gulp.task('foo', function() {
    gulp.src(glob)
        .pipe(...)
        .pipe(...)
        .pipe(gulp.dest(...))
        .pipe(...)
        .pipe(gulp.dest(...))
});

// shell
$ gulp foo

基本 API

  • gulp.src(glob[, options])css

    • 根据 glob 匹配文件,返回 stream,能够经过 .pipe() 方法传递给后续的插件。html

  • gulp.dest(path[, options])node

    • 通常用法 .pipe(gulp.dest(path)),把 pipe 中的内容按照指定的 path 写成文件,会自动建立不存在的文件夹。git

    • 注意,能够经过 .pipe 屡次指定输出的地方,具体请看 这里github

  • gulp.task(name[, deps], fn)shell

    • 定义名为 name 的任务,定义以后就能够在命令行中使用 gulp xxx 来执行任务。gulp

    • deps 里面的任务所有完成后才会执行 fnapi

    • deps 里面的任务都是并行执行的,若是须要顺序执行,须要特殊写法。具体看 这里promise

  • gulp.watch(glob[, opts, cb])sass

    • 监听文件变化

    • 不会监听新文件(目录),因此通常你会须要 gulp-watch

经常使用命令 (自定义)

# for development mode
gulp server

# run test
gulp test

# for production mode
gulp build

gulp server 流程

  • less, sass, 之类的文件编译成 CSS,经常使用插件:

  • 建立 Web Server (with Live Reload),经常使用:

    • gulp-connect,用来建立 Web Server,其实还有其余选择的,但多数都是利用 connect 来建立 Web Server 的。

    • node-proxy-middle,用来代理请求,能够把 /api/xxx 发送到指定的地址。(经常使用于 SPA 开发)

    • connect-modrewrite,匹配资源,若是不匹配就能够重定向到指定地址。(经常使用于 SPA 开发)

    • connect-history-api-fallback,做用同上,也用于匹配资源,但用起来简单不少。(经常使用于 SPA 开发)

  • 监听文件变化,经常使用插件:

示例代码

gulp.task('clean:css', function () {
    del.sync('app/styles/*.css');
});

gulp.task('less', ['clean:css'], function () {
    var stream = gulp
            .src('app/styles/main.less')
            .pipe(less())
            .pipe(gulp.dest('app/styles/'));
    return stream;
});

gulp.task('connect', function () {
    connect.server({
        root: './app',
        port: 9000,
        livereload: true,
        middleware: function (connect, o) {
            return [
                (function () {
                    var url = require('url');
                    var proxy = require('proxy-middleware');
                    var options = url.parse('http://localhost:3000/api');
                    options.route = '/api';
                    return proxy(options);
                })(),
                modRewrite([
                    '!\\.html|\\.js|\\.css|\\.swf|\\.jp(e?)g|\\.png|\\.gif|\\.eot|\\.woff|\\.ttf|\\.svg$ /index.html'
                ])
            ];
        }
    });
});

gulp.task('watch', function () {
    gulp
        .src('app/styles/**/*.less', {read: false})
        .pipe(watch('app/styles/**/*.less', function () {
            return gulp
                .src('app/styles/main.less')
                .pipe(less())
                .pipe(gulp.dest('app/styles/'))
                .pipe(connect.reload());
        }));

    gulp
        .src(['app/scripts/**/*.js', 'app/**/*.html'])
        .pipe(watch(['app/scripts/**/*.js', 'app/**/*.html']))
        .pipe(plumber())
        .pipe(connect.reload());
});

gulp.task('server', ['less', 'connect', 'watch']);

gulp build 流程

实例代码

gulp.task('clean:build', function () {
    del.sync('dist/', {force: true});
});

gulp.task('minify', ['clean:build', 'less'], function () {
    gulp
        .src('app/views/**/*.html')
        .pipe(htmlmin({collapseWhitespace: true}))
        .pipe(gulp.dest('dist/views'));

    gulp
        .src('app/index.html')
        .pipe(usemin({
            js: [uglify(), rev()],
            css: [minifyCss(), 'concat', rev()]
        }))
        .pipe(gulp.dest('dist/'));
});

gulp.task('copyfonts', function () {
    gulp
        .src('app/styles/fonts/*')
        .pipe(gulp.dest('dist/fonts/'));
});

gulp.task('build', ['clean:build', 'minify', 'copyfonts']);

出处

https://scarletsky.github.io/2015/08/14/use-gulp-for-front-end-workflow/

参考资料

英文文档
中文文档

相关文章
相关标签/搜索