Grunt watch pattern.indexOf不是一个功能

时间:2016-08-28 06:45:39

标签: javascript gruntjs grunt-contrib-watch

我试图使用Grunt的grunt-contrib-watch插件来观看一些文件,然后运行任务,就像它的目的一样,这是我的 Gruntfile.js

module.exports = function(grunt){
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        sass: {
            options: {
                sourceMap: true,
                outputStyle: 'compressed'
            },
            dist: {
                files: {
                    'static/stylesheets/main.min.css': 'static/stylesheets/sass/main.scss',
                    /*'bower_components/foundation-sites/dist/foundation.min.css': 'bower_components/foundation-sites/scss/foundation.scss'*/
                }
            }
        },
        uglify: {
            dist: {
                files: {
                    'static/javascript/main.min.js': 'static/javascript/main.js'
                }
            }
        },
        watch: {
            files: [
                '<%= sass.dist.files %>',
                '<%= uglify.dist.files %>'
            ],
            tasks: [
                'sass',
                'uglify'
            ]
        }
    });

    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-sass');
    grunt.loadNpmTasks('grunt-contrib-uglify');

    grunt.registerTask('default', ['watch']);
};

当我运行它时,它一遍又一遍地运行,当我停止它时,我看到我有这样的信息:

  

跑步&#34;观看&#34;任务   等候...   警告:pattern.indexOf不是函数

我真的不知道问题是什么。有人知道这里发生了什么吗?

更新

显然,问题在于我调用文件的方式,因为我将其更改为:&#39; static / stylesheets / sass / * .scss&#39;它运作良好,但我想知道为什么另一种方式不起作用,因为我认为这是一种更有用的方法。

2 个答案:

答案 0 :(得分:4)

grunt-contrib-watch要求单个模式字符串或模式字符串数组作为其files配置的值。但是,您在配置中使用的模板会评估对象。您的watch.files值的计算结果如下:

files: [
    { 'static/stylesheets/main.min.css': 'static/stylesheets/sass/main.scss' },
    { 'static/javascript/main.min.js': 'static/javascript/main.js' }
]

当模式匹配尝试运行时,它失败,因为对象上没有indexOf方法。由于grunt-contrib-watch永远运行,因此尝试无效循环并且无法构建监视文件列表。

您通常会使用以下内容配置监视文件:

files: [
    'static/**/*.scss',
    'static/**/*.js'
]

但是上述情况会导致您的问题,因为您的缩小JS文件与源JS文件位于同一文件夹中。您可以通过向文件数组添加'!static/**/*.min.js'来解决这个问题,但更好的解决方案是将所有已编译的文件放入单独的文件夹中。

答案 1 :(得分:1)

从对象中提取值:

watch: {
    files: [
        '<%= sass.dist.files.values() %>',
        '<%= uglify.dist.files.values() %>'
    ],