Gulp 为watch语句一口气运行两次js

Gulp 为watch语句一口气运行两次js,gulp,gulp-watch,Gulp,Gulp Watch,我看到控制台日志语句,一旦我更改任何javascript文件,js任务就会运行两次。我想知道为什么每次更改都会运行两次 var gulp = require('gulp'); var concat = require("gulp-concat"); var uglify = require("gulp-uglify"); gulp.task('default', function() { gulp.watch("public/js/**/*.*", ["js"]); }); gulp

我看到控制台日志语句,一旦我更改任何javascript文件,js任务就会运行两次。我想知道为什么每次更改都会运行两次

var gulp = require('gulp');
var concat = require("gulp-concat");
var uglify = require("gulp-uglify");

gulp.task('default', function() {
    gulp.watch("public/js/**/*.*", ["js"]);
});

gulp.task("js", function(){
    var js = [
        "public/js/**/*.js",
        "!public/js/api/**/*.js"
    ];

    gulp.src(js)
    .pipe(concat("app.min.js"))
    .pipe(uglify())
    .pipe(gulp.dest("public/js"));
});
控制台

[13:02:27] Starting 'js'...
[13:02:27] Finished 'js' after 1.6 ms
[13:02:27] Starting 'js'...
[13:02:27] Finished 'js' after 5.1 ms

问题是,检测到更改时,您正在监视与您运行的任务中的目标目录相同的目录。当前,您的生成流如下所示:

  • 假设您正在修改一个文件public/js/script.js

  • “监视”任务检测到更改并启动自定义的js任务。因此,将创建public/js/app.min.js文件

  • 由于app.min.js位于监视目录内,监视任务检测到另一个更改,因此再次执行js任务。实际上,你应该会遇到一个循环,但Gulp似乎足够聪明,可以检测到这样的循环
  • 解决此问题的最佳解决方案是将源文件与输出分开。在任务管道中,将目标文件夹设置为源目录之外的内容,例如:

    .pipe(gulp.dest("dist/js"));
    
    之后,您的项目应具有以下结构:

    public
      js
        script.js
    dist
      js
        app.min.js
    grunfile.js
    ...
    

    其中,public目录用于保存监视的源文件,dist目录保存生成的输出。如果我是你,我会重新考虑将public目录重命名为更具描述性的src,但这取决于你:)

    问题是,当检测到更改时,你正在监视与你运行的任务中的目标目录相同的目录。当前,您的生成流如下所示:

  • 假设您正在修改一个文件public/js/script.js

  • “监视”任务检测到更改并启动自定义的js任务。因此,将创建public/js/app.min.js文件

  • 由于app.min.js位于监视目录内,监视任务检测到另一个更改,因此再次执行js任务。实际上,你应该会遇到一个循环,但Gulp似乎足够聪明,可以检测到这样的循环
  • 解决此问题的最佳解决方案是将源文件与输出分开。在任务管道中,将目标文件夹设置为源目录之外的内容,例如:

    .pipe(gulp.dest("dist/js"));
    
    之后,您的项目应具有以下结构:

    public
      js
        script.js
    dist
      js
        app.min.js
    grunfile.js
    ...
    
    其中,public目录用于保存监视的源文件,dist目录保存生成的输出。如果我是你,我会重新考虑将public目录重命名为更具描述性的src,但这取决于你:)