我有一个有点工作的方法。我选择修改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 文件更改发生时,它们不会根据这些文件更改触发重新 linting(即更改了新文件,或者之前(在启动 webpack-dev-server 之前)更改的文件更改是丢弃)。我检查了我能做的一切。更改已注册并存储在 中modFilesList
,执行测试函数并返回 true(对于先前未更改的文件中的新更改)或 false 以防更改被丢弃。我也玩过该cache
选项无济于事。似乎在初始加载时,eslint-loader
缓存了它将来会 lint 的文件(不知道这是使用测试函数而不是正则表达式的结果,还是正则表达式的情况)。有没有人有想法或以前见过这个(eslint-loader 没有更新文件列表)?
更新
这似乎是 webpack(或其他加载器之一)的问题,因为文件更改时甚至没有执行 eslint-loader。然而,该test
函数被执行,这有点奇怪。我不完全了解装载机如何工作或它们如何一起玩,所以可能有其他一些装载机导致了这种情况......