__non_webpack_require__
我已经访问了webpack的网站,但仍然对这个函数是什么以及如何在node/react应用程序中使用它感到困惑。您能提供有关此函数用例的简短说明,然后说明如何在node/react应用程序中使用它吗?
__non_webpack_require__
我已经访问了webpack的网站,但仍然对这个函数是什么以及如何在node/react应用程序中使用它感到困惑。您能提供有关此函数用例的简短说明,然后说明如何在node/react应用程序中使用它吗?
Webpack从入口点开始处理您在应用程序中使用的每个模块,包括您导入(import
或require
)的每个模块,并将其包含在您的捆绑包中。 __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特定的,当您想使用另一个工具(例如进行测试)时,它将无法工作,或者您将在尝试解决它时遇到困难。
__non_webpack_require__
非常适合与AWS的Lambda层一起使用。这些模块已经提前存储在Lambda环境中,并由您的Webpack代码引用。您无法在本地require
它们,因为它们不存在,这将导致构建失败。但是在Lambda运行时,它们确实存在,并且可以完美地进行要求。顺便说一句,这是一个写得很好的答案! - Geek Stocks