Javascript `module.exports={{uuuu dirname}`如何以及为什么工作?
中的代码是如何工作的?为什么?对象表示法似乎不满足要求。我觉得这相当令人困惑。在文档@Mozilla或@NodeJS中,这指的是什么 文件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
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);