【问题标题】:Create Gulp tasks to minify/concat files to package sources from multiples directories into files in their respective directory创建 Gulp 任务以缩小/合并文件以将多个目录中的源打包到各自目录中的文件中
【发布时间】:2014-03-14 19:36:24
【问题描述】:

我正在编写一个具有以下结构的 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']);

【问题讨论】:

    标签: javascript angularjs gulp


    【解决方案1】:

    您可以使用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']);
    

    【讨论】:

    • 您的意思是在任务中包含componentsFolders 的内容吗?就像现在一样,它会在每次运行 gulp 时运行,无论哪个任务。
    • @OverZealous 谢谢!编辑任务。
    • @t3chn0b0y 我使用了您的代码和正则表达式,它运行良好,谢谢!但是,我确实遇到了一个问题,即让 livereload 与 Chrome 插件一起工作并立即观看。编辑我的帖子以显示我当前的设置。
    • @SirTophamHatt 我还没有尝试过 gulp-livereload。我建议你试试gulp-connect。在任何浏览器中无需插件即可更轻松地设置和工作。这是我的gulpfile。
    • @t3chn0b0y 我已经将 Apache 配置为为使用 Zend PHP 框架的 Web 应用程序提供服务。我正在尝试利用现有的服务器,只运行一个单独的 livereload 服务器。
    猜你喜欢
    • 2021-05-25
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 2018-04-07
    相关资源
    最近更新 更多