Grunt.js - 如何有效地忽略(黑名单)node_modules文件夹?

时间:2014-07-17 12:04:27

标签: gruntjs

我想知道为什么我的jshint grunt任务如此死慢。这是简短的示例配置:

var config = {
    jshint: {
        scripts: ['**/*.js', '!node_modules/**']
    },
    watch: {
        files: ['**/*.js', '!node_modules/**'],
        tasks: ['jshint']
    }
}

这种模式是什么?如果我已正确理解了这些内容,则两个文件模式都使用grunt api来构建任务的文件列表。该模式有效,它会过滤掉node_modules中的所有内容,但它会非常缓慢,因为在应用过滤器之前,grunt会递归地挖掘整个node_modules目录(~100 MB)。

有没有办法真正告诉grunt甚至不看node_modules?

我的笔记本电脑上的示例配置大约需要30秒。如果使用白名单模式而不是黑名单,则jshint任务只需几秒钟。但是白名单意味着如果我进行任何重构等非常烦人的话,我必须一直在寻找Gruntfile。

当前列表模式如下所示:

var allJSFiles = [
    '*.js',
    '{browser,server,config,models,routes,tasks,schema,test,utils,views}/**/*.js',
     '!browser/bower_components/**'
];

4 个答案:

答案 0 :(得分:5)

难道你不能只将你的JS文件添加到root下的新文件夹中吗?这样,您可以通过不将其包括在列表中来“忽略”node_modules

示例文件夹结构

- root
- node_modules
  - jshint
- src
  // your bespoke code

Grunt config

var config = {
  jshint: {
    scripts: ['src/**/*.js']
  },
  watch: {
    files: ['src/**/*.js'],
    tasks: ['jshint']
  }
}

答案 1 :(得分:2)

就像Andy已经提到的那样,我也建议使用不同的文件结构,将代码保存在" src"或"公共"例如目录。

这里的问题是你的规则

  

' ** / * JS'

总是遍历所有目录,后来才排除node_modules,此时无法阻止。

不仅仅是因为这个,还要从其他资产(图像?文档?)中分离代码,另一种结构应该是可行的方法。

答案 2 :(得分:0)

鉴于您说在@Xosofox的答案评论中不能将您的节点模块与JS分开,我会考虑专门针对您想要运行jshint的文件夹,而不是忽略您的node_modules文件夹。

jshint: {
    scripts: [
         'folderYoureInterestedIn/*.js',
         'anotherFolderYoureInterestedIn/*.js'
    ]
},

答案 3 :(得分:0)

您可以使用filter这样的属性:

filter: function(filepath) {
   return (grunt.file.isFile(filepath) && filepath.indexOf('node_modules') < 0);
}