✔️ 모듈은 재사용 가능한 코드 조각을 캡슐화💊 하고 다른 자바스크립트 파일에서 쉽게 재사용할 수 있게 해준다.
💊 캡슐화 ?
하나의 파일로 그룹화하고, 이를 모듈이라 함.묶어 관리 할 수 있음.export 키워드를 사용하여 모듈을 만들고 다른 파일에서 사용할 수 있게 한다. 재사용할 수 있는 함수, 객체 또는 원시 값을 의미.잠깐!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 자바스크립트의 실행 환경은 브라우저 환경과 Node 환경이 존재.
- Node 환경에서의 모듈 import 방식은
CommonJS방식과ES6방식이 있음.- 지금부터 할 React 개발 환경은 대부분
ES6에서 제시한 방법을 사용
import 구문을 사용하여 다른 파일에서 함수를 불러와 사용
// app.js
import { add, multiply, ONE, sample } from './math.js';
console.log(add(2, 3)); //5
console.log(multiply(2, 3)); //6
console.log(ONE); //1
console.log(sample.two); //2
- 명확한 종속성 관리
script 태그를 사용하여 자바스크립트 파일을 로드하는 방식은 스크립트 파일 간의 종속성과 로딩 순서를 수동으로 관리<!-- 전통적인 스크립트 로딩 방식 -->
<script src="jquery.js"></script>
<script src="plugin.js"></script> <!-- 이 스크립트는 jquery.js에 의존 -->
<script src="app.js"></script> <!-- 이 스크립트는 plugin.js와 jquery.js에 의존 -->
모듈 시스템을 사용 => 각 모듈이 필요로 하는 종속성을 내부적으로 선언하므로, 개발자는 파일을 로드하는 순서에 신경 쓸 필요가 없음. // ES6 모듈 사용 예시
import $ from 'jquery';
import plugin from 'plugin'; // 자동으로 jQuery에 대한 의존성을 처리
import app from 'app'; // 모든 의존성이 충족되면 실행
- 코드 캡슐화, 충돌 방지
모듈은 자체적인 스코프를 가짐
=> 모듈 외부에서는 모듈 내부의 변수에 직접 접근할 수 없음.
==> 변수의 오염 방지, 이름 충돌 방지
여러 스크립트에서 동일한 함수명을 사용하더라도 묘듈을 사용하면 각 스크립트에서 정의된 합수는 해당 모듈 내에서만 유효 => 팀작업이 편리!?
// module1.js
export function conflictFunction() {
console.log('Module 1의 함수');
}
// module2.js
export function conflictFunction() {
console.log('Module 2의 함수');
}
// app.js
import { conflictFunction as function1 } from './module1';
import { conflictFunction as function2 } from './module2';
function1(); // "Module 1의 함수"
function2(); // "Module 2의 함수"
- 효율적인 코드 로딩
코드 스플리팅 => 사용자의 현재 요구에 따라 필요한 코드만 동적으로 로드 가능지연 로딩(lazy-loding) 은 대규모 애플리케이션에서 성능과 자원 사용을 최적화하는 데 매우 효과적 import 시 특정 요소에 별칭을 지정하여 충돌을 방지하거나 명확성을 높일 수 있다. import { square as sqr } from './utils.js';
console.log(sqr(4)); // 16
export default를 통해 내보내진 모듈은 import시 이름변경 가능
특정 경로에서 가져온import값은 하나만 존재 => 이름을 명시하지 않아도 특정할 수 있음
// math.js
export default function multiply(x, y) {
return x * y;
}
// app.js
import multiply from './math.js';
console.log(multiply(6, 7)); // 42
// export default 시 모듈이름 변경은 자유!
// utils.js
export default function square(x) {
return x * x;
}
// main.js
import mySquare from './utils.js';
console.log(mySquare(4)); // 출력: 16
// app.js
import * as MathFunctions from './math.js';
console.log(MathFunctions.add(10, 5)); // 15
console.log(MathFunctions.multiply(10, 5)); // 50