Как полностью удалить зависимость и ее ссылки с помощью плагина Webpack - PullRequest
2 голосов
/ 12 марта 2020

Я пытаюсь написать плагин Webpack, который находит и полностью удаляет зависимости (все, что импортировано с require или import), которые следуют определенному шаблону.

Отказ от ответственности, я знаю, что есть IgnorePlugin но есть две причины, по которым я не использую это:

  1. Я не просто удаляю импорт, я запоминаю то, что я удалил, и создам отдельный пакет с этими зависимости
  2. Что еще более важно, я попытался клонировать этот плагин и запомнить то, что я удалил, но это приводит к ошибкам. Позвольте мне объяснить

Если я посмотрю на исходный код IgnorePlugin, он удалит их, вернув null в хуках beforeResolve. Но это, похоже, не означает, что Webpack действительно игнорирует его, а не возвращает нулевую ссылку sh. Потому что я работаю внутри Next. js, и это приводит к ошибке, когда Next не может найти ссылки на то, что я удалил.

Итак, это мой код:

class NextCriticalWebpackPlugin {
  pluginName = this.constructor.name;
  requests = [];

  apply(compiler) {
    compiler.hooks.normalModuleFactory.tap(this.pluginName, factory => {
      factory.hooks.beforeResolve.tap(this.pluginName, result => this.checkIgnore(result));
    });
  }

  checkIgnore(result) {
    if (result && result.request && result.request.startsWith('next-critical/loader')) {
      this.requests.push(result.request);
      return null;
    }
    return result;
  }
}

module.exports = NextCriticalWebpackPlugin;

Если я запускаю Webpack, все кажется нормальным, но когда я запускаю свою сборку, он выдает ошибки, что не может найти модули, которые я удалил:

Cannot find module 'next-critical/loader!/Users/luke/Arbeit/Stroeer/Projekte/paper/apps/web/src/critrical/ads.ts'

Поэтому мне интересно, как я могу сказать Webpack удалить зависимости и импортировать их из пакета.

...