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);
}