我正在尝试编写一个 Webpack 插件来查找并完全删除遵循某种模式的依赖项(使用require
or导入的任何内容)。import
免责声明,我知道有,IgnorePlugin
但我不使用它有两个原因:
- 我不只是删除导入,我正在记住我已删除的内容,并将创建一个包含这些依赖项的单独包
- 更重要的是,我试图克隆该插件并记住我删除的内容,但这会导致错误。让我解释
如果我查看它的源代码,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 从包中删除依赖项及其导入。