创建Gulp任务以缩小/连接文件以将来自多个目录的源打包到其各自目录中的文件中

时间:2014-03-14 19:36:24

标签: javascript angularjs gulp

我正在编写一个具有以下结构的Angular项目:

js/
    components/
        component1/
            component1.directive.js
            component1.controller.js
            component1.factory.js
            component1.rest.service.js
        component2/
            component2.factory.js
            component2.rest.service.js
    vendor/
        angular/
        jquery/
    home.js
    page2.js

其中组件是共享资源,直接驻留在js /下的文件是所需组件和供应商库的包。

我想用gulp做的是创建一个任务,它将从每个组件目录中流式传输文件,监视更改以触发ngmin()和uglify(),然后将这些文件concat()转换为' { componentDirectoryName} .package.min.js'文件位于组件的目录中。结果看起来像这样:

js/
    components/
        component1/
            component1.directive.js
            component1.controller.js
            component1.factory.js
            component1.rest.service.js
            component1.package.min.js
        component2/
            component2.factory.js
            component2.rest.service.js
            component2.package.min.js

目前的实施:

var gulp        = require('gulp');
var $           = require('gulp-load-plugins')({ camelize: true});
var glob        = require('glob');
var StreamQueue = require('streamqueue');

var publicDir = './src/main/webapp/public/';
var jsDir = publicDir + 'js/';
var components = jsDir + 'components/';

gulp.task('js', function() {
    var componentsDirectories = glob.sync(components + '/*/');
    var queue = new StreamQueue();

    componentsDirectories.forEach(function(directory) {
        var componentName = directory.match(/.+\/(.+)\/$/)[1];

        queue.queue(
            gulp.src([directory + '*.js', '!' + directory + '*-package.min.js'])
                .pipe($.ngmin())
                .pipe($.jsmin())
                .pipe($.concat(componentName + "-package.min.js"))
                .pipe(gulp.dest(directory))
        );
    });

    return queue.done().pipe($.livereload());

});

gulp.task('watch', function() {
    gulp.watch([components + '**/*.js', '!' + components + '**/*.min.js'], ['js']);
});

gulp.task('default', ['js', 'watch']);

1 个答案:

答案 0 :(得分:10)

您可以使用node-glob获取组件的名称 要将多个源注册为单个任务,您可以使用streamqueue组合流。

这是我的解决方案:

var gulp = require('gulp');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var ngmin = require('gulp-ngmin');
var livereload = require('gulp-livereload');
var glob = require('glob');
var StreamQueue = require('streamqueue');

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

  var componentsFolders = glob.sync('components/*/');
  var queue = new StreamQueue();

  componentsFolders.forEach(function(folder){
    var componentName = folder.match(/.+\/(.+)\/$/)[1];
    queue.queue(
      gulp.src([folder + '*.js', '!' + folder + '*.package.min.js'])
          .pipe(ngmin())
          .pipe(uglify())
          .pipe(concat(componentName + ".package.min.js"))
          .pipe(gulp.dest(folder))
    );
  });

  return queue.pipe(livereload());
});

gulp.task('default', ['js']);