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';
。所以解构应该在这里
编辑2 :see this post,来自下面willascend提到的主题。 否。部分说明了我的问题所在的行是什么问题。
答案 0 :(得分:2)
这只是一个简单的对象常量,其属性名称与值匹配:
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导入时对对象进行解构。语法看起来与销毁对象相似,但并非如此。执行以下操作时实际上是导入已作为命名导出导出的导入变量。
export const __dirname = 'this is a path';
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
文件时导出。 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
答案 1 :(得分:0)
这是ES2015(MDN)中的对象简写。
{__dirname}
等于{__dirname: __dirname}
例如:
var a = 'foo', b = 42, c = {};
var o = {a, b, c};
console.log(o);