在documentation for webpack's NormalModuleReplacementPlugin
中声明:
如果
newResource
是相对的,则相对于先前的资源进行解析。
文档中的示例是:
new webpack.NormalModuleReplacementPlugin(
/some\/path\/config\.development\.js/,
'./config.production.js'
);
这让我相信'以前的资源'是正则表达式匹配的导入,而不是请求导入的资源。这个假设是否正确,因为它似乎不起作用,而plugin's code表明它是不正确的,因为替换它时会忽略匹配导入的路径。
我已经通过将函数传递给插件而不是字符串来修复此问题,但是想知道观察到的行为是否是预期的。
以下是存储库的link以显示错误。
答案 0 :(得分:1)
'previous resource'是正则表达式匹配的导入
是的,相关代码是here
我创建了一个演示项目 https://github.com/loveky/webpack-NormalModuleReplacementPlugin-demo您可以下载并尝试
这是使用演示项目的断点。
根据损坏的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
。