Node Module

박가현·2023년 5월 19일
3

Nodejs

목록 보기
2/2
post-thumbnail

Module

goal

  • module 정의와 노드 모듈에 대해 알아보자
  • repl에 대해 알아보자



REPL 사용하기

1장에서도 언급했듯이 노드는 자바스크립트 런타임으로 자바스크립트 코드를 실행하게 해준다

즉 노드는 우리가 입력한 자바스크립트 코드를 읽고 ( READ), 해석하고 (EVAL) 결과물을 반환하고 (PRINT) 종료할때까지 반복(LOOP)한다

이 과정을 REPL이라고 한다


예를 들어 우리가 프롬프트에 const str = “hello” 를 입력하면 node는 우리가 입력한 코드를 읽고 해석한 후 결과물을 출력을 한다 ( 실제 위와 같은 명령문을 입력하면 undefined가 출력될 것이다) 이때 ctrl+c를 하지 않는 이상 종료가 되지 않으므로 또 다른 입력을 기다린다( 반복)


이런식으로 node는 repl의 과정을 거친다. 우리가 프롬프트에 코드를 입력해도 실행을 할 수 있지만 편의성을 위해 일반적으로 자바스크립트 파일을 만들어 파일을 읽고 해석하도록 시킨다



Module


브라우저 상에서 동작하는 자바스크립트는 script tag로 로드하며 복수의 자바스크립트 파일을 로드한다고 하여도 하나의 파일로 합쳐지며 동일한 유효범위를 가진다

이때 자바스크립트의 문제를 Node js의 모듈 시스템이 해결한다

Module이란?

애플리케이션을 개발하다보면 규모가 커지고 자연스레 파일을 여러 개로 분리하는 과정을 겪는다 이때 분리된 하나의 파일을 모듈이라 하고 이런 모듈은 재활용, 네임스페이스화, 유지보수 용이라는 장점을 가져다준다

모듈 시스템의 종류는 대표적으로 CommonJS와 ECMAScript 모듈시스템이 존재한다



CommonJS 모듈


commonJS 모듈은 표준 자바스크립트 모듈은 아니지만 표준이 나오기 이전부터 사용되어 널리 쓰이고 있다

commonJS에서는 module.exports와 require 함수를 사용해서 모듈 기능을 제공한다

이런 기능을 사용하면 파일을 다른 파일에서 사용 가능하다는 장점이 있다

아래 예시를 보면 어떻게 사용하는지 더 와닿을것이다

//a.js
const odd = "홀수입니다";
const even = "짝수입니다";

module.exports={odd,even};
//지금은 객체를 할당했지만 값을 할당하는 것도 가능하다

//b.js
const { odd , even } = require('./a.js');
//const num = require('./a.js"); 이렇게 구조분해할당 안하고도 가능
console.log(odd);// 홀수입니다

module.exports와 exports

exports와 module.exports는 모두 하나의 객체를 바라본다 그리고 최종적으로 return 되는 것은 무조건 module.exports이기에 만약 exports에 다른 값을 할당하면 둘의 참조관계가 끊어지기에 exports에 어떤 변경을 해도 모듈에 영향을 주지 못한다

exports에는 객체처럼 속성명과 속성값을 대입해야 한다. 다른 값을 대입하면 안된다

➕node에서 this는 브라우저에서 this와 다르게 module.exports를 뜻한다

require


require은 모듈을 불러오는 함수이다 함수도 객체이기에 require은 객체로서 require.cache , require.main이라는 속성을 가지고 있다
- require.cache → 한번 require한 파일은 require.cache에 저장되어 다음 번에 require할 때 새로 불러오지 않고 재사용된다 - require.main → 노드 실행 시 첫 모듈을 가리킨다 현재 파일이 첫 모듈인지 알려면 require.main === module을 해보면 된다

또한 require과 module exports는 최상단, 최하단이 아닌 아무 곳이나 위치해도 상관없다



ECMAScript Module

ECMAScript 모듈은 공식적인자바스크립트 모듈형식으로 표준형식이다.

commonJS의 require, exports, module.exports가 import, export, export default로 바뀌었다

ES모듈의 import나 export default는 require이나 module처럼 함수나 객체가 아니라 문법 그 자체이다

  • named export를 사용하여 함수 또는 변수를 내보낼 수 있다
  • default export를 사용하여 하나의 기본 함수를 내보낼 수 있으며 모듈 당 하나만 가능하다
  • import를 사용하여 모듈을 불러올 수 있다
  • commonJS는 다이내믹 임포트가 되는데 ES모듈에서는 다이나믹 임포트가 불가하다 ( 조건부로 모듈을 불러오는 임포트)
  • commonsJS에서는 filename , dirname으로 경로에 대한 정보를 얻지만 ES모듈에서는 import.meta.url로 경로를 가지고 올 수 있다



Node 내장 모듈 path

노드에는 다양한 내장 모듈과 내장 객체가 존재하지만 그 중 path만 정리해보려고 한다

유닉스 계열 운영체제와 윈도우 운영체제는 서로 다른 문자로 디렉토리 구조를 표현한다 따라서 문자열로 파일이나 디렉토리 경로에 접근하면 원하는 방향대로 돌아가지 않을 수 있다

경로는 path.join 함수 또는 path.resolve 함수를 통해 완전한 경로로 조합이 가능하다

path.join("Users" ,"test.txt");
->'Users/test.txt'

path.resolve('/users' ,'test.txt');
->'/users/test.txt'

이때 resolve는 /를 만나면 절대경로로 인식해서 앞의 경로를 다 날려버린다는 점이 있다

  • path.dirname → 디렉토리 부분을 알아낼 수 있다
  • path.basename → 파일이름을 알아낼 수 있다
  • path.extname → 확장자를 알아낼 수 있다
profile
프론트엔드 공부일지

0개의 댓글