Может ли webpack сообщить, какой файл вызвал компиляцию в режиме просмотра?

Я хотел бы, чтобы Webpack регистрировал, какой файл вызвал мою сборку режима часов.

Я настроил плагин, который слушает watch-run компилятор событие крюк, как это:

function() {
  this.plugin("watch-run", function(watching, callback) {
    // maybe something in `watching` will indicate the changed file?
    // when I find out what it is, `console.log` it here
    callback();
  });
}

// Example output: "/Users/aaron/git/test/index.js" was changed, new build triggered

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

документация Webpack действительно отсутствует в этой области. The Крюк Событий Компилятора страница не имеет примеров (только сообщение, чтобы объяснить, что примеры скоро придут), а то старая документация v1 не намного лучше при разработке свойств / методов, доступных в watching/compiler "объект".

любая помощь или руководство будет принята с благодарностью.

2 ответов


такого рода информация не охватывается документацией webpack, и было бы трудно включить все возможные опции, доступные в компиляторе. Но я бы сказал, что это область, где вы должны изучить доступные параметры, либо прочитав исходный код, либо развернув отладчик и исследуя их. Я сделал последнее и обнаружил, что измененные файлы доступны в:

watching.compiler.watchFileSystem.watcher.mtimes

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

следующий код печатает файлы, которые были изменены (файлы могут быть пустыми):

this.plugin("watch-run", (watching, done) => {
  const changedTimes = watching.compiler.watchFileSystem.watcher.mtimes;
  const changedFiles = Object.keys(changedTimes)
    .map(file => `\n  ${file}`)
    .join("");
  if (changedFiles.length) {
    console.log("New build triggered, files changed:", changedFiles);
  }
  done();
});

пример вывода этого:

New build triggered, files changed:
  /path/to/app/src/components/item/Item.js
  /path/to/app/src/App.js

Примечание: этот выход придет до окончательной статистики напечатанный.


в webpack 4 Вы можете получить доступ к watcher таким образом:

getChangedFiles(compiler) {
  const { watchFileSystem } = compiler;
  const watcher = watchFileSystem.watcher || watchFileSystem.wfs.watcher;

  return Object.keys(watcher.mtimes);
}

последний в watchRun крюк

compiler.hooks.watchRun.tapAsync('plugin name', (_compiler, done) => {
  const changedFile = this.getChangedFiles(_compiler)

  // ...

  return done();
});