如何在ES6语法中对导入使用深度解构?

E_J*_*ovi 4 javascript ecmascript-6

我注意到ES6解构导入可以这样实现:

foo.js

export default () => {
  return {
    a: 'b'
  }
}
Run Code Online (Sandbox Code Playgroud)

index.js

import foo from './foo';
export default foo;
export const bar = foo();
Run Code Online (Sandbox Code Playgroud)

然后,我可以将模块用于:

import foo, { bar } from 'my-module';
Run Code Online (Sandbox Code Playgroud)

但是,当我使用from的“深度解构”导入时my-module,它失败并显示:

import foo, { bar: { a } } from 'my-module';
Run Code Online (Sandbox Code Playgroud)

ES6似乎已经实现了以上语法,但是我该如何使用呢?

T.J*_*der 5

ImportClauseimport是不一样的解构。它们确实有一些语法上的相似性,但是如果您仔细阅读规范import,就会发现它从不引用通常的解构结构,例如DestructuringAssignmentTargetBindingPattern

请记住,导入会在模块之间创建绑定,但是解构分配会将从源复制到目标。使用您想象中的销毁导入,如果bar源模块中更改的值会改变导入的内容a吗?(毕竟import { bar } from 'my-module';,如果使用进行了bar更改my-module,则导入的内容将bar反映该更改。)或者解构导入会在某个时间点复制bar.ato 的值a?如果是这样,什么时间点?

你明白了。他们只是不同的野兽。

当然,您可以导入然后进行销毁:

import foo, { bar } from 'my-module';
let { a } = bar;
Run Code Online (Sandbox Code Playgroud)

...但是我确定你知道。:-)

  • @AnonymousCreator - 我认为这源于这样一个事实:这是一个全新的、静态的、声明性的机制,用于表达模块之间的关系,因此使用新的语法很有意义。如果他们让它使用像你一样的“from”伪函数,它看起来就像旧的 CommonJS 动态东西,这会产生误导。恕我直言,使其静态是明智之举。它可以顺利处理循环依赖、智能预取和捆绑器时间树摇动等。对深度解构的导入进行静态分析意味着什么...... (2认同)