import
, export
구문)import
와 export
를 통해 다른 모듈을 불러오거나 외부 모듈에 함수나 변수를 내보낼 수 있음import
: 외부 모듈의 기능을 가져옴 (모듈 가져오기
)export
: 외부 모듈에서 해당 변수나 함수에 접근 가능 (모듈 내보내기
)// a.ts
export a : number = 3;
// b.ts
import {a} from '/a.ts';
console.log(a+4); // *7 expected*
as
: 가져온 모듈의 변수나 함수명에 alias 를 붙여주는 문법// b.ts
import {a as A} from '/a.ts'
console.log(A+4); // *7 expected*
*
: 대부분의 언어에서 지원하듯 모든 것 을 의미하는 연산자단 default Module
로 선언한 것은 받아오지 못한다.
// a.ts
export a : number = 3;
export b : string = 'Hello World';
export c = () : void => console.log('It is C');
// b.ts
import * as File from '/a.ts'
console.log(File.a + 4); // 7 expected
console.log(File.b + '!'); // 'Hello World!' expected
File.c(); // It is C expected
export default
: 하나의 모듈에서 대표적으로 내보낼 함수나 변수를 선언하는 문법. 이를 사용할 경우 import A form ‘./A’ 가 가능해지고 즉시 A를 사용할 수 있게 된다.export default
문을 적극적으로 애용했다. export default
를 사용하는 것이 훨씬 코드가 깔끔하다고 느껴졌기 때문이었고, eslint 에서도 prefer-default-module 이라는 문법이 존재했기 때문이다.export * from ‘filePath’
에서 모듈로서 잡히지 않는다 → 코드가 오히려 더 더러워진다.사실 정확히 이야기하면
export default
로 선언한다고 export * from ‘filePath’를 사용하지 못하는 것은 아니다.
export {default as Foo} from ‘./Foo’;
이런 식으로 작성할 수 있다. 하지만 후술하겠지만, 이런 방식은 오히려 코드를 복잡하게 만들 뿐이다.
index.js
(index.ts
) : 이를 사용할 경우 import
문에서 해당 폴더만 작성까지만 파일경로를 작성해줘도 자동으로 index.js
파일을 import 를 하게 된다root
├── Foo
│ └── **index.ts**
└── app.tsx
// app.tsx
import {getValue} from 'Foo';
import {getValue} from 'Foo/index';
import {getValue} from 'Foo/index.ts';
export * from ‘filePath’
import
, export
를 쓸 수 있을까?index.ts
를 넣어주고, index.ts 안에 해당 폴더에 있는 모든 모듈들을 export * from ...
을 선언한다. 이다.root
├── navigation
│ ├── navigation.method.ts
│ ├── navigation.screen.tsx
│ └── index.ts
├── screens
│ ├── phone-call
│ │ ├── phone-call.const.ts
│ │ ├── phoen-call.screen.tsx
│ │ └── index.ts
│ ├── memo
│ │ ├── memo.const.ts
│ │ ├── memo.screen.tsx
│ │ └── index.ts
│ └── index.ts
└── app.tsx
위는 현재 사내 프로젝트 구조를 극도로 단순화한 모형이다.
index.ts
가 있는 것을 볼 수 있다. 각각의 index.ts 코드를 보면 다음과 같다.그렇다면 최종적으로 이 모든 파일들을 불러오는 app.tsx
에서는 어떨까?
위에서 이전에 작성한 코드와는 비교도 안되게 깔끔해진 것을 알 수 있다.
종합하여 현재 나는 현업을 포함하여 사이드프로젝트를 진행할 때 아래와 같이 파일 구조를 만든다.
export default
사용을 배제하고 named export 를 사용한다.index.ts
가 존재한다.index.ts
는 해당 폴더안에 있는 모든 파일들을 export * from ‘...’
으로 내보낸다.phone-call.screen.tsx
에서 navigation 쪽 코드를 불러온다고 가정해보자.그렇다면 아래와 같이 작성을 해야한다.
import {getNavigationValue} from '../../navigation';
기껏 상대경로를 찾는것을 최대한 줄일려고 했지만 상위 폴더로 가는 ..
을 막을수는 없었다.
글 잘봤습니다! webpack 설정을 통해서 alias 별칭 설정을 통해 절대 경로 세팅이 된다면 말씀하신 상대경로에 대한 문제점이 해결될 것 같네요!