忽略 Webpack 中的特定 require()s?

Ignoring specific require()s in Webpack?

我有一个可与 NodeJS 和浏览器互操作的库,两者都通过 Webpack 运行 生成最终包。我 运行 遇到的问题是 Webpack 会将所有 require() 语句重写为 __webpack_require__() 并尝试捆绑库,这不适用于 fsworker_threads。在给定特定输入字符串的情况下,如何让它忽略某些 require() 和相关机制(require.resolve()import 等)?

我读到我可以使用 webpack.IgnorePlugin,但我不想让用户必须在他们为我的库构建时添加特殊规则。我自己也无法让它工作,它仍然重写了 require()s。我也读过我可以做到 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();
}

要在使用 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 的一个隐藏功能(可能是因为它不经常使用)发现 here 会忽略 require 调用,因此可以在应用 运行 而不是捆绑时。

请注意,这不应该用于针对网络浏览器的应用程序,因为它会导致使用 resolve,而网络浏览器不知道 resolve 是什么。仅在针对 Node.

的代码中使用它