模块创建需要 webpack 打包

5

我正试图将一个node应用程序打包成单个文件。

但是,在捆绑后检查webpack的输出后,我发现其中一个库使用Module.createRequire在运行时加载某些模块。 检查捆绑后的代码后,我了解到webpack没有将Module.createRequire(path).resolve替换为__webpack_require__,这导致我的应用程序在捆绑后依赖于node_module。

我可以想到一个简单的解决方案,即修改库的代码并使用require代替Module.createRequire。但我宁愿不修改库的代码,因为那会让我每次想要更新库时都增加额外的麻烦。

此外,我想知道如果我根据Webpack上下文require(myPath)替换以下代码Module.createRequire(myPath),是否会导致webpack将所有的node_modules都打包,因为结果表达式*将与所有模块匹配?

1个回答

1
我对Module.createRequire(path).resolve的理解是错误的,我以为它会解析模块,但实际上它只是解析路径。
然而,引起问题的是require(path)。对于webpack来说,它是一个没有任何上下文的bundle,因此它会生成webpackEmptyContext。这什么也不做,只会抛出异常。
一个hacky的解决方法是将考虑文件中的require替换为__non_webpack_require__,如下所示在不解析或打包目标模块的Node目标上使用动态require 当然,你需要将模块复制到正确的路径,因为它们没有被捆绑。你可以使用webpacCopyPlugin来完成这个任务。
我很惊讶在Webpack Context和其他任何地方都没有官方文档记录这种行为。看起来这是一种很常见的情况,特别是当我们无法控制代码的时候。我不得不自己解决这个问题,但我希望我错了,并且有更好的方法可以做到这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接