我想知道什么"模块包装器函数";意思以及它对我的代码的作用。
(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,包含模块的绝对文件名和目录路径
从本质上讲,此包装器用于配置模块,并且它允许使用变量exports
、require
、module
、__filename
和__dirname
编辑
OP还提到了process
和global
变量。
-
process
对象提供有关当前Node.js进程的信息和对其的控制- 它发出
exit
和uncaughtException
等事件来管理Node进程 - 它还包括诸如
process.abort()
之类的功能来结束当前进程 - 要查看所有信息,请参阅
process
上的Node文档
- 它发出
-
global
提供了一个用于访问和设置全局变量的系统- 例如,如果您在一个模块中执行
global.something = true
,那么在另一个模块,您可以访问something
,它将是true
(无需导出( - 请参阅Node
global
文档了解更多信息
- 例如,如果您在一个模块中执行
编辑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++代码来解决这个问题,但这要复杂得多。