#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
Функция, однако, выполняется, что немного странно. Я не совсем понимаю, как работают загрузчики или как они взаимодействуют друг с другом, поэтому, возможно, причиной этого является какой-то другой загрузчик…