기말고사는 filesystem access 부터 입니다.
Ryan dahl also created Deno (2018), a runtime for JavaScript, TypeScript,
and WebAssembly, which is based on V8 and Rust.
“10 things I regret about NodeJS”
Runtime vs. Framework
NodeJS
NextJS
pass
document & window
objects -> Browsers브라우저의 경우, 사용자에게 웹 페이지를 보여주는 것이 목적이기 때문에 HTML 요소를 선택하고 조작하는 DOM API를 제공한다.
이와 달리, Node.js는 주로 서버에서 데이터를 다루는 목적으로 사용되기 때문에 로컬 스토리지에 파일을 생성하고 수정하는 File 시스템 관련 API가 제공된다.
이런 작업을 수행하기 위해서 Node.js는 브라우저보다 컴퓨터의 깊숙한 곳까지 제어할 수 있다. 브라우저는 사용자 컴퓨터에서 동작하기 때문에, 브라우저를 통해 사용자의 컴퓨터에 있는 파일들을 조작할 수 있다면 보안적으로 매우 위험하기 때문에 브라우저 환경에서는 이러한 동작을 하지 않는다.
exports
. (노출시킴)module.exports
can instead be set.모듈이란 어플리케이션을 구성하는 개별적 요소를 말한다.
module 파일 단위는 .js가 아니라 .mjs
// jaehyun.js
// jaehyun wrote a calculate function
// sum of geometric series (등비수열)
function calculate(a, x, n) {
if(x === 1) return a*n;
return a*(1 - Math.pow(x, n))/(1 - x);
}
module.exports = calculate;
// jihun.js
// So did jaehyun
// volume of a sphere of radius r (구의 체적)
function calculate(r) {
return 4/3*Math.PI*Math.pow(r, 3);
}
module.exports = calculate;
const geometricSum = require(`./jaehyun.js`);
const sphereVolume = require(`./jihun.js`);
console.log(geometricSum(1, 2, 5)); // logs 31
console.log(sphereVolume(2)); // logs 33.510321638291124
// jihun.js
module.exports = {
geometricSum(a, x, n) {
if(x === 1) return a*n;
return a*(1 - Math.pow(x, n))/(1 - x);
},
arithmeticSum(n) {
return (n + 1)*n/2;
},
quadraticFormula(a, b, c) {
const D = Math.sqrt(b*b - 4*a*c);
return [(-b + D)/(2*a), (-b - D)/(2*a)];
},
};
const jihun = require(`./jihun.js`);
console.log(jihun.geometricSum(1, 2, 5)); // logs 31
console.log(jihun.quadraticFormula(1, 2, -15)); // logs [ 3, -5 ]
확장자 mjs임을 유의하자
// jaehyun.mjs
const calculate = (a, x, n) => {
if(x == 1) return a*n;
return a*(1 - Math.pow(x, n))/(1-x);
}
const addition = (y, z ) => {
return (y+ z);
}
export { calculate, addition };
// jihun.mjs
const calculate = (r) => {
return 4/3*Math.PI*Math.pow(r, 3);
}
export { calculate };
import * as jaehyun from './jaehyun.mjs';
import { calculate as sphereVolume } from './jihun.mjs';
console.log(jaehyun.calculate(1, 2, 5)); // 31
console.log(sphereVolume(2)); // 33.51....
console.log(jaehyun.addition(3, 4));
여기서 jihun.caculate(), caculate() 모두 오류이니 참고
하고 싶으면 각각 아래와 같이 import 해야한다.
import * as jihun from './jihun.mjs';
import {calculate} from './jihun.mjs';
import 문에서
*
as별명
인 것을 기억하자
npm modules
are file modules that are located in a special directory called node_modules.node_modules
).node_modules
there, andnpm(node package manager)은 Node.js에서 사용할 수 있는 모듈들을 패키지화하여 모아둔 저장소 역할 겸 패키지 설치 및 관리를 위한 CLI를 제공한다.
지역 설치 시 프로젝트 루트 디렉터리에 node_modules 디렉터리가 자동 생성되고 그 안에 패키지가 설치된다. 이는 해당 프로젝트 내에서만 사용할 수 있다.
1) 핵심 모듈인지 확인, 2) 현재 디렉토리의 node_modules 디렉토리 검사, 3) 디렉토리를 하나 거슬러 올라가 node_modules 디렉토리가 있따면 검사, 4) 최상위 디렉토리에 도달할 떄까지 반복, 5) 전역 디렉토리 검사 이런 과정에도 해당 모듈을 찾을 수 없으면 오류를 던진다.
부모 디렉토리로 가는 이유는 로컬 모듈도 있고 글로벌 모듈이 있기 때문이다.
require()는 데이터베이스 초기화, 로그 싱글컨 생성, 내장 타입과 객체 변경과 같은 '한번만 동작하는' 코드를 수행하기 위해서 사용할 수 있다. require() 로 모듈을 불러올 때 파일 경로를 명시할 수 있다
/home/<jdoe>/fs
C:\Users\<JohnDoe>\Documents\fs
)const fs = require('fs');
fs.writeFile('hello.txt', 'hello from Node!', function(err) {
if(err)
return console.log('Error writing to file.');
});
const fs = require('fs');
const path = require('path');
fs.readFile(path.join(__dirname, 'hello.txt'), function(err, data) {
if(err)
return console.error('Error reading file.');
console.log('Read file contents:');
console.log(data);
});
__dirname
: always set to the directory in which the source file resides.const fs = require('fs');
fs.writeFile(__dirname + '/hello.txt',
'hello from Node!', function(err) {
if(err)
return console.error('Error writing to file.');
});
path.join
: join directory elements using whatever directory separator is appropriate for the operating system recommend const fs = require('fs');
const path = require('path');
fs.readFile(path.join(__dirname, 'hello.txt'),
{ encoding: 'utf8' }, function(err, data) {
if(err) return console.error('Error reading file.');
console.log('File contents:');
console.log(data);
});
join 안해도 상대적인 자리로도 가능하긴 함..
// for synchronous write, use writeFileSync()
fs.writeFileSync(path.join(__dirname, 'hello.txt'), 'hello from Node!');
// for synchronous read, use readFileSync()
const data = fs.readFileSync(path.join(__dirname, 'hello.txt'),
{ encoding: 'utf8' });
try {
fs.writeFileSync(path.join(__dirname, 'hello.txt'), 'hello from Node!');
} catch(err) {
console.error('Error writing file.');
}
const http = require('http');
const server = http.createServer(function(req, res) {
console.log(`${req.method} ${req.url}`);
res.end('Hello world!');
});
const port = 8080;
server.listen(port, function() {
// you can pass a callback to listen that lets you know
// the server has started
console.log(`server startd on port ${port}`);
});
그냥 pass하심