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

Cob*_*urn 3 javascript require webpack

我有一个可与 NodeJS 和浏览器互操作的库,两者都通过 Webpack 运行以生成最终包。我遇到的问题是 Webpack 会将所有require()语句重写为__webpack_require__()并尝试捆绑库,这对fs和 之类的东西不起作用worker_threads。我如何使它忽略某些require()S和相关机制(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();
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*dam 9

require在与 Webpack 捆绑后在代码中保持调用原样,只需替换require__non_webpack_require__. 所以你的例子看起来像这样:

if (typeof window !== "undefined") {
    var myWorker = new Worker();
}
else {
    var Worker = __non_webpack_require__("worker_threads");
    var myWorker = new Worker();
}
Run Code Online (Sandbox Code Playgroud)

这是 Webpack 的一个隐藏特性(可能是因为它不经常使用)在这里发现它会忽略require调用,因此可以在应用程序运行时而不是在捆绑时评估它们。

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