首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >`module.exports = {__dirname}`是如何工作的,为什么?

`module.exports = {__dirname}`是如何工作的,为什么?
EN

Stack Overflow用户
提问于 2018-08-10 05:14:41
回答 2查看 634关注 0票数 0

中的代码是如何工作的--为什么?对象表示法似乎不能满足要求。我发现它相当令人困惑。在文档@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';。所以解构应该在这里就位

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-10 09:58:37

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

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值导出为默认 commonjs导出对象(即module.exports = {__dirname})的属性,然后在导入到文件时将其用作use.mjs默认commonjs导出。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

票数 2
EN

Stack Overflow用户

发布于 2018-08-10 10:18:05

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

{__dirname}等于{__dirname: __dirname}

例如:

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

console.log(o);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51775875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档