[JS, TS] Barrel Export Pattern

JS에서 사용하는 export pattern이다.

import 문을 단순화할 수 있다.

바로 예시를 확인해 보자. 예시를 보면 한 번에 이해할 수 있다.

일반적인 구조

📂 sample

    📄 foo.ts

    📄 bar.ts

📄 test.ts

위와 같은 폴더구조가 있다고 가정한다.

 

// sample/foo.ts
export const foo = 'foo';
export const foo2 = 'foo2';
// sample/bar.ts
export const bar = 'bar';
// test.ts
import {foo, foo2} from "./sample/foo";
import {bar} from "./sample/bar";

const test = () => {
  console.log(foo);
  console.log(foo2);
  console.log(bar);
}

각 폴더는 위와 같이 작성되어 있다.

 

test에서 import 하니 두 파일을 각각 import 해서 의 import 문을 사용한 것을 볼 수 있다.

barrel export를 사용하면 이 import 문을 한 줄로 줄일 수 있고, ./sample/foo 처럼 파일 명까지 모두 적어야 했던 것을./sample 로 줄일 수 있다.

barrel export 사용

📂 sample

    📄 foo.ts

    📄 bar.ts

    📄 index.ts

📄 test.ts

// sample/foo.ts
export const foo = 'foo';
export const foo2 = 'foo2';
// sample/bar.ts
export const bar = 'bar';
// sample/index.ts
export * from './foo';
export * from './bar';

barrel export pattern을 위해 추가한 index 파일

/* test.ts
before
import {foo, foo2} from "./sample/foo";
import {bar} from "./sample/bar";
*/
import {bar, foo, foo2} from "./sample";

const test = () => {
  console.log(foo);
  console.log(foo2);
  console.log(bar);
}

import 가 한 줄로 바뀌고, 뒤에 from 도 짧아졌다.

 

언제 유용한가?

  • 한 폴더 안에 많은 파일들이 있을 때 import 해야 할 것이 많을 경우
  • 프로젝트 규모가 커져서 폴더 depths 가 커지는 경우

장점

  • import 문을 깔끔하게 정리할 수 있다.
  • 라이브러리처럼 공식 진입점을 제공해 주는 효과가 있다.

단점

 

활용, 스스로 고민해본 것

꼭 모든 폴더에 barrel export 를 사용하지 않고 필요하다고 생각되는 곳에만 선택적으로 사용해도 된다.

 

예를 들어, 컴포넌트 기반 프로젝트에서 버튼 종류가 여러 개가 있을 때, 이를 파일별로 만들면 아래와 같을 것이다.

ClickButton.ts MouseButton.ts ScrollButton.ts ....

이 모든 버튼을 import 해서 쓴다면, import 줄 수만 해도 꽤나 차지할 것이다. 이럴 때 유용하게 쓸 수 있을 것 같다.

 

index.ts 를 폴더별로 중첩해서 최상위 경로만 from 에서 입력해서 쓰게할 수도 있다.