source

Node.js란?

lovecheck 2022. 10. 19. 21:12
반응형

Node.js란?

Node.js의 의미를 완전히 이해하지 못했습니다.아마 저는 주로 웹 기반의 비즈니스 애플리케이션 개발자입니다.그것은 무엇이고, 그것의 용도는 무엇입니까?

지금까지의 제 이해는 다음과 같습니다.

  1. 프로그래밍 모델은 이벤트 중심이며, 특히 I/O 처리 방식이 그렇습니다.
  2. JavaScript를 사용하며 파서는 V8입니다.
  3. 동시 서버 애플리케이션을 작성하기 위해 쉽게 사용할 수 있습니다.

제가 이해한 것이 맞습니까?그렇다면 이벤트 I/O의 이점은 무엇입니까? 단지 동시성 문제에만 해당합니까?또한 Node.js의 방향은 JavaScript 기반(V8 기반) 프로그래밍 모델과 같은 프레임워크가 되는 것입니까?

직장에서 Node.js를 사용하고 있는데 매우 강력합니다.Node.js를 설명하는 단어를 하나만 선택해야 한다면 "흥미롭다"고 말할 수 있습니다(이것은 순수하게 긍정적인 형용사는 아닙니다).그 공동체는 활기차고 성장하고 있다.JavaScript는 그 기묘한 점에도 불구하고 코드화하기에 좋은 언어입니다.또, 「베스트 프랙티스」에 대한 자신의 이해와 잘 짜여진 코드의 패턴을 매일 재검토할 수 있습니다.현재 Node.js에는 엄청난 아이디어의 에너지가 흐르고 있으며, 그 속에서 작업하면 이러한 모든 생각, 즉 정신적인 역도를 경험할 수 있습니다.

실제 가동 중인 Node.js는 확실히 가능하지만 매뉴얼에서 약속한 턴키 도입과는 거리가 멀다.Node.js v0.6.x에서는 "클러스터"가 플랫폼에 통합되어 필수적인 구성 요소 중 하나를 제공하지만, "production.js" 스크립트는 로그 디렉토리의 작성, 데드워커의 재활용 등의 작업을 처리하기 위해 여전히 150줄에 이르는 논리입니다."심각한" 프로덕션 서비스를 위해서는 수신 연결을 조절하고 Apache가 PHP에 대해 수행하는 모든 작업을 수행할 준비가 필요합니다.Ruby on Rails에는 정확히문제가 있습니다.이 문제는 두 가지 보완 메커니즘을 통해 해결됩니다. 1) Nginx(또는 Apache/Lighttd)와 같은 전용 웹 서버(C로 작성되어 지옥 및 백 테스트 완료)의 배후에 Ruby on Rails/Node.js가 있습니다.웹 서버는 효율적으로 스태틱콘텐츠 서비스, 접근로깅, URL 변경, SSL 종료, 접근규칙 적용 및 여러 서브서비스를 관리할 수 있습니다.실제 노드 서비스에 히트하는 요청의 경우 웹 서버는 요청을 프록시합니다.2) Unicon과 같이 작업자 프로세스를 관리하고 정기적으로 재활용하는 프레임워크 사용완전히 구워진 듯한 Node.js의 프레임워크는 아직 찾을 수 없습니다.존재할 수도 있지만 아직 찾을 수 없습니다.그리고 손으로 감은 「production.js」에 150행까지 사용하고 있습니다.

Express와 같은 프레임워크를 읽으면 모든 것을 하나의 Jack-of-All-Trades Node.js 서비스를 통해 제공하는 것이 표준인 것 같습니다.app.use(sublic.static(_public name + '/public')).부하가 낮은 서비스나 개발의 경우는, 그 정도면 충분합니다.그러나 서비스에 큰 부하를 걸고 24시간 365일 실행하려고 하면, Nginx와 같이 잘 구워지고 강화된 C-코드를 Nginx와 같이 사이트에 배치하여 모든 정적 콘텐츠 요청을 처리하는(Amazon CloudFront와 같은 CDN을 셋업할 때까지) 동기가 바로 발견될 것이다.이것에 대해 다소 유머러스하고 부끄럽지 않게 부정적인 견해를 가지려면 이 남자를 만나보세요.

또한 Node.js는 점점 더 많은 비서비스 용도를 찾고 있습니다.웹 콘텐츠를 제공하기 위해 다른 것을 사용하는 경우에도 Node.js를 빌드 도구로 사용할 수 있습니다.npm 모듈을 사용하여 코드를 정리하고 Browserify를 사용하여 코드를 단일 자산에 연결하고 uglify-js를 사용하여 전개할 수 있습니다.웹을 다룰 때 JavaScript는 완벽한 임피던스 일치이며 대부분의 경우 가장 쉬운 공격 경로가 됩니다.예를 들어 다수의 JSON 응답 payload를 더듬는 경우 구조화 데이터의 유틸리티 벨트인 언더스코어-CLI 모듈을 사용해야 합니다.

장점 / 단점:

  • 장점: 서버 담당자에게는 백엔드에 JavaScript를 쓰는 것이 현대 UI 패턴을 학습하는 데 있어 "게이트웨이 약"이었습니다.나는 더 이상 클라이언트 코드를 쓰는 것을 두려워하지 않는다.
  • 장점: 적절한 에러 체크를 권장하는 경향이 있습니다(거의 모든 콜백에 의해 에러가 반환되어 프로그래머에게 처리를 재촉합니다.또, 비동기.js나 그 외의 라이브러리는, 일반적인 동기 코드보다 훨씬 뛰어난 「이러한 서브 태스크 중 하나가 실패했을 경우」패러다임을 처리합니다).
  • 장점: 일부 흥미롭고 보통 어려운 태스크는 이동 중인 태스크의 상태 확인, 워커 간의 통신, 캐시 상태 공유 등 사소한 것이 됩니다.
  • 장점: 견고한 패키지 매니저를 기반으로 한 대규모 커뮤니티와 수많은 훌륭한 라이브러리(npm)
  • 단점: JavaScript에는 표준 라이브러리가 없습니다.기능 Import에 익숙해져 있기 때문에 JSON.parse 또는 npm 모듈을 추가할 필요가 없는 다른 빌트인 메서드를 사용하면 이상합니다.이것은 모든 것에 5가지 버전이 있다는 것을 의미합니다.Node.js "core"에 포함된 모듈도 기본 구현에 만족하지 못할 경우 5가지 변종이 더 있습니다.이것은 급속한 진화로 이어지지만, 어느 정도의 혼란으로 이어지기도 합니다.

단순한 요청당 프로세스 모델(LAMP)에 비해:

  • 장점: 수천 개의 활성 연결까지 확장 가능.매우 빠르고 효율적입니다.웹 플릿의 경우 PHP 또는 Ruby에 비해 필요한 박스 수를 10배 줄일 수 있습니다.
  • 장점: 병렬 패턴 작성은 간단합니다.Memcached에서 3개(또는 N개)의 Blob을 가져와야 한다고 가정합니다.이걸 PHP로... 코드만 썼어?첫 번째 blob, 두 번째, 세 번째 blob?와, 느리다.Memcached의 특정 문제를 수정하는 특별한 PECL 모듈이 있지만 데이터베이스 쿼리와 병행하여 Memcached 데이터를 가져오려면 어떻게 해야 할까요?Node.js에서는 패러다임이 비동기적이기 때문에 웹 요청이 여러 작업을 병렬로 수행하는 것은 매우 자연스러운 일입니다.
  • 단점: 비동기 코드는 동기 코드보다 근본적으로 더 복잡하며, 동시 실행이 실제로 무엇을 의미하는지 확실히 이해하지 못하면 개발자에게 선행 학습 곡선은 어려울 수 있습니다.그래도 잠금 기능이 있는 멀티 스레드 코드를 작성하는 것보다 훨씬 덜 어렵습니다.
  • 단점: 계산 부하가 높은 요구가 예를 들어 100밀리초 동안 실행되면 동일한 Node.js 프로세스에서 처리 중인 다른 요구의 처리가 지연됩니다.AKA, 공동 멀티태스킹.이것은 Web Workers 패턴(고가의 태스크를 처리하기 위한 서브프로세스의 스핀오프)으로 경감할 수 있습니다.또는 다수의 Node.js 워커를 사용하여 각 워커가1개의 요구를 동시에 처리하도록 할 수도 있습니다(프로세스 재활용이 없기 때문에 매우 효율적입니다).
  • 단점: 프로덕션 시스템의 실행은 Apache + PHP, Perl, Ruby 등의 CGI 모델보다 훨씬 복잡합니다.처리되지 않은 예외는 프로세스 전체를 정지시키고 실패한 워커를 재시작하기 위한 논리가 필요합니다(클러스터 참조).버그가 있는 네이티브코드가 있는 모듈은 프로세스를 하드 크래시 할 수 있습니다.워커가 사망할 때마다 워커가 처리하던 모든 요청이 폐기되므로 하나의 버그 API는 다른 공동 호스팅된 API의 서비스를 쉽게 저하시킬 수 있습니다.

Java/C#/C로 "진짜" 서비스를 작성하는 것과 비교(C? 정말요?)

  • 장점: Node.js에서 비동기화를 수행하는 것은 다른 곳보다 쉽고, 거의 틀림없이 더 큰 이점을 제공합니다.Node.js는 지금까지 작업한 비동기 패러다임 중 가장 부담이 적습니다.라이브러리가 좋으면 동기 코드를 쓰는 것보다 조금 더 어렵습니다.
  • 장점: 멀티스레딩/잠금 버그는 없습니다.실제로 차단 작업 없이 적절한 비동기 워크플로우를 표현하는 보다 상세한 코드를 작성하는 데 먼저 투자합니다.그리고 몇 가지 테스트를 작성하여 작업을 수행해야 합니다(이것은 스크립트 언어이며, 굵은 핑거링 변수 이름은 단위 테스트 시간에만 잡힙니다).하지만 일단 작동하게 되면, 하이젠버그의 표면적은 100만 번에 한 번씩 나타나는 이상한 문제들입니다. 그 표면적은 훨씬 더 낮습니다.Node.js 코드를 기술하는 세금은 코딩 단계에 상당히 전방 부하가 걸립니다.그러면 안정적인 암호를 얻게 되는 경향이 있습니다.
  • 장점: JavaScript는 기능을 표현하기 위해 훨씬 더 가볍습니다.말로 증명하기는 어렵지만, JSON, 동적 타이핑, 람다 표기법, 원형 유전, 경량 모듈 등...같은 생각을 표현하는 데 더 적은 코드를 사용하는 경향이 있습니다.
  • 단점: 자바 코딩 서비스를 정말 좋아하십니까?

JavaScript 및 Node.js에 대한 다른 관점은 Java 개발자의 인상과 Node.js 학습 경험에 대한 블로그 게시물인 From Java to Node.js참조하십시오.


모듈 노드를 고려할 때 선택한 JavaScript 라이브러리가 사용자 경험을 정의합니다.대부분의 사용자는 비동기 패턴 도우미(Step, Futures, Async)와 JavaScript 설탕 모듈(Underscore.js) 중 적어도2개를 사용합니다.

도우미/JavaScript Sugar:

  • Underscore.js - 이 명령을 사용합니다.그냥 해._.isString() 및 _.isArray()와 같은 기능으로 코드를 읽기 쉽게 만듭니다.그렇지 않으면 어떻게 안전코드를 쓸 수 있을지 모르겠네요.또한 확장 명령줄 fu에 대해서는 자체 Underscore-CLI를 확인하십시오.

비동기 패턴 모듈:

  • 스텝 - 시리얼 액션과 병행 액션의 조합을 매우 우아하게 표현합니다.제 개인적인 추천서입니다.스텝 코드가 어떻게 되어 있는지 제 투고를 참조해 주세요.
  • 미래 - 요건을 통해 주문을 표현하는 훨씬 유연한 방법(그것이 정말 좋은 일일까요?)start a, b, c와 같은 것을 병렬로 표현할 수 있습니다.A와 B가 끝나면 AB를 시작합니다.A와 C가 종료하면 AC를 기동합니다." 이러한 유연성은 워크플로우에서 버그를 피하기 위해 더욱 주의를 기울여야 합니다(콜백을 호출하지 않거나 여러 번 호출하지 않는 등).Raynos의 선물 사용에 대한 게시물(이 게시물은 내가 미래를 얻도록 만든 게시물)을 참조하십시오.
  • 비동기 - 각 패턴에 대해 하나의 메서드를 사용하는 기존 라이브러리입니다.저는 이것을 종교에서 스텝으로 전환하기 전에 시작했는데, 그 후에 비동기 패턴의 모든 패턴을 스텝에서 보다 읽기 쉬운 하나의 패러다임으로 나타낼 수 있다는 것을 깨달았습니다.
  • TimeJS - OKCupid가 작성한 프리 컴파일러입니다.시리얼 워크플로우와 병행 워크플로우를 우아하게 기술하기 위한 새로운 언어의 "대기"를 추가합니다.패턴은 훌륭해 보이지만 사전 컴파일이 필요합니다.이 건에 대해서는 아직 결정하지 못했습니다.
  • 합리화JS - TimeJS와 경쟁합니다.난 타임 쪽으로 기울고 있지만, 네가 알아서 결정해.

또는 비동기 라이브러리에 대한 모든 내용을 읽으려면 이 패널-저작자와의 인터뷰를 참조하십시오.

웹 프레임워크:

  • 사이트를 구성하기 위한 Rails-esk 프레임워크의 Express Great Ruby.XML/HTML 템플릿 엔진으로서 JADE를 사용하고 있기 때문에, HTML 의 구축에 드는 번거로움이 훨씬 적고, 우아하기까지 합니다.
  • jQuery 기술적으로 노드 모듈은 아니지만 jQuery는 클라이언트 측 사용자 인터페이스의 사실상의 표준으로 빠르게 자리 잡고 있습니다.jQuery는 CSS와 같은 셀렉터를 사용하여 DOM 요소 세트(핸들러, 속성, 스타일 설정 등)를 '쿼리'할 수 있도록 합니다.마찬가지로 Twitter의 Bootstrap CSS 프레임워크, MVC 패턴의 Backbone.js모든 JavaScript 파일을 하나의 파일로 연결하기 위한 Browserify.js도 있습니다.이 모듈들은 모두 사실상의 표준이 되어가고 있기 때문에 들어본 적이 없다면 최소한 확인해야 합니다.

테스트:

  • JSHint - 꼭 사용해야 합니다.처음에는 이것을 사용하지 않았는데 지금은 이해할 수 없는 것 같습니다.JSLint는 Java와 같은 컴파일된 언어로 얻을 수 있는 많은 기본 검증을 추가합니다.일치하지 않는 괄호, 선언되지 않은 변수, 다양한 모양과 크기의 타이포스가 있습니다.또, 「anal 모드」라고 불리는 다양한 형태의 「anal 모드」를 온으로 할 수도 있습니다.이 모드를 사용하고 싶은 경우는, 「」라고 하는 스타일을 검증할 수 있습니다.하지만, 진정한 가치는, 「」라고 하는 닫힘을 잊은 정확한 회선 번호에 대해서, 코드를 실행해, 위반 회선을 칠 필요가 없는, 즉석에서 피드백을 얻는 것입니다."JSHint"는 더글라스 크록포드JSLint보다 구성 가능한 변형입니다.
  • 모카 경쟁자가 서약서보다 더 좋아지고 있어두 프레임워크 모두 기본을 잘 다루지만, 복잡한 패턴은 모카에서 표현하기 더 쉬운 경향이 있습니다.
  • 서약서는 정말 우아하다.또한 어떤 테스트 사례가 합격/불합격되었는지 보여주는 멋진 보고서(--spec)가 출력됩니다.30분 동안 학습하면 최소한의 노력으로 모듈의 기본 테스트를 작성할 수 있습니다.
  • 좀비 - JSDom을 가상 브라우저로 사용한HTML 및 JavaScript 헤드리스 테스트아주 강력한 것.이를 Replay와 결합하여 브라우저 내 코드의 결정론적 테스트를 신속하게 수행할 수 있습니다.
  • 테스트를 '생각'하는 방법에 대한 코멘트:
    • 테스트는 선택사항이 아닙니다.JavaScript와 같은 동적 언어에서는 정적 체크가 거의 없습니다.예를 들어, 4를 예상하는 메서드에 2개의 파라미터를 전달하면 코드가 실행될 때까지 중단되지 않습니다.JavaScript에서 버그를 생성하기 위한 매우 낮은 바입니다.컴파일 언어와의 검증 격차를 메우기 위해서는 기본 테스트가 필수적입니다.
    • 검증은 생략하고 코드를 실행합니다.모든 방법에서 첫 번째 검증 사례는 "nothing breaks"이며, 이것이 가장 자주 발생하는 경우입니다.코드를 버리지 않고 실행한다는 것을 증명하면 80%의 버그가 발견되어 코드 신뢰도를 높일 수 있습니다.그러면 과거로 돌아가서 건너뛴 미묘한 검증 사례를 추가할 수 있습니다.
    • 작은 것부터 시작해서 관성 장벽을 깨라.우리는 모두 게으르고 시간에 쫓기고 있으며, 시험을 "추가 작업"으로 보기 쉽습니다.작은 것부터 시작하세요.Write test case 0 - 모듈을 장착하고 성공을 보고합니다.이 정도만 무리하면 시험 관성 장벽이 깨진다.매뉴얼을 읽는 것까지 포함하여 한 번에 30분 미만입니다.이제 테스트 사례 1을 작성합니다.사용하는 메서드 중 하나를 호출하여 "nothing breaks(절단 없음)", 즉 오류가 다시 나타나지 않는지 확인합니다.테스트 케이스 1은 1분 이내에 완료됩니다.관성이 없어지면 테스트 범위를 점차 확대하는 것이 쉬워집니다.
    • 이제 코드와 함께 테스트를 발전시키십시오.모의 서버에서의 "올바른" 엔드 투 엔드 테스트나 그 모든 것에 주눅들지 마십시오.코드는 단순하게 시작하여 새로운 사례를 처리하기 위해 진화합니다. 테스트도 마찬가지입니다.코드에 새로운 케이스와 복잡함을 추가할 때 테스트 케이스를 추가하여 새로운 코드를 연습합니다.버그가 발견되면 검증 및/또는 새로운 케이스를 추가하여 결함이 있는 코드를 해결합니다.디버깅 중에 코드에 대한 신뢰가 떨어지면 다시 돌아가서 테스트를 추가하여 생각하는 대로 동작하고 있음을 증명합니다.샘플 데이터의 문자열(호출하는 다른 서비스, 스크랩하는 웹 사이트 등)을 캡처하여 구문 분석 코드에 넣습니다.여기서 몇 가지 사례를 보면 검증이 개선되고 신뢰성이 높은 코드가 생성됩니다.

또한 권장되는 Node.js 모듈의 공식 목록도 확인하십시오.그러나 GitHub의 Node Modules Wiki는 훨씬 더 완전하고 좋은 리소스입니다.


노드를 이해하려면 몇 가지 주요 설계 선택 사항을 고려하는 것이 좋습니다.

Node.js는 EVENT BASED AYSNOCKRUS/NON-BLOCKING 입니다.HTTP 접속과 같은 이벤트는 데이터베이스 연결이나 다른 서버로부터의 콘텐츠 풀링과 같은 약간의 작업을 수행하는 JavaScript 함수를 실행합니다.이러한 작업이 시작되면 이벤트 기능이 종료되고 Node.js가 sleep 상태로 돌아갑니다.데이터베이스 접속이 확립되거나 외부 서버가 콘텐츠로 응답하는 등 다른 일이 발생하면 콜백 함수가 실행되며 더 많은 JavaScript 코드가 실행되어 더 많은 비동기 작업(데이터베이스 쿼리 등)이 시작될 수 있습니다.이와 같이 Node.js는 여러 병렬 워크플로우의 액티비티를 인터리브하여 임의의 시점에서 차단되지 않은 액티비티를 실행합니다.따라서 Node.js는 수천 개의 동시 접속을 매우 효율적으로 관리할 수 있습니다.

다른 사람들과 마찬가지로 접속당 프로세스/스레드를 1개만 사용하면 어떨까요?Node.js에서 새로운 연결은 매우 작은 힙 할당에 불과합니다.새로운 프로세스를 고속화하는 데 필요한 메모리가 대폭 증가하여 플랫폼에 따라서는 1메가바이트가 될 수도 있습니다.그러나 실제 비용은 컨텍스트 스위칭과 관련된 오버헤드입니다.10^6 커널 스레드가 있는 경우 커널은 다음에 누가 실행할지 결정하는 많은 작업을 수행해야 합니다.Linux용 O(1) 스케줄러를 구축하기 위해 많은 작업이 이루어졌지만, 결국 CPU 시간을 두고 경쟁하는 10^6 프로세스보다 단일 이벤트 기반 프로세스를 사용하는 것이 훨씬 효율적입니다.또한 과부하 상태에서는 다중 프로세스 모델이 매우 제대로 작동하지 않아 중요한 관리 및 관리 서비스, 특히 SSHD(상자에 로그인하여 실제로 얼마나 엉망인지 알 수 없음)가 부족합니다.

Node.js는 단일 스레드이며 LOCK이 없습니다.Node.js는 매우 신중한 설계 선택으로 프로세스당 하나의 스레드만 있습니다.따라서 여러 스레드가 동시에 데이터에 액세스하는 것은 기본적으로 불가능합니다.따라서 잠금이 필요하지 않습니다.실이 단단하다.진짜 너무 힘들어.그렇게 생각하지 않는다면 충분히 스레드화된 프로그래밍을 하지 않은 것입니다.올바르게 잠그는 것은 어렵고 버그를 추적하는 것은 매우 어렵습니다.잠금과 멀티스레딩을 없애면 가장 악질적인 버그 중 하나가 사라집니다.이것이 노드의 가장 큰 장점일 수 있습니다.

하지만 16개의 코어 박스를 활용하려면 어떻게 해야 할까요?

두 가지 방법:

  1. 이미지 인코딩과 같은 대규모 처리 작업의 경우 Node.js는 하위 프로세스를 실행하거나 추가 작업자 프로세스에 메시지를 보낼 수 있습니다.이 설계에서는 하나의 스레드가 이벤트의 흐름을 관리하고 N개의 프로세스가 부하가 높은 컴퓨팅 태스크를 수행하고 나머지 15개의 CPU를 소비합니다.
  2. 웹 서비스의 throughput을 확장하려면 클러스터(Node.js v0.6.x에서는 여기에 링크된 공식 "클러스터" 모듈이 서로 다른 API를 가진 학습 부스트 버전을 대체합니다.)를 사용하여 코어당 하나씩, 하나의 상자에서 여러 Node.js 서버를 실행해야 합니다.이러한 로컬 Node.js 서버는 소켓 상에서 경합하여 새로운 접속을 받아들여 부하를 분산할 수 있습니다.접속이 받아들여지면, 이러한 공유 프로세스 중 하나에 단단히 바인드 됩니다.이론적으로는 좋지 않지만 실제로는 매우 잘 작동하며 스레드 세이프 코드를 작성하는 번거로움을 피할 수 있습니다.또한 Node.js는 뛰어난 CPU 캐시 어피니티를 얻을 수 있어 메모리 대역폭을 보다 효과적으로 사용할 수 있습니다.

Node.js를 사용하면 번거로움 없이 매우 강력한 작업을 수행할 수 있습니다.다양한 작업을 수행하고 TCP 포트에서 명령을 수신하며 일부 이미지를 인코딩하는 Node.js 프로그램이 있다고 가정합니다.5줄의 코드를 사용하면 활성 태스크의 현재 상태를 보여주는 HTTP 기반 웹 관리 포털을 추가할 수 있습니다.이것은 간단합니다.

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(myJavascriptObject.getSomeStatusInfo());
}).listen(1337, "127.0.0.1");

이제 URL을 눌러 실행 중인 프로세스의 상태를 확인할 수 있습니다.버튼을 몇 개 추가하면 "관리 포털"이 나타납니다.Perl / Python / Ruby 스크립트를 실행하고 있는 경우, 「관리 포털에의 투척」은 간단하지 않습니다.

하지만 JavaScript는 느리지/나쁘지/악하지/악마의 씨앗이 아닐까?JavaScript에는 몇 가지 이상한 점이 있지만, "좋은 부분"과 함께 매우 강력한 언어가 있습니다.어쨌든 JavaScript는 클라이언트(브라우저)의 언어입니다.JavaScript는 다른 언어들이 이를 IL로서 목표로 하고 있으며, 세계적인 인재들이 최첨단 JavaScript 엔진을 만들기 위해 경쟁하고 있다.브라우저에서의 JavaScript의 역할 때문에 JavaScript를 빠르게 만들기 위해 엄청난 엔지니어링 노력이 투입되고 있습니다.V8은 적어도 이번 달만큼은 최신의 최고의 Javascript 엔진입니다.효율과 안정성의 양면에서 다른 스크립트 언어를 날려버립니다(Ruby씨).Microsoft, Google 및 Mozilla에서 이 문제를 해결하기 위해 노력하고 있는 대규모 팀이 최고의 JavaScript 엔진을 구축하기 위해 경쟁하고 있다면 개선될 것입니다(현대 엔진은 모두 코드 1회 실행을 위한 대체 수단으로서만 수많은 JIT 컴파일을 하기 때문에 더 이상 JavaScript "인터프리터"가 아닙니다).그래, 우리 모두 자바스크립트 언어 중 몇 가지를 수정할 수 있기를 바라지만, 그렇게 나쁘지는 않아.언어는 매우 유연하기 때문에 실제로 JavaScript를 코딩하는 것이 아니라 Step 또는 jQuery를 코딩하는 것입니다. JavaScript에서는 라이브러리가 경험을 정의합니다.웹 어플리케이션을 구축하려면 JavaScript를 알아야 하기 때문에 서버에서 이를 사용하여 코딩하는 것은 일종의 스킬셋 시너지 효과를 가져옵니다.클라이언트 코드 작성을 두려워하지 않게 되었습니다.

게다가 자바스크립트를 정말 싫어한다면 커피스크립트와 같은 통사설탕을 사용할 수 있다.또는 Google Web Toolkit(GWT)와 같이 JavaScript 코드를 생성하는 다른 모든 항목도 사용할 수 있습니다.

JavaScript 얘기가 나와서 말인데, "폐쇄"란 무엇인가? - 콜 체인에 걸쳐 사전 범위 변수를 유지하는 것은 꽤 복잡한 표현이다.;) 다음과 같이 합니다.

var myData = "foo";
database.connect( 'user:pass', function myCallback( result ) {
    database.query("SELECT * from Foo where id = " + myData);
} );
// Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback
doSomethingElse();

"myData"를 객체에 저장하는 것과 같은 어색한 작업을 하지 않고 사용할 수 있는 방법을 알고 계십니까?Java와 달리 "myData" 변수는 읽기 전용일 필요가 없습니다.이 강력한 언어 기능은 비동기 프로그래밍을 훨씬 덜 장황하고 덜 고통스럽게 만듭니다.

비동기 코드 작성은 단순한 싱글 스레드 스크립트를 작성하는 것보다 항상 복잡하지만 Node.js를 사용하면 그다지 어렵지 않고 수천 개의 동시 접속에 대한 효율성과 확장성 외에도 많은 이점을 얻을 수 있습니다.

장점은 다음과 같습니다.

  1. VM 상에서 동적 언어(JavaScript)를 사용한 웹 개발은 놀라울 정도로 빠릅니다(V8).Ruby, Python, Perl보다 훨씬 빠릅니다.

  2. 단일 프로세스로 최소 오버헤드로 수천 개의 동시 연결을 처리할 수 있습니다.

  3. JavaScript는 퍼스트 클래스 함수 객체와 닫힘 이벤트 루프에 적합합니다.사용자가 시작한 이벤트에 응답하기 위해 브라우저에서 사용했기 때문에 사람들은 이미 이 방법을 알고 있습니다.

  4. 많은 사람들이 이미 JavaScript를 알고 있습니다. 심지어 프로그래머라고 주장하지 않는 사람들도요.그것은 거의 틀림없이 가장 인기 있는 프로그래밍 언어이다.

  5. 브라우저뿐만 아니라 웹 서버에서 JavaScript를 사용하면 방정식의 양쪽에서 동일하게 동작하는 JSON을 통해 데이터 구조를 통신할 수 있는 두 프로그래밍 환경 간의 임피던스 불일치를 줄일 수 있습니다.서버와 클라이언트 간에 중복된 양식 확인 코드를 공유할 수 있습니다.

V8은 JavaScript를 구현한 것입니다.독립 실행형 JavaScript 응용 프로그램을 실행할 수 있습니다.

Node.js is simply a library written for V8 which does evented I/O. This concept is a bit trickier to explain, and I'm sure someone will answer with a better explanation than I... The gist is that rather than doing some input or output and waiting for it to happen, you just don't wait for it to finish. So for example, ask for the last edited time of a file:

// Pseudo code
stat( 'somefile' )

That might take a couple of milliseconds, or it might take seconds. With evented I/O you simply fire off the request and instead of waiting around you attach a callback that gets run when the request finishes:

// Pseudo code
stat( 'somefile', function( result ) {
  // Use the result here
} );
// ...more code here

This makes it a lot like JavaScript code in the browser (for example, with Ajax style functionality).

For more information, you should check out the article Node.js is genuinely exciting which was my introduction to the library/platform... I found it quite good.

Node.js is an open source command line tool built for the server side JavaScript code. You can download a tarball, compile and install the source. It lets you run JavaScript programs.

The JavaScript is executed by the V8, a JavaScript engine developed by Google which is used in Chrome browser. It uses a JavaScript API to access the network and file system.

It is popular for its performance and the ability to perform parallel operations.

Understanding node.js is the best explanation of node.js I have found so far.

Following are some good articles on the topic.

The closures are a way to execute code in the context it was created in.

What this means for concurency is that you can define variables, then initiate a nonblocking I/O function, and send it an anonymous function for its callback.

When the task is complete, the callback function will execute in the context with the variables, this is the closure.

The reason closures are so good for writing applications with nonblocking I/O is that it's very easy to manage the context of functions executing asynchronously.

Two good examples are regarding how you manage templates and use progressive enhancements with it. You just need a few lightweight pieces of JavaScript code to make it work perfectly.

I strongly recommend that you watch and read these articles:

Pick up any language and try to remember how you would manage your HTML file templates and what you had to do to update a single CSS class name in your DOM structure (for instance, a user clicked on a menu item and you want that marked as "selected" and update the content of the page).

With Node.js it is as simple as doing it in client-side JavaScript code. Get your DOM node and apply your CSS class to that. Get your DOM node and innerHTML your content (you will need some additional JavaScript code to do this. Read the article to know more).

Another good example, is that you can make your web page compatible both with JavaScript turned on or off with the same piece of code. Imagine you have a date selection made in JavaScript that would allow your users to pick up any date using a calendar. You can write (or use) the same piece of JavaScript code to make it work with your JavaScript turned ON or OFF.

There is a very good fast food place analogy that best explains the event driven model of Node.js, see the full article, Node.js, Doctor’s Offices and Fast Food Restaurants – Understanding Event-driven Programming

Here is a summary:

If the fast food joint followed a traditional thread-based model, you'd order your food and wait in line until you received it. The person behind you wouldn't be able to order until your order was done. In an event-driven model, you order your food and then get out of line to wait. Everyone else is then free to order.

Node.js is event-driven, but most web servers are thread-based.York explains how Node.js works:

  • You use your web browser to make a request for "/about.html" on a Node.js web server.

  • The Node.js server accepts your request and calls a function to retrieve that file from disk.

  • While the Node.js server is waiting for the file to be retrieved, it services the next web request.

  • When the file is retrieved, there is a callback function that is inserted in the Node.js servers queue.

  • The Node.js server executes that function which in this case would render the "/about.html" page and send it back to your web browser."

Well, I understand that

  • Node's goal is to provide an easy way to build scalable network programs.
  • Node is similar in design to and influenced by systems like Ruby's Event Machine or Python's Twisted.
  • Evented I/O for V8 javascript.

For me that means that you were correct in all three assumptions. The library sure looks promising!

Also, do not forget to mention that Google's V8 is VERY fast. It actually converts the JavaScript code to machine code with the matched performance of compiled binary. So along with all the other great things, it's INSANELY fast.

Q: The programming model is event driven, especially the way it handles I/O.

Correct. It uses call-backs, so any request to access the file system would cause a request to be sent to the file system and then Node.js would start processing its next request. It would only worry about the I/O request once it gets a response back from the file system, at which time it will run the callback code. However, it is possible to make synchronous I/O requests (that is, blocking requests). It is up to the developer to choose between asynchronous (callbacks) or synchronous (waiting).

Q: It uses JavaScript and the parser is V8.

Yes

Q: It can be easily used to create concurrent server applications.

Yes, although you'd need to hand-code quite a lot of JavaScript. It might be better to look at a framework, such as http://www.easynodejs.com/ - which comes with full online documentation and a sample application.

ReferenceURL : https://stackoverflow.com/questions/1884724/what-is-node-js

반응형