Grunt.js监视 - 始终监视node_modules

时间:2015-08-05 12:56:52

标签: gruntjs livereload node-modules

我只使用Grunt进行livereload。它工作正常,但我注意到它有很高的CPU,当我用“--verbose”运行它时,我看到它正在观察整个“node_modules”文件夹。

所以,我做了一些研究,并试图忽略这一点。不幸的是,没有成功。

我的“gruntfile.js”部分是:

    // the watch stuff ..
    watch: {
        all: {
            files: ['!**/node_modules/**', 'js/**/*.js', 'css/**/*.css', 'index.html'],
            options: {
                interval: 5007,
                livereload: true
            }
        }
    },

基本上我说我想要grunt来观看所有的js,css和index.html文件。明确添加了忽略“node_modules”的代码,但它仍然表示正在观察它并且CPU大约30%。 (Mac OSx)

==================

我注意到了一件事:

当我在“gruntfile.js”中进行更改时 - 例如在“watch”任务的“files”属性中再添加一个文件 - 然后重新启动grunt,在控制台中我看到它开始观看只有我想要的文件,然后CPU低于1%。 (我想这应该是最初的原因。)

我做错了什么?

====================

编辑:不幸的是,当我更改gruntfile并且我看到只有我想要的文件被观看时 - 那么livereload的东西不再有效。

====================

这是我开始的文章: http://thecrumb.com/2014/03/15/using-grunt-for-live-reload/

这是我的package.json文件:

{
  "name": "grunt-reload",
  "version": "1.0.0",
  "devDependencies": {
        "grunt": "~0.4.3",
        "matchdep": "~0.3.0",
        "grunt-express": "~1.2.1",
        "grunt-contrib-watch": "~0.6.0",
        "grunt-open": "~0.2.3"
  }
}

这是我的Gruntfile.js:

module.exports = function(grunt) {

    require('matchdep')
        .filterDev('grunt-*')
        .forEach(grunt.loadNpmTasks);

    grunt.initConfig({

        // the web server ..
        express: {
            all: {
                options: {
                    bases: [__dirname],
                    port: 8888,
                    hostname: 'localhost',
                    livereload: true
                }
            }
        },

        // the watch stuff ..
        watch: {
            all: {
                files: ['js/**/*.js', 'css/**/*.css', 'index.html'],
                options: {
                    livereload: true
                }
            }
        },

        // the automatic opening stuff ..
        open: {
            all: {
                path: 'http://localhost:8888/index.html'
            }
        }
    });

    // create the server task ..
    grunt.registerTask(
        'server',
        ['express', 'open', 'watch']
    );

}; // end of "module.exports" ..

我用“grunt服务器”开始这一切。

1 个答案:

答案 0 :(得分:1)

编辑:共享Gruntfile后,问题变得更加清晰。

在您的grunt-express配置中,您已将livereload设置为true而将bases设置为__dirname,即Gruntfile中的文件夹{}从

现在,让我们看一下grunt-express文档:

  

<强>碱

     

类型:字符串|数组默认值:null

     

将从中提供静态文件的基(或根)目录。将为每个基数条目生成connect.static()。 当livereload设置为true(或设置为特定端口号)时,将为您创建一个监视任务(在运行时)以观察您的basePath /**/*.*

(强调我的)

因此,在grunt-express配置中,您可以设置livereload以查看基本路径中的所有文件,其中包括node_modules

您有几种选择:

  1. 相应地删除您的其他watch任务和配置grunt-expresses基本路径(基本上只复制其他配置)。

  2. 保留两项监视任务,忽略其他node_modules配置中的grunt-express -> bases

  3. 删除bases并处理其他watch任务中的实时重载

  4. node_modules文件夹位于何处?如果它在root上,只要没有任何匹配的glob模式,你就可以完全删除node_modules参数:

    // the watch stuff ..
    watch: {
        all: {
            files: ['js/**/*.js', 'css/**/*.css', 'index.html'],
            options: {
                interval: 5007,
                livereload: true
            }
        }
    },
    

    现在您正在观看:所有.js - js文件夹下的文件,根目录下的index.html等等。

    但是,如果node_modules下有js/node_modules,则可以明确忽略该文件夹及其中的文件:

     files: ['!js/node_modules/**', 'js/**/*.js', 'css/**/*.css', 'index.html'],
    

    无论如何,根据您的Gruntfiles和node_module - 文件夹位置,您的配置应该可以正常工作。