【问题标题】:How and why does `module.exports = {__dirname}` work?`module.exports = {__dirname}` 如何以及为什么工作?
【发布时间】:2019-01-17 10:36:10
【问题描述】:

here 中的代码如何工作 - 为什么?对象符号似乎不满足。我觉得它相当混乱。这在 @Mozilla 或 @NodeJS 文档中指的是什么?

文件expose.js

module.exports = {__dirname};

文件use.mjs

import expose from './expose.js';
const {__dirname} = expose;

那么这实际上不应该起作用吗,只从对象中导入键,在use.mjs 中? (这不是......但上面有!)

import {__dirname} from './expose.js';

编辑:我通常会执行import electron, {ipcMain, session} from 'electron'; 之类的操作 - 导入整个名称空间,然后根据需要直接导入特定部分。以及import {inspect} from 'util';。所以这里应该有解构的地方

edit 2see this post,来自下面 willascend 提到的线程。 No. 部分解释了我的问题中的问题所在。

【问题讨论】:

  • 您只是在询问{__dirname} 语法吗?在这种情况下,这是 ECMA 用于创建对象的新速记语法。搜索“速记”here{a} 将创建一个对象,其键为 "a",其值为 a 的任何值
  • const {__dirname} = expose; 正在解构为局部变量 __dirname ?那么为什么最后一次导入不起作用呢?
  • 嗯,__dirname 是一个特殊的关键字,所以这样导入可能会有些困难。你得到什么错误?尝试导入所有的expose.js,看看对象包含什么
  • 在 .mjs 中没有预先设置魔法全局变量。所以没有__dirname。这就是为什么需要这个脚本。问题仍然存在。
  • @BananaAcid,请看我的回答。我认为它解释了这里发生的事情。

标签: javascript node.js node-modules babeljs es6-modules


【解决方案1】:

这只是一个简单的对象字面量,其属性名称与值匹配:

let ___test = 'this is a string... could be a path';
let object = {___test};

console.log(object);

使用module.exports,您已经导出了一个对象。使用模块系统导入时,您实际上有一个模块范围的对象expose。然后在定义{__dirname} 时解构该对象的__dirname 属性。我还没有测试过,但你应该可以像这样将__dirname 导入为命名导入(尽管你可能会遇到变量名冲突):

import __dirname from './expose.js';

编辑:做了一些测试,当你进行上述导入时,你得到了导出的对象,所以你仍然需要在导入后解构(当然,解构成一个新变量):

import __dirname from './expose.js';
const {__dirname: dirname} = __dirname;
console.log(dirname);

经过一番谷歌搜索,在执行 ES6 导入时,您似乎无法解构对象。语法看起来类似于解构对象,但事实并非如此。当您执行以下操作时,您所做的实际上是导入已导出为命名导出的变量。

test.mjs

export const __dirname = 'this is a path';

test-import.mjs

import { __dirname } from './test.mjs';
console.log(__dirname);

请注意,我没有使用export const __dirname = __dirname;,甚至没有使用export const dirname = __dirname;。这是因为节点特定的全局变量当前在 .mjs 文件中不可用。因此,在您的示例中,expose.js 仍然是一个标准的 .js 文件,它可以访问 module__dirname 全局变量。然后,__dirname 值作为 default commonjs 导出对象(即module.exports = {__dirname})的属性导出,然后在导入时作为 default 导出可用你的use.mjs 文件。 expose 变量是导出的 module.exports 对象文字。一旦它被初始化为导入变量,您就可以解构 __dirname 值。

希望这会有所帮助。

这些其他来源也有助于我理解这一点:Destructuring a default export object https://github.com/babel/babel-loader/issues/194#issuecomment-168579479 https://github.com/nodejs/node/issues/16844#issuecomment-342245465

【讨论】:

  • 链接:很好的发现!特别是我的问题的第一个让 - 从那里引用:“不。它所做的是声明一个不可见的变量,用对象 { foo: foo, bar: bar } 对其进行初始化,然后以默认名称导出它。 "
【解决方案2】:

这是 ES2015 中的对象简写 (MDN)。

{__dirname} 等于 {__dirname: __dirname}

例如:

var a = 'foo', b = 42, c = {};
var o = {a, b, c};

console.log(o);

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 2013-12-19
    • 2013-03-17
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多