eslint для динамически изменяющегося списка файлов

#javascript #webpack #eslint #babel-loader #eslint-loader

#javascript #webpack #eslint #babel-загрузчик #eslint-загрузчик

Вопрос:

Я хотел бы работать eslint только с измененными файлами. Я создал новую цель запуска в package.json для запуска eslint из командной строки ( git diff --name-only --relative | grep -E '.*\.(vue|js)$' | xargs eslint --ext .js,.vue ). Теоретически, это должно работать нормально, но в моем проекте происходит небольшой этап преобразования (замена строки) при объединении файлов с webpack, который приведет к сбою eslint (некоторая нестандартная разметка будет расширена до JS).

Какие у меня есть варианты и как бы я их реализовал? Например, могу ли я выполнить определенное правило / загрузчик webpack и передать результат в eslint ? Другой вариант, который я вижу, — включить eslint в процесс загрузки правил webpack (вместо выполнения его из командной строки), но как бы я тогда отфильтровал файлы, которые в данный момент изменены (может ли это быть обработано временным файлом, который содержит git diff... результат?)

Ответ №1:

У меня есть несколько рабочий подход. Я решил изменить webpack.base.conf.js вместо того, чтобы использовать решение командной строки, чтобы использовать уже существующий загрузчик для замены строк.

Файлы собираются с помощью WebpackBeforeBuildPlugin функции обратного вызова, и вместо тестовой переменной на основе регулярных выражений используется функция, которая проверяет соответствие ранее собранным файлам.

 const exec = require('child_process').exec;
const WebpackBeforeBuildPlugin = require('before-build-webpack');
var modFilesList = new Set([]);
const srcPath = resolve('.');

...
      rules: [{
        test: function(filename) {
          let relFilename = path.relative(srcPath, filename);
          let lint = modFilesList.has(relFilename);
          return lint
        },
        loader: 'eslint-loader',
        include: resolve('src'),
        exclude: /node_modules/,
        options: {
          formatter: require('eslint-friendly-formatter'),
          cache: false
        }
      }, {
       ... other string replacement loader ...
      }


   plugins: [
    ...
    new WebpackBeforeBuildPlugin(function(stats, callback) {
      // Collect changed files before building.
      let gitCmd = 'git diff --name-only --relative | grep -E ".*\.(vue|js)$"';
      const proc = exec(gitCmd, (error, stdout, stderr) => {
        if (stdout) {
          let files = stdout.split('n');
          modFilesList = new Set(files);
        }
        if (error !== null) {
          console.log(`exec error: ${error}`);
        }
      });
      callback();
    })
  ]
  

Единственная проблема на данный момент заключается в том, что когда происходят изменения файла git, они не запускают повторную компоновку на основе этих изменений файла (т. Е. Изменяется новый файл или ранее (до запуска webpack-dev-server) измененные изменения файла отбрасываются). Я проверил все, что мог. Изменение регистрируется и сохраняется в modFilesList , выполняется тестовая функция и возвращает true (для нового изменения в ранее неизмененном файле) или false в случае, если изменение было отменено. Я также поиграл с cache опцией безрезультатно. Кажется, что при начальной загрузке eslint-loader кэшируются файлы, которые будут удалены в будущем (не знаю, является ли это результатом использования тестовой функции вместо регулярного выражения или также имеет место с регулярным выражением). У кого-нибудь есть идея или он видел это раньше (eslint-loader не обновляет список файлов)?

Обновить

Похоже, это проблема с webpack (или одним из других загрузчиков), поскольку eslint-loader даже не выполняется при изменении файла. test Функция, однако, выполняется, что немного странно. Я не совсем понимаю, как работают загрузчики или как они взаимодействуют друг с другом, поэтому, возможно, причиной этого является какой-то другой загрузчик…