Require
이번엔 모듈을 불러오는 require에 대해 알아봅시다. require는 함수이고, 함수는 객체이므로 require는 객체로서 속성을 몇 개 갖고 있습니다. 그중에서 require.cache 와 require.main을 알아보도록 하자
var.js가 있는곳에 require.js를 만들어보자
// require.js
console.log('require가 가장 위에 오지 않아도 됩니다.');
module.exports = '저를 찾아보세요';
require("./var");
console.log('require.cache 입니다');
console.log(require.cache);
console.log('require.main 입니다');
console.log(require.main); // require.main 객체모양은 require.cache의 모듈객체와 같다.
console.log(require.main === module); // 현재 파일이 첫 모듈인지 확인.
console.log(require.main.filename); // 첫 모듈의 알아볼때.
위 예제에서 알아야할 점은 require가 반드시 파일 최상단에 위치할 필요가 없고, module.exports도 최하단에 위치할 필요가 없다는 것입니다. 아무 곳에서나 사용해도 됩니다.
require.cache 객체에 require.js나 var.js 같은 파일 이름이 속성명으로 들어 있는 것을 볼 수 있습니다.속성값으로는 각 파일의 모듈 객체가 들어 있습니다. 한번 require한 파일은 require.cache에 저장되므로 다음 번에 require 할 떄는 새로 불러오지 않고 require.cache 에 있는 것이 재사용됩니다.
만약에 require하실 원한다면 require.cache의 속성을 제거하면 됩니다. 다만, 프로그램의 동작이 꼬일 수 있으므로 권장하지는 않습니다. 속성을 자세히 살펴보면 module.exports했던 부분(exprots) 이나 로딩 여부 (loaded), 자식(children) 모듈 관계를 찾을 수 있습니다.
내장객체
노드에서는 기본적인 내장 객체와 내장 모듈을 제공합니다. 내장객체와 내장 모듈은 따로 설치하지 않아도 바로 사용할 수 있으며, 브라우저의 window 객체와 비슷하다고 보면 됩니다.
이 절에서는 노드 프로그래밍을 할 때 많이 쓰이는 내장 객체를 알아보겠습니다.
global
- Node.js
- global
-내장객체
-console.log
-process
- __dirname
- __filename
- 내장모듈
- fs
- path
- buffer
- os
브라우저의 window와 같은 전역 객체이며, 전역 객체이므로 모든 파일에서 접근할 수 있습니다. 또한, window.open 메서드를 그냥 open 메서드를 그냥 open으로 호출할 수 있는 것처럼 global도 생략할 수 있습니다. require 함수도 global.require에서 global이 생략된 것입니다.노드 콘솔에 로스를 기록하는 console 객체도 원래는 global.console입니다.
global 객체 내부에는 매우 많은 속성이 들어 있습니다. 이 절에서 배울 내용들은 global 객체안에 있으며, 내부를 보려면 REFL을 이용합니다.
내장 '모듈'
왜 굳이? 가져오지? 내장객체에 다 때려박으면 되는거 아닌가?
바로 용량을 비효율적으로 차지하는 경우가 있기 때문이다.
노드 내장 모듈 사용하기
노드는 웹 브라우저에서 사용되는 자바스크립트보다 더 많은 기능을 제공합니다. 운영체제 정보에도 접근할 수있고, 클라이언트가 요청한 주소에 대한 정보도 가져올 수 있습니다. 노드에서 이러한 기능을 하는 모듈을 제공합니다.
노드의 모듈은 노드 버전마다 차이가 있습니다.
'fs'
fs module (= File System module) 이란, 파일 처리와 관련된 전반적인 작업을 하는 모듈을 말한다.
const fs = require( "fs" ); // => fs 모듈 불러오기
filename은 '불러올 파일의 위치(경로)'이고, string, Buffer, URL, integer 타입이 올 수 있다.(보통은 문자열을 사용한다.)
'path'
폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈입니다. path 모듈이 필요한 이유 중 하나는 운영체제별로 경로 구분자가 다르기 때문입니다. 크게 윈도 타입과 POSIX 타입으로 구분됩니다. POSIX는 유닉스 기반의 운영체제들로 맥과 리눅스가 속해 있습니다.
- 윈도: C:\Users\파일처럼 \로 구분합니다.
- POSIX: /home/파일처럼 /로 구분합니다.
따라서 맥이나 리눅스에서 예제를 실습하고 있다면 \ 대신 / 가 나오는 것이 정상입니다.
이외에도 파일 경로에서 파일명이나 확장자만 따로 떼어주는 기능도 구현해둬서 직접 구현하지 않고도 편리하게 사용할 수 있습니다.
path 모듈의 속성과 메서드를 알아봅시다.
const path = require('path')
const string = __filename;
console.log('path.sep:', path.sep);
console.log('path.delemeter:', path.delimiter);
console.log("-------------------------------");
console.log('path.dirname()', path.dirname(string));
console.log(('path.extname:', path.extname(string)));
console.log('path.basename()', path.basename(string));
console.log('path.basename - extname', path.basename(string, path.extname(string)));
console.log("------------------------------");
console.log('path.parse()', path.parse(string));
console.log('path.format()', path.format({
root: '/',
dir: '/mnt/c/Users/xxx/새 폴더/xxxx/xxxx/fs',
base: 'pathTest.js',
ext: '.js',
name: 'xxxx'
}));
console.log('---------------------------');
console.log('path.isAbsolute(C:\\)', path.isAbsolute('/mnt'));
path.join([...paths])
path.join('foo', 'bar', 'baz/asdf')
'buffer'
버퍼와 스트림 이해하기
파일을 읽거나 쓰는 방식에는 크게 두 가지 방식, 즉 버퍼를 이용하거나 스트림을 이용하는 방식이 있습니다.
버퍼링과 스트리밍이라는 용어를 들어 봤을것이다.
노드의 버퍼와 스트림도 비슷한 개념이다. readFile 메서드를 사용할 때 읽었던 파일이 버퍼 형식으로 출력되었습니다.
노드는 파일을 읽을 때 메모리에 파일 크기만큼 공간을 마련해두며 파일 데이터를 메모리에 저장한 뒤 사용자가 조작할 수 있도록 합니다. 이때 메모리에 저장된 데이터가 바로 '버퍼' 입니다. ※일정 크기로 모아두는 데이터.
buffer 모듈의 정의
바이너리 (= 이진) 데이터 스트림을 처리하는 방법을 제공.
ex)1 byte = 8bit'12' = '1100''0000' = '1''0001' = '2''0010' = '3''0011' = '4''0100' = '5''0101' = '6''0110' = '7'A = '0100 0001'a = '0110 0001'O = '0100 1111'
Buffer 객체는 여러가지 메서드를 제공합니다.
- from(문자열): 문자열을 버퍼로 바꿀 수 있습니다. length 속성은 버퍼의 크기를 알립니다. 바이트 단위입니다.
- toString(버퍼): 버퍼를 다시 문자열로 바꿀 수 있습니다. 이때 base64나 hex를 인수로 넣으면 해당 인코딩으로 변환 가능합니다.
- concat(배열): 배열 안에 든 버퍼들을 하나로 합칩니다.
- alloc(바이트): 빈 버퍼를 생성합니다. 바이트를 인수로 넣으면 해당 크기의 버퍼가 생성됩니다.
※ readFile 방식의 버퍼가 편리하기는 하지만 문제점도 있습니다. 만약 용량리 100MB인 파일이 있으면, 읽을 때 메모리에 100MB의 버퍼를 만들어야 합니다 이 작업을 동시에 열 개만 해도 1GB에 달하는 메모리가 사용됩니다. 특히 서버처럼 몇 명이 이용할지 모르는 환경에서는 메모리 문제가 발생할 수 있습니다. 또한, 모든 내용을 버퍼에 다 쓴 후에야 다음 동작으로 넘어가므로 파일 읽기, 압축, 파일 쓰기 등의 조작을 연달아 할 때 매번 전체 용량을 버퍼로 처리해야 다음 단계로 넘어갈 수 있습니다. 이를 편리하게 만든것이 스트림이다.
// buufferT.js
const buffer = Buffer.from("aaa")
console.log(buffer);
console.log(buffer.length);
// <Buffer 61 61 61>
// 3
const arr = [Buffer.from("Hello"), Buffer.from("World")]
console.log(arr);
const concat = Buffer.concat(arr)
console.log(concat);
console.log(concat.toString());
const alloc = Buffer.alloc(5)
console.log(alloc);
//bufferT2.js
const fs = require("fs")
fs.readFile("./Request.txt", (err, data) => {
if (err) throw err
console.log(data);
})
//출력
<Buffer 48 65 6c 6c 6f 20 57 6f 6c 72 64 0d
0a 0d 0a 34 35 34 35 38 38 38 0d 0a 0d 0a eb 8f 99 ed 95
b4 eb ac bc ea b3 bc 20 eb b0 b1 eb 91 90 ec...
// Request.txt
Hello Wolrd
4545888
동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려 강산
대한사람 대한으로 길이 보전하세
남산 위에 저 소나무 철갑을 두른듯
바람서리 불변함은 우리 기상일세
무궁화 삼천리 화려 강산
대한사람 대한으로 길이 보전하세
가을 하늘 공활한데 높고 구름 없이
밝은 달은 우리 가슴 일편단심일세
무궁화 삼천리 화려 강산
대한사람 대한으로 길이 보전하세
// bufferT3.js
// Buffer를 쪼개보도록 하겠습니다.
const fs = require("fs")
const readStream = fs.createReadStream("./Request.txt", { highWaterMark: 16 })
// Buffer
// Stream
const data = []
readStream.on('data', (buffer)=> {
data.push(buffer);
console.log(buffer);
})
//on() = addEventListener
//chunk = buffer
readStream.on("end", () => {
console.log(Buffer.concat(data).toString());
console.log("다 읽었습니다.");
})
// 출력
<Buffer 48 65 6c 6c 6f 20 57 6f 6c 72 64 0d 0a 0d 0a 34>
<Buffer 35 34 35 38 38 38 0d 0a 0d 0a eb 8f 99 ed 95 b4>
<Buffer eb ac bc ea b3 bc 20 eb b0 b1 eb 91 90 ec 82 b0>
<Buffer ec 9d b4 20 eb a7 88 eb a5 b4 ea b3 a0 20 eb 8b>
<Buffer b3 eb 8f 84 eb a1 9d 0d 0a ed 95 98 eb 8a 90 eb>
<Buffer 8b 98 ec 9d b4 20 eb b3 b4 ec 9a b0 ed 95 98 ec>
<Buffer 82 ac 20 ec 9a b0 eb a6 ac eb 82 98 eb 9d bc 20>
<Buffer eb a7 8c ec 84 b8 0d 0a eb ac b4 ea b6 81 ed 99>
<Buffer 94 20 ec 82 bc ec b2 9c eb a6 ac 20 ed 99 94 eb>
<Buffer a0 a4 20 ea b0 95 ec 82 b0 0d 0a eb 8c 80 ed 95>
<Buffer 9c ec 82 ac eb 9e 8c 20 eb 8c 80 ed 95 9c ec 9c>
<Buffer bc eb a1 9c 20 ea b8 b8 ec 9d b4 20 eb b3 b4 ec>
<Buffer a0 84 ed 95 98 ec 84 b8 0d 0a eb 82 a8 ec 82 b0>
<Buffer 20 ec 9c 84 ec 97 90 20 ec a0 80 20 ec 86 8c eb>
<Buffer 82 98 eb ac b4 20 ec b2 a0 ea b0 91 ec 9d 84 20>
<Buffer eb 91 90 eb a5 b8 eb 93 af 0d 0a eb b0 94 eb 9e>
<Buffer 8c ec 84 9c eb a6 ac 20 eb b6 88 eb b3 80 ed 95>
<Buffer a8 ec 9d 80 20 ec 9a b0 eb a6 ac 20 ea b8 b0 ec>
<Buffer 83 81 ec 9d bc ec 84 b8 0d 0a eb ac b4 ea b6 81>
<Buffer ed 99 94 20 ec 82 bc ec b2 9c eb a6 ac 20 ed 99>
<Buffer 94 eb a0 a4 20 ea b0 95 ec 82 b0 0d 0a eb 8c 80>
<Buffer ed 95 9c ec 82 ac eb 9e 8c 20 eb 8c 80 ed 95 9c>
<Buffer ec 9c bc eb a1 9c 20 ea b8 b8 ec 9d b4 20 eb b3>
<Buffer b4 ec a0 84 ed 95 98 ec 84 b8 0d 0a ea b0 80 ec>
<Buffer 9d 84 20 ed 95 98 eb 8a 98 20 ea b3 b5 ed 99 9c>
<Buffer ed 95 9c eb 8d b0 20 eb 86 92 ea b3 a0 20 ea b5>
<Buffer ac eb a6 84 20 ec 97 86 ec 9d b4 0d 0a eb b0 9d>
<Buffer ec 9d 80 20 eb 8b ac ec 9d 80 20 ec 9a b0 eb a6>
<Buffer ac 20 ea b0 80 ec 8a b4 20 ec 9d bc ed 8e b8 eb>
<Buffer 8b a8 ec 8b ac ec 9d bc ec 84 b8 0d 0a eb ac b4>
<Buffer ea b6 81 ed 99 94 20 ec 82 bc ec b2 9c eb a6 ac>
<Buffer 20 ed 99 94 eb a0 a4 20 ea b0 95 ec 82 b0 0d 0a>
<Buffer eb 8c 80 ed 95 9c ec 82 ac eb 9e 8c 20 eb 8c 80>
<Buffer ed 95 9c ec 9c bc eb a1 9c 20 ea b8 b8 ec 9d b4>
<Buffer 20 eb b3 b4 ec a0 84 ed 95 98 ec 84 b8>
Hello Wolrd
4545888
동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려 강산
대한사람 대한으로 길이 보전하세
남산 위에 저 소나무 철갑을 두른듯
바람서리 불변함은 우리 기상일세
무궁화 삼천리 화려 강산
대한사람 대한으로 길이 보전하세
가을 하늘 공활한데 높고 구름 없이
밝은 달은 우리 가슴 일편단심일세
무궁화 삼천리 화려 강산
대한사람 대한으로 길이 보전하세
다 읽었습니다.
alloc()
지정된 길이의 Buffer 객체를 생성.
allocUnsafe()
지정된 길이의 0이 아닌 버퍼를 생성.
allocUnsafeSlow
지정된 길이의 0이 아닌 풀링 된 (=non-pooled) 버퍼를 생성.
byteLength()
지정된 객체의 바이트 수를 반환.
compare()
두 개의 Buffer 객체를 비교.
concat()
Buffer 객체의 배열을 하나의 Buffer 객체로 연결.
copy()
Buffer 객체의 지정된 바이트 수를 복사.
entry()
Buffer 객체의 "index" "byte"쌍의 반복자를 반환.
equals()
두 Buffer 객체를 비교하고 일치하면 true를 반환하고 그렇지 않으면 false를 반환.
fill()
Buffer 객체를 지정된 값으로 채움.
객체 (문자열 / 배열 / 버퍼)에서 Buffer 객체를 생성.
includes()
Buffer 객체에 지정된 값이 포함되어 있는지 확인.
일치하는 항목이 있으면 true를 반환하고 그렇지 않으면 false를 반환.
indexOf()
Buffer 객체에 지정된 값이 포함되어 있는지 확인.
첫 번째 발생을 반환하고, 그렇지 않으면 -1 반환.
isBuffer()
객체가 Buffer 객체인지 확인.
isEncoding()
Buffer 객체가 지정된 인코딩을 지원하는지 확인.
keys()
Buffer 객체의 키 배열을 반환.
lastIndexOf()
Buffer 객체에 지정된 값이 포함되어 있는지 확인.
끝부터 시작하여 첫 번째 발생을 반환하고, 그렇지 않으면 -1 반환.
length
Buffer 객체의 길이를 바이트 단위로 반환.
poolSize
풀링에 사용되는 바이트 수를 설정/반환.
readDoubleBE()
Buffer 객체에서 64 비트 double을 읽고 결과를 big endian으로 반환.
readDoubleLE()
Buffer 객체에서 64 비트 double을 읽고 결과를 little endian으로 반환.
readFloatBE()
Buffer 객체에서 32 비트 float를 읽고 결과를 빅 엔디안으로 반환.
readFloatLE()
Buffer 객체에서 32 비트 float를 읽고 결과를 little endian으로 반환.
readInt8()
Buffer 객체에서 8 비트 정수를 읽음.
readInt16BE()
Buffer 객체에서 16 비트 정수를 읽고 결과를 빅 엔디안으로 반환.
readInt16LE()
Buffer 객체에서 16 비트 정수를 읽고 결과를 리틀 엔디안으로 반환.
readInt32BE()
Buffer 객체에서 32 비트 정수를 읽고 결과를 빅 엔디안으로 반환.
readInt32LE()
Buffer 객체에서 32 비트 정수를 읽고 결과를 리틀 엔디안으로 반환.
readIntBE()
Buffer 객체에서 지정된 바이트 수를 읽고 결과를 빅 엔디안으로 반환.
readIntLE()
Buffer 객체에서 지정된 바이트 수를 읽고 결과를 리틀 엔디안으로 반환.
readUInt8()
Buffer 객체에서 부호없는 8 비트 정수를 읽음.
readUInt16BE()
Buffer 객체에서 부호없는 16 비트 정수를 읽고 결과를 빅 엔디안으로 반환.
readUInt16LE()
Buffer 객체에서 부호없는 16 비트 정수를 읽고 결과를 리틀 엔디안으로 반환.
readUInt32BE()
Buffer 객체에서 부호없는 32 비트 정수를 읽고 결과를 빅 엔디안으로 반환.
readUInt32LE()
Buffer 객체에서 부호없는 32 비트 정수를 읽고 결과를 리틀 엔디안으로 반환.
readUintBE()
Buffer 객체에서 지정된 바이트 수를 읽고 결과를 부호없는 정수로 반환.
readUIntLE()
Buffer 객체에서 지정된 바이트 수를 읽고 결과를 부호없는 정수로 반환.
slice()
Buffer 객체를 지정된 위치에서 시작하고 끝나는 새로운 Buffer 객체로 자름.
swap16()
16 비트 버퍼 객체의 바이트 순서를 변경.
swap32()
32 비트 버퍼 객체의 바이트 순서를 변경.
swap64()
64 비트 버퍼 객체의 바이트 순서를 변경.
toString()
Buffer 객체의 문자열 버전을 반환.
toJSON()
Buffer 객체의 JSON 버전을 반환.
values ()
Buffer 객체의 값 배열을 반환.
write()
지정된 문자열을 Buffer 객체에 쓰기.
writeDoubleBE()
빅 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓰기.
바이트는 64 비트 double이어야 함.
writeDoubleLE()
리틀 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓰기.
바이트는 64 비트 double이어야 함.
writeFloatBE()
빅 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓰기.
바이트는 32 비트 부동 소수점이어야 함.
writeFloatLE()
리틀 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓰기.
바이트는 32 비트 부동 소수점이어야 함.
writeInt8()
지정된 바이트를 Buffer 객체에 쓰기.
바이트는 8 비트 정수여야 함.
writeInt16BE()
빅 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓰기.
바이트는 16 비트 정수여야 함.
writeInt16LE()
리틀 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓰기.
바이트는 16 비트 정수여야 함.
writeInt32BE()
빅 엔디안을 사용하여 지정된 바이트를 Buffer 개체에 쓰기.
바이트는 32 비트 정수여야 함.
writeInt32LE()
리틀 엔디안을 사용하여 지정된 바이트를 Buffer 개체에 쓰기.
바이트는 32 비트 정수여야 함.
writeIntBE()
빅 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓰기.
writeIntLE()
리틀 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓰기.
writeUInt8()
지정된 바이트를 Buffer 객체에 쓰기.
바이트는 8 비트 부호없는 정수여야 함.
writeUInt16BE()
빅 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓰기.
바이트는 16 비트 부호없는 정수여야 함.
writeUInt16LE()
리틀 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓰기.
바이트는 16 비트 부호없는 정수여야 함.
writeUInt32BE()
빅 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓰기.
바이트는 32 비트 부호없는 정수여야 함.
writeUInt32LE()
리틀 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓱기.
바이트는 32 비트 부호없는 정수여야 함.
writeUIntBE()
빅 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓰기.
writeUIntLE()
리틀 엔디안을 사용하여 지정된 바이트를 Buffer 객체에 쓰기.
연습문제
// 001.js
const EventEmitter = require("events")
// EventEmitter 내장모듈
const myEvent = new EventEmitter()
myEvent.addListener('event1', () => {
console.log("event 1");
})
myEvent.on("event2", () => {
console.log("event 2");
})
myEvent.once("event3", () => {
console.log("event 3");
})
myEvent.emit("event1")
myEvent.emit("event2")
myEvent.emit("event2")
myEvent.emit("event3")
myEvent.emit("event3")
// 1
// 2
// 2
// 3
'os'
웹 브라우저에 사용되는 자바스클비트는 운영체제의 정보를 가져올 수 없지만, 노드는 os 모듈에 정보가 담겨 있어 정보를 가져올 수 있습니다.
내장 모듈인 os 불러오려면 require('os') 또는 require('node:os')를 하면 됩니다. OS라는 파일이 존재하는 것은 아니지만 도드가 알아서 내장 모듈임을 파악해 불러옵니다.
OS 모듈의 대표적인 메서드를 알아 봅시다.
const os = require('os')
console.log('운영체제 정보---------------------');
console.log('os.arch()', os.arch()); //process.arh와 동일하다
console.log('os.platform()', os.platform()); // process.patform 과 동일하다
console.log('os.type()', os.type()); // 운영체제의 종류를 보여줍니다.
console.log('os.uptime()', os.uptime()); // 운영체제의 부팅 이후 흐은 시간(초)을 보여줍니다.
/* process.uptime()은노드의 실행 시간이었습니다. */
console.log('os.hostname()', os.hostname()); // 컴퓨터의 이름을 보여줍니다.
console.log('os.release()', os.release()); // 운영체제의 버전을 보여줍니다.
console.log('경로---------------------------');
console.log('os.homedir', os.homedir()); // 홈 디렉터리 경로를 보여줍니다.
console.log('os.tmpdir', os.tmpdir()); // 임시 파일 저장 경로를 보여줍니다.
console.log('cpu 정보------------------------------');
console.log('os.cpus():',os.cpus()); // 컴퓨터의 코어 정보를 보여줍니다.
console.log(('os.cpus().length:', os.cpus().length)); //코어 갯수
console.log('메모리 정보 --------------------------');
console.log('os.freemem():', os.freemem()); // 사용가능한 메모리(RAM)를 보여줍니다
console.log('os.totalmem()', os.totalmem()); // 전체 메모리 용량을 보여줍니다
__filename, __dirname
노드에서는 파일 사이에 모듈 관계가 있는 경우가 많으므로 현재 파일의 경로나 파일명을 알아야하는 경우가 많다. 노드는
__filename, __dirname이라는 키워드로 경로에 대한 정보를 제공합니다. 파일에 __filename과 __dirname을 넣어두면 실행 시 현재 파일명과 현재 파일경로로 바뀝니다.
filename.js
console.log(__filename); // c:\Users\xxx\xxx\filename.js
console.log(__dirname); // c:\Users\xxx\xxx
윈도우가 아니라면 \ 대신 / 로 폴더 경로가 구분될 수 있습니다. 이렇게 얻은 정보를 사용해경로 처리를 할 수도 있습니다.
하지만 경로가 문자열로 반환되기도 하고, \ 나 / 같은 경로 구분자 문제도 있으므로 보통은 이를 해결해주는 path 모듈과 함께 씁니다.
※참고로 ES 모듈에서는 __ filename. __dirname을 사용 할 수 없습니다. 대신 import.meta.url로 경로를 가져올 수 있습니다.
'nodeJS' 카테고리의 다른 글
[Node.js] 예외 처리하기 (0) | 2023.09.07 |
---|---|
[NodeJS] express (0) | 2023.09.04 |
[Node.js] Net 모듈 (0) | 2023.08.31 |
[Node.js] 통신(네트워크) (0) | 2023.08.30 |
NodeJS 기초 , 정의 (0) | 2023.08.25 |