javascript - 为什么 gulp watch 运行所有任务?

标签 javascript gulp

我有一个 gulpfile.js 来编译我的 sass 和 javascript。在文件的底部,我有一个任务可以监视任何 sass 或 javascript 文件的变化:

// Load plugins
var gulp = require('gulp'),
    sass = require('gulp-ruby-sass'),
    autoprefixer = require('gulp-autoprefixer'),
    minifycss = require('gulp-minify-css'),
    jshint = require('gulp-jshint'),
    uglify = require('gulp-uglify'),
    imagemin = require('gulp-imagemin'),
    rename = require('gulp-rename'),
    clean = require('gulp-clean'),
    concat = require('gulp-concat'),
    cache = require('gulp-cache'),
    livereload = require('gulp-livereload');

// Styles
gulp.task('styles', function() {
    return gulp.src('sass/**/*.scss')
        .pipe(sass({ style: 'expanded', }))
        .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
        .pipe(gulp.dest('web'))
        .pipe(rename({ suffix: '.min' }))
        .pipe(minifycss())
        .pipe(gulp.dest('web'));
});

// Scripts
gulp.task('scripts', function() {
    return gulp.src('js/**/*.js')
        .pipe(jshint('node_modules/gulp-jshint/.jshintrc'))
        .pipe(jshint.reporter('default'))
        .pipe(concat('main.js'))
        .pipe(gulp.dest('web'))
        .pipe(rename({ suffix: '.min' }))
        .pipe(uglify())
        .pipe(gulp.dest('web'));
});

// Images
gulp.task('images', function() {
    return gulp.src('img/**/*')
        .pipe(cache(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })))
        .pipe(gulp.dest('web'));
});

// Clean
gulp.task('clean', function() {
    return gulp.src(['web'], {read: false})
        .pipe(clean());
});

// Default task
gulp.task('default', ['clean'], function() {
    gulp.start('styles', 'scripts', 'images');
});

// Start livereload
gulp.task('start-livereload', function () {
    server.listen(35729, function (err) {
        if (err) {
            return console.log(err);
        }
    });
});

// Watch
gulp.task('dev', ['start-livereload'], function() {

    console.log('running');

    // Watch .scss files
    gulp.watch('sass/**/*.scss', {mode: 'poll'}, ['styles']);

    // Watch .js files
    gulp.watch('js/**/*.js', {mode: 'poll'}, ['scripts']);

    // Watch image files
    gulp.watch('img/**/*', {mode: 'poll'}, ['images']);

    // Create LiveReload server
    var server = livereload();

    // Watch any files in dist/, reload on change
    gulp.watch(['web/**']).on('change', function(file) {
        server.changed(file.path);
    });

});

当我在终端中运行 gulp dev 并更改 sass 文件时,sass 编译器和 javascript 编译器都会运行。当我更改 javascript 文件时,也会发生同样的事情。

我怎样才能改变它,以便我只在 sass 文件更改时编译 Sass,而在 javascript 文件更改时只编译 javascript?

最佳答案

您是否注意到,您观察源目标目录中的文件更改?所以,也许,如果源代码被更改并被编译,目标目录就会被触及。而这会继承目的目录的监视任务。

此外,您在 stylesscripts 任务中设置了两次目标:

.pipe(gulp.dest('web'));

谨致问候。

关于javascript - 为什么 gulp watch 运行所有任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24020080/

相关文章:

angularjs - 将 Angular 动画添加到预先存在的堆栈中

javascript - gulp 构建任务 - 连接和缩小模块

javascript - Aria gridcell 标签在 SVG 矩形内始终为空白

javascript - jQuery - 为什么我不能将事件绑定(bind)到循环中的元素?

javascript - 从 web.config 变量生成 JSON 文件

javascript - autoprefixer watch 任务配置

javascript - 使用 javascript 访问共享点列表

javascript - 使用 jQuery 代理时保留两个 `this` 引用

sass - 在另一台机器上使用 gulp 项目

deployment - 如何使用 gulp 递归复制目录?