Webpack中如何忽略特定的require()?

4
我有一个与NodeJS和浏览器兼容的库,两者都通过Webpack运行以生成最终捆绑包。我遇到的问题是Webpack会将所有require()语句重写为__webpack_require __()并尝试对库进行捆绑,但这对于像fsworker_threads之类的东西不起作用。如何使其忽略特定输入字符串中的某些require()和相关机制(require.resolve()import等)?
我已经阅读了可以使用webpack.IgnorePlugin,但我不想让用户在他们的构建中添加特殊规则来使用我的库。我也无法让它自己工作,它仍然重写了require()。我还读到可以使用eval('require("fs")'),但这似乎很麻烦,但如果这确实是最好的方法,我愿意这样做。
示例:
//example.js
if(typeof window !== "undefined") {
    //Browser
    var myWorker = new Worker();
}
else {
    //NodeJS
    var Worker = require("worker_threads"); //I want Webpack to keep this line as-is
    var myWorker = new Worker();
}

你能给一个简单的工作示例来说明你想要什么吗? - Adam
@Adam 添加了示例 - Cobertos
最好的方法似乎是 var _require = eval('require');,然后在文件中的任何地方都使用它。 - Cobertos
抱歉回复晚了。我在过去几天里一直在研究这个问题,但没有找到比你建议的更好的选择。我可能会创建一个专门用于此的软件包供您使用。 - Adam
1个回答

9
为了在Webpack打包后保持代码中的require调用不变,只需将require替换为__non_webpack_require__。因此,您的示例将如下所示:
if (typeof window !== "undefined") {
    var myWorker = new Worker();
}
else {
    var Worker = __non_webpack_require__("worker_threads");
    var myWorker = new Worker();
}

这是Webpack的一个隐藏功能(可能因为它很少被使用),在这里发现,它忽略require调用,因此可以在应用程序运行时而不是捆绑时进行评估。
请注意,这不适用于针对Web浏览器的应用程序,因为它将导致使用resolve,而Web浏览器不知道resolve是什么。只在针对Node的代码中使用它。

1
哥们,这个在文档深处找到的东西真是太棒了。谢谢!下次需要用到时我会接受并确保它能正常工作。 - Cobertos

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