>  기사  >  웹 프론트엔드  >  Nodejs 시작하기 연구 Notes_node.js

Nodejs 시작하기 연구 Notes_node.js

WBOY
WBOY원래의
2016-05-16 16:03:361037검색

NodeJS에 대한 첫 번째 기사를 공유합니다 - Javascript에 대한 상식과 Javascript 개발자에서 NodeJS 개발자로 전환하는 방법(구체적인 프레임워크는 소개되지 않습니다). 이 글을 읽기 전, 자바스크립트에 대한 사전 이해가 있기를 바랍니다.

자바스크립트는 프로토타입 모델을 기반으로 한 해석 언어입니다. 해석에 대해서는 나중에 NodeJS에서 다루겠습니다. 프로토타입 체인은 ES6 이전의 Javascript의 객체지향 구현 방법 중 하나입니다. ES6에서 지원하는 클래스에 새로운 구현 방법이 추가되었습니다. Javascript의 모든 것은 "클래스"를 포함한 객체입니다. Ruby/Python 메타프로그래밍에 노출된 사람들에게는 이것이 매우 친숙하다는 것을 알 수 있으며 Javascript는 동적으로 클래스를 생성하는 방법을 쉽게 구현할 수 있습니다.

1. 프로토타입 체인을 기반으로 구현된 간단한 "클래스"

var Person = function(name){
 this.name = name;
};

Person.staticSay = function(name){
 console.log('Hello ' + name);
};

Person.prototype.sayHi = function(){
 Person.staticSay(this.name);
}

몇 가지 일반적인 사양을 언급하세요. 예를 들어 Javascript의 모든 메소드 이름은 카멜 표기법으로 지정되고 작은 따옴표가 선호되며 두 개의 공백이 사용됩니다. 자세한 사양은 https://github.com을 참조하세요. /airbnb/자바스크립트.

코드의 staticSay는 정적 메서드입니다. 즉, Person.staticSay를 통해서만 호출할 수 있습니다. 위의 Person이 인스턴스를 생성하면(예: var vincent = new Person('vincent');) vincent는 자동으로 Person.prototype의 모든 메서드를 상속합니다(코드에서 이는 위의 vincent인 현재 컨텍스트를 나타냅니다). .

동시에 다음 코드와 같이 vincent 개체에 메서드를 동적으로 추가할 수도 있습니다.

var vincent = new Person('vincent')
vincent.tellName = function(){
 console.log('Hi, i\'m am' + this.name)
};

그러면 상속을 시뮬레이션해야 할 때 프로토타입 작업을 해야 합니다. 예를 들어, 이를 달성하기 위해 아래에서는 Worker.prototype = new Person()을 사용합니다. new Person()이 반환한 인스턴스 객체의 모든 메서드와 속성은 프로토타입에 할당되어 변장된 상속을 시뮬레이션합니다. 이 메소드는 궁극적으로 프로토타입의 내용을 레이어별로 검색합니다(각 인스턴스의 메소드가 프로토타입에 있고 Object까지 올라가기 때문입니다). 물론 순회를 통해 프로토타입에 값을 할당하여 상속을 시뮬레이션할 수도 있습니다.

2. 컨텍스트 전환

컨텍스트의 가장 직관적인 표현은 코드 블록에 있는 것으로, 이는 일반적으로 객체 지향 프로그래밍에서 현재 "클래스"에 의해 생성된 해당 인스턴스를 참조하기 위해 사용되며, 이는 다른 언어의 self와 일치합니다.

위의 예를 계속 사용하면 위에서 Person.prototype.sayHi 메소드가 구현되었습니다. 이제 새 객체가 생겼으며 코드는 다음과 같습니다.

var Cat = function(name){
 this.name = name;
}

var c = new Cat('tomcat');

어느 날 갑자기 고양이가 사람처럼 자신을 소개하고 싶다고 하면 어쩌죠? 하지만 console.log(Person.prototype.sayHi)를 통해 인간의 sayHi 메소드를 얻을 수 있습니다. 고양이도 어떻게 사용할 수 있나요?

Javascript에는 호출과 적용이라는 두 가지 방법이 있습니다. 두 가지 방법의 차이점은 매개변수가 다르며(Google에서 직접 검색) 해당 기능은 컨텍스트를 전환하는 것입니다. 간단히 말하면 Person.prototype.sayHi 함수에서 이를 다른 객체로 변경할 수 있습니다. 사용법: Person.prototype.sayHi.call(c).

이게 실용적인가요? 예를 들어 다음 시나리오는 다음과 같습니다.

var doSomething = function(){
 var persons = arguments;
};

위 함수에서는 키워드 인수를 통해 모든 매개변수를 얻어서 무한한 수의 매개변수를 지원합니다. 이제 우리는 원래 Array 유형에 속한 몇 가지 메서드를 사람에 사용하려고 합니다. 어떻게 해야 할까요? 여기에서 컨텍스트 전환을 사용할 수 있습니다:

var doSomething = function(){
 var persons = arguments;
 // 使用 Array 的 slice 方法,将 arguments 对象转变为 Array 实例
 var persons_arr = Array.prototype.slice.call(arguments);
};

3. 폐쇄

몇 가지 일반적인 코드부터 시작하겠습니다

for (var i = 0; i < 3; i ++){
 setTimeout(function(){
  console.log(i);
 }, i)
}

이 결과는 어떻게 될까요? 0 1 2를 순서대로 출력하나요? 실제 상황은 setTimeout이 처음으로 콜백을 실행할 때 for 루프가 종료되었다는 것입니다. 이는 i가 이때 이미 3이라는 것을 의미하므로 최종 출력 결과는 3 3 3이 됩니다.

주변 코드의 영향을 받지 않도록 변수를 보호해야 하는 경우 클로저(닫힌 범위가 있는 코드 블록)를 고려해야 할 수 있습니다.

for (var i = 0; i < 3; i ++){
 +function(i){
  setTimeout(function(){
   console.log(i);
  }, i)
 }(i)
}

이게 무슨 목적인가요? 다른 방법이 있다면 직접 Google에 문의해 보세요. 클로저 내 i의 범위는 닫힌 범위이므로 결국 클로저 내 i는 외부 실행에 의해 변경되지 않았으므로 0 1 2가 성공적으로 출력될 수 있습니다.

자바스크립트의 일부 기능, 키워드 프로토타입 체인, 호출 및 적용, 인수 키워드에 대한 간략한 소개는 권위 있는 가이드 등의 책을 읽어보거나 기본 유형과 각 유형의 특징을 빠르게 이해할 수 있습니다. 방법. 현재 코드의 문자열을 가져온 다음 원하는 내용을 얻기 위해 이를 처리하고, 사용자가 객체 속성에 값을 가져오거나 할당할 때 getter 및 setter를 사용하여 몇 가지 특별한 작업을 수행하는 등 몇 가지 더 마법적인 코드가 있습니다. 등.

4. NodeJS와 Javascript 개발의 차이점

이 섹션에서는 주로 필수 로딩에 대한 기본 지식을 소개합니다. 먼저 몇 가지 코드를 소개합니다.

// a.js
module.exports = {
 name: "a",
 doSomething: function(){
  return "something";
 }
}

// b.js
var a = require('./a')
global.a_name = a.name;

// c.js
require('./b');
console.log(a_name) // 执行后打印 a 

node c.js를 실행하면 어떻게 되나요?

require는 노드 키워드입니다. NodeJS는 비동기식으로 유명하지만 require는 차단입니다. 그렇지 않으면 다른 모듈이 로드되기 전에 이미 다음 코드가 실행되기 시작한 상황이 발생합니다.

resolve() 메소드는 참조하는 파일의 실제 경로를 찾는 데 사용됩니다. 알아낸 후 Nodejs는 require.cache를 조사하여 캐시가 있는지 확인합니다. 파일을 만들고 구문 분석하므로 일반적으로 이 경우 js 파일에서 실행된 코드는 처음 필요할 때만 실행됩니다. (tip. require.cache는 필요하다면 수동으로 삭제한 후 어느 정도 여러 번 실행할 수 있습니다)

b.js가 실행되기 시작하면 먼저 a.js를 로드해야 합니다. module.exports는 이 파일이 외부에 노출되는 내용을 Nodejs에 알려줍니다. 예를 들어 a.js는 이름 속성과 doSomething 메소드. 그러면 b.js의 a 변수는 실제로 이 객체입니다.

a.js를 얻기 위해 실행한 후 계속해서 b.js로 돌아갑니다. global.a_name은 전역 변수를 선언하는 것과 같습니다. 이는 프런트 엔드의 window.a_name = a.name과 비슷한 효과를 갖습니다.

최종 프로세스가 완료되고, c.js가 출력값을 실행합니다.

5. 비동기의 기본 원칙

NodeJS는 사람들에게 쉽게 사용 환상을 줄 수 있습니다. 즉, 오랫동안 작성한 후에도 기본 비동기가 어떻게 구현되는지 모를 수 있습니다. (다음의 이해는 주로 python3.4의 asyncio에 대한 이해에서 나온 것입니다. 오류가 있으면 지적해주세요.)

NodeJS의 기본 libev는 Window에서는 IOCP를 사용하고 *nix에서는 AIO 기반 libeio를 사용하여 비동기 구현을 달성합니다. 시스템 수준 기술을 통해 최종적으로 하나의 목표가 달성됩니다. 즉, 애플리케이션이 비동기식 요청을 시작합니다. 마지막으로 시스템 실행이 완료된 후 시스템은 애플리케이션에 처리가 완료되었음을 알립니다. 이 프로세스 동안 애플리케이션은 실행을 기다리기 위해 이전 처리를 스레드 풀로 일시 중지/푸시할 수 있으며, 애플리케이션은 이 기간 동안 다른 작업을 수행할 수 있습니다.

전체 작업은 시스템 수준 이벤트 루프를 통해 작동됩니다. 예를 들어 Python은 비동기 실행 전에 프로그램이 종료되지 않도록 run_until 및 run_forever와 유사한 메서드를 제공합니다. 전체 비동기 작업을 항상 실행되는 작업장으로 생각하십시오. 작업장의 기계는 패키지를 확인하고 스탬프를 찍는 일을 담당하며, 해당 라벨을 부착한 후 작업장에 반환합니다. 작업자는 이전에 패키지에 부착한 라벨과 작업장에서 부착한 라벨을 기반으로 다음 처리 단계를 수행합니다. 작업자는 다음 패키지로 이동하기 전에 패키지가 검사될 때까지 기다릴 필요 없이 간단한 처리를 받은 후 검사를 위해 작업장에 넣기만 하면 됩니다. 그런 다음 워크샵에서 특정 시간에 패키지를 반환할 때까지 기다린 후 다음 단계로 진행합니다.

현재는 주로 일부 언어 수준의 지식만 소개하고 있지만, 이것만으로는 나중에 소개할 완전한 웹을 개발하기에는 아직 멀었습니다. Redis, Nginx, 테스트 드라이버 등이 포함됩니다.

위 내용은 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.