javascript - `module.exports = {__dirname}` 如何以及为什么工作?
问题描述
这里的代码是如何工作的——为什么?对象符号似乎不满足。我觉得它相当混乱。这在文档 @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:见这篇文章,来自下面 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 导入时,您似乎无法解构对象。语法看起来类似于解构对象,但事实并非如此。当您执行以下操作时,您所做的实际上是导入已导出为命名导出的变量。
测试.mjs
export const __dirname = 'this is a path';
测试导入.mjs
import { __dirname } from './test.mjs';
console.log(__dirname);
请注意,我没有使用export const __dirname = __dirname;
, 甚至export const dirname = __dirname;
. .mjs
这是因为节点特定的全局变量当前在文件中不可用。因此,在您的示例中,expose.js
它仍然是一个标准的 .js 文件,它可以同时访问 themodule
和__dirname
globals。然后将该__dirname
值作为默认commonjs 导出对象(即module.exports = {__dirname}
)的属性导出,然后在导入文件时将其作为默认导出可用。变量是被导出的 module.exports 对象字面量use.mjs
。expose
一旦它被初始化为导入的变量,您就可以解构 __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
推荐阅读
- vert.x - Vertx 中的集群事件总线如何工作?
- android - 无法将位图图像保存到 Android 中的新文件夹
- mapstruct - mapstruct - 更新现有 bean - 忽略所有子/嵌套 bean(数组列表、集合等)中的“id”字段
- php - PHP 警告:在 php 7.3 中使用 password_hash() 时使用未定义的常量 PASSWORD_ARGON2ID
- r - 使用 R 的 for 循环中可能存在的错误
- python - 在连接两个纬度和经度的线上的任意位置找到纬度和经度
- kotlin - 任务“:cinteropAFNetworkingIOS”执行失败。> 无法为 AFNetworking 执行 cinterop 处理:无法确定标头位置
- ios - 仅当模型对象包含图像 url 时如何显示图像视图
- java - Jsch ChannelExec:如何在命令后将密码传递给服务器?
- java - 如何提示用户只输入他们可以选择的三个选项之一,并显示错误输入的错误消息