728x90
반응형
- REPL
- Read
- Eval
- Loop
- $node로 입력해서 >로 바뀌면 자바스크립트 입력
- 자바스크립트 코드 실행
- $node [자바스크립트 파일 경로]
- 코드 -> 모듈화 (CommonJS 모듈,ECMAScript 모듈)
- 브라우저의 this와 다른 노드의 this
- 노드에서 최상위 스코프의 this는 module.exports를 가리킨다.
브라우저에서는 window 객체를 가리킨다. - 노드에서 함수 선언문 내부의 this는 global 객체를 가리킨다.
브라우저에서는 window 객체를 가리킨다.
- 노드에서 최상위 스코프의 this는 module.exports를 가리킨다.
- 노드의 내장 객체
- CommonJS 모듈
- require로 모듈 불러오기
- module.exports로 모듈 한번에 내보내기
- exports 객체로 각각의 변수를 대입하기
- exports객체와 module.exports는 같은 객체를 참조하므로, 참조 관계가 깨지지 않도록 해야함
- exports는 객체만 사용 가능
- 한 모듈에는 exports와 module.exports 하나만 사용하는 게 좋다.
- 다이내믹 임포트
- 조건부로 모듈을 불러오는 기능 -> if문 안에서 임포트 가능
require 함수
- 함수는 객체이므로, 속성을 가진다.
- 속성
- require.cache
- 불러온 모듈의 정보를 기록한다.
- 한 번 불러온 모듈은 다시 불러오지 않고 cache에서 재사용
- module.exports한 부분, 로딩 여부, 자식 모듈 관계를 포함
- require.main
- 노드 실행 시 첫 모듈을 가리킨다.
- 순환 참조가 존재하면, 대상을 빈 객체로 만드므로 원하는 동작을 수행하지 않을 수 있다.
- require.cache
ECMAScript 모듈
- 표준 모듈 형식으로, 브라우저에서도 사용 가능
- require -> import
- exports -> export
- module.exports -> export default
- 함수나 객체 -> 문법
- js파일 -> mjs
- mjs 대신 js를 사용하기 위해선 package.json에 type :"module"속성이 필요
- 파일 경로에 생략이 불가능
- 다이내믹 임포트
- if문 안에서 임포트 불가능 -> import함수를 이용해 동적으로 불러 올 수 있다.
- import 함수는 Promise 반환 -> await, then 필요
- async는 최상위 스코프에서는 생략 가능
- if문 안에서 임포트 불가능 -> import함수를 이용해 동적으로 불러 올 수 있다.
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
노드 내장 객체
- global
- console
- 타이머
- process
- 기타
- URL, URLSearchParams
- AbortController, FormData, fetch, Headers, Request, Response, Event, EventTarget
- TextDecoder
- TextEncoder
- 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 작업의 경우 (항상 먼저 실행되는건 아님)
- setTimeout보다 setImmedidate가 먼저 실행
- 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(코드)
- 실행 중인 노드 프로세스 종료
- process.env
setImmediate(() => {
console.log('immediate');
});
process.nextTick(() => {
console.log('nextTick');
});
setTimeout(()=> {
console.log('timeout');
},0);
Promise.resolve().then(() => console.log('promise'));
: nextTick -> promise -> timeout -> immediate
- nextTick 콜백 실행: process.nextTick()에 등록된 콜백 함수가 가장 먼저 실행됩니다. nextTick 콜백은 다른 비동기 이벤트들보다 우선시되어 즉시 실행됩니다.
- Promise 콜백 실행: Promise.resolve().then()에 등록된 콜백 함수가 실행됩니다. 이는 Microtask Queue에 들어가므로 다른 Microtask들이 실행되기 전에 실행됩니다.
- timeout 콜백 실행: setTimeout()에 등록된 콜백 함수가 실행됩니다. 이는 Timer Queue에 들어가므로 다른 비동기 작업들이 모두 완료된 후에 실행됩니다.
- immediate 콜백 실행: setImmediate()에 등록된 콜백 함수가 실행됩니다. 이는 Check Queue에 들어가므로 Timer Queue에 있는 작업들보다 우선순위가 높습니다.
728x90
반응형