Хмыкнуть.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);
}