中的代码是如何工作的--为什么?对象表示法似乎不能满足要求。我发现它相当令人困惑。在文档@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';
。所以解构应该在这里就位
编辑2:see this post,来自下面willascend提到的线程。No.部分解释了我问题中的问题所在。
发布于 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
发布于 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);
https://stackoverflow.com/questions/51775875
复制相似问题