我想知道,模块包装函数是什么意思,它对我的代码有什么作用?
(function (exports, require, module, __filename, __dirname) {
});
答案 0 :(得分:2)
在执行模块的代码之前,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
global
提供了用于访问和设置全局变量的系统。
global.something = true
,则在另一个模块中可以访问something
,它将为true
(无需导出)。global
documentation上了解更多信息。您也可以编辑包装器:
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];
});
答案 1 :(得分:1)
如果您编写一些代码,例如:
const fs = require("fs");
module.exports = fs.readFileSync(__dirname + "test.txt");
process.exit();
然后,您将处理许多未通过js规范定义的全局变量,它们仅在node中可用。为了使它们可用于代码,所执行的代码包含在引用的函数中,该函数使您可以访问它们。他们也可能写了一些C ++代码来解决这个问题,但这要复杂得多。
答案 2 :(得分:0)
我认为,我在这篇文章上的发言时间不算太晚,但我想在这里分享我的2美分。
因此,您编写的表达式为IIFE(立即调用函数表达式)。
基本上,(节点)文件中的代码包装在此特定函数内。当有人需要此文件时,IIFE会自动运行并为您提供诸如module.exports,exports,__ dirname,__ filename之类的对象。
这些对象不是全局的,而是模块(文件)的本地对象。这些可以通过此IIFE功能使用。使用此对象可以导出您的模块。
上面的答案中已经提供了指向文档的链接,应该会有所帮助。