728x90
반응형
Node.js와 CommenJs
- 원래 JavaScript에 module이라는 정확한 개념이 존재하지 않아 웹브라우저에 국한되지 않고
범용적 활용과 코드의 효율성을 높이기 위해 CommonJs와 AMD가 등장했고,
이둘은 JacaScript Code를 module로 만드는 합의된 일련의 표준명세 입니다. - 모듈은 로컬 파일에서 동작하지 않고, HTTP 또는 HTTPS 프로토콜을 통해서만 동작합니다.
- Node.js는 그중 CommonJs의 모듈 명세에 따라 모듈화를 지원하기 때문에
모듈을 선언할 때 module.exports 를 사용하고, 모듈을 로딩할 때에는 require 를 사용합니다.
IIFE(Immediately Invoked Function Expression)
- 즉시 호출 함수 표현식이라고 하며 스코프 영역 내 외부 변수의 접근을
막고 즉시 호출하는 함수를 만들고 싶을때 사용합니다.
//1.
(function () {
console.log('Hello World!');
})(); // Hello World!
//2.
(function func() {
console.log('Hello World!02');
})(); // Hello World!02
func(); // error
//3.
(func03 = function (x) {
console.log(`Hello World! ${x}`);
})(); // Hello World! undefined
func03('kim'); // Hello World! kim
- IIFE는 선언과 동시에 즉시 호출됩니다. 특징은 함수명이 생략될 수 있습니다. 일반적인 함수 표현식처럼 호이스팅이 됩니다.
- 함수 선언식을 즉시 함수 표현식으로 바꿀 수 있습니다. 하지만 재사용이 불가합니다.
- 즉시 함수 표현식을 만들 수 있습니다. 재사용이 가능합니다.
module과 require의 생성방식
> module
Module {
id: '<repl>',
path: '.',
exports: {},
filename: null,
loaded: false,
children: [],
paths: [
'C:\\Users\\godhy\\Desktop\\sparta_plus\\middle-project-for-exam\\middle-project-for-exam\\repl\\node_modules',
'C:\\Users\\godhy\\Desktop\\sparta_plus\\middle-project-for-exam\\middle-project-for-exam\\node_modules',
'C:\\Users\\godhy\\Desktop\\sparta_plus\\middle-project-for-exam\\node_modules',
'C:\\Users\\godhy\\Desktop\\sparta_plus\\node_modules',
'C:\\Users\\godhy\\Desktop\\node_modules',
'C:\\Users\\godhy\\node_modules',
'C:\\Users\\node_modules',
'C:\\node_modules',
'C:\\Users\\godhy\\.node_modules',
'C:\\Users\\godhy\\.node_libraries',
'C:\\Program Files\\nodejs\\lib\\node'
]
}
> require
[Function: require] {
resolve: [Function: resolve] { paths: [Function: paths] },
main: undefined,
extensions: [Object: null prototype] {
'.js': [Function (anonymous)],
'.json': [Function (anonymous)],
'.node': [Function (anonymous)]
},
cache: [Object: null prototype] {}
}
require함수의 동작 방식
require의 구조
// global ?
var require = function(src){ // 1
var fileAsStr = readFile(src) // 2
var module.exports = {} // 3
eval(fileAsStr) // 4
return module.exports // 5
}
const express = require('express')
- require메소드에 ‘express’인자가 들어갑니다.
- fileAsStr로 선언한 변수에 express를 readFile로 읽고 할당합니다.
- module.exports로 선언한 변수에 빈 객체를 할당합니다.
- eval 메소드를 이용하여 fileAsStr를 인자로 넣어 사용합니다
- module.exports를 return합니다.
⇒ require로 모듈을 불러오면 그 즉시 실행되는 점에서 IIFE방식과 비슷하다고 볼 수 있습니다.
readFile ?
- node.js에서 제공하는 파일을 읽는 비동기 함수 입니다.
비동기 방식
const fs = require('fs');
fs.readFile('./readme.txt', (err, data) => {
if (err) { throw err; }
console.log(data.toString());
});
동기 방식
const fs = require('fs');
const data = fs.readFileSync('./readme.txt')
console.log(data.toString());
프로미스 방식
const fs = require('fs').promises;
fs.readFile('./readme.txt')
.then(adata) =>
console.log(data.toString());
})
.catch((err) => {
console.error(err);
});
Method
- fs.access(경로, 옵션, 콜백) : 접근 가능 여부 체크
- fs.mkdir(경로, 콜백) : 폴더 생성
- fs.open(경로, 옵션, 콜백) : 파일의 아이디(fd 변수)를 가져옴. 파일이 없으면 파일을 생성 하므로 파일 생성에 사용가능
- fs.write() : w 쓰기 , r 읽기 , a 추가 가능.
- fs.rename(기존경로, 새경로, 콜백) : 파일 이름 변경 및 이동
- fs.readdir(경로, 콜백) : 폴더 내용 확인
- fs.unlink : 파일 삭제
- fs.rmdir : 폴더 삭제
eval ?
- 객체를 깊은복사 하여 할당해주는 함수 입니다. (복사 + 붙여넣기)
var require = function(src){ //line 1
var fileAsStr = readFile(src) //line 2
var module.exports = {} //line 3
const a = 10
exports.a = a;
return module.exports //line 5
}
- 방식을 조금 풀어서 설명하자면 eval이라는 함수는 먼저 a라는 변수가 선언되고
인자로 받은 값을 할당한뒤 exports에 깊은복사 합니다.
결론
- require Method가 parameter로 들어온 파일에 들어가 코드를 IIFE로 변환 시킨 뒤
새로만든 module의 빈 객체를 인자로 삼아 IIFE를 실행하고 module.exports를 return하는 것입니다.
728x90
반응형
'Language > Node.js' 카테고리의 다른 글
Node Snippets 명령어 (0) | 2022.10.05 |
---|---|
Package Manager (0) | 2022.09.30 |
Express.js (0) | 2022.09.30 |
첫 Node.js (0) | 2022.09.30 |