我想知道为什么我的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/**'
];
答案 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);
}