개발을 하다보면, import
와 require
사용과 관련된 에러 메세지를 만날 때가 종종 있다.
require
는 CommonJS를 사용하는 node.js문이지만 import
는 ES6에서만 사용한다.
CommonJS는 서버사이드 JS가 나온 후, 표준화를 위해 정립된 모듈 표준이다. ES6는 2016년에 정립된 최신의 문법 표준이며, ES modules이라는 모듈 표준을 사용한다.
require
는 동기로 실행된다. require
가 선언되면 하드웨어나 네트워크를 통해 즉시 스크립트를 실행한다. 따라서, require
는 파일 경로를 지정해야 호출할 수 있다. require
는 프로그램의 어느 지점에서나 호출 할 수 있다.
import
는 정적으로 호출하기 때문에, 비동기로 실행된다. 따라서, import
는 파일의 시작 부분에서만 실행할 수 있다. 하지만, import
도 import()
를 사용하면 원하는 지점에서 호출할 수 있다. 자세한 내용은 MDN에 써져 있다.
import
를 선언하기 위해서는 파일이 런타임 내에 파일이 모듈로 읽어져야 된다. 따라서, HTML의 <script> tag
안에 type="module"
을 적어야 한다.
한 프로그램 안에 require
와 import
를 동시에 사용할 수 없다.
require
는 모듈을 전부 불러오는 반면에, import
는 모듈의 필요한 부분만 로드할 수 있다. 따라서, import
가 더 효율적이라고 할 수 있고, 점점 많은 라이브러리들이 CommonJS
의 지원을 중단하고 ES modules
로 넘어가는 추세라고 한다.
// getPrimes.js - import / [export]
// - Returns a list of prime numbers that are smaller than `max`.
export function getPrimes(max) {
const isPrime = Array.from({ length: max }, () => true);
...
return [...isPrime.entries()]
.filter(([, isPrime]) => isPrime)
.map(([number]) => number);
}
// [import] / export
import { getPrimes } from "/modules/getPrimes.js";
console.log(getPrimes(10)); // [2, 3, 5, 7]
// require / [exports]
module.exports = module;
// [require] / exports
const module = require("module");
썸네일 이미지는 OpenAI의 DALL-E로 제작되었습니다.