Хмыкнуть.js-как эффективно игнорировать папку модулей узла (черный список)?
мне было интересно, почему моя задача JSHint grunt настолько медленная. Вот краткий пример конфигурации:
var config = {
jshint: {
scripts: ['**/*.js', '!node_modules/**']
},
watch: {
files: ['**/*.js', '!node_modules/**'],
tasks: ['jshint']
}
}
что делает этот шаблон? Если я правильно понял, оба шаблона файлов используют Grunt api для создания списка файлов для задачи. Этот шаблон работает, он фильтрует все внутри node_modules, но делает это очень медленно, потому что перед применением фильтра grunt выкапывает весь каталог node_modules рекурсивно (~100 МБ).
есть ли способ на самом деле сказать гранту даже не смотреть на node_modules?
этот пример конфигурации занимает около 30 секунд на моем ноутбуке. При использовании шаблона белого списка в черном списке задача jshint занимает всего пару секунд. Но белый список означает, что я должен смотреть Gruntfile все время, если я делаю рефакторинг и т. д., что очень раздражает.
текущий шаблон списка выглядит следующим образом:
var allJSFiles = [
'*.js',
'{browser,server,config,models,routes,tasks,schema,test,utils,views}/**/*.js',
'!browser/bower_components/**'
];
4 ответов
не можете ли вы просто добавить свои файлы 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']
}
}
Как уже упоминал Энди, я бы рекомендовал другую файловую структуру, например, сохраняя ваш код в каталоге "src" или "public".
проблема здесь в том, что ваше правило
'**/*.js'
всегда копается во всех каталогах и только позже исключает node_modules, что на данный момент невозможно предотвратить.
не только из-за этого, но и для отделения кода от других активов (изображений? документация?), должна быть другая структура.
учитывая, что вы сказали, что разделение ваших модулей узлов от вашего JS не является вариантом в комментарии к ответу @Xosofox, я бы рассмотрел конкретный таргетинг на папки, которые вы хотите запустить jshint, а не игнорировать папку node_modules.
jshint: {
scripts: [
'folderYoureInterestedIn/*.js',
'anotherFolderYoureInterestedIn/*.js'
]
},
можно использовать filter
вот так:
filter: function(filepath) {
return (grunt.file.isFile(filepath) && filepath.indexOf('node_modules') < 0);
}