__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 从入口点开始处理您在应用程序中使用的每个模块,包括您导入的每个模块(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
模块包含在捆绑包中,如果存在任何适用的规则,任何加载程序也将对其进行处理。另一方面,./non-webpack.js
不包含在包中,webpack 调用了require
。这意味着 ./non-webpack.js
在执行时将被解析,如果它不可用或包含无效的 javascript,它将失败并出现运行时错误。
__non_webpack_require__
是一种解决 webpack 处理所有 require
调用这一事实的方法。因为 webpack 捆绑了所有模块,所以它必须知道在编译时要包含哪些模块。这使得require
比 Node.js 中的实际限制更多。例如,您不能使用动态require
s,这意味着您不能使用变量作为模块的路径(另请参阅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 变量
python NameError:未定义全局名称'__file__'
admob 广告未在 Android 应用程序 apk 中显示