__non_webpack_require__ 未定义

Posted

技术标签:

【中文标题】__non_webpack_require__ 未定义【英文标题】:__non_webpack_require__ is not defined 【发布时间】:2018-02-21 10:37:28 【问题描述】:

我是 webpack 和 node 的新手,我想知道如何使用

__non_webpack_require__ 

功能。我访问过webpack's website,但仍然对这个功能是什么以及如何使用它感到困惑。您能否简要介绍一下此功能的用例以及如何在节点/反应应用程序中使用它?

【问题讨论】:

【参考方案1】:

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 模块包含在捆绑包中,如果存在任何适用的规则,任何加载程序也将对其进行处理。另一方面,./non-webpack.js 不包含在包中,webpack 调用了require。这意味着 ./non-webpack.js 在执行时将被解析,如果它不可用或包含无效的 javascript,它将失败并出现运行时错误。

__non_webpack_require__ 是一种解决 webpack 处理所有 require 调用这一事实的方法。因为 webpack 捆绑了所有模块,所以它必须知道在编译时要包含哪些模块。这使得require 比 Node.js 中的实际限制更多。例如,您不能使用动态requires,这意味着您不能使用变量作为模块的路径(另请参阅webpack dynamic module loader by 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's Lambda Layers 合作。这些是提前存储在您的 Lambda 环境中并被您的 Webpack 代码引用的模块。您不能在本地 require 它们,因为它们在那里不存在,并且会导致构建失败。但是在 Lambda 运行时,它们确实存在并且将完全需要。顺便说一句,这是一个写得很好的答案! 我明白这一点,但我应该如何处理自己的问题呢? ***.com/questions/56492794/… 如果需要外部可选对等依赖项呢?

以上是关于__non_webpack_require__ 未定义的主要内容,如果未能解决你的问题,请参考以下文章

如果 __name__ == '__main__' 之后未定义 Python 变量

未实现的 __init__()

python NameError:未定义全局名称'__file__'

admob 广告未在 Android 应用程序 apk 中显示

admob 广告未在 Android 应用程序 apk 中显示

函数_main(OPENGL C++)中引用的未解析的外部符号_____________