Node.js는 오늘날 가장 인기있는 기술 중 하나 여야합니다. 이 기사는 주로 node.js의 특성 및 응용 시나리오를 소개합니다.
Node.js는 Chrome JavaScript 런타임에 구축 된 플랫폼으로 빠르고 스케일링하기 쉬운 네트워크 응용 프로그램을 쉽게 구축하는 데 사용됩니다. Node.js는 이벤트 중심으로 가볍고 효율적이며 분산 장치에서 실행되는 데이터 집약적 실시간 응용 프로그램에 이상적입니다.
1. 기능
1.1 비동기 I/O
소위 비동기 I/O는 동기 I/O와 관련이 있습니다. 파일 읽기 및 쓰기, 입력 및 출력, 요청 응답 등과 같은 프로그램 실행 중에 많은 I/O 작업이 수행되어야합니다. 일반적으로 I/O 작업은 시간이 소요됩니다. 예를 들어, 기존 프로그래밍 모드에서는 여러 g의 파일을 읽어야합니다. 전체 스레드가 일시 중지되고 파일을 읽고 계속 실행할 때까지 기다립니다. 다시 말해, I/O 운영은 코드 실행을 차단하여 프로그램의 효율성을 크게 줄입니다.
비동기 I/O와 관련하여 실제로 AJAX 요청을 시작하는 것이 "비동기"호출이기 때문에 실제로 프론트 엔드 엔지니어에게 익숙하지 않습니다. 노드에서 파일 읽기 (파일을 읽는 시간이 소요되는 I/O 조작)를 예로 들어 ajax 요청을 시작하는 방식과 매우 유사합니다.
코드 사본은 다음과 같습니다.
var fs = 요구 ( 'fs');
fs.ReadFile ( '/path', function (err, file) {
Console.log ( '완료된 파일 읽기');
});
console.log ( '파일 읽기 시작');
위의 코드를 fs.readfile이라고 불린 후에 후속 코드는 즉시 실행되며 "읽기 파일이 완료된 시간"은 예측할 수 없습니다. 스레드가 I/O 작동에 직면하면 I/O 작동이 차단 방식으로 종료되기를 기다리지 않지만 I/O 요청을 운영 체제로 보내고 후속 명령문을 계속 실행합니다. 운영 체제가 I/O 작업을 완료하면 I/O 작업을 수행하는 스레드에 이벤트 형태로 알림을 받고 스레드는 특정 시간에 이벤트를 처리합니다.
1.2 이벤트 루프 및 콜백 기능
소위 이벤트 루프는 노드가 이벤트 메커니즘을 사용하여 모든 비동기 작업을 해결하고 스레드가 지속적으로 루핑하여 이벤트 큐를 감지 함을 의미합니다. 이벤트 루프는 프로그램이 끝날 때까지 이벤트 대기열에서 처리되지 않은 이벤트를 확인합니다. 이벤트의 프로그래밍 방법은 경량, 느슨한 커플 링의 장점을 가지고 있으며 트랜잭션 포인트에만 초점을 맞추고 있습니다. 그러나 여러 비동기 작업의 시나리오에서는 이벤트가 서로 독립적이며 협력하는 방법이 문제입니다. JavaScript에서는 콜백 함수가 어디에나 있으며 콜백 함수가 데이터를 반환하기 위해 비동기 호출을 수락하는 가장 좋은 방법입니다.
1.3 단일 스레드
노드는 브라우저에서 JS의 특성을 단일 스레드로 유지합니다. 단일 스레드의 가장 큰 장점은 멀티 스레드 프로그래밍과 같은 상태에 민감한 동기화 문제가 필요하지 않다는 것입니다. 교착 상태가 없거나 스레드 컨텍스트 전환의 오버 헤드가 없다는 것입니다. 단일 스레드는 또한 약점이 있으며, 주로 세 가지 측면에서 나타납니다. 멀티 코어 CPU를 활용할 수 없음; 오류로 인해 전체 응용 프로그램이 종료되며 신청서의 견고성은 대학원 입학 시험에 적합합니다. 많은 양의 컴퓨팅이 CPU를 차지하며 비동기 I/O를 계속 호출하는 것을 불가능하게 만듭니다.
위의 문제를 해결하기 위해 Node는 HTML5 웹 작업자와 동일한 아이디어를 채택하고 child_process를 사용하여 단일 스레드에서 많은 양의 계산 문제를 해결합니다. 계산을 각 어린이 프로세스에 배포함으로써 많은 계산을 분해 할 수 있으며 결과는 프로세스 간의 이벤트 메시지를 통해 전달 될 수 있습니다.
1.4 크로스 플랫폼
노드는 크로스 플랫폼입니다. 즉, Windows, Linux, OSX 및 기타 플랫폼에서 동일한 JS 코드 세트를 배포하여 실행할 수 있습니다. 이는 주로 노드가 운영 체제와 노드 상위 레벨 모듈 시스템간에 플랫폼 수준 아키텍처 libuv를 구축했기 때문입니다.
2. 응용 프로그램 시나리오
1) 실시간 응용 프로그램 : 온라인 채팅, 실시간 알림 푸시 등과 같은 (socket.io와 같은)
2) 분산 응용 프로그램 : 효율적인 병렬 I/O를 통해 기존 데이터를 사용하십시오.
3) 도구 응용 프로그램 : 대규모 도구, 프론트 엔드 압축 배포 (예 : Grunt)에서 데스크탑 그래픽 인터페이스 응용 프로그램에 이르기까지
4) 게임 애플리케이션 : 게임 필드는 실시간 및 동시성에 대한 높은 요구 사항을 가지고 있습니다 (예 : Netease의 Pomelo 프레임 워크)
5) 웹 렌더링 기능을 향상시키기 위해 안정적인 인터페이스를 사용하십시오
6) 통합 프론트 엔드 프로그래밍 언어 환경 : 프론트 엔드 개발자는 서버 측 개발자 (예 : 유명한 순수 자바 스크립트 풀 스택 평균 아키텍처)를 신속하게 입력 할 수 있습니다.