ES6의`export const`와`export default '


204

나는 다음을 export default수행 하여 가져올 수있는 것 외에이 둘 사이에 큰 차이점이 있는지 확인하려고합니다 .

import myItem from 'myItem';

그리고 export const내가 할 수있는 일 :

import { myItem } from 'myItem';

이 이외의 차이점 및 / 또는 사용 사례가 있는지 궁금합니다.


1
를 사용 const하면 식별자가 읽기 전용이됩니다. 따라서 기본 값의 경우이를 변경할 수없는 것으로 간주 할 수 있습니다. 값 자체는 변경할 수 없으므로 객체, 배열 등은 재 할당되지 않고 변경할 수 있습니다.
spmurrayzzz 2016

4
@ spmurrayzzz : FWIW, 가져 오기 바인딩도 마찬가지로 변경할 수 없습니다 const.
Felix Kling

정화 @FelixKling 주셔서 감사합니다, 몰랐
spmurrayzzz

@FelixKling : 적어도 외부에서. 일정하지 않을 수도 있지만 내보내기를 변경할 수 있습니다.
Bergi

@ Bergi : 맞아, 그래서 내가 가져 오기 바인딩을 말한 이유 ;)
Felix Kling

답변:


326

명명 된 내보내기 대 기본 내보내기입니다. export constconst 선언 또는 선언을 내보내는 명명 된 내보내기입니다.

강조 : 여기에서 중요한 것은 const 선언 또는 선언을 선언하는 데 사용되는 export키워드 const입니다. export클래스 또는 함수 선언과 같은 다른 선언에도 적용될 수 있습니다.

기본 내보내기 ( export default)

파일 당 하나의 기본 내보내기를 가질 수 있습니다. 가져올 때 이름을 지정하고 다음과 같이 가져와야합니다.

import MyDefaultExport from "./MyFileWithADefaultExport";

원하는 이름을 지정할 수 있습니다.

명명 된 수출 ( export)

명명 된 내보내기를 사용하면 파일 당 여러 개의 명명 된 내보내기를 가질 수 있습니다. 그런 다음 중괄호로 묶을 특정 내보내기를 가져옵니다.

// ex. importing multiple exports:
import { MyClass, MyOtherClass } from "./MyClass";
// ex. giving a named import a different name by using "as":
import { MyClass2 as MyClass2Alias } from "./MyClass2";

// use MyClass, MyOtherClass, and MyClass2Alias here

또는 동일한 명령문에서 명명 된 가져 오기와 함께 기본값을 사용할 수 있습니다.

import MyDefaultExport, { MyClass, MyOtherClass} from "./MyClass";

네임 스페이스 가져 오기

객체의 파일에서 모든 것을 가져올 수도 있습니다.

import * as MyClasses from "./MyClass";
// use MyClasses.MyClass, MyClasses.MyOtherClass and MyClasses.default here

노트

  • 이 구문은 사용 사례가 더 일반적이기 때문에 기본 내보내기를 약간 더 간결하게 선호합니다 ( 여기에서 논의 참조 ).
  • 기본 내보내기는 실제로 이름이 지정된 명명 된 내보내기 default이므로 명명 된 가져 오기를 사용하여 가져올 수 있습니다.

    import { default as MyDefaultExport } from "./MyFileWithADefaultExport";

24

export default내 보낸 "thing"을 가져올 때, 내 보낸 이름을 무엇이든 상관없이 내 보낸 이름을 가져 와서 내 보낸 모든 것을 가져올 수있을 때 구문이 import"default"로 표시되어 있기 때문에 구문에 영향을줍니다 .

내가 좋아하고 사용하는 유용한 유스 케이스는 명시 적 으로 이름을 지정 하지 않고 익명 함수 를 내보낼 수 있으며 해당 함수를 가져올 때만 이름을 지정해야합니다.


예:

두 가지 기능 내보내기, 하나는 default다음과 같습니다.

export function divide( x ){
    return x / 2;
}

// only one 'default' function may be exported and the rest (above) must be named
export default function( x ){  // <---- declared as a default function
    return x * x;
}

위 기능을 가져옵니다. default하나 의 이름을 구성 :

// The default function should be the first to import (and named whatever)
import square, {divide} from './module_1.js'; // I named the default "square" 

console.log( square(2), divide(2) ); // 4, 1

{}구문은 함수 (또는 변수)를 가져 오는 데 사용됩니다 그것은 한 가져온 어떤 것을 의미 이미 내보낼 때 하나가로 가져와야합니다, 그래서 이름이 정확 하지 것 일 다른 가져 오기를 같은 이름, 또는.


잘못된 예 :

  1. 가져 오려면 기본 기능이 먼저 있어야합니다

    import {divide}, square from './module_1.js
  2. divide_1에 내 보내지 않았 module_1.js으므로 가져올 것이 없습니다

    import {divide_1} from './module_1.js
  3. square에 수출되지 module_1.js때문에, {}명시 적으로 검색 할 수있는 엔진을 말한다 라는 이름의 수출 만.

    import {square} from './module_1.js

그것은 하나의 것을 내보내는 것을 의미하지는 않습니다. 동일한 모듈에서 여러 개의 이름과 하나의 기본값을 가질 수 있습니다. 기본값은 단순히 정확히 의미합니다 . 가져올 때 이름을 지정하지 않으면 기본 내보내기입니다 (예 : import something from대신) import { somethingNamed } from.
Andris

또한 여기에 새로운 영어 단어를 배웠습니다 : "잘못된"그 +1
Yuval 교수 레비

12

사소한 참고 : 기본 내보내기에서 가져 오는 경우 이름이 완전히 독립적입니다. 이것은 실제로 리팩토링에 영향을 미칩니다.

Foo해당 가져 오기가있는 이와 같은 클래스가 있다고 가정 해 봅시다 .

export default class Foo { }

//the name 'Foo' could be anything, since it's just an
//identifier for the default export
import Foo from './Foo'

이제 Foo클래스를 리팩터링 Bar하고 파일 이름을 바꾸면 대부분의 IDE는 가져 오기를 건드리지 않습니다. 그래서 당신은 이것으로 끝날 것입니다 :

export default class Bar { }

//the name 'Foo' could be anything, since it's just an
//identifier for the default export.
import Foo from './Bar'

특히 Typescript에서는 명명 된 내보내기와보다 안정적인 리팩토링에 정말 감사합니다. 차이점은 default키워드와 중괄호 가 없다는 것입니다 . 이 btw는 또한 유형 검사가 있으므로 가져 오기에 오타가 생기지 않도록합니다.

export class Foo { }

//'Foo' needs to be the class name. The import will be refactored
//in case of a rename!
import { Foo } from './Foo'

2
" 'Foo'는 클래스 이름이어야합니다. "-아니요! 기본 내보내기 import { Foo as Anything } from …로 할 수있는 것처럼 쉽게 할 수 있습니다 import Anything from ….
Bergi

당신은 할 수 가로 이름을 변경 as하는 소스 의견의 요점은 정말 없습니다. downvote 주셔서 감사합니다; p
Philipp Sumi

1
나는 공감하지 않았지만 그 주장이 설득력이 있는지 확신 할 수 없다. 단일 모듈을 리팩토링 할 때 IDE가 모든 가져 오기의 이름을 바꾸도록할지 여부를 모르겠습니다. 정확히 모듈화에 관한 것입니다. ...
BERGI

필자는 개발자 UX를 위해 명명 된 내보내기를 사용한다는 데 동의하지만 Typescript 자체가 전부라고 주장 할 수 있습니다. 나는 자주 리팩토링하고 파일 당 하나의 클래스 (내 경우에는 React Component)가 있다고 가정하면 가져 오기에서 이름이 바뀐 구성 요소를 따라 연결을 끊지 않기를 원합니다. 물론, 이것은 개별 개발자에 따라 의미가 있거나 없을 수 있습니다.
Philipp Sumi

같은 내용의 기사 를 찾았 습니다. 합리적인 위치는 다음과 같습니다. export default프로젝트의 주요 객체, 특히 npm 패키지에서를 내보내는 데 사용해야 합니다 (a를 대체 함 module.exports =). 그러나 프로젝트 내부에서는 명명 된 내보내기 만 사용하는 것이 좋습니다.
Paleo

7

에서 문서 :

명명 된 내보내기는 여러 값을 내보내는 데 유용합니다. 가져 오는 동안 동일한 이름을 사용하여 해당 값을 참조 할 수 있습니다.

기본 내보내기와 관련하여 모듈 당 하나의 기본 내보내기 만 있습니다. 기본 내보내기는 함수, 클래스, 객체 또는 다른 것이 될 수 있습니다. 이 값은 가져 오기가 가장 간단하기 때문에 "기본"내 보낸 값으로 간주됩니다.


0

기본값을 설정하면 기본 내보내기라고합니다. 파일 당 하나의 기본 내보내기 만 가질 수 있으며 원하는 이름을 가진 다른 파일로 가져올 수 있습니다. 이름이 지정된 내보내기라는 기본값을 넣지 않으면 중괄호가있는 동일한 이름을 사용하여 다른 파일로 가져와야합니다.


0

브라우저가 es6을 사용하지 않는다는 문제가있었습니다.

나는 그것을 고쳤다 :

 <script type="module" src="index.js"></script>

유형 모듈은 브라우저에 ES6을 사용하도록 지시합니다.

export const bla = [1,2,3];

import {bla} from './example.js';

그런 다음 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.