节点中的节点模块包装器功能意味着什么

时间:2018-07-15 15:50:58

标签: javascript node.js

我想知道,模块包装函数是什么意思,它对我的​​代码有什么作用?

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


 });

3 个答案:

答案 0 :(得分:2)

原始答案

根据Node.js documentation

  

在执行模块的代码之前,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()之类的函数来结束当前进程。
    • 要查看所有信息,请参见Node documentation on process
  • global提供了用于访问和设置全局变量的系统。
    • 例如,如果您在一个模块中执行global.something = true,则在另一个模块中可以访问something,它将为true(无需导出)。
    • Node global documentation上了解更多信息。

编辑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];
});

答案 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功能使用。使用此对象可以导出您的模块。

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