`module.exports = {__dirname}` 如何以及为何起作用?
How and why does `module.exports = {__dirname}` work?
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';
的事情——导入整个名称space,然后根据需要直接导入特定部分。以及 import {inspect} from 'util';
。所以解构应该到位
edit 2: ,来自下面 willascend 提到的线程。 No. 部分解释了我问题中的行的问题。
这只是一个简单的对象字面量,属性 名称与值匹配:
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';
测试-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}
)的 属性 导出,然后作为 默认 在您的 use.mjs
文件中导入时导出。 expose
变量是导出的 module.exports 对象文字。一旦它被初始化为导入变量,您就可以解构出 __dirname 值。
希望这对您有所帮助。
这些其他资源也有助于我理解这一点:
https://github.com/babel/babel-loader/issues/194#issuecomment-168579479
https://github.com/nodejs/node/issues/16844#issuecomment-342245465
这是 ES2015 (MDN) 中的对象 shorthand。
{__dirname}
等于 {__dirname: __dirname}
例如:
var a = 'foo', b = 42, c = {};
var o = {a, b, c};
console.log(o);
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';
的事情——导入整个名称space,然后根据需要直接导入特定部分。以及 import {inspect} from 'util';
。所以解构应该到位
edit 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';
测试-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}
)的 属性 导出,然后作为 默认 在您的 use.mjs
文件中导入时导出。 expose
变量是导出的 module.exports 对象文字。一旦它被初始化为导入变量,您就可以解构出 __dirname 值。
希望这对您有所帮助。
这些其他资源也有助于我理解这一点:
这是 ES2015 (MDN) 中的对象 shorthand。
{__dirname}
等于 {__dirname: __dirname}
例如:
var a = 'foo', b = 42, c = {};
var o = {a, b, c};
console.log(o);