Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript `module.exports={{uuuu dirname}`如何以及为什么工作?_Javascript_Node.js_Node Modules_Babeljs_Es6 Modules - Fatal编程技术网

Javascript `module.exports={{uuuu dirname}`如何以及为什么工作?

Javascript `module.exports={{uuuu dirname}`如何以及为什么工作?,javascript,node.js,node-modules,babeljs,es6-modules,Javascript,Node.js,Node Modules,Babeljs,Es6 Modules,中的代码是如何工作的?为什么?对象表示法似乎不满足要求。我觉得这相当令人困惑。在文档@Mozilla或@NodeJS中,这指的是什么 文件expose.js: module.exports = {__dirname}; import expose from './expose.js'; const {__dirname} = expose; 文件使用.mjs: module.exports = {__dirname}; import expose from './expose.js'; c

中的代码是如何工作的?为什么?对象表示法似乎不满足要求。我觉得这相当令人困惑。在文档@Mozilla或@NodeJS中,这指的是什么

文件
expose.js

module.exports = {__dirname};
import expose from './expose.js';
const {__dirname} = expose;
文件
使用.mjs

module.exports = {__dirname};
import expose from './expose.js';
const {__dirname} = expose;
那么,在
use.mjs
中,仅从对象导入密钥,这难道不应该起作用吗?(这不…但上面有!)

编辑:我通常从“electron”执行类似于导入electron的操作,{ipcMain,session}-导入整个名称空间,然后根据需要直接导入特定部分。以及从“util”导入{inspect}。所以这里应该有解构


编辑2:,从下面Willscend提到的线程。否。部分解释了我问题中的行的问题所在。

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

let ___test = 'this is a string... could be a path';
let object = {___test};

console.log(object);
使用
module.exports
,您已经导出了一个对象。使用模块系统导入时,基本上有一个模块范围的对象,
expose
。然后,在定义
{uuuuu dirname}
时,可以对该对象的
\uuu dirname
属性进行解构。我还没有测试过它,但是您应该能够像这样将
\uuu dirname
作为命名导入(尽管您可能会遇到变量名冲突):

编辑:进行了一些测试,当您执行上述导入时,您将获得导出的对象,因此在导入后仍然需要对其进行分解(当然,还要将其分解为新变量):

谷歌搜索之后,在执行ES6导入时,似乎无法对对象进行分解。该语法看起来类似于分解对象,但事实并非如此。当您执行以下操作时,实际上是导入已作为命名导出导出的变量

test.mjs test-import.mjs 注意,我没有使用
export const\uu dirname=\uu dirname
,甚至
导出常量dirname=\uu dirname。这是因为特定于节点的全局变量当前在
.mjs
文件中不可用。因此,在您的示例中,
expose.js
仍然是一个标准的.js文件,它可以访问
模块
目录名
全局文件。然后将
\uuu dirname
值导出为默认值commonjs导出对象的属性(即
module.exports={\uuu dirname}
),然后在导入
use.mjs
文件时,将其作为默认值导出。
expose
变量是导出的module.exports对象文本。一旦它被初始化为导入变量,就可以对_dirname值进行解构

希望这有帮助

这些其他来源也有助于我理解这一点:

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

let ___test = 'this is a string... could be a path';
let object = {___test};

console.log(object);
使用
module.exports
,您已经导出了一个对象。使用模块系统导入时,基本上有一个模块范围的对象,
expose
。然后,在定义
{uuuuu dirname}
时,可以对该对象的
\uuu dirname
属性进行解构。我还没有测试过它,但是您应该能够像这样将
\uuu dirname
作为命名导入(尽管您可能会遇到变量名冲突):

编辑:进行了一些测试,当您执行上述导入时,您将获得导出的对象,因此在导入后仍然需要对其进行分解(当然,还要将其分解为新变量):

谷歌搜索之后,在执行ES6导入时,似乎无法对对象进行分解。该语法看起来类似于分解对象,但事实并非如此。当您执行以下操作时,实际上是导入已作为命名导出导出的变量

test.mjs test-import.mjs 注意,我没有使用
export const\uu dirname=\uu dirname
,甚至
导出常量dirname=\uu dirname。这是因为特定于节点的全局变量当前在
.mjs
文件中不可用。因此,在您的示例中,
expose.js
仍然是一个标准的.js文件,它可以访问
模块
目录名
全局文件。然后将
\uuu dirname
值导出为默认值commonjs导出对象的属性(即
module.exports={\uuu dirname}
),然后在导入
use.mjs
文件时,将其作为默认值导出。
expose
变量是导出的module.exports对象文本。一旦它被初始化为导入变量,就可以对_dirname值进行解构

希望这有帮助

这些其他来源也有助于我理解这一点:

这是ES2015中的对象速记()

{uuuu dirname}
等于
{uuuu dirname:{uuuu dirname}

例如:

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

控制台日志(o)这是ES2015中的对象速记()

{uuuu dirname}
等于
{uuuu dirname:{uuuu dirname}

例如:

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

控制台日志(o)
您只是在询问
{uuuu dirname}
语法吗?在这种情况下,这就是ECMA用于对象创建的新速记语法。搜索“速记”
{a}
将创建一个对象,该对象具有键
“a”
a
计算的值,并且
const{uu dirname}=expose正在解构为局部变量
\uu dirname
?那么为什么最后一次导入不起作用呢?嗯,
\uu dirname
是一个特殊的关键字,所以像这样导入它可能会有一些困难。你有什么错误?尝试导入所有o
export const __dirname = 'this is a path';
import { __dirname } from './test.mjs';
console.log(__dirname);