javascript - 为什么 dirname 不是模块属性? (__ 符号)

标签 javascript node.js

我正在学习 Node 的基础知识。根据文档,__dirname__filename 都属于模块范围。正如预期的那样,两者:

console.log(__dirname)
console.log(__filename)

工作,打印当前目录名和文件名。

但是当我尝试从 module 调用它们时,只有文件名有效:

console.log(module.dirname)
console.log(module.filename)

第一个打印undefined

1 - 为什么 console.log(module.dirname) 打印未定义?

2 - 我对 __notation 感到困惑。如果它不是 module. 的 sugar 语法,它有什么用?

最佳答案

这些变量被定义为函数的参数,包裹在您的模块代码中,如下所示:

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

    // Module code actually lives in here

});

这会做几件事:

  1. 它为您的模块提供一个范围(包装函数的函数范围)。您在模块中声明的任何顶级变量实际上都在模块范围内,而不是在顶部范围内。
  2. 它提供requiremodule__filename__dirname 的值作为独立变量,这些变量是唯一的每个模块,不能被其他模块搞乱。

模块对象的属性(通过 Object.getOwnPropertyNames(module) 收集)是:

  'id',
  'exports',
  'parent',
  'filename',
  'loaded',
  'children',
  'paths'

Why dirname is not a module attribute?

在设计模块系统时,“为什么”必须进入设计师的头脑并进行讨论。一个模块对象可能可以被其他代码访问,并将 __dirname__filename 作为参数传递给包装器,这样即使其他人可以访问您的模块对象不能与 __dirname__filename 混淆。或者,它可能只是为了打字的快捷方式而完成的。或者,它可能只是个人的设计选择。

Why console.log(module.dirname) prints undefined?

因为 dirname 不是模块对象本身的属性(我不知道为什么)。相反,__dirname 作为包装函数参数传递。

I'm confused about __notation. If it's not a sugar syntax for module., what it is used for?

通常,___ 前缀只是用来确保它不会意外地与代码中的任何常规变量声明发生冲突。我的猜测是 node.js 的原始设计者设想了在模块中使用现有代码库,他们希望减少变量命名冲突的可能性。


您的一些问题似乎是关于为什么不是所有这些都只是模块对象的属性。我想不出为什么这不是一个完全正常和合乎逻辑的设计的特别原因。

为了节省打字,对象中有很多对 require 的引用,所以我当然可以看到不让我们全部打字的论据 module.require('someModuleName') 每次。

而且,exports 已经是 module 的一个属性。例如,module.exports === exports。将它用作 module.exports 确实有一些用处,因为您可以为导出定义一个全新的对象:

module.exports = {
    greeting: "hello",
    talk: function() {...}
};

但是,您不能仅通过重新分配导出来做到这一点。这是行不通的:

exports = {
    greeting: "hello",
    talk: function() {...}
};

所以,我想 exports 也可以作为您只想执行的快捷方式提供:

exports.talk = function() {...}

但是,如果您要分配一个全新的导出对象,则需要 module.exports。

关于javascript - 为什么 dirname 不是模块属性? (__ 符号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58894892/

相关文章:

node.js - 如何从 grunt 任务访问 Waterline 模型?

javascript - SyntaxHighlighter.all() 在 DOM 级别不起作用?

javascript - 使用 JS 从不同的 html 文件访问 DOM

javascript - 在 Typescript 的类型注释中使用 'is' 关键字的目的是什么

javascript - 使用 javascript 或 jquery 对 html 图像或按钮的实时平铺倾斜效果?

node.js - 错误断言 `args[3]->IsInt32()' 失败

javascript - highcharts 无法读取属性 'legendBackgroundColor'

node.js - 在 .env 文件中使用插值

Javascript eval() 异常 - 行号

node.js - 命名参数不使用 Koa 2 在 Node 中路由