为什么 ECMAScript ES 模块导入不遵循解构标准?

Why ECMAScript ES module import do not follow destructuring standard?

在JavaScript中我可以这样重命名和导入模块

import { original_name as alias_name } from 'my_module'

是否需要as关键字和nod遵循优秀的解构标准有很好的解释吗?

为什么不是这样的:

import { original_name: alias_name } from 'my_module'

我的脑子里总是充满好奇

他们做不同的事情:

  • 解构是 属性 访问的一种形式,通常与 const 之类的变量声明相结合,甚至可能与默认初始化程序
  • 导入变量会在模块范围内声明绑定的别名

重要的区别在于,解构执行 运行 代码(测试对象可强制性,执行 getter),而导入声明是完全声明的(设置模块之间的依赖关系,甚至在变量之前启用 cross-module 提升被初始化)。这使得后者可以静态分析。导入别名也没有嵌套对象的概念。

两者都允许“重命名”,但它们对不同的事物使用不同的语法 - 否则会造成混淆。他们的 shorthand 形式彼此相似主要是巧合,因为两者都使用大括号。

答案当然是,它们的不同是因为它们做的事情不同,只是语法上有相似之处而已。

但也许有更好的理由来设计它们?我通过以下方式试验了 Node.JS 个模块:

// origin.js
export let specialNumber = 2;

setInterval(() => {
    specialNumber = Math.random();
}, 400)
// importer.js
import { specialNumber as aliasAttempt } from './origin.js'
import * as StarImport from './origin.js'
let { specialNumber: destructuringAttempt } = StarImport;

setInterval(() => {
    console.log(aliasAttempt, destructuringAttempt);
}, 400)

在这里,destructuringAttempt 将始终给出“2”(解构时得到的值),而 aliasAttempt 将不断变化。例如:

0.3600619094195876 2
0.33268826082163194 2
0.20684912705131553 2
0.8665522020482055 2
0.9349778920742413 2

看起来 destructuringAttempt 在解构期间按值复制,而 aliasAttempt 保留对 let specialNumber 变量的引用。

destructuringAttempt 的这种行为是预期的,因为 let { specialNumber: destructuringAttempt } = StarImport;let destructuringAttempt = StarImport.specialNumber; 相同,即只是复制了数字)

所以,也许原因是,如果导出是一个 non-const 值,'aliasing' 会给出与典型解构行为(“ copy once"),所以最好区分语法。