我们什么时候在 javascript 导入中使用“{ }”?

When do we use '{ }' in javascript imports?

我正在学习 Javascript 导入,我还不明白我们在从另一个 JS 文件导入项目(函数、对象、变量)时何时使用花括号。

import Search from './models/Search';
import * as searchView from './views/searchView';
import { elements, renderLoader } from './views/base'
//elements is an object, renderLoader is a function

您可以使用花括号 隐式地 和选择性地从另一个模块函数或对象等导入。

// import implicitly one function and one constant from example.js
import { a, b } from 'example'

example.js

// export a and b but kept c private to example.js
export const a => { ... }
export const b = "hello"
const c = "private, not visible to the outside"

更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import

https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export

导入语句用于从另一个模块导入导出的绑定

大括号 ({}) 用于导入命名绑定,其背后的概念称为解构赋值解构赋值的概念是一个过程,可以将数组或对象中的值解包到不同的变量中在导入的模块中

花括号 ({}) 用于导入命名绑定

我想借助一个例子来解释 ES6 中不同类型的导入

假设我们有一个名为 Animals(Animals.js) 的模块,假设该模块导出一个默认绑定 Man 和其他几个命名绑定,例如 CatDog等等

/*
 Animals.js
*/
..
export Cat;
export Dog
export default Man

从模块导入单个导出

为了从另一个模块(假设是 Cat)导出单个导出,我们可以这样写

/*
 Anothermodule.js
*/
import {Cat} from "./Animals"

同样适用于狗

/*
 YetAnothermodule.js
*/
import {Dog} from "./Animals"

从模块导入多个导出

也可以导入多个模块如下

/*
 Anothermodule.js
*/
import {Dog, Cat} from "./Animals"

使用更方便的别名导入导出

/*
 Anothermodule.js
*/
import {Dog as Puppy}  from './Animals.js';

在导入期间重命名多个导出

/*
 Anothermodule.js
*/
import {Dog as Puppy, Cat as Kitty}  from './Animals.js';

但是在将 Man 导入另一个模块的情况下,因为它是默认导出,你可以这样写

/*
 Anothermodule.js
*/
import Man  from './Animals.js';

例如,您也可以混合使用上述两种变体

/*
 Anothermodule.js
*/
import Man, {Dog as Puppy, Cat as Kitty} from '/Animals.js';

导入整个模块的内容

如果你想导入所有你可以使用的东西

/*
 Anothermodule.js
*/
import * as Animals from './Animals.js';

在这里,访问导出意味着使用模块名称(在本例中为“Animals”)作为命名空间。例如,如果你想在这种情况下使用 Cat,你可以像下面这样使用它

Animals.Cat

您可以阅读有关导入的更多信息here

你可以阅读解构here

{} 在您想要导入对象的一部分时使用。 * as searchView 将导入 searchView 文件中的所有属性和方法。

假设'./views/base'有3个属性:elements, renderLoader, additionalParam(假设这三个都在文件中作为named exports导出)

做的时候

import { elements, renderLoader } from './views/base'

您只导入这 2 个特定属性

但是当你这样做的时候

import * as base from './views/base'

您在名为 base 的对象中导入所有三个属性

import Search from './models/Search';

默认导出元素 导入为 Search

import * as searchView from './views/searchView';

所有 导入已导出的 searchView

import { elements, renderLoader } from './views/base'

导入指定数量的命名导出元素

如果某些内容作为默认导出,则导入时不带花括号。

如果导出多个变量,则使用花括号导入。

例如,

在somefunction.js

export default module;

import module from './somefunction.js';

在someOtherFunction.js

export func1;

export func2;

import { func1, func2 }  from './someOtherFunction.js'

您可以从单个模块中导出 1 个以上的内容。

例如您的代码:

import * as searchView from './views/searchView'; //1
import { elements, renderLoader } from './views/base' //2

//1,您从 './views/searchView';

导入 一切

//2,可能有更多来自 './views/base' 的内容,但您仅导入 elements and renderLoader

更多信息:import MDN

import { elements, renderLoader } from './views/base'

是您需要从模块导入单个命名导出的方式,在这种情况下,它是从导入 named exports elementsrenderLoader base.js.

{ elements, renderLoader } 语法在许多情况下只是在 ECMAScript 标准的最新版本中添加的语法糖(称为 解构)。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring

不过,在这种情况下,只需要获取所需的命名导出即可。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Import_a_single_export_from_a_module

请注意,您也可以像这样为您的变量选择新名称

import { elements as newNameForElements, renderLoader as newNameForRenderLoader } from './views/base'

这将使 elements 导出可用 newNameForElements

举个例子:

要导入的文件,比如importedFile.js:

var defaultExport, otherExport1, otherExport2, otherExport3;

export default defaultExport = () => {
    console.log("Default Export")
}

export otherExport1 = "Other non-default Export";

export otherExport2 = function() {
  console.log("Some more non-default Export");
};

export otherExport3 = { msg: "again non-default Export" };

现在在您的主 JS 文件中,如果您要执行以下操作:

import something from './importedFile.js;

此处变量something将获取variable/function的值,该值已作为默认值导出到importedFile.js文件中,即变量 defaultExport。现在,如果您执行以下操作:

import { otherExport1, otherExport2 } from './importedFile.js;

它将专门导入 otherExport1otherExport2 变量和函数,而不是 defaultExportotherExport3

你也可以做类似下面的事情来从 importedFile.js:

导入所有变量的名称
import { defaultExport, otherExport1, otherExport2, otherExport3 } from './importedFile.js';

Conclusion:

  1. curly braces are used to choose variables/functions/objects (using a technique called object destructuring in ES6) that need to be imported without importing all the other unnecessary exported variables/functions/objects.
  2. If you don't specify curly braces, it would always import only the variable/function/object that has been exported as default and nothing else. It would import undefined if nothing has been exported as default export.