Node.js 튜토리얼 : Node.js 시작하기

서버 및 애플리케이션을위한 크로스 플랫폼 JavaScript 런타임 환경 인 Node.js는 많은 이점을 제공합니다. 낮은 메모리 사용량, 우수한 성능 및 현재 약 475,000 개에 달하는 대규모 패키지 에코 시스템으로 인해 Node.js는 웹 서버, REST API, 실시간 네트워크 애플리케이션 (예 : 채팅, 게임)을 구축하는 데 인기있는 선택이되었습니다. 크로스 플랫폼 데스크톱 앱.

Node.js를 아직 시작하지 않았다면 아마도 때입니다. Node.js가 어떻게 작동하는지 알아 보려면 Node.js 설명자를 확인하십시오. 이 기사에서는 Node.js 및 NPM 패키지 관리자를 설치하고, 간단한 웹 서버를 회전하고, Node.js 클러스터 모듈을 사용하여 여러 CPU 코어를 활용하는 방법을 단계별로 설명합니다.

NPM 패키지 관리자를 사용하여 추가 Node.js 모듈 및 기타 JavaScript 패키지를 설치하는 방법도 살펴 봅니다. 그리고 우리는 Node.js 프레임 워크 (이 경우 Koa)를 사용하여 기능이 더 풍부하고 유연한 Node.js 서버를 만들 것입니다.  

시작하자.

Node.js 및 NPM을 설치하는 방법

//nodejs.org로 이동하여 시작하십시오.

Node.js 재단

현재 릴리스에서 몇 가지 새로운 기능이 필요하다는 것을 모르는 경우 LTS (장기 지원) 다운로드 버튼을 클릭하십시오. 다운로드 한 설치 프로그램의 정확한 모양은 운영 체제마다 다를 수 있지만 Mac에서는 처음에는 다음과 같습니다.

설치가 완료되면 다음과 같이 표시됩니다.

이제 Node.js와 NPM이 모두 올바르게 설치되었는지 확인해야합니다. 명령 줄 셸 (Mac의 경우 터미널, Windows의 경우 명령 프롬프트)을 열고 설치된 버전을 모두 확인합니다.

$ 노드 — 버전

v6.11.3

$ npm — 버전

3.10.10

Node.js 또는 NPM을 찾을 수 없다는 오류가 발생하면 셸 응용 프로그램을 다시 시작하거나 컴퓨터를 재부팅하십시오. 그래도 작동하지 않으면 $ PATH (Mac 및 Linux) 또는 PATH (Windows)를 편집하고 다시 시작해야 할 수 있습니다.

Node.js와 NPM은 모두 위의 터미널 스크린 샷에서 의도 한 버전과 일치하므로 Node.js로 이동하여 실제로 무언가를 개발할 준비가되었습니다. 순수 Node.js로 쉽게 빌드 할 수있는 것부터 시작하겠습니다.

Sublime Text, Visual Studio Code, Brackets, Atom 또는 WebStorm과 같은 JavaScript 및 Node.js를 지원하는 코드 편집기 또는 IDE가 필요합니다.

Node.js 예제 : 간단한 웹 서버

정말 간단하게 시작하기 위해 Node.js 사이트에서 간단한 예제를 훔쳐 보겠습니다. 코드를 복사하여 코드 편집기에 붙여 넣은 다음 (Visual Studio Code를 사용하고 있지만 일반 텍스트를 저장하는 모든 편집기로 충분 함) example.js로 저장합니다.

const http = require ( 'http');

const 호스트 이름 = '127.0.0.1';

const 포트 = 3000;

const 서버 = http.createServer ((req, res) => {

   res.statusCode = 200;

   res.setHeader ( 'Content-Type', 'text / plain');

   res.end ( 'Hello World \ n');

});

server.listen (port, hostname, () => {

   console.log (`// $ {hostname} : $ {port} /`에서 실행되는 서버);

});

파일을 저장 한 디렉토리에서 셸을 열고 명령 줄에서 파일을 실행합니다.

$ 노드 example.js

//127.0.0.1:3000/에서 실행되는 서버

제 경우에는 Visual Studio Code에서 터미널 창을 사용했습니다. 독립적 인 셸 창으로 거의 쉽게 전환 할 수있었습니다.

이제 서버에 나열된 URL을 찾습니다.

터미널에서 Control-C를 눌러 노드 서버를 중지하십시오.

계속하기 전에 코드를 분리 해 보겠습니다.

const http = require ( 'http');

1 행 require은 Node.js에서 모듈을로드하는 방법 인을 사용합니다. 이 명령문은 Node.js http 모듈을로드합니다.이 모듈 createServer은 6 ~ 10 listen행에서 호출 된 메소드 와 12 ~ 14 행에서 호출 된 메소드를 제공합니다. =>6 행과 12 행에서 "뚱뚱한 화살표"연산자 는 익명의 Lambda 함수를 생성하는 약어입니다. , Node.js 앱에서 자주 사용됩니다.

const 서버 = http.createServer ((req, res) => {

  res.statusCode = 200;

  res.setHeader ( 'Content-Type', 'text / plain');

  res.end ( 'Hello World \ n');

});

6 행 의 res인수 createServer()는 응답을 작성하는 데 사용됩니다. req인수는이 코드에서 무시됩니다 들어오는 HTTP 요청을 포함하고 있습니다. 이 res.end메서드는 응답 데이터를 'Hello World \ n'로 설정하고 서버에 응답 생성이 모두 완료되었음을 알립니다.

server.listen (port, hostname, () => {

  console.log (`// $ {hostname} : $ {port} /`에서 실행되는 서버);

});

메서드에 의해 생성 된 서버 클로저server.listen() 는 정의 된 호스트 (예 : localhost) 및 포트 (3000)에서 요청을 수신하도록 서버에 지시합니다. createServer()메서드에 의해 생성 된 클로저 는 정의 된 호스트 및 포트에 들어올 때 요청을 처리합니다.

JavaScript 클로저가 이벤트 핸들러로 정의된다는 생각은 Node.js의 가장 미묘하고 강력한 부분 중 하나이며 Node의 비동기식 비 차단 아키텍처의 핵심입니다. Node.js는 이벤트 루프를 숨기지 만 다른 방법으로 참여하지 않으면 항상 이벤트 처리로 되돌아갑니다. 또한 JavaScript 클로저는 스레드 생성 또는 프로세스 분기와 같은 여러 클라이언트 연결을 처리하는 다른 방법보다 훨씬 적은 메모리를 사용합니다.

Node.js 예제 : 다중 프로세스 웹 서버

"Hello World"만 인쇄하는 것 외에도 위의 예제는 하나의 스레드에서만 실행됩니다. 즉, 호스트 컴퓨터의 코어 하나만 사용할 수 있습니다. 서버에 할당하고 싶은 코어가 많을 때가 있습니다.

Node 클러스터 모듈의 공식 예제는이를 수정하는 방법을 보여줍니다. 이전과 마찬가지로 코드를 훔쳐 실행합니다. Node.js 클러스터 문서를 찾아서 코드를 복사하고 코드 편집기 또는 IDE에 붙여넣고 server.js로 저장합니다.

const 클러스터 = require ( 'cluster');

const http = require ( 'http');

const numCPUs = require ( 'os'). cpus (). length;

if (cluster.isMaster) {

console.log (`Master $ {process.pid} 실행 중`);

// 포크 작업자.

for (leti = 0; i

cluster.fork ();

}

cluster.on ( 'exit', (작업자, 코드, 신호) => {

console.log (`worker $ {worker.process.pid} 사망`);

});

} else {

// 작업자는 모든 TCP 연결을 공유 할 수 있습니다.

//이 경우 HTTP 서버입니다.

http.createServer ((req, res) => {

res.writeHead (200);

res.end (`hello world from $ {process.pid} \ n`);

}). listen (8000);

console.log (`Worker $ {process.pid} 시작됨`);

}

node server.js명령 줄에서 실행 하면 로그에 마스터 및 작업자 프로세스의 프로세스 ID가 표시됩니다. 컴퓨터에 논리 코어가있는만큼 작업자가 있어야합니다. 4 개의 하드웨어 코어와 하이퍼 스레딩이있는 Core i7 프로세서가있는 MacBook Pro의 경우 8 개입니다.

localhost : 8000 또는 127.0.0.1:8000으로 이동하면 "hello world"가 표시됩니다. 터미널 창에서 Ctrl-C를 눌러 노드 서버 프로세스를 중지 할 수 있습니다.

const 클러스터 = require ( 'cluster');

const http = require ( 'http');

const numCPUs = require ( 'os'). cpus (). length;

라인 1과 2는 마지막 예제에서 익숙해 보일 것입니다. 3 행은 조금 다릅니다. 단순히 os모듈을 요구하는 대신 cpus()멤버 함수를 호출 하고 반환 된 배열의 길이 (CPU 수)도 반환합니다. 그러면 배열 자체와 os모듈 링크에 연결할 수 없으며 나중에 JavaScript 엔진에 의해 가비지 수집 될 수 있습니다.

if (cluster.isMaster) {

   console.log (`Master $ {process.pid} 실행 중`);

   // 포크 작업자.

   for (let i = 0; i <num CPUs; i ++) {

      cluster.fork ();

   }

   cluster.on ( 'exit', (작업자, 코드, 신호) => {

      console.log (`worker $ {worker.process.pid} 사망`);

   });

}

5 행은 마스터 프로세스에 대해서만 실행되는 블록을 시작합니다. PID를 기록하고, 사용 가능한 CPU 당 작업자를 포크하고, 클러스터 종료 이벤트를 처리하고 기록하는 클로저를 만듭니다.

} else {

   // 작업자는 모든 TCP 연결을 공유 할 수 있습니다.

   //이 경우 HTTP 서버입니다.

   http.createServer ((req, res) => {

      res.writeHead (200);

      res.end ( 'hello world \ n');

   }). listen (8000);

   console.log (`Worker $ {process.pid} 시작됨`);

16 행에서 시작하는 블록은 작업자 프로세스에 의해서만 실행됩니다. 이 코드는 이전 예제와 비슷해 보입니다. "hello world"로 모든 요청에 ​​응답하는 웹 서버를 생성합니다.

위에서 본 결과를 보면이 코드가 내 컴퓨터에서 8 번 실행되어 포트 8000에서 상위 프로세스의 TCP 연결을 공유하는 8 개의 웹 서버 작업자를 생성했음을 알 수 있습니다. 그러나 시스템은 부하를 어떻게 공유합니까?

문서에 따르면 Node.js 클러스터 모듈은 Windows를 제외하고 기본적으로 수정 된 라운드 로빈 알고리즘을 사용합니다. 알고리즘은 cluster.schedulingPolicy속성에 의해 제어됩니다 .

이것이 작동하는지 어떻게 알 수 있습니까? 테스트 해 봅시다. 한 줄의 코드 만 변경하면됩니다. 21 행을 다음과 같이 편집하십시오.

      res.end (`hello world from $ {process.pid} \ n`);

을 추가해야 할뿐만 아니라 from ${process.pid}구분 기호를 작은 따옴표에서 백틱으로 변경해야 JavaScript가 문자열에서 변수 대체를 수행 할 수 있습니다.

파일을 저장하고 이전에 실행중인 인스턴스를 중지 한 다음 다시 실행하십시오. 브라우저 클라이언트를 새로 고칠 때마다 반환 된 프로세스 ID가 변경 될 것이라고 생각할 수 있지만 틀릴 것입니다. 브라우저가 너무 똑똑하고 웹 페이지를 만료 된 것으로 표시하지 않았으므로 브라우저는 처음 실행될 때 응답을 캐시하고 동일한 숫자를 계속 표시합니다. 동일한 URL을 가리키는 여러 브라우저 탭이나 페이지를 생성하더라도 그렇게 할 것입니다. 그러나 마스터로부터의 라운드 로빈 디스패치가 동시에 여러 브라우저 (이 경우 Chrome, Safari 및 Opera)를 실행하여 작동 함을 알 수 있습니다.

다른 웹 서버에 익숙한 경우 요청을 라우팅하고 Node.js에서 각 사용자의 로그인 및 환경을 보존하기 위해 지속적인 상태를 유지하는 스키마를 볼 수 있습니다. 아아, Node에는 내장 기능이 없습니다. 두려워하지 마십시오. Node.js 위에 구축 된 수많은 웹 프레임 워크가 여러분이 기대하는 모든 것을 수행합니다.

NPM으로 Node.js 모듈을 설치하는 방법

대부분의 노드 모듈을 사용하려면 기본적으로 NPM 레지스트리에서 전역으로 또는 프로젝트 디렉토리에 모듈을 설치 한 다음 require()코드에서 설치하면됩니다. 종종 프로젝트는 여러 NPM 모듈에 의존하며 해당 목록을 project.json 파일에 보관합니다. 명령 줄에서 각 종속성을 설치하는 대신 GitHub 저장소에서 프로젝트를 체크 아웃 한 후 한 번에 모두 설치할 수 있습니다.

$

$ cd my_project

$ npm 설치

모든 NPM 패키지가 정확하게 작동하는 것은 아닙니다. React를 포함한 일부 는 설치 옵션 중 하나로 시작 앱 을 만드는 "공장"앱을 가지고 있습니다.

$ npm install -g create-react-app

$ cd ~ / 작업

$ create-react-app 내 앱

$ cd 내 앱 /

$ npm 시작

도구가 전 세계적으로 설치되는 것은 드문 일이 아닙니다. 예를 들어 Angular 명령 줄 도구 Ng는 전역 적으로 설치됩니다. 그런 다음 로컬에서 실행하여 폴더에 앱을 만듭니다.

$ npm install -g @ angular / cli

$ cd ~ / 작업

새로운 내 앱 $ ng

Angular에는 표준 패턴과 더 유사한 또 다른 설치 방법이 있습니다. Angular QuickStart 시드를위한 것입니다.

$ git clone //github.com/angular/quickstart.git 빠른 시작

$ cd 빠른 시작

$ npm 설치

빠른 시작 폴더의 package.json 파일 npm install은 CLI 설치와 거의 동일한 종속성 목록을 가져 오도록 지시 합니다.

Node.js 예제 : Koa 웹 서버

React와 Angular는 모두 Node.js 생태계의 일부이며 개발을 위해 Node.js와 NPM이 필요하지만 특별히 Node.js 프레임 워크는 아닙니다. 브라우저에서 실행할 수 있습니다. 저는의 "Node.js 프레임 워크에 대한 전체 가이드"에서 수십 개의 실제 Node.js 프레임 워크를 다루었습니다.

예를 들어, Express는 웹 애플리케이션, HTTP 요청 및 응답, 라우팅 및 미들웨어를 처리하는 원래의 구체화 된 Node 웹 서버입니다. 새로운 옵션 인 Koa는 미들웨어 용 콜백 대신 생성기 를 사용합니다 .

앱 폴더 안에 표준 패턴으로 Koa를 설치합니다.

$ npm koa 설치  

다음은 이전 예제에서와 같이 저장하고 실행할 수있는 Koa "Hello World"앱의 코드입니다.

const Koa = require ( 'koa');

const app = new Koa ();

// x- 응답 시간

app.use (async (ctx, next) => {

const 시작 = Date.now ();

await next ();

const ms = Date.now ()-시작;

ctx.set ( 'X-Response-Time',`$ {ms} ms`);

});

// 로거

app.use (async (ctx, next) => {

const 시작 = Date.now ();

await next ();

const ms = Date.now ()-시작;

console.log (`$ {ctx.method} $ {ctx.url}-$ {ms}`);

});

// 응답

app.use (async ctx => {

ctx.body = 'Hello World';

});

app.listen (3000);

Koa에서 사용하는 미들웨어 생성기와 Express 및 기타 Node.js 프레임 워크에서 사용하는 콜백 사이에는 차이가 있습니다. 많은 콜백 구현은 하나가 반환 될 때까지 일련의 함수를 통해 단순히 제어를 전달하는 반면 Koa는 "다운 스트림"을 생성 한 다음 제어가 "업스트림"으로 되돌아갑니다.

위의 예에서 x-response-time await next() 은 호출을 표시하는 문으로 응답 생성기를 "래핑"합니다  . 이 비동기 함수를 사용하면 타이머와 응답 사이에 웹 로거와 같이 시퀀스에 다른 생성기를 쉽게 삽입 할 수 있으므로 명시 적 함수 호출보다 더 유연합니다.

yield next대신 사용 하는 이전 Koa 코드를 볼 수 있습니다 await next(). 차이점은 Koa는 이제 ES2015 및 비동기 기능을 지원한다는 것입니다. 제어의 흐름은 동일합니다. yield next호출시 체인의 다음 핸들러로 이동 한 다음 모든 핸들러가 완료되면 반환됩니다.