“ module.exports = {__dirname}”如何工作,为什么工作?

时间:2018-08-09 21:14:41

标签: javascript node.js node-modules babel node-modules-esm

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提到的主题。 否。部分说明了我的问题所在的行是什么问题。

2 个答案:

答案 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导入时对对象进行解构。语法看起来与销毁对象相似,但并非如此。执行以下操作时实际上是导入已作为命名导出导出的导入变量。

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文件时导出。 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);