728x90
1. 모듈의 일반적 의미
모듈
- 모듈 : 애플리케이션을 구성하는 개별적 요소로서 재사용 가능한 코드 조각
- 모듈은 기능을 기준으로 파일 단위로 분리
- 모듈이 성립하려면 모듈은 자신만의 파일 스코프(모듈 스코프) 가질 수 있어야함
모듈의 비공개
- 자신만의 파일 스코프를 갖는 모듈의 자산(모듈에 포함되어 있는 변수, 함수, 객체 등)은 기본적으로 비공개 상태
- 자신만의 파일 스코프를 갖는 모듈의 모든 자산은 캡슐화되어 다른 모듈에서 접근할 수 없음
- 모듈은 개별적 존재로서 애플리케이션과 분리되어 존재
모듈의 재사용
- 애플리케이션과 완전히 분리되어 개별적으로 존재하는 모듈은 재사용이 불가능하므로 존재의 의미가 없음
- 모듈은 애플리케이션이나 다른 모듈에 의해 재사용되어야 의미가 있음
- export : 모듈은 공개가 필요한 자산에 한정해 명시적으로 선택적 공개 가능하는 것
- 공개된 모듈의 자산은 다른 모듈에서 재사용
- import : 모듈 사용자가 모듈이 공개한 자산 중 일부 또는 전체를 선택해 자신의 스코프 내로 불러들여 재사용하는 것
- 모듈 사용자 : 공개된 모듈의 자산을 사용하는 모듈
- 모듈은 애플리케이션과 분리되어 개별적으로 존재하다가 필요에 따라 다른 모듈에 의해 재사용
- 모듈은 기능별로 분리되어 개별적인 파일로 작성
- 코드의 단위를 명확히 분리하여 애플리케이션을 구성할 수 있고 재사용성이 좋아서 개발 효율성과 유지보수성 높일 수 있음
2. 자바스크립트와 모듈
- 자바스크립트는 처음에 웹페이지의 단순한 보조 기능을 처리하기 위한 제한적인 용도였음
- 태생적 한계로 인해 다른 프로그래밍 언어와 비교할 때 부족한 부분이 있음
- 모듈 시스템을 지원하지 않음
- 자바스크립트는 모듈이 성립하기 위해 필요한 파일 스코프와 import, export 지원하지 않음
모든 자바스크립트 파일은 하나의 전역을 공유
- 자바스크립트는 script 태그를 사용해 외부의 자바스크립트 파일을 로드할 수는 있지만 파일마다 독립적인 파일 스코프를 갖지 않음
- 자바스크립트 파일을 여러개의 파일로 분리해 script 태그로 로드해도 분리된 자바스크립트 파일들은 결국 하나의 자바스크립트 파일 내에 있는것처럼 동작
- 분리된 자바스크립트 파일들의 전역 변수가 중복되는 등의 문제가 발생할 수 있음
CommonJS와 AMD
- 자바스크립트를 브라우저 환경에 국한하지 않고 범용적으로 사용하려함
- => 모듈 시스템을 해결하기 위해 CommonJS와 AMD
- 자바스크립트의 모듈 시스템은 CommonJS와 AMD으로 나눠져 있음
- Node.js : CommonJS 채택
- ECMAScript 표준 사양은 아니지만 모듈 시스템 지원 => 파일별로 독립적인 파일 스코프(모듈 스코프) 가짐
- Node.js : CommonJS 채택
3. ES6 모듈(ESM)
- ES6에서 클라이언트 사이드 자바스크립트에서도 동작하는 모듈 기능 추가
- ES6 모듈(=ESM) 사용 방법
- script 태그에 type ="mpdule" 어트리뷰트 추가하면 로드된 자바스크립트 파일은 모듈로서 동작
- 일반적인 자바스크립트 파일이 아닌 ESM임을 명확히 하기 위해 ESM 파일 확장자는 mjs 사용할 것 권장
- ESM에서는 기본적으로 strict mode 적용
a. 모듈 스코프
a-1. 일반 자바스크립트 파일
- ESM 아닌 경우 script 태그로 분리해서 로드해도 독자적인 모듈 스코프 갖지 않음
- script 태그로 분리해서 로드된 2개의 자바스크립트 파일은 하나의 자바스크립트 파일 내에 있는것 처럼 동작= 하나의 전역 공유
a-2. ESM
- ESM은 파일 자체의 독자적인 모듈 스코프 제공
- 모듈 내에서 var 키워드로 선언한 변수여도 전역 변수가 아니고 window 객체의 프로퍼티도 아님
- 모듈 내에서 선언한 식별자는 모듈 외부에서 참조할 수 없음 => 모듈 스코프가 다르기 때문
b. export 키워드
- 모듈은 독자적인 모듈 스코프 가짐
- 모듈 내부에서 선언한 모든 식별자는 기본적으로 해당 모듈 내부에서만 참조 가능
- 모듈 내부에서 선언한 식별자를 외부에 공개하여 다른 모듈들이 재사용할 수 있게 하려면 export 키워드 사용
- export 키워드는 선언문 앞에 사용
- 하나의 객체로 구성해 한번에 export 할 수도 있음
c. import 키워드
c-1. import
- 다른 모듈에서 공개한 식별자를 자신의 모듈 스코프 내부로 로드하려면 Import 키워드 사용
- 다른 모듈이 export한 식별자 이름으로 import 해야하며 ESM의 경우 파일 확장자 생략 불가능
- 이때 ./lib.mjs는 app.mjs의 import 문에 의해 로드되는 의존성 => script 태그로 로드하지 않아도 됨
- 모듈이 export한 식별자 이름을 일일이 지정하지 않고 하나의 이름으로 한번에 Import 가능
- 이때 import 되는 식별자는 as 뒤에 지정한 이름의 객체에 프로퍼티로 할당
- 모듈이 export 한 식별자 이름을 변경해 import 가능
c-2. default
- 모듈에서 하나의 값만 export 한다면 default 키워드 사용 가능
- default 키워드를 사용하는 경우 이름없이 하나의 값 export
- default 키워드 사용하는 경우 var, let, const 키워드 사용 불가능
- default 키워드와 함께 export한 모듈은 {} 없이 임의의 이름으로 import
모던 자바스크립트 딥다이브 책을 정리한 내용입니다!!
728x90
'개념 정리 > 모던 자바스크립트 딥다이브' 카테고리의 다른 글
모던 자바스크립트 : 제너레이터와 async/await (1) | 2023.12.20 |
---|---|
모던 자바스크립트 : Babel과 Webpack을 이용한 ES6+/ES.NEXT 개발 환경 구축 (1) | 2023.12.19 |
모던 자바스크립트 : 에러처리 (0) | 2023.12.16 |
모던 자바스크립트 : 이벤트 (0) | 2023.12.14 |
모던 자바스크립트 : 프로미스 (0) | 2023.12.13 |