this
require
순환참조
노드 자체적으로 순환 참조 막아줌 → dep1의 module.exports가 함수가 아니라 빈 객체로 표시
//dep1.js
const dep2 = require('./dep2');
module.exports = () => {
console.log('dep2', dep2);
};
//dep2.js
const dep1 = require('./dep1');
module.exports = () => {
console.log('dep1', dep1);
};
3.3.2 ECMAScript 모듈
공식적인 자바스크립트 모듈 형식
//var.mjs
export const odd = 'MJS 홀수입니다';
export const even = 'MJS 짝수입니다';
//func.mjs
import { odd, even } from './var.mjs';
function checkOddOrEven(num) {
if (num % 2) { // 홀수이면
return odd;
}
return even;
}
export default checkOddOrEven;
//index.mjs
import { odd, even } from './var.mjs';
import checkNumber from './func.mjs'; //이름 달라도 상관없음!
function checkStringOddOrEven(str) {
if (str.length % 2) { // 홀수이면
return odd;
}
return even;
}
console.log(checkNumber(10));
console.log(checkStringOddOrEven('hello'));
콘솔에 $ node index.mjs 로 실행
js 확장자에서 import 사용하면 SyntaxError: Cannot use import statement outside a module 에러 발생
- 해결방법 : mjs 확장자 대신 js 확장자를 사용하면서 ES 모듈 사용하려면 package.json에 type: “module” 속성 추가


3.3.3 다이나믹 임포트
CommonJS 모듈에서는 가능, ES 모듈에서는 불가능
조건부로 모듈을 불러오는 것
//dynamic.js
const a = false;
if (a) {
require('./func');
}
console.log('성공');
ES 모듈에서 사용하는 방법!
- ES모듈은 async 함수 없이도 await 가능
//dynamic.mjs
const a = false;
if (a) {
import './func.mjs';
}
console.log('성공');
//=> 위의 코드는 에러남
//수정후
const a = true;
if (a) {
const m1 = await import('./func.mjs'); //import는 Promise를 반환하기에 await이나 then을 붙여야함
console.log(m1);
const m2 = await import('./var.mjs');
console.log(m2);
}
3.3.4 filename, dirname
3.4 노드 내장 객체
3.5 노드 내장 모듈 사용하기