3

我正在尝试编写一个 Webpack 插件来查找并完全删除遵循某种模式的依赖项(使用requireor导入的任何内容)。import

免责声明,我知道有,IgnorePlugin但我不使用它有两个原因:

  1. 我不只是删除导入,我正在记住我已删除的内容,并将创建一个包含这些依赖项的单独包
  2. 更重要的是,我试图克隆该插件并记住我删除的内容,但这会导致错误。让我解释

如果我查看它的源代码,IgnorePlugin它将通过在beforeResolve钩子中返回 null 来删除它们。但这似乎并不意味着 Webpack 会真正忽略它,而不是返回一个空引用。因为我在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 从包中删除依赖项及其导入。

4

0 回答 0