var.js를 다른 파일에서 받아 쓸 수 있다.
모듈화의 2가지 방법
//var.js
const odd = "홀수입니다.";
const even = "짝수입니다";
//모듈화 방법1
//두가지 이상을 exports하고 싶을 때 사용 가능
exports.odd = odd;
exports.even = even;
//모듈화 방법2
module.exports = {
odd: odd, even: even
};
기본 개념:
require가 제일 위에 올 필요는 없음
require을 console.log(require)해보면 require 속성들이 나옴
require('./var'); //var 파일 실행만 됨.
const {odd,even} = require('./var.js'); //구조분해할당
console.log(odd);
console.log(even);
순환 참조
//require1.js
require('./require2');
//require2.js
require('./require1'); //빈객체
dynamic import
const a = true;
if(a) require('./var');
else require('./index');
기본 개념:
확장자를 mjs로 쓰거나, package.json에 type:"module" 로 바꿔줘야한다.
CommonJs -> ES 모듈이 되면서 바뀐 것
require -> import exports -> export module.exports -> export default async+await이 항상 함께 -> async 없이 await을 쓸 수 있음 __dirname, __filename 사용 가능 -> 사용 불가 //var.mjs
export const odd = "홀수입니다.";
export const even = "짝수입니다";
//func.mjs
import { odd, even } from './var.mjs' //확장자까지 꼭 써줘야함
function checkOddorEven(num) {
if (num % 2) {
return odd;
}
return even;
};
export default checkOddorEven;
dynamic import in ES 모듈
const a = true;
if(a) a1 = await import('./var.mjs');
else a2 = await import('./index.mjs');
1)기본 개념: 현재 실행중인 노드 프로세스에 대한 정보에 접근할 수 있음
process.upTime(); //프로세스가 시작된 후 지난 시간
process.cwd(); //현재 프로세스가 실행되는 위치
process.pid //프로세스 아이디
process.env : 환경변수
process.env 로 접근const passwd=process.env.SECRET_ID;
process.nextTick
process.nextTick 의 콜백함수를 우선적으로 처리setImmediate(() => {
console.log('immediate');
});
process.nextTick(() => {
console.log('nextTick');
});
setTimeout(() => {
console.log('timeout');
}, 0);
Promise.resolve().then(() => console.log('promise'));
//nextTick->promise->timeout->immediate
process.exit
process.exit(0) : 정상적으로 종료된 것운영체제의 정보
process와 겹치는 부분이 있음
//os.js
const os = require('os');
os.arch() // process.arch와 동일합니다.
os.platform() // process.platform과 동일합니다.
os.type() // 운영체제의 종류를 보여줍니다.
os.uptime() // 운영체제 부팅 이후 흐른 시간(초)을 보여줍니다. //process.uptime()은 노드의 실행 시간이었습니다.
os.hostname() // 컴퓨터의 이름을 보여줍니다.
os.release() // 운영체제의 버전을 보여줍니다.
os.homedir() // 홈 디렉터리 경로를 보여줍니다.
os.tmpdir() // 임시 파일 저장 경로를 보여줍니다.
os.cpus() // 컴퓨터의 코어 정보를 보여줍니다.
os.freemem() // 사용 가능한 메모리(RAM)를 보여줍니다.
os.totalmem() // 전체 메모리 용량을 보여줍니다.
경로처리
맥, 리눅스 등에 따라 경로처리가 다름: \을 쓰는 경우도 있고 /를 쓰는 경우도 있고...
이러한 경로들을 path 가 처리해줌
const path = require('path');
path.join(__dirname, '..', 'var.js');
//-> 주어진 경로들을 단순히 이어 붙여 새로운 경로를 만듦
//___dirname에서 한 단계 위(..)로 이동한 후 var.js를 붙인 경로를 반환
///Users/user/project/src/index.js =>/Users/user/project/index.js
path.resolve(__dirname, '..', '/var.js');
//-> 절대 경로를 반환
//__dirname에서 한 단계 위(project)로 이동한 후 var.js를 추가
///Users/user/project/src/index.js =>/Users/user/project/index.js
이 예제들 이외에도 굉장히 많음..

URL, searchParams : 내장 모듈이 아니라 객체, require('url') 없어도 됨
const url = require('url');
const myURL = new URL('https://www.naver.com/');
console.log(myURL);
console.log(url.format(myURL)); //문자열로 바꿔줌
/* 출력1
URL {
href: 'https://www.naver.com/',
origin: 'https://www.naver.com',
protocol: 'https:',
username: '',
password: '',
host: 'www.naver.com',
hostname: 'www.naver.com',
port: '',
pathname: '/',
search: '',
searchParams: URLSearchParams {},
hash: ''
}
출력2: https://www.naver.com/
*/
const myURL = new URL('http://www.gilbut.co.kr/?page=3&limit=10&category=nodejs&category=javascript');
console.log('searchParams:', myURL.searchParams);
console.log('searchParams.getAll():', myURL.searchParams.getAll('category'));
console.log('searchParams.get():', myURL.searchParams.get('limit'));
console.log('searchParams.has():', myURL.searchParams.has('page'));
console.log('searchParams.keys():', myURL.searchParams.keys());
console.log('searchParams.values():', myURL.searchParams.values());
myURL.searchParams.append('filter', 'es3');
myURL.searchParams.append('filter', 'es5');
console.log(myURL.searchParams.getAll('filter'));
myURL.searchParams.set('filter', 'es6');
console.log(myURL.searchParams.getAll('filter'));
myURL.searchParams.delete('filter');
console.log(myURL.searchParams.getAll('filter'));
console.log('searchParams.toString():', myURL.searchParams.toString());
myURL.search = myURL.searchParams.toString();
내장 모듈
주로 도메인을 통해 IP나 기타 dns를 찾는데 쓰임
import dns from 'dns/promises';
const ip = await dns.lookup('gilbut.co.kr');
console.log(ip); //ip 주소 가져옴
const a = await dns.resolve('gilbut.co.kr', 'A');
console.log(a); //ipv4 주소
const mx = await dns.resolve('gilbut.co.kr', 'MX');
console.log(mx); //메일서버 관련 정보들(=레코드 라고 부름)
const cname = await dns.resolve('www.gilbut.co.kr', 'CNAME');
console.log(cname); //별칭(www가 붙은 주소는 별칭인 경우가 많다)
const any = await dns.resolve('gilbut.co.kr', 'ANY');
console.log(any);
암호화: 평문 -> 암호, 복호화: 암호 -> 평문
해시: 단방향 암호화의 대표주자: 암호화만 되고 복호화가 안됨
const crypto = require('crypto');
console.log(crypto.createHash('sha512').update('비밀번호').digest('base64'))
//비밀번호 라는 문자열을 해시로 바꿈
cipher, decipher : 양방향 암호화
const cipher = crypto.createCipheriv(algorithm, key, iv);
const decipher = crypto.createDecipheriv(algorithm, key, iv);
각종 편의 기능을 모아둠
deprecate
그 함수가 사용되었을 때 경고창을 띄움
const util = require('util');
const dontuse = util.deprecate((x, y) => {
console.log(x + y);
}, 'dontuse 함수는 더이상 사용하지 마세요');
console.log(x + y) 를 실행하여 8을 출력. DeprecationWarning(사용 중단 경고) 이 발생하며, dontuse 함수는 더이상 사용하지 마세요 라는 메시지가 표시됨promisify
콜백 기반 함수를 Promise 기반 함수로 변환
// crypto.randomBytes를 Promise 기반 함수로 변환
const promiseme = util.promisify(crypto.randombytes);
promiseme(64)
.then((buf) => {
console.log(buf.toString('base64'));
})
.catch((error) => {
console.log(error);
});