【问题标题】:module.createRequire webpack bundlingmodule.createRequire webpack 打包
【发布时间】:2021-03-08 22:58:55
【问题描述】:

我正在尝试将节点应用程序捆绑到单个文件中。

但是在捆绑后检查 webpack 的输出。

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

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

其次,我想知道如果我根据Webpack Context 将以下代码Module.createRequire(myPath) 替换为require(myPath),webpack 会捆绑所有节点模块,因为结果表达式* 将与所有模块匹配?

【问题讨论】:

    标签: node.js webpack


    【解决方案1】:

    我误会了Module.createRequire(path).resolve。我以为它解析了模块,但实际上它只是解析路径。

    但是导致问题的原因是require(path)。对于 webpack,它是一个没有任何上下文的包,因此它会为它生成 webpackEmptyContext。除了抛出异常之外什么都不做。

    一个 hacky 解决方案是用__non_webpack_require__ 替换所考虑文件中的require,如下Using dynamic require on node targets WITHOUT resolve or bundle the target module

    当然,您必须将模块复制到正确的路径,因为它们没有被捆绑。你可以使用webpacCopyPlugin

    我很惊讶在以下文档 Webpack Context 或其他任何地方都没有关于该行为的官方文档。它看起来像是一个经常发生的场景,尤其是无法控制代码。我必须自己弄清楚,我希望我弄错了,我希望有一种更清洁的方法。

    【讨论】:

      猜你喜欢
      • 2016-03-28
      • 2018-08-01
      • 2016-09-23
      • 2019-06-11
      • 2017-07-05
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多