본문 바로가기

JavaScript/Node.js

노드의 기능

반응형
  1. REPL 
    1. Read
    2. Eval
    3. Print
    4. Loop
      • $node로 입력해서 >로 바뀌면 자바스크립트 입력
  2. 자바스크립트 코드 실행
    • $node [자바스크립트 파일 경로]
  3. 코드 -> 모듈화 (CommonJS 모듈,ECMAScript 모듈)
  4. 브라우저의 this와 다른 노드의 this
    1. 노드에서  최상위 스코프의 this는 module.exports를 가리킨다.
      브라우저에서는 window 객체를 가리킨다.
    2. 노드에서 함수 선언문 내부의 this는 global 객체를 가리킨다.
      브라우저에서는 window 객체를 가리킨다.
  5. 노드의 내장 객체

 


  • CommonJS 모듈
    1. require로 모듈 불러오기
    2. module.exports로 모듈 한번에 내보내기
    3. exports 객체로 각각의 변수를 대입하기
      • exports객체와 module.exports는 같은 객체를 참조하므로, 참조 관계가 깨지지 않도록 해야함
      • exports는 객체만 사용 가능
      • 한 모듈에는 exports와 module.exports 하나만 사용하는 게 좋다.
    4. 다이내믹 임포트
      • 조건부로 모듈을 불러오는 기능 -> if문 안에서 임포트 가능

 

 

require 함수

  • 함수는 객체이므로, 속성을 가진다.
  • 속성
    • require.cache
      • 불러온 모듈의 정보를 기록한다.
      • 한 번 불러온 모듈은 다시 불러오지 않고 cache에서 재사용
      • module.exports한 부분, 로딩 여부, 자식 모듈 관계를 포함
    • require.main
      • 노드 실행 시 첫 모듈을 가리킨다.
      • 순환 참조가 존재하면, 대상을 빈 객체로 만드므로 원하는 동작을 수행하지 않을 수 있다.

ECMAScript 모듈

  • 표준 모듈 형식으로, 브라우저에서도 사용 가능
  • require -> import
  • exports -> export
  • module.exports -> export default
  • 함수나 객체 -> 문법
  • js파일 -> mjs
    • mjs 대신 js를 사용하기 위해선 package.json에 type :"module"속성이 필요
  • 파일 경로에 생략이 불가능
  • 다이내믹 임포트
    • if문 안에서 임포트 불가능 -> import함수를 이용해 동적으로 불러 올 수 있다.
      • import 함수는 Promise 반환 -> await, then 필요
      • async는 최상위 스코프에서는 생략 가능

var.mjs

export const odd = 'MJS 홀수';
export const even = 'MJS 짝수';

 

 

fun.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 "./fun.mjs";

function checkStringOddOrEven(str){
    if(str.length % 2){
        return odd;
    }
    return even;
}

console.log(checkNumber(10));
console.log(checkStringOddOrEven('hello'));

 

dynamic.mjs

const a = true;

if(a){
    const m1 = await import ('./fun.mjs');
    console.log(m1);
    const m2 = await import('./var.mjs');
    console.log(m2);
}

  • __filename, __dirname
    • 현재 파일명과 현재 파일 경로명
    • 경로 구분자 문제 '/', '\' -> path모듈 사용
    • ES 모듈에서는 사용불가능 -> import.meta.url

노드 내장 객체

  1. global
  2. console
  3. 타이머
  4. process
  5. 기타
    1. URL, URLSearchParams
    2. AbortController, FormData, fetch, Headers, Request, Response, Event, EventTarget
    3. TextDecoder
    4. TextEncoder
    5. WebAssembly

  • global
    • window와 비슷한 전역객체 -> 간단한 데이터 공유할 때 사용
    • 모든 파일에 접근 가능
    • 생략 가능
    • 브라우저에 존재하는 DOM,BOM 객체가 존재하지 않는다.
      -> globalThis는 브라우저에서는 window, 노드에서는 global을 가리킴

globalA

module.exports = () => global.message;

 

globalB

const A = require('./globalA');

globalThis.message = '안녕하세요';
console.log(A());

  • console
  • fconsole.time(레이블)
  • console.log(내용)
  • conole.error(에러 내용)
  • console.table(배열)
  • console.dir(객체, 옵션)
  • console.trace(레이블)

타이머

  • setTimeout(콜백 함수, 밀리초)
  • setInterval(콜백 함수, 밀리초)
  • setImmediate(콜백 함수)

 

  • 이벤트 루프 거친 뒤 즉시 실행되는 함수지만 차이
    • setTimeout보다 setImmedidate가 먼저 실행
      -> 파일 시스템 접근, 네트워킹 같은 I/O 작업의 경우 (항상 먼저 실행되는건 아님)

 

  • clearTimeout(아이디)
  • claerInterval(아이디)
  • clearImmediate(아이디)

 

  • 콜백기반 API이지만, 프로미스 방식 사용 가능 -> 노드 내장 객체가 아닌 노드 내장 모듈
  • 프로미스 기반 함수 -> 프로미스 지원하는 함수 -> async/await 
    • 프로미스 기반 함수 X -> 프로미스 함수 사용 필요
    • 프로미스 기반 함수 -> async/await로 간결하게 사용 가능

프로미스

function asyncFunction() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Async operation completed"); // 비동기 작업 성공
        }, 1000);
    });
}

asyncFunction().then(result => {
    console.log(result); // 출력: "Async operation completed"
}).catch(error => {
    console.error(error); // 에러 처리
});

 

async/await

async function asyncFunction() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Async operation completed"); // 비동기 작업 성공
        }, 1000);
    });
}

async function main() {
    try {
        const result = await asyncFunction();
        console.log(result); // 출력: "Async operation completed"
    } catch (error) {
        console.error(error); // 에러 처리
    }
}

main();

process

  • 현재 실행 중인 노드 프로세스 정보 담고있는 객체
  • 속성
    • process.env
      • 시스템 환경 변수
    • process.nextTick(콜백)
      • 이벤트 루프가 다른 콜백 함수보다 우선 처리하도록
      • Promise로 resolve된 Promise까지 다른 콜백보다 우선되기 때문에 -> 마이크로 태스크로 구분해서 사용 
    • process.exit(코드)
      • 실행 중인 노드 프로세스 종료
setImmediate(() => {
    console.log('immediate');
});

process.nextTick(() => {
    console.log('nextTick');
});
setTimeout(()=> {
    console.log('timeout');
},0);

Promise.resolve().then(() => console.log('promise'));

: nextTick -> promise -> timeout -> immediate

  1. nextTick 콜백 실행: process.nextTick()에 등록된 콜백 함수가 가장 먼저 실행됩니다. nextTick 콜백은 다른 비동기 이벤트들보다 우선시되어 즉시 실행됩니다.
  2. Promise 콜백 실행: Promise.resolve().then()에 등록된 콜백 함수가 실행됩니다. 이는 Microtask Queue에 들어가므로 다른 Microtask들이 실행되기 전에 실행됩니다.
  3. timeout 콜백 실행: setTimeout()에 등록된 콜백 함수가 실행됩니다. 이는 Timer Queue에 들어가므로 다른 비동기 작업들이 모두 완료된 후에 실행됩니다.
  4. immediate 콜백 실행: setImmediate()에 등록된 콜백 함수가 실행됩니다. 이는 Check Queue에 들어가므로 Timer Queue에 있는 작업들보다 우선순위가 높습니다.

 

 

반응형