2-Node.js 내장 모듈

Node.js 내장 모듈

소개

앞서 언급했듯이 Node.js에서 가장 중요한 두 문장은 다음과 같습니다.

  • Node.js는 Chrome V8 엔진을 기반으로 하는 JavaScript 런타임 환경입니다.
  • Node.js는 이벤트 중심의 비차단 I/O 모델을 사용하여 가볍고 효율적입니다.

위의 두 문장은 아래 그림을 통해 자세히 이해할 수 있습니다.

이미지.png

쉽게 말하면 이 사진은

가장 왼쪽의 것은 Chrome V8 엔진 기반의 자바스크립트 실행 환경에서 실행되는 애플리케이션의 자바스크립트 코드를 의미합니다.

이 환경에서 가장 오른쪽에 있는 Non-Blocking I/O 모델에 연결하는 방법은 중간에 Node.js에 내장된 컴퓨터 시스템 운영 API(OS Operation)를 통해 Non-Blocking I/O 모델을 연결하는 것입니다. 이 모델과 관련된 작업 방법은 이벤트 중심입니다.

보충 : 위의 전체 프로세스의 코드 또는 데이터 흐름, 즉 당사의 JS 코드 데이터에서 Chrpme V8 코드 모듈에 의해 C++ 코드 데이터로 변환되고, C++에서는 변환된 명령을 접합하여 컴퓨터 시스템을 작동시키고, 작업 후 데이터 또는 결과. 그런 다음 결과를 Chrome V8 코드 모듈에 전달하여 필요한 JS 코드 데이터 형식으로 변환하고 JS 코드를 통해 컴퓨터 시스템을 작동하는 동작도 달성합니다.

Node.js 바인딩

Node.js에 내장된 API 모듈인 Node.js 바인딩 부분을 소개하겠습니다. 이 모듈은 우리 JS와 컴퓨터의 하단 레이어를 연결하는 핵심 브릿지라고 할 수 있습니다.

Node.js에 내장된 API는 공식 Node.js 문서를 참고하시면 되며, 자신의 Node.js 버전 정보에 주의하시고 해당 버전의 API 기능을 확인하셔야 한다는 점 참고하시기 바랍니다.

예를 들어 Node.js v14.21.2 버전에 해당하는 공식 문서 주소는 https://nodejs.org/docs/latest-v14.x/api/ 입니다.

이벤트 API 아래의 이벤트 통신 클래스 EventEmitter를 예로 들어 보겠습니다.

간단한 EventEmitter
하위 클래스를 캡슐화하고 하위 클래스에서 관찰자 모드(이벤트 발생 모드)를 사용하여 난수 메시지를 내보내도록 컴퓨터 시스템을 제어한 다음
EventEmitter 하위 클래스에서 생성된 인스턴스를 통해 리스너의 addListener 메서드를 호출합니다. 인스턴스 아래에서 컴퓨터가 보낸 난수 정보를 수락합니다.

lib.js 파일은 EventEmitter 하위 클래스 모듈 파일을 캡슐화하고, 파일에서 인스턴스화하고, 인스턴스를 내보냅니다.

// 引入事件通信类
const EventEmitter = require('events').EventEmitter
// 创建事件通信的子类
class RandomNums extends EventEmitter {
    
    
  constructor() {
    
    
    super()
    setInterval(() => {
    
    
      // 通过事件通信的 emit Api 来发射事件 newlesson
      this.emit('randomNums', {
    
     randomNums: Math.random() * 100 })
    }, 3000)
  }
}
// 实例化创建的子类
const randomNums = new RandomNums
// 导出模块
module.exports = randomNums

index.js는 이벤트 통신 인스턴스를 도입하고, 리스너를 추가하고, 생성된 이벤트 정보를 얻습니다.

// 引入模块
const randomNums = require('./lib')

// 为事件通信实例创建监听器,这样才可以获取 emit 发射的事件
// 补充:
// >>> 这种事件通信操作底层来抛出事件的能力,也就是观察者模式(抛事件模式)
// >>> 解决两个对象之间通信的问题的方法:观察者模式(抛事件模式) 和 调用相关函数 
// >>> 观察者模式(抛事件模式) 使用情况在于 只需要抛出事件,不管谁去监听
// >>> 调用相关函数 使用情况在于 不清楚有没有通知者的存在,只管去监听就可以
randomNums.addListener('randomNums', (result) => {
    
    
  // do someting ...
  console.log('>>> result ', result)
})

다른 Node.js 내장 API의 경우 문서에 따라 해당 데모를 작성할 수도 있으며, 이를 통해 내장 API의 실용성과 중요성을 더 쉽게 이해할 수 있습니다.

그래도 기본 코드를 자세히 이해해야 한다면 Node.js 소스 코드를 보고 node.js API 메서드부터 중간 Chrome V8 엔진 변환 모듈, C++ 작업 모듈까지 순서를 따르면 됩니다.

Node.js의 소스 코드를 찾으려면 Node.js 공식 웹사이트에서 해당 버전의 문서를 직접 열고 문서 왼쪽의 마지막 디렉터리까지 아래로 스크롤한 후 코드 저장소 및 이슈 추적기 옵션을 선택하세요. 해당 소스 코드 저장소로 이동합니다.

여기서는 Node.js v14.21.2를 예로 들어 우리가 봐야 할 디렉터리 위치에 해당하는 소스 코드 웨어하우스를 간략하게 소개합니다.
가장 바깥쪽 디렉터리에는 많은 파일이 포함되어 있습니다.

이미지.png

node.js 내장 API 함수 파일 경로는 ./lib/ 이고, 이전 버전 경로는 ./lib/internal/ 이었으므로 잘 검색해 주셔야 합니다.
이 경로에서 일반적으로 사용되는 Node.js 내장 함수 os, 경로, http 등을 찾을 수 있습니다.
이미지.png

여기서는 os.js 모듈의 핵심 코드를 간략하게 살펴보겠습니다.

이 모듈의 코드에서 InternalBinding('os') 메소드는 Chrome V8 모듈에 캡슐화된 메소드를 호출하는 데 사용됩니다. 그런 다음 이러한 메소드는 os.js 파일에 캡슐화됩니다. V8 모듈은 기본 개체를 콜백합니다. 이러한 방법으로 필요한 컴퓨터 정보가 전달됩니다.

이미지.png

InternalBinding('os')에 의해 도입된 Chrome V8 모듈에 캡슐화된 메소드는 C++로 작성되었으며 디렉토리는 ./src/ 아래에 있습니다. 예를 들어 os 모듈을 도입하면 해당 파일은 ./src/node_os입니다. 참조.

이미지.png
이 파일에서 우리는 기본 C++ 데이터를 JS 데이터로 변환하는 것이 Chrome V8 엔진에 내장된 C++ 방법을 통해 달성되었음을 알 수 있습니다.
Chrome V8 메소드는 node_os.cc 파일에 정의되어 있습니다.

이미지.png

이러한 메소드는 Chrome V8의 맥락에서 C++ 데이터를 JS 데이터로 변환하는 작업을 처리합니다.

이미지.png

예를 들어, GetCpuInfo는 CPU 데이터를 획득하고 해당 데이터를 JS 환경에서 사용할 수 있는 데이터로 변환하는 C++ 메서드입니다.
아래 그림의 원 안의 첫 번째 코드 줄은 CPU 정보를 얻기 위한 C++의 하위 수준 메서드이거나, 데이터를 얻은 후 두 번째 코드 줄은 Chrome V8의 내장 메서드를 호출하여 C++ 데이터를 JS 데이터로 변환합니다. .

이미지.png

위 내용은 os 모듈을 예로 들어 소스코드와 소스코드를 읽는 방법을 간략하게 소개하고 있으며, 다른 모듈에서도 이 읽기 방법을 참고할 수 있습니다.

Node.js 내장 API를 살펴볼 때 이것이 모든 사람에게 도움이 되기를 바랍니다.

Supongo que te gusta

Origin blog.csdn.net/qq_44886882/article/details/128728818
Recomendado
Clasificación