>  기사  >  웹 프론트엔드  >  Node.js의 Koa 프레임워크에 대한 심층 분석

Node.js의 Koa 프레임워크에 대한 심층 분석

青灯夜游
青灯夜游앞으로
2021-06-16 10:08:392830검색

이 글에서는 Node.js의 Koa 프레임워크에 대해 자세히 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

Node.js의 Koa 프레임워크에 대한 심층 분석

이전 글에서는 Express 프레임워크에 대해 간략하게 이해하고 이 프레임워크를 사용하여 가위바위보 게임을 변형한 Koa 프레임워크와 Express 프레임워크의 차이점을 살펴보고 사용하겠습니다. 가위바위보 게임을 변화시키는 Koa 프레임워크를 만나보세요! [추천 학습: "nodejs Tutorial"]

Koa

Koa는 Express의 일부 디자인 결함을 해결하기 위해 탄생했습니다. 해당 미들웨어는 async 함수를 통해 작성할 수 있습니다. wait next()는 미들웨어 실행을 중단하고 이를 실행하기 전에 모든 후속 미들웨어가 실행될 때까지 기다릴 수 있습니다.

또 다른 기능은 요청과 응답의 단순화된 처리로, 둘 다 ctx에 탑재됩니다. 반환된 콘텐츠는 다음과 같이 직접 할당을 통해 사용할 수도 있습니다. ).

그리고 Koa는 마이크로커널의 미니멀한 아이디어인 미들웨어를 통해 구현되는 라우팅 기능을 차단했습니다.

핵심 기능(Koa 문서):

  • Express보다 더 극단적인 요청/응답 단순화, 예:
    • ctx.status = 200
    • ctx.body = 'hello node'
  • 구현된 미들웨어 사용 비동기 기능으로.
  • "실행을 일시 중지"하는 기능이 있습니다.
  • 또한 비동기 상황에서 양파 모델을 따릅니다.
  • 커널을 간소화하고 모든 추가 기능을 미들웨어로 옮깁니다.

Koa는 가위바위보 게임을 변형합니다

마찬가지로 game.js 게임 모듈과 index.html 페이지의 코드는 변경되지 않았습니다: koa 및 koa-mount(npm). i koa koa-mount)

koa-mount는 다른 애플리케이션을 미들웨어로 마운트할 수 있습니다. mount() 함수에 전달된 경로 매개변수는 스택이 해제될 때까지 URL에서 일시적으로 제거됩니다. 사용되는 경로에 관계없이 올바르게 작동하는 전체 앱이나 미들웨어를 만드는 데 유용합니다. 미들웨어를 특정 경로에 마운트하고 미들웨어는 이 경로와 독립적으로 작동합니다.

index.js 코드 변환:

// 加载模块
const fs = require('fs');
const koa = require('koa');
const mount = require('koa-mount');

const game = require('./game');
let playerWon = 0; // 赢的次数

const app = new koa();
// 精简内核,所有额外功能都移到中间件里实现。路由使用通过 mount 的中间件实现的
// 通过 mount() 把中间件挂载到一个特定的路径上,中间件独立于这个路径动作。 
// /favicon.ico 路径的路由
app.use(
  mount('/favicon.ico', function (ctx) {
    // 对 `request` 和 `response` 的处理简化了,这两者都挂载在 `ctx` 上使用,返回的内容也可以通过直接赋值来使用
    ctx.status = 200;
    return;
  })
)
// mount中不可以跟多个函数中间件,可以通过 new koa() 来挂载在 koa 上:
const gameKoa = new koa();
app.use(
  mount('/game', gameKoa)
)
// 分离模块
gameKoa.use(
  async function (ctx, next) {
    if (playerWon >= 3) {
      // response.status(500);
      // response.send('我不会再玩了!');
      // 使用 = 赋值,更加简化了
      ctx.status = 500;
      ctx.body = '我不会再玩了!';
      return;
    }
    // 通过next执行后续中间件
    await next();
    // 当后续中间件执行完之后,会执行到这个位置
    if (ctx.playerWon) {
      playerWon++;
    }
  }
)
// 在 koa 里可以使用 async function 和 await next() 来执行异步中间件
// 使在异步的情况下也符合洋葱模型。
gameKoa.use(
  async function (ctx, next) {
    const query = ctx.query;
    const playerAction = query.action;
    if (!playerAction) {
      ctx.status = 400;
      return;
    }
    ctx.playerAction = playerAction;
    await next();
  }
)
// 异步处理,500ms后才返回结果
gameKoa.use(
  async function (ctx, next) {
    const playerAction = ctx.playerAction;
    const result = game(playerAction);
    // 对于一定需要在请求主流程里完成的操作,一定要使用await进行等待
    // 否则koa就会在当前事件循环就把http response返回出去了
    await new Promise(resolve => {
      setTimeout(() => {
        ctx.status = 200;
        if (result == 0) {
          ctx.body = '平局'
        } else if (result == -1) {
          ctx.body = '你输了'
        } else {
          ctx.body = '你赢了'
          ctx.playerWon = true;
        }
        resolve();
      }, 500)
    })
  }
)
// 打开页面 index.html
app.use(
  mount('/', function (ctx) {
    ctx.body = fs.readFileSync(__dirname + '/index.html', 'utf-8')
    return;
  })
)
// 监听端口 3000
app.listen(3000);

Express VS Koa

  • Express는 임계값이 더 낮고 Koa는 더 강력하고 우아합니다.
  • Express는 더 많은 것을 패키지하고, 더 빠르게 개발하며, Koa는 더 많은 사용자 정의가 가능합니다.

그 중 '좋은' 것과 '나쁜' 것은 어느 것인가요?

  • 사실 프레임워크 사이에 좋고 나쁨의 구분은 없습니다.
  • 프레임워크마다 적용 가능한 시나리오가 다릅니다

더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 비디오를 방문하세요! !

위 내용은 Node.js의 Koa 프레임워크에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제