일반적인 웹사이트 개발에서 많은 JavaScript파일을 관리하기란 코드 간의 의존성 문제로 어렵다.
JS파일들의 의존성 관리를 도와주면서 여러 장점을 제공해 주는 ES Modules에 대해 학습하고 사용해보자.
모듈화 프로그래밍은 프로그램을 작은 독립적인 단위로 분할하여 개발하는 방법론을 말한다.
모듈들
이 상호작용하여 프로그램을 완성하도록 한다.모듈화 프로그래밍의 장점
코드의 재사용성
: 각 모듈은 독립적으로 작동하기에 다른 프로그래에서도 사용이 재사용이 가능하다.유지보수성 향상
: 각 모듈은 독립적으로 작동하기에 다른 모듈에 영향을 미치지 않고 수정할 수 있다.코드의 가독성 향상
: 각 모듈은 자체적으로 기능을 수행하므로, 코드의 구조가 더욱 명확하다.이러한 모듈화 프로그래밍 방식을 JS에서 지원해주는 모듈 시스템이 ES modules
이다.
ES modules은 ECMAScript 6(ES6)에서 추가된 JavaScript의 모듈 시스템이다.
이전에는 JavaScript에서 모듈을 구현하는 여러가지 방법이 있었지만,
ES modules은 표준화되어 있으며 다른 모듈 시스템과 호환성도 높다.
ES modules에서는 export와 import 구문을 사용하여
모듈 내에서 정의한 변수
, 함수
, 클래스
등을 외부로 보내거나 가져올 수 있다.
<head>
<script> type="module" src="./app.js"></script>
</head>
<!--
HTML에는 한개의 JS 파일을 모듈로 추가한다.
이렇게 추가하는 시작점의 JS를 entry point라고 한다.
script 태그에 type="module"로 해야함을 기억하자.
-->
// app.js
import { hello, sayHello } from './greeting.js';
console.log(hello); // "Hello, world"
greet("kim"); // "Hello, world My name is kim."
// import 키워드를 사용하여 greeting.js 모듈에서 변수와 함수를 가져온다.
// app.js는 greeting.js를 의존하고 있다.
// greeting.js
export const hello = "Hello, world";
export function sayHello(name) {
console.log(`${hello} My name is ${name}.`);
}
// export 키워드를 사용하여 hello 변수와 sayHello 함수를 외부로 보낸다.
// 다양한 import 방식
// export된 객체 중 foo만 사용한다(destructuring)
import { foo } from "./foo.js";
// bar라는 객체를 활용할 수 있다.
// 같은 도메인이라면 URL방식도 사용가능하다. 다른 도메인은 CORS때문에 지원 불가능
import * as bar from "http://127.0.0.1:8080/bar.js";
const pobiResult= bar.pobi()
Understanding ES6 Modules
ES modules까지의 흐름
entry point란 프로그램이 실행되기 시작하는 지점을 정의하는 파일을 가리킨다.
CORS란 웹에서 실행되는 스크립트가 다른 도메인에 있는 리소스에 접근하는 것을 제안하는 보안 기능이다.
ES modules에서는 다른 도메인에 있는 모듈을 가져오려면 해당 도메인에서 CORS 정책을 설정해줘야 한다.
하나의 HTML 페이지를 기반으로 하여 동적으로 데이터를 로드하고 변경하는 웹 어플리케이션을 말한다.
새로운 패이지를 로드하는 대신 필요한 데이터만 서버로부터 받아와서 화면에 동적으로 보여준다.
하나의 HTML 페이지를 기반으로 동적인 동작을 하는 SPA는
필요한 파일만 로드하고 사용해야 하기에 파일들을 모듈화 해주는게 중요하다.
따라서, SPA에서는 ES modules를 사용함으로써 모듈간 의존성을 관리하고 자원을 효율적으로 사용 할 수 있다.
메모리에서 단 한 번만 로드
되고 다른 모듈에서도 이 인스턴스를 참조하여 사용하는 것이다. (ES 모듈의 내부 캐시 기능)코드의 중복을 줄이고 메모리 사용량도 줄일 수 있다.
해당 모듈의 상태가 다른 모듈에서 변경되면 다른 모듈에서도 해당 변경 사항이 반영된다.
(상태관리)async function loadModule(modulePath) {
const module = await import(modulePath);
return module;
}
const myModule = await loadModule('./myModule.js');
async function loadModules(modulePaths) {
const promises = modulePaths.map(modulePath => import(modulePath));
const modules = await Promise.all(promises);
return modules;
}
const [myModule1, myModule2] = await loadModules(['./myModule1.js', './myModule2.js']);