0

我目前正在使用 Grunt,当我尝试 Gulp 时,我第一次遇到的 Grunt 问题也发生在我身上。

我正在尝试处理一些 js 文件(concat、uglify 和缩小它们),但我不希望所有这些文件都编译成一个大文件,我想要多个输出文件,每个文件都来自一些输入文件的处理:

scripts =
    firstOutput:
        outputFilename: 'first.min.js',
        inputFiles: ['one.js', 'two.js']

    secondOutput:
        outputFilename: 'second.min.js',
        inputFiles: ['three.js']

    thirdOutput:
        outputFilename: 'third.min.js',
        inputFiles: ['four.js', 'five.js']

我发现(目前)使用 Grunt 实现这一目标的唯一方法是使用多个手表和多个 uglify 任务(或一个 uglify 任务和一个监听器更改以动态修改 uglify 任务 src 和 dest):

module.exports = (grunt) ->
    grunt.loadNpmTasks 'grunt-contrib-watch'
    grunt.loadNpmTasks 'grunt-contrib-uglify'

    grunt.initConfig
         watch:
             firstOutput:
                 files: scripts.firstOutput.inputFiles
                 tasks: ['uglify:firstOutput']
                 options :
                     spawn : false

             secondOutput:
                 files: scripts.secondOutput.inputFiles
                 tasks: ['uglify:secondOutput']
                 options :
                     spawn : false

             thirdOutput:
                 files: scripts.thirdOutput.inputFiles
                 tasks: ['uglify:thirdOutput']
                 options :
                     spawn : false

         uglify:
             firstOutput:
                 files: scripts.firstOutput.inputFiles
                 dest: scripts.firstOutput.outputFilename

             secondOutput:
                 files: scripts.secondOutput.inputFiles
                 dest: scripts.secondOutput.outputFilename

             thirdOutput:
                 files: scripts.thirdOutput.inputFiles
                 dest: scripts.thirdOutput.outputFilename

    grunt.registerTask 'default', 'watch'

而且,您可以想象,这只是一个示例,在我的大型 Web 应用程序的情况下,不仅仅是三个输出 js 文件,而且我还将少一些文件处理成一些 css 文件

我的 Gruntfile 真的很大,我发现它有很多重复的代码,有没有办法让这个代码重构为一个 watch 和一个 uglify 任务,自动猜测 src 和 dest 有某种依赖(知道如果four.js文件被修改,它必须处理第三个输出)?

如果你有办法用 Gulp 来做这件事,我会很高兴地接受它,因为我想在我通常的工作流程中测试它。

4

2 回答 2

1

以下是使用 gulp + vanilla javascript 执行此操作的方法:

var _ = require("underscore")
  , gulp = require("gulp")
  , uglify = require("gulp-uglify")

var scripts = [
  {
    output: 'first.min.js',
    input: ['one.js', 'two.js']
  }
  , {
    output: 'second.min.js',
    input: ['three.js']
  }
  , {
    output: 'third.min.js',
    input: ['four.js', 'five.js']
  }
];

function build(files, dest) {

  return gulp.src(files)
    .pipe(uglify())
    .pipe(gulp.dest(dest));

}

gulp.task("watch", function () {

  _.each(scripts, function (script, i) {

    gulp.watch(script.input, function () {

      build(script.input, script.output);

    });

  });

});

如果您可以使用 glob 来匹配文件集,那就更好了,这样您就不必为每个文件集写出路径input。就像是input: ["one/**/*.js, "other/**/*.js"]

于 2014-02-18T15:04:26.657 回答
-1

“我正在尝试处理一些 js 文件(concat、uglify 和缩小它们),但我不希望所有这些文件都编译成一个大文件”

我能问为什么吗?一个较大文件的好处是您可以节省 HTTP 请求,您加载的每个资源都会导致您的网站速度变慢。我可以建议对 RequireJS 使用适当的依赖管理吗?这样,优化器可以遍历您的依赖图并为您输出优化文件。

http://requirejs.org/

这也有一个繁重的任务:

https://github.com/gruntjs/grunt-contrib-requirejs

于 2014-02-17T00:10:25.880 回答