1

我只想eslint在修改后的文件上运行。我创建了一个新的运行目标package.jsoneslint从命令行 ( git diff --name-only --relative | grep -E '.*\\.(vue|js)$' | xargs eslint --ext .js,.vue) 运行。从理论上讲,这应该可以正常工作,但是当将文件与 webpack 捆绑时,我的项目中发生了一些转换步骤(字符串替换),这将抛出eslint(一些非标准标记将扩展为 JS)。

我有哪些选择,我将如何实施它们?例如,我可以执行一个特定的 webpack 规则/加载器并将结果传递给eslint吗?我看到的另一个选项是包含eslint到 webpack 规则/加载器进程中(而不是从命令行执行它),但是我将如何过滤当前修改的文件(这可以由包含git diff...结果的临时文件处理?)

4

1 回答 1

0

我有一个有点工作的方法。我选择修改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函数被执行,这有点奇怪。我不完全了解装载机如何工作或它们如何一起玩,所以可能有其他一些装载机导致了这种情况......

于 2019-03-28T13:04:40.487 回答