Grunt 监视任务而不是文件?

Grunt watch for tasks instead for files?

我是 Grunt 的新手,我看过一些关于 watch 插件的教程。示例:

watch:{
 sass:{
  files: 'sass/*.scss',
  tasks: ['sass','cssmin']
 }
}

我的问题是为什么我需要关注 "sass" 之类的另一个插件而不是关注实际文件 'sass/*.scss'?

我不明白,看一个plugin/task而不是一个文件是不合逻辑的。

为什么我不能这样调用:

watch:{
      files: 'sass/*.scss',
      tasks: ['sass','cssmin']
    }

?

如果我还想查看我的 js 文件怎么办?我是否还需要将其放入 sass 任务的文件中?将 js 文件放入 sass 任务中是没有意义的...

并不是说您是 "watching" 那个插件,而是您正在监视一组文件,并且在文件更改时 运行 正在执行任务。 tasks 规范是您指定所需任务的地方。因此,在这种情况下,您将 运行 sass 和 cssmin 任务。

你绝对不是在看插件。假设你有另一个插件 less,你想处理一组不同的文件。你会怎么做?

watch {
    sass: ...

    less: ...

    uglify: ...
}

即使您将 js 文件与 sass 放在一起(忽略这是一种可怕的做法),当 grunt 在该文件上调用 sass 时,也不会发生任何事情。

举个例子

module.exports = function (grunt) {

    grunt.initConfig({

        jshint: {
            // ...
        },

        uglify: {
            // ...
        },

        sass: {
            // ...
        },

        foo: {
            // ...
        },

        watch: {
            javascript: {
                files: 'javascripts/*/**.js',
                tasks: ['jshint', 'uglify']
            },
            sass: {
                files: 'sass/*/**.scss',
                tasks: ['sass', 'foo']
            }
        }

    });

    // ...

};

js有不同的watcher,比如uglify。

watch 插件监视与 files 部分指定的模式匹配的文件。每当更改任何匹配文件时,都会执行 tasks 中提到的任务。

例如,让我们考虑一下您问题中的 watch 任务

watch:{
    sass:{
        files: 'sass/*.scss',
        tasks: ['sass','cssmin']
    }
}

这里,sass只是给操作起的名字。它可以是任何东西;但由于该操作编译 Saas 文件,因此该操作被命名为 saas.

每当sass目录中的任何scss文件被改变时,操作saas被触发,执行saascssmin任务,这应该早点定义。

参考文献: