몇 년 전만 해도 프론트엔드 학습에 에너지가 흐트러질까 두려워 NodeJS 학습을 주저하셨을 겁니다. 하지만 이제는 nodeJS를 배우지 않으면 프론트엔드 학습에 진전이 없을 수도 있습니다. 기술의 발전이 너무 잔인하네요. 우리가 새로운 기술을 기다려 볼 때, 그 기술은 이미 대중화되었습니다. 이 기사에서는 nodeJS의 기본 지식을 소개합니다
Ryan Dahl은 Node를 만들기 전에는 고성능 웹 서버를 중심으로 작업한 수석 C/C++ 프로그래머입니다. 몇 번의 시도와 실패 끝에 그는 고성능 웹 서버 설계를 위한 몇 가지 핵심 포인트인 이벤트 중심, 비차단 I/O를 발견했습니다. 이것이 nodejs의 두 가지 주요 특징입니다
그래서 Ryan Dahl의 초기 목표는 웹 작성이었습니다. 더 높은 성능을 달성하고 Apache와 같은 서버에 대한 대안을 제공하기 위해 이벤트 중심의 비차단 I/O 기반 서버입니다. Ryan Dahl은 Node를 작성할 때 C, Lua, Haskell, Ruby 및 기타 언어를 대체 구현으로 평가했습니다. 그는 C가 개발 임계값이 높으며 일상적으로 사용할 수 있는 개발자가 많지 않을 것으로 예상한다고 결론지었습니다. 비즈니스 개발을 포기합니다. Ryan Dahl은 Haskell에 능숙하지 않다고 느꼈기 때문에 Lua 자체에는 이미 많은 차단 I/O 라이브러리가 포함되어 있으며 이를 위해 비 차단 I/O 라이브러리를 구축하면 사람들을 바꿀 수 없습니다. I/O를 계속 차단하는 습관이 있어서 저도 버렸고 Ruby의 가상 머신은 성능 저하로 인해 선택되지 않았습니다
이에 비해 JavaScript는 C보다 개발 임계값이 낮고 Lua보다 역사적 수하물이 적습니다. . 서버 측 JavaScript가 수년 동안 존재했지만 백엔드 부분에 대한 시장은 없었습니다. 역사적 수하물이 없으며 비차단 I/O 라이브러리를 가져오는 데 추가적인 저항이 없다고 말할 수 있습니다. 그것. 또한 JavaScript는 브라우저에 다양한 이벤트 중심 애플리케이션을 갖고 있는데, 이는 Ryan Dahl이 선호하는 이벤트 중심 요구 사항과 일치합니다. 당시 제2차 브라우저 전쟁은 점차 끝나가고 있었고, 크롬 브라우저의 자바스크립트 엔진 V8은 성능 부문 1위 타이틀을 획득했다. 고성능, 이벤트 중심적, 역사적 수하물 없음이라는 세 가지 주요 이유를 고려하여 JavaScript는 Node
의 구현 언어가 되었습니다. 처음에 Ryan Dahl은 자신의 프로젝트를 web.js라고 불렀습니다. 하지만 이 프로젝트는 단순히 웹 서버를 개발한다는 그의 원래 생각을 넘어, 네트워크 애플리케이션을 구축하기 위한 기본 프레임워크가 되었기 때문에 그 위에 서버, 클라이언트, 명령 등 더 많은 것을 구축할 수 있게 되었습니다. 라인 도구 등. Node는 어떤 리소스도 공유하지 않는 단일 스레드, 단일 프로세스 시스템으로 발전했으며, 네트워크에 매우 적합한 라이브러리를 포함하고 대규모 분산 애플리케이션을 구축하기 위한 인프라를 제공하는 것도 목표입니다. 빠르고 확장 가능한 네트워크 애플리케이션을 구축하기 위한 것입니다. 그 자체는 매우 간단하며 통신 프로토콜을 통해 많은 노드를 구성하고 대규모 네트워크 애플리케이션 구축 목적을 달성하기 위해 확장하기가 매우 쉽습니다. 각 Node 프로세스는 이 네트워크 애플리케이션에서 노드를 구성합니다. 이것이 이름의 진정한 의미입니다
Node는 백엔드 JavaScript를 위한 실행 플랫폼으로서 다시 작성하지 않고도 프런트엔드 브라우저 JavaScript의 친숙한 인터페이스를 유지합니다. 언어 자체의 모든 기능은 여전히 범위와 프로토타입 체인을 기반으로 합니다. 차이점은 프런트 엔드에서 널리 사용되는 아이디어를 서버 측으로 마이그레이션한다는 것입니다. 다른 언어와 비교한 Node의 특징은 다음과 같습니다
1. 비동기 I/O
Node에서는 대부분의 작업이 비동기식으로 호출됩니다. Ryan Dahl은 모든 어려움을 극복하고 파일 읽기부터 네트워크 요청 등에 이르기까지 최하위 수준에 많은 비동기 I/O API를 구축했습니다. 이것의 의미는 Node에서는 언어 수준에서 자연스럽게 병렬 I/O 작업을 수행할 수 있다는 것입니다. 각 호출 사이에 이전 I/O 호출이 완료될 때까지 기다릴 필요가 없습니다. 프로그래밍 모델의 효율성을 크게 향상시킬 수 있습니다
두 개의 파일 읽기 작업을 동시에 실행하는 경우를 예로 들면, 비동기식 I/O는 가장 느린 파일 읽기 시간에 따라 달라지지만 동기식 I/O는 두 개가 소요됩니다. 각 작업. 여기서 비동기식의 장점은 명백합니다
2. 이벤트
웹 2.0 시대가 도래하면서 JavaScript는 프런트 엔드에서 더 많은 책임을 맡게 되었고 이벤트도 널리 사용되었습니다. Node는 Rhino만큼 Java의 영향을 많이 받지 않습니다. 대신 프런트엔드 브라우저에서 널리 사용되는 성숙한 이벤트를 백엔드에 도입하고 비동기 I/O와 협력하며 이벤트 포인트를 비즈니스 로직에 노출합니다.
이벤트 프로그래밍 메소드는 규모, 호환성, 거래 지점에만 집중하는 등의 문제가 있습니다. 그러나 다중 비동기 작업의 시나리오에서는 이벤트가 서로 독립적입니다. 어떻게 협업할지가 문제입니다
3. 콜백 기능
웹 백엔드 엔드 투 엔드 프로그래밍 언어와 비교할 때 비동기 및 이벤트 외에도 콜백 함수는 Node.js의 주요 기능입니다. 전체적으로 보면 콜백 함수는 비동기 호출에서 반환된 데이터를 받아들이는 가장 좋은 방법이기도 합니다. 그러나 이 프로그래밍 방법은 동기식 프로그래밍에 익숙한 많은 사람들에게는 매우 생소할 수 있습니다. 코드가 작성되는 순서는 실행되는 순서와 아무런 관련이 없으므로 코드를 읽는 데 어려움을 겪을 수 있습니다. 프로세스 제어 측면에서는 비동기 방식과 콜백 함수가 산재해 있기 때문에 기존 동기 방식에 비해 명확성이 떨어집니다
4. 싱글 스레드
JavaScript 언어의 주요 특징은 단일 스레드라는 것입니다. 즉, 한 번에 한 가지 작업만 수행할 수 있다는 의미입니다. JavaScript는 목적에 따라 단일 스레드입니다. 브라우저 스크립팅 언어인 JavaScript의 주요 목적은 사용자와 상호 작용하고 DOM을 조작하는 것입니다. 이는 단일 스레드만 가능하다는 것을 결정합니다. 그렇지 않으면 매우 복잡한 동기화 문제가 발생합니다. 예를 들어 JavaScript에 두 개의 스레드가 동시에 있다고 가정해 보겠습니다. 한 스레드는 특정 DOM 노드에 콘텐츠를 추가하고 다른 스레드는 해당 노드를 삭제합니다. 이 경우 브라우저는 어떤 스레드를 사용해야 합니까? 따라서 복잡성을 피하기 위해 JavaScript는 탄생부터 단일 스레드를 사용했으며 이는 이 언어의 핵심 기능이 되었습니다
Node는 브라우저에서 JavaScript의 단일 스레드 특성을 유지합니다. 그리고 Node에서 JavaScript는 다른 스레드와 어떤 상태도 공유할 수 없습니다. 단일 스레딩의 가장 큰 장점은 다중 스레드 프로그래밍과 같은 상태 동기화 문제를 걱정할 필요가 없다는 것입니다. 여기에는 교착 상태가 없으며 스레드 컨텍스트 교환으로 인한 성능 오버헤드도 없습니다. 에는 특히 다음과 같은 세 가지 측면이 있습니다. 오류로 인해 전체 애플리케이션이 종료되고 애플리케이션의 견고성이 CPU를 많이 차지하므로 테스트할 가치가 있습니다. 비동기 I/O를 계속 호출하는 것은 불가능합니다
스레드를 공유하는 브라우저의 JavaScript와 UI처럼 마찬가지로 JavaScript를 오랫동안 실행하면 UI의 렌더링 및 응답이 중단됩니다. Node에서는 장기간 CPU 사용으로 인해 후속 비동기 I/O 호출을 실행할 수 없으며 완료된 비동기 I/O의 콜백 함수가 제때 실행되지 않습니다.
HTML5는 웹 표준을 사용자 정의했습니다. 작업자 웹 작업자는 UI 렌더링을 차단하는 대규모 JavaScript 계산 문제를 해결하기 위해 계산을 수행하는 작업자 스레드를 생성할 수 있습니다. 메인 스레드를 차단하지 않기 위해 작업 스레드는 메시지 전달을 통해 실행 결과를 전달하며, 이는 또한 작업 스레드가 메인 스레드의 UI에 접근하는 것을 방지합니다. Node는 많은 양의 계산을 해결하기 위해 Web Workers와 동일한 아이디어를 채택합니다. 단일 스레드에서 문제: child_process. 하위 프로세스의 출현은 Node가 단일 스레드의 견고성과 멀티 코어 CPU를 활용하지 못하는 문제를 침착하게 처리할 수 있음을 의미합니다. 계산을 개별 하위 프로세스에 분산함으로써 많은 수의 계산을 분할할 수 있으며 그 결과는 프로세스 간 이벤트 메시지를 통해 전달될 수 있으므로 애플리케이션 모델을 단순하고 낮은 종속성으로 유지할 수 있습니다. Master-Worker의 관리 방식을 통해 각 작업 프로세스를 잘 관리하여 더욱 높은 견고성을 달성할 수 있습니다.
적용 시나리오
기술을 선택하기 전에 결국 신기술이 어떤 현장에 적합한지 이해해야 합니다. , 올바른 장면에 올바른 기술을 사용하면 예상치 못한 효과를 가져올 수 있습니다. Node 관련해서 가장 많이 논의되는 것은 I/O 집약적이고 CPU 집약적입니다
모든 스크립팅 언어를 한 곳에서 판단한다면 단일 스레드 관점에서 볼 때 그렇습니다. , I/O를 처리하는 노드의 능력은 칭찬받을 만합니다. 일반적으로 Node가 I/O 집약적인 애플리케이션 시나리오에 능숙하다고 말하는 데는 기본적으로 이의가 없습니다. 노드는 네트워크 지향적이고 병렬 I/O에 능숙하며 더 많은 하드웨어 자원을 효과적으로 구성하여 더 좋은 서비스를 제공할 수 있습니다
I/O 집약적 노드의 가장 큰 장점은 노드가 시작하는 대신 이벤트 루프의 처리 능력을 사용한다는 것입니다 각각 하나의 스레드가 각 요청을 처리하며 매우 적은 리소스를 차지합니다
2. CPU 집약적
다른 관점에서 Node가 CPU 집약적인 애플리케이션 시나리오에서 유능할 수 있습니까? 실제로 V8의 실행 효율성은 매우 높습니다. 실행 효율성만으로 판단하면 V8의 실행 효율성은 의심의 여지가 없습니다
CPU 집약적인 애플리케이션이 Node에 가져오는 주요 과제는 다음과 같습니다. JavaScript의 단일 스레드 특성으로 인해 장기 실행 계산(예: 대규모 계산)이 있는 경우 루프)로 인해 CPU 타임 슬라이스가 해제될 수 없게 되어 후속 I/O를 시작할 수 없게 됩니다. 그러나 대규모 컴퓨팅 작업을 여러 개의 작은 작업으로 적절하게 조정하고 분해하면 I/O 호출 시작을 차단하지 않고 적시에 컴퓨팅을 해제할 수 있습니다. 이러한 방식으로 병렬 비동기 I/O의 이점을 누릴 수 있습니다. CPU를 최대한 활용하세요
위 내용은 Node js에 대한 기본 지식에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!