__non_webpack_require__未定义

14
我对 webpack 和 node 不熟悉,想知道如何使用。
__non_webpack_require__ 

我已经访问了webpack的网站,但仍然对这个函数是什么以及如何在node/react应用程序中使用它感到困惑。您能提供有关此函数用例的简短说明,然后说明如何在node/react应用程序中使用它吗?

1个回答

25

Webpack从入口点开始处理您在应用程序中使用的每个模块,包括您导入(importrequire)的每个模块,并将其包含在您的捆绑包中。 __non_webpack_require__是一个函数,会产生一个普通的require调用。

让我们以此入口点为例:

const processedByWebpack = require("./module");
const notProcessed = __non_webpack_require__("./non-webpack");

console.log(processedByWebpack);
console.log(notProcessed);

在这种情况下,webpack将打包该应用程序并包含您导入的每个模块,而在此情况下仅为./module.js。因此输出将是:

/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

const processedByWebpack = __webpack_require__(1);
const notProcessed = require("./non-webpack");

console.log(processedByWebpack);
console.log(notProcessed);


/***/ }),
/* 1 */
/***/ (function(module, exports) {

module.exports = "This module is bundled with webpack"


/***/ })
/******/ ]);

如果存在适用规则,那么./module.js模块将被包含在打包文件中并且也会被任何loader处理。另一方面,./non-webpack.js没有被包含在打包文件中,webpack将其变成了require调用。这意味着./non-webpack.js将在执行时解析,并且如果不可用或包含无效的JavaScript,则会因运行时错误而失败。

__non_webpack_require__是解决webpack处理所有require调用的方法之一。因为webpack将所有模块捆绑在一起,所以必须在编译时知道哪些模块要包含在内。这使得require比它在Node.js中实际上更加严格。例如,您不能使用动态的require,也就是说,您不能将变量作为模块路径(另请参见webpack通过require加载动态模块)。例如:

// Path to module as a variable (could be an argument to a function)
const modulePath = "./module";

const processedByWebpack = require(modulePath); // Fails
const notProcessed = __non_webpack_require__(modulePath);

在常规的require中,webpack会失败,因为它不知道要包含哪些模块以覆盖可能在运行时引用的所有模块。在这个示例中,这似乎很明显,但是它甚至可以使用用户输入来确定要加载的模块。使用__non_webpack_require__只需创建一个require调用,您将不得不处理可能出现的运行时Module not found异常。

什么时候应该使用它?

可能永远都不需要。这是一种应该被认为是最后的手段的函数,当您需要绕过webpack进行一些动态的模块分辨率时,可以考虑使用它。在大多数情况下,有其他解决方案可以实现相同的目标(例如使用Externals将导入推迟到运行时),其他情况则是边缘情况。

您会注意到__non_webpack_require__被转换为require调用。这意味着它只在Node.js中工作,在任何浏览器环境中都会失败,除非您定义了一个全局的require,它可能会做一些特殊的事情。另一个缺点是它是webpack特定的,当您想使用另一个工具(例如进行测试)时,它将无法工作,或者您将在尝试解决它时遇到困难。


2
虽然我同意“可能永远不会”,但__non_webpack_require__非常适合与AWS的Lambda层一起使用。这些模块已经提前存储在Lambda环境中,并由您的Webpack代码引用。您无法在本地require它们,因为它们不存在,这将导致构建失败。但是在Lambda运行时,它们确实存在,并且可以完美地进行要求。顺便说一句,这是一个写得很好的答案! - Geek Stocks
1
我理解这个问题,但是我应该如何处理自己的问题呢? - Omid
那么对于需要外部可选的对等依赖呢? - elios264

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