Gruntjs Grunt.js-如何有效地忽略(黑名单)节点\u模块文件夹?

Gruntjs Grunt.js-如何有效地忽略(黑名单)节点\u模块文件夹?,gruntjs,Gruntjs,我想知道为什么我的jshint grunt任务如此缓慢。这是一个简短的配置示例: var配置={ jshint:{ 脚本:['**.js','!node_modules/**'] }, 观察:{ 文件:['**/*.js','!node_modules/**'], 任务:['jshint'] } } 这种模式是什么?若我理解正确的话,这两种文件模式都在使用GruntAPI为任务构建文件列表。这种模式可以工作,它过滤掉节点模块内部的所有内容,但速度非常慢,因为在应用过滤器之前,grunt递归地挖

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

var配置={
jshint:{
脚本:['**.js','!node_modules/**']
},
观察:{
文件:['**/*.js','!node_modules/**'],
任务:['jshint']
}
}
这种模式是什么?若我理解正确的话,这两种文件模式都在使用GruntAPI为任务构建文件列表。这种模式可以工作,它过滤掉节点模块内部的所有内容,但速度非常慢,因为在应用过滤器之前,grunt递归地挖掘整个节点模块目录(~100MB)

有没有办法告诉grunt不要看node_模块

这个示例在我的笔记本电脑上大约需要30秒。若使用黑名单的白名单模式istead,jshint任务只需几秒钟。但白名单意味着,如果我做任何重构等工作,我必须一直寻找Gruntfile,这非常烦人

当前while列表模式如下所示:


难道你不能把你的JS文件添加到根目录下的一个新文件夹吗?这样,您就可以通过不将节点模块包含在列表中来“忽略”节点模块

示例文件夹结构

- root
- node_modules
  - jshint
- src
  // your bespoke code
咕噜声配置

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

正如Andy已经提到的,我也建议使用不同的文件结构,例如将代码保存在“src”或“public”目录中

这里的问题是你的规则

“***.js”

始终在所有目录中查找,直到稍后才排除节点_模块,这在此时是无法阻止的


不仅因为这个原因,而且为了将代码与其他资产(图像?文档?)分离,应该采用另一种结构。

鉴于您说过,在对@Xosofox的回答的评论中,将节点模块与JS分离不是一个选项,我会考虑专门针对要运行JSHITN的文件夹,而不是忽略NoDeYMead模块文件夹。

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

您可以像这样使用
过滤器
属性:

过滤器:函数(文件路径){
return(grunt.file.isFile(filepath)和&filepath.indexOf('node_modules')<0);
}

也许可以试试
!节点\u模块
***
模式?
!节点模块
只过滤文件夹本身,但传递节点模块内的任何内容。而且似乎是
!节点_modules/***
相同!node_modules/**
但我想稍后是编写该模式的更正确的方法,所以我对其进行了更改。如果您想同时在多个包(每个包都有自己的node_modules文件夹)上运行JSHint,则白名单更令人讨厌。问题是我正在处理一个大型已建立的项目。该项目被分解为许多不同文件夹中的许多包,因此在许多不同的地方都有node_模块文件夹。您应该如何高效地在类似的东西上运行jshint?在较小的项目中,我确实将所有JS文件放在一个文件夹中,但这对我没有帮助。。。“哎哟,你完蛋了”怎么用漂亮的词来形容?据我所知,在查看代码时,grunt将文件委托给Gaze(),这将接收完整的模式。。。因此,只要在递归地挖掘目录的过程中凝视不验证模式,您可能就无能为力了……我同意。这里的问题是项目的结构。将所有JS放到一个单独的文件夹中,并直接指向它。我通常会创建一个js源文件夹,在上面运行我的jshint,然后将js“丑化”到一个单独的小型文件夹中。这样,您也可以避免在缩小的脚本上运行jshint。您问题中的代码也很可能是jshint'ing您的gruntfile.js,这是不必要的
jshint: {
    scripts: [
         'folderYoureInterestedIn/*.js',
         'anotherFolderYoureInterestedIn/*.js'
    ]
},