const module1 = require('module1'); // CommonJS
import module1 from 'module1'; // ES6
자바스크립트로 개발을 하다보면
require
나import
로 외부 라이브러리를 불러오는 코드를 자주 볼 수 있다.require
은 CommonJS 키워드,import
는 ES6에서 사용되는 키워드다.
모듈은 프로그램의 구성 요소로, 관련 데이터와 함수를 하나로 묶은 단위를 의미한다. 일반적으로 하나의 소스 파일에 모든 함수를 작성하지 않고, 함수의 기능별로 별도의 모듈을 구성한다. 이처럼 프로그램 코드를 기능별로 나누어 독립된 파일에 저장하여 관리하는 방식을 모듈화라고 한다.
require.js
라이브러리를 통해 개발된, 가장 오래된 모듈 시스템ESM은 ES6에 도입된 모듈 시스템이다. import
, from
, export
, default
처럼 모듈 관리 전용 키워드를 사용하여 가독성이 좋다. 또한, Named Parameter
와 같이 CommonJS에서 지원하지 않는 기능들도 가지고 있다.
CommonJS는 exports
나 module.exports
를 이용하여 객체를 내보내고, require
를 통해 객체를 불러온다.
exports
를 이용한 내보내기/불러오기// (func.js)
exports.func1 = func1;
exports.func2 = func2;
// (main.js)
const func = require('./func');
func.func1(10);
func.func2(10);
module.exports
를 이용한 내보내기/불러오기// (func.js)
const func = {
func1: function(n) {
},
func2: function(n) {
}
}
module.exports = func;
// (main.js)
const func = require('./func');
func.func1(10);
func.func2(20);
exports
와module.exports
모두 객체를 내보내는 공통적인 기능을 갖고 있지만exports
는 property 방식을 사용하고,module.exports
는 곧바로 사용할 수 있다는 점에서 차이가 았다.
반면, ES6는 export
키워드를 사용하여 객체를 내보내고, 다른 프로그램에서 import
문으로 객체를 가져와 사용할 수 있다. export
에는 named와 default 두 종류의 내보내기 방식이 있다.
// 개별적으로 내보내기
export const func1 = function(num) {};
export const func2 = function(num) {};
// 목록으로 내보내기
export {func1, func2};
export default function() {}; // export {func as default} 도 가능
named 방식은 여러 값을 내보낼 때 유용하다. 이때, 불러와 사용할 때는 내보낸 이름과 동일한 이름을 사용해야 한다. 반면, default는 아무 이름으로 가져와 사용할 수 있다.
CommonJS
내보내기
exports
변수의 property로 내보낼 객체 할당module.exports
의 변수로 내보낼 객체 할당불러오기 : require
키워드 사용
ES6
export
를 사용하여 named/default 방식으로 내보낼 객체 선정import ~ from
키워드 사용참고자료
TCP School : module
JAVASCRIPT.INFO : module
ESM import
mozilla : ES modules: A cartoon deep-dive
exports vs. module.exports
mdn web docs : export
글 잘 봤습니다.