节点中的"node module wrapper function"是什么意思?



我想知道什么"模块包装器函数";意思以及它对我的代码的作用。

(function (exports, require, module, __filename, __dirname) {  


});

原始答案

根据Node.js文档,

在执行模块的代码之前,Node.js会用一个函数包装它看起来如下的包装器:

(function(exports, require, module, __filename, __dirname) { 
// Module code actually lives in here 
}); 

通过这样做,Node.js实现了事物:

  • 它保持顶级变量(用var、const或let定义(的作用域到模块而不是全局对象
  • 它有助于提供一些实际上特定于模块的全局变量,例如:
    • 模块和导出实现者可以使用的对象以导出模块中的值
    • 便利变量__filename和__dirname,包含模块的绝对文件名和目录路径

从本质上讲,此包装器用于配置模块,并且它允许使用变量exportsrequiremodule__filename__dirname

编辑

OP还提到了processglobal变量。

  • process对象提供有关当前Node.js进程的信息和对其的控制
    • 它发出exituncaughtException等事件来管理Node进程
    • 它还包括诸如process.abort()之类的功能来结束当前进程
    • 要查看所有信息,请参阅process上的Node文档
  • global提供了一个用于访问和设置全局变量的系统
    • 例如,如果您在一个模块中执行global.something = true,那么在另一个模块,您可以访问something,它将是true(无需导出(
    • 请参阅Nodeglobal文档了解更多信息

编辑2

你也可以编辑包装:

let Module = require('module');
Module.wrap = (function (exports, require, module, __filename, __dirname) {
// What you want the new wrapper to be.
return Module.wrapper[0] + exports + 'console.log("This is the wrapper.");' + Module.wrapper[1];
});

我想,我发这篇文章有点晚了,但我想在这里分享我的2美分。

因此,您编写的表达式是IIFE(立即调用函数表达式(。

基本上,(Node(文件中的代码被封装在这个特定的函数中。当有人需要此文件时,IIFE会自动运行,并为您提供诸如module.exports、exports、__dirname、__filename之类的对象。

这些对象不是全局的,而是模块(文件(的本地对象。这些都是由IIFE函数提供的。使用此对象可以导出模块。

上面的答案中已经提供了文档链接,这应该会有所帮助。

如果您编写一些代码,例如:

const fs = require("fs");
module.exports = fs.readFileSync(__dirname + "test.txt");
process.exit();

然后,您将处理许多未通过js规范定义的全局变量,它们仅在节点中可用。为了使它们对代码可用,您执行的代码被包含在您引用的函数中,该函数允许您访问它们。他们也可以编写一些C++代码来解决这个问题,但这要复杂得多。

相关内容

最新更新