在webpack的`NormalModuleReplacementPlugin`中,相对`newResource`的预期行为是什么?

时间:2018-06-03 06:54:11

标签: webpack

documentation for webpack's NormalModuleReplacementPlugin中声明:

  

如果newResource是相对的,则相对于先前的资源进行解析。

文档中的示例是:

new webpack.NormalModuleReplacementPlugin(
  /some\/path\/config\.development\.js/,
  './config.production.js'
);

这让我相信'以前的资源'是正则表达式匹配的导入,而不是请求导入的资源。这个假设是否正确,因为它似乎不起作用,而plugin's code表明它是不正确的,因为替换它时会忽略匹配导入的路径。

我已经通过将函数传递给插件而不是字符串来修复此问题,但是想知道观察到的行为是否是预期的。

以下是存储库的link以显示错误。

1 个答案:

答案 0 :(得分:1)

  

'previous resource'是正则表达式匹配的导入

是的,相关代码是here

我创建了一个演示项目 https://github.com/loveky/webpack-NormalModuleReplacementPlugin-demo您可以下载并尝试

这是使用演示项目的断点。

enter image description here

根据损坏的repo

进行更新

如果您更改src/a/b/c/import3.js中的行:

import { something } from '../../e/initial.js';

import { something } from '../../e/initial';

那么你应该能够无误地编译。

<强>为什么:

如果您导入../../e/initial.js,那么在beforeResolve挂钩中,result.request的格式为:

"../../e/initial.js"

与正则表达式/\/e\/initial\.js$/匹配,然后与插件updates the request匹配,并导致Module not found错误。

如果您导入的../../e/initial/\/e\/initial\.js$/不匹配,因为它错过了.js扩展名,并且afterResolve挂钩正确替换了路径。< / p>

为了使其有效,我们应该在导入中省略文件扩展名。插件文档中没有记录这一点。也许你可以在GitHub上提交一个问题,要求作者做出一些澄清。

修改

如果您使用的是Windows,则路径分隔符为\。因此,要创建适用于所有平台的正则表达式,您可以使用path.sep