# ย้ายไป Fastify เร็ว แรงส์

#Dev#Javascript#Nestjs#Backend#Fastify

หลังๆมานี้ใครที่เล่น NodeJS ก็อาจจะได้พบเห็นมาบ้างกับเจ้า Fastify เฟรมเวิร์คสุดแรงแซง Express กันไปเลย
ซึ่งเจ้า NestJS นั้นเดิมทีจะใช้ Express ในการทำงานเบื้องหลัง แต่เราก็สามารถเปลี่ยนไปใช้ Fastify ได้โดยง่ายและยังเขียนโค้ดเหมือนๆเดิมได้

Header

ไม่จำเป็นต้องเปลี่ยนไปใช้ Fastify ก็ได้ถ้าไม่จำเป็น
เพราะว่าเจ้า Express ก็ยังคงมี Docs, หรือ Library ที่ค่อนข้างให้ดูให้เลือกใช้งานมากกว่า

# สร้างโปรเจค

nest new nestjs-fastify

# ติดตั้ง Library

npm install @nestjs/fastify fastify

ตัว fastify เราจะไม่ติดตั้งก็ได้ แต่ผมติดตั้งไว้เวลากำหนด Type ของตัวแปร Response (ในกรณีที่เราจะทำ Response แบบกำหนดเอง)

# เปลี่ยนไปใช้ Fastify

src/main.ts



 
 
 
 


 

 





import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import {
  NestFastifyApplication,
  FastifyAdapter,
} from '@nestjs/platform-fastify';

async function bootstrap() {
  const app = await NestFactory.create<NestFastifyApplication>(
    AppModule,
    new FastifyAdapter(),
  );
  await app.listen(3000);
}
bootstrap();

สิ่งที่เราจะเพิ่มเข้าไปก็คือ NestFastifyApplication และ new FastifyAdapter()
เพียงแค่นี้ NestJS ก็จะเปลี่ยนไปใช้ Fastify แทนแล้วโดยที่เราไม่ต้องแก้อะไรเลยทุกอย่างก็จะรันได้เหมือนเดิม

ทีนี้มาลองดูไฟล์ src/app.controller.ts ถ้าเราเขียนโดยใช้ Express เป็นพื้น

import { Controller, Get, Res, Param, Query } from '@nestjs/common';
import { AppService } from './app.service';
import { Response } from 'express';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get(':id')
  getHello(
    @Res() res: Response,
    @Param('id') id: number,
    @Query() query,
  ) {
    res.send({ success: true, id: id, ...query });
  }
}

ถ้าเปลี่ยนเป็น Fastify ก็จะเป็นแบบนี้แทน



 
 







 







import { Controller, Get, Res, Param, Query } from '@nestjs/common';
import { AppService } from './app.service';
import { FastifyReply } from 'fastify';
import { ServerResponse } from 'http';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get(':id')
  getHello(
    @Res() res: FastifyReply<ServerResponse>,
    @Param('id') id: number,
    @Query() query,
  ) {
    res.send({ success: true, id: id, ...query });
  }
}

ในส่วน @Res() res นั้นเราอาจจะไม่ใส่ Type Response หรือ FastifyReply<ServerResponse> ก็ได้
แต่จะขาดความสามารถในการแสดง Code Completion ไปได้เพราะ IDE มันจะถูก Type ของ res เป็น any แทน

# Load Testing

# Express

Image

# Fastify

Image

# สรุป

  1. เร็วจริง แรงจริง (เทียบกับ Javascript Framework ด้วยกัน) เร็วกว่า Express พอสมควร
  2. มีข้อจำกัดเล็กน้อย บางทีหา Library อาจจะเจอแต่ตัวที่ใช้กับ Express
  3. มีบางฟีเจอร์ที่ไม่รองรับ เช่น Sub-Domain Routing ไม่สามารถแยก Sub-Domain ได้ (ปกติเราใช้ Apache2 หรือ Nginx ... ในการทำอยู่แล้วพวกนี้)

อัปเดตเมื่อ: 1 ปีที่แล้ว