Grunt.js - Как эффективно игнорировать (черный список) node_modules папку?
Мне было интересно, почему моя задача сжимания jshint настолько медленная. Вот пример примера config:
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/**'
];
Ответы
Ответ 1
Не можете ли вы просто добавить свои JS файлы в новую папку с корнем? Таким образом вы можете "игнорировать" node_modules
, не включая его в список.
Пример структуры папок
- root
- node_modules
- jshint
- src
// your bespoke code
Конфигурация Grunt
var config = {
jshint: {
scripts: ['src/**/*.js']
},
watch: {
files: ['src/**/*.js'],
tasks: ['jshint']
}
}
Ответ 2
Как уже упоминал Энди, я бы рекомендовал другую файловую структуру, например, сохраняя ваш код в каталоге "src" или "public".
Проблема в том, что ваше правило
'**/*. JS
всегда просматривает все каталоги и только позже исключает node_modules, который не может быть предотвращен в этот момент.
Не только из-за этого, но и для разделения кода от других активов (документация??), должна быть еще одна структура.
Ответ 3
Учитывая, что вы сказали, что разделение ваших node -модулей из JS не является вариантом в комментарии к ответу @Xosofox, я бы рассмотрел конкретную ориентацию на папки, которые вы хотите запустить jshint, вместо того, чтобы игнорировать ваш node_modules папку.
jshint: {
scripts: [
'folderYoureInterestedIn/*.js',
'anotherFolderYoureInterestedIn/*.js'
]
},
Ответ 4
Вы можете использовать свойство filter
следующим образом:
filter: function(filepath) {
return (grunt.file.isFile(filepath) && filepath.indexOf('node_modules') < 0);
}