1. สูตรโกงเขียนโค้ด
  2. Node.js

🔗 ลิงก์ที่น่าสนใจ

ลิงก์เกี่ยวกับ
Node.jsเว็บไซต์หลักของ Node.js
nvmNode Version Manager
Denoเว็บไซต์หลักของ Deno
Bunเว็บไซต์หลักของ Bun
W3Schoolsสอนการใช้ Node.js แบบพื้นฐาน
Node.js Tutorialสอนการใช้ Node.js จากเว็บไซต์หลัก
Node.js APIAPI Documents
npmjs.comNode.js Registry หลักที่ใช้งาน
bestofjsเว็บไซต์ค้นหา Node.js Packages
npm trendsเว็บไซต์เปรียบเทียบความนิยมของ Node.js Packages
awesome-nodejsGitHub Awesome (Node.js)
GitHub Topic: Node.jsรวม Repository ที่เกี่ยวข้องกับ Node.js
r/nodeReddit สังคมรวมคนใช้ Node.js

Directory Structure

directory/
├── bin/
│   └── cli.js        # CLI executable
├── lib/
│   └── helper.js     # Additional library files
├── src/
│   └── index.js      # Entry point
├── .eslintrc.json    # ESLint configuration
├── .gitignore        # Git ignore rules
├── .nvmrc            # nvm configuration
├── package.json      # Package metadata
└── README.md         # Project documentation

package.json

{
  "name": "example-package",       // ชื่อ Package (lower-hyphen-case)
  "version": "1.0.0",              // กำหนด Version โดยใช้ SemVer
  "description": "A description",  // คำอธิบาย
  "main": "./src/index.js",        // Entry point ของ Package
  "type": "module",                // ใช้ระบบ ESM Import
  "bin": {                         // Executable ที่ลิงก์กับ CLI
    "example-cli": "./bin/cli.js"
  },
  "scripts": {                     // npm run *
    "start": "node index.js",      // `npm start`
    "build": "node build.js",      // `npm run build`
    "test": "jest",                // `npm test`
    "lint": "eslint .",            // `npm run lint`
  },
  "dependencies": {                // Production dependencies
    "express": "^4.18.2",
    "dotenv": "^16.1.4"
  },
  "devDependencies": {             // Development dependencies
    "jest": "^29.6.1",
    "eslint": "^8.51.0"
  },
  "peerDependencies": {            // Dependencies ที่ต้องการติดตั้งเอง
    "react": ">=17.0.0"
  },
  "optionalDependencies": {        // Dependencies ที่ไม่จำเป็นต้องติดตั้ง
    "fsevents": "^2.3.2"
  },
  "engines": {                     // กำหนด Node.js และ npm ที่ต้องการ
    "node": ">=14.0.0",
    "npm": ">=7.0.0"
  },
  "keywords": [                    // คำค้นหาสำหรับ Registry
    "example",
    "nodejs",
    "package"
  ],
  "author": {                      // ชื่อผู้พัฒนา
    "name": "Your Name",
    "email": "[email protected]",
    "url": "https://your-website.com"
  },
  "license": "MIT",                // ประเภทลิขสิทธิ์
  "repository": {                  // รายละเอียด Repository
    "type": "git",
    "url": "https://github.com/your-repo/example-package.git"
  },
  "bugs": {                        // รายละเอียดการติดตามแก้ไขบัค
    "url": "https://github.com/your-repo/example-package/issues"
  },
  "homepage": "https://example.com", // หน้าแรกของ Package
  "files": [                       // ไฟล์ที่จะเผยแพร่ไปยัง Registry
    "dist/",
    "lib/",
    "bin/"
  ],
  "private": false                 // true ก็ต่อเมื่อไม่ต้องการ Publish
}

Shebang

#!/usr/bin/env node

console.log('Hello CLI') // และโค้ดอื่นๆ

Node CLI

Commandเกี่ยวกับ
node -hดูชุดคําสั่งทั้งหมด
node -vตรวจสอบเวอร์ชั่น Node.js
nodeเริ่มต้น Node.js REPL
node <file.js>รันไฟล์ JavaScript
node inspect <file.js>รันไฟล์ JavaScript แบบ Debug
node -e "console.log(1 + 2)"รันคําสั่ง JavaScript

NPM CLI

Commandเกี่ยวกับ
npm -hดูชุดคําสั่งทั้งหมด
npm -vตรวจสอบเวอร์ชั่น NPM
npm initสร้างไฟล์ package.json
npm init -yสร้างไฟล์ package.json (แบบข้ามการตั้งค่า)
npm run <script>รันคำสั่งใน package.json
npm startรันคำสั่ง start ใน package.json
npm testรันคำสั่ง test ใน package.json
npm buildรันคำสั่ง build ใน package.json
npm iติดตั้ง Packages จาก package.json
npm i <name>ติดตั้ง Package ที่ต้องการ
npm i -g <name>ติดตั้ง Package แบบ Global
npm i -D <name>ติดตั้ง Package แบบ Development
npm ciติดตั้ง Package สำหรับ CI/CD
npm r <name>ถอนการติดตั้ง Package
npm r -g <name>ถอนการติดตั้ง Package แบบ Global
npm listดู Packages ที่ติดตั้ง
npm list -gดู Packages ที่ติดตั้งแบบ Global
npm auditตรวจสอบความปลอดภัยของ Packages
npm audit fixแก้ไขความปลอดภัยของ Packages
npm pruneลบ Packages ที่ไม่ได้ใช้งาน
npm outdatedตรวจสอบ Packages ที่ต้องอัพเดท
npm updateอัพเดท Packages ที่ต้องอัพเดท
npm loginเข้าสู่ระบบ npmjs.com
npm publishเผยแพร่ Package ของตัวเอง
npm config get <key>ดูการตั้งค่า
npm config set <key> <value>เปลี่ยนการตั้งค่า
npm cache clean --forceล้างแคชของ NPM

PM2

Commandเกี่ยวกับ
pm2 -hดูชุดคําสั่งทั้งหมด
pm2 start <file.js>รันไฟล์ JavaScript ด้วย PM2
pm2 start <file.js> --name <name>รันพร้อมชื่อ
pm2 start <file.js> -i maxรันพร้อมชื่อและ CPU ทั้งหมด
pm2 start <file.js> --watchรันพร้อม Watch Mode
pm2 start <file.js> --cron "0 0 * * *"รันพร้อม Cron Job
pm2 lsดู Process ทั้งหมด
pm2 monitดู Monitor ของ Process
pm2 logsดู Log ของ Process
pm2 stop <name>หยุด Process
pm2 stop allหยุด Process ทั้งหมด
pm2 restart <name>รีสตาร์ท Process
pm2 restart allรีสตาร์ท Process ทั้งหมด
pm2 del <name>ลบ Process
pm2 del allลบ Process ทั้งหมด
pm2 saveบันทึก Process สำหรับเปิดระบบใหม่
pm2 startupตั้งค่า PM2 Startup
pm2 unstartupยกเลิก PM2 Startup
pm2 updateอัพเดท PM2
pm2 ecosystemสร้างไฟล์ ecosystem.config.js

ES Modules (ESM)

// วิธีนี้จะต้องกำหนด `"type": "module"` ลงใน `package.json`

import fs from 'node:fs'
import axios from 'axios'
import { someDataExported } from './module.js'

export const variable = 'value'
export function func() {}
export default functionOrVariable

CommonJS (CJS)

const fs = require('node:fs')
const axios = require('axios')
const { someDataExported } = require('./module.js')

exports.variable = 'value'
exports.func = function() {}
exports.default = functionOrVariable

Process Object

Codeเกี่ยวกับ
process.env.*Environment Variables
process.argvArguments ที่รับจาก CLI
process.cwd()Current Working Directory
process.exit(code)Exit Process
process.on(event, callback)Event Listener
process.platformPlatform ปัจจุบันที่รัน
process.uptime()Uptime ของ Process
process.memoryUsage()Memory Usage ของ Process
process.cpuUsage()CPU Usage ของ Process
process.pidProcess ID
process.stdinStandard Input
process.stdoutStandard Output
process.stderrStandard Error

Global Objects

Codeคําอธิบาย
__dirnamePath ของ Directory ปัจจุบัน (CJS)
__filenamePath ของ File ปัจจุบัน (CJS)
import.meta.dirnamePath ของ Directory ปัจจุบัน (ESM)
import.meta.urlURL ของ File ปัจจุบัน (ESM)
setTimeout(callback, delay)Run หลังจาก Delay
setInterval(callback, delay)Run ทุก Delay
clearTimeout(id)Clear Timeout
clearInterval(id)Clear Interval
BufferBinary Data

Cluster

import express from 'express'
import cluster from 'node:cluster'
import os from 'node:os'

const numCPUs = os.cpus().length

if (cluster.isPrimary) {
  console.log(`Primary process started. PID: ${process.pid}`)
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork()
  }
  cluster.on('exit', (worker, code, signal) => {
    console.log(`Worker ${worker.process.pid} exited`)
  })
} else {
  // Code ที่ต้องการให้ Worker ทำงาน
}

File System

import fs from 'node:fs'          // มี Method มากกว่า เช่น .watch(), .createReadStream()
import fs from 'node:fs/promises' // Promise ทั้งหมด

await fs.readFile('./path/to/file.txt')                 // อ่านไฟล์
await fs.writeFile('./path/to/file.txt', 'content')     // เขียนไฟล์
await fs.appendFile('./path/to/file.txt', 'content')    // เพิ่มไฟล์ล่างสุด
await fs.unlink('./path/to/file.txt')                   // ลบไฟล์
await fs.rm('./path/to/file.txt')                       // ลบไฟล์
await fs.rm('./path/to', { recursive: true })           // ลบโฟลเดอร์และไฟล์อื่นๆทั้งหมด
await fs.rename('./path/to/file.txt', './path/to/newfile.txt')   // เปลี่ยนชื่อไฟล์
await fs.copyFile('./path/to/file.txt', './path/to/newfile.txt') // คัดลอกไฟล์
await fs.readdir('./path/to')                           // รายชื่อไฟล์ในโฟลเดอร์
await fs.mkdir('./path/to')                             // สร้างโฟลเดอร์
await fs.rmdir('./path/to')                             // ลบโฟลเดอร์
await fs.stat('./path/to/file.txt')                     // ข้อมูลของไฟล์
await fs.access('./path/to/file.txt')                   // ตรวจสอบสิทธิ์ของไฟล์
await fs.chmod('./path/to/file.txt', 0o755)             // เปลี่ยนสิทธิ์ของไฟล์
await fs.chown('./path/to/file.txt', 1000, 1000)        // เปลี่ยนเจ้าของของไฟล์
fs.watch('./path/to', (event, filename) => {})          // ตรวจสอบการเปลี่ยนแปลงของไฟล์และโฟลเดอร์
fs.watchFile('./path/to/file.txt', (curr, prev) => {})  // ตรวจสอบการเปลี่ยนแปลงของไฟล์
fs.createReadStream('./path/to/file.txt')               // อ่านไฟล์แบบ Stream
fs.createWriteStream('./path/to/file.txt')              // เขียนไฟล์แบบ Stream

Path

import path from 'node:path'

path.join(__dirname, './path/to/file.txt')     // รวม Path (Relative)
path.resolve(__dirname, './path/to/file.txt')  // รวม Path (Absolute)
path.extname('file.txt')                       // นามสกุลไฟล์
path.basename('file.txt')                      // ชื่อไฟล์
path.dirname('path/to/file.txt')               // ที่อยู่โฟลเดอร์
path.parse('path/to/file.txt')                 // แยก Path Object
path.format({                                  // รวม Path Object
  root: '/',
  dir: '/path/to',
  base: 'file.txt',
  ext: '.txt',
  name: 'file'
})
path.normalize('path/to/file.txt')             // ปรับ Path ตามระบบ
path.isAbsolute('/path/to/file.txt')           // ตรวจสอบ Absolute Path
path.relative('/path/to', '/path/to/file.txt') // แปลงเป็น Relative Path

HTTP Server

import http from 'node:http'

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' })
  res.end('Hello World\n')
})

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/')
})

server.on('error', (err) => {
  console.error(err)
})

server.on('close', () => {
  console.log('Server closed')
})

Event Emitter

import EventEmitter from 'node:events'

class MyEmitter extends EventEmitter {}   // สร้าง Class ที่สืบทอดจาก EventEmitter

const myEmitter = new MyEmitter()         // สร้าง Instance ของ EventEmitter

myEmitter.on('event', (data) => {         // เพิ่ม Event Listener
  console.log('an event occurred!')
})

myEmitter.emit('event', { some: 'data' }) // ส่ง Event ไปยัง Listener

OS

import os from 'node:os'

os.arch()     // สถาปัตยกรรมของ CPU
os.platform() // ระบบปฏิบัติการ
os.release()  // รุ่นของระบบปฏิบัติการ
os.type()     // ชนิดของระบบปฏิบัติการ
os.hostname() // ชื่อ Hostname
os.totalmem() // จำนวน Memory ทั้งหมด
os.freemem()  // จำนวน Memory ว่าง
os.cpus()     // ข้อมูลของ CPU
os.userInfo() // ข้อมูลของ User

Child Process

import child_process from 'node:child_process'

// รันคำสั่ง และส่งข้อมูลกลับมาเป็น Callback
child_process.exec('ls -lh', (err, stdout, stderr) => {
  if (err) {
    console.error(err)
    return
  }
  console.log(stdout)
})

// รันคำสั่ง และส่งข้อมูลกลับมาเป็น Stream
child_process.spawn('ls', ['-lh']).stdout.on('data', (data) => {
  console.log(data.toString())
})

// รันไฟล์ Shell Script
child_process.execFile('command.sh', (err, stdout, stderr) => {
  if (err) {
    console.error(err)
    return
  }
  console.log(stdout)
})

Utils

import util from 'node:util'

util.format('Hello %s', 'World') // จัดรูปแบบข้อความ
util.inspect({ a: 1 })           // แสดงข้อมูลของ Object
util.promisify(fs.readFile)      // แปลง Callback เป็น Promise
// Promisify สามารถใช้: https://www.npmjs.com/package/pify

Crypto

import crypto from 'node:crypto'

crypto.randomBytes(16).toString('hex') // สร้าง Random String
crypto.createHash('sha256').update('data').digest('hex') // สร้าง Hash

Dotenv

# .env
# https://www.npmjs.com/package/dotenv

NODE_ENV=development
PORT=3000

DB_HOST=localhost
DB_USER=root
DB_PASS=pass123

CLI Packages

Packageคำอธิบาย
chalkเพิ่มสีสันบน CLI
oraแสดง Progress
cli-table3แสดง Table
commanderCLI Builder ที่นิยมมากที่สุด
yargsCLI Builder ที่ได้รับคำชื่นชมดีกว่า
oclifCLI Builder ในรูปแบบ OOP
enquirerInteractive CLI
Best of JS - CLIรวมรายการอื่นๆ

File System Packages

Packageคำอธิบาย
fs-extraเพิ่มคุณสมบัติของ fs ที่หายไป
mkdirpสร้างโฟลเดอร์แบบ Recursive (โฟลเดอร์หลายลำดับ)
ncpคัดลอกไฟล์และโฟลเดอร์แบบ Recursive
rimrafลบไฟล์แบบ rm -rf ที่ง่ายกว่าเดิม
globค้นหาและเลือกไฟล์แบบ Glob
chokidarWatch File, Directory ที่ดีกว่าเดิม

Process Execution Packages

Packageคำอธิบาย
execaใช้แทน child_process ที่ดีกว่าเดิม
zxใช้แทน child_process ที่ดีกว่าเดิม

Single Executable Application Packages

Tool/Packageคำอธิบาย
pkgแปลงจาก Node.js เป็น Single Executable Application สำหรับระบบต่างๆ
Deno Compileเลือกใช้ Deno แทน Node.js
Bun Executablesเลือกใช้ Bun แทน Node.js

Linter Packages

Tool/Packageคำอธิบาย
eslintเครื่องมือช่วยตรวจสอบคุณภาพโค้ดของ JavaScript
eslint-config-standardชุดตั้งค่าของ Standard
eslint-plugin-promiseส่วนเสริมตรวจสอบการใช้ Promise
eslint-plugin-importส่วนเสริมตรวจสอบการใช้ Import
eslint-plugin-unicornส่วนเสริมช่วยตรวจสอบการใช้ JavaScript หลากหลาย
eslint-plugin-tailwindcssส่วนเสริมการใช้ร่วมกับ Tailwind CSS
eslint-plugin-reactส่วนเสริมการใช้ร่วมกับ React
eslint-plugin-jsx-a11yส่วนเสริมการใช้ร่วมกับ JSX
eslint-plugin-vueส่วนเสริมการใช้ร่วมกับ Vue
typescript-eslintส่วนเสริมการใช้ร่วมกับ TypeScript
PrettierCode Formatter สำหรับ HTML, CSS, JavaScript และที่เกี่ยวข้อง (จะไม่ตรวจ Error)

Utility Packages

Packageคำอธิบาย
lodashUtility Functions (แนะนำ)
underscoreUtility Functions
ramdaUtility Functions
remedaUtility Functions (สร้างเพื่อ TypeScript ที่ดีขึ้น)
radashiUtility Functions (สร้างเพื่อ TypeScript ที่ดีขึ้น)

Faker Packages

Packageคำอธิบาย
fakerสร้างข้อมูลปลอม
chanceสร้างข้อมูลปลอม

Date & Time Packages

Packageคำอธิบาย
dayjsDate & Time Utility (แนะนำ)
date-fnsDate & Time Utility
luxonDate & Time Utility
momentDate & Time Utility (ไม่แนะนำ)
humanize-durationแปลงรูปแบบวันเวลาเป็นภาษาอ่านช่วงเวลา

Text Packages

Packageคำอธิบาย
bytesแสดงข้อมูล Bytes ที่ดีขึ้น
pretty-bytesแสดงข้อมูล Bytes ที่ดีขึ้น
msแปลงจากข้อความวัน เป็นจำนวนสำหรับใช้ฟังก์ชั่นต่างๆ
pretty-msแปลงจากจำนวน เป็นวันเวลาที่อ่านได้
slugifyแปลงจากข้อความเป็น URL Slug
uuidการสร้าง UUIDs ที่หลากหลาย (มาตรฐาน RFC9562)
nanoidการสร้าง Unique ID แบบกำหนดเอง และมีขนาดเล็ก
yamlอ่านเอกสาร YAML เป็น JSON

Validation Packages

Packageคำอธิบาย
validatorรวมฟังก์ชั่นตรวจสอบรูปแบบข้อมูล
zodSchema Validator (ที่ดีที่สุดในตอนนี้)
joiSchema Validator
yubSchema Validator
ajvSchema Validator
superstructSchema Validator

Database Packages

Packageคำอธิบาย
better-sqlite3เชื่อมต่อกับฐานข้อมูล SQLite
pgเชื่อมต่อกับฐานข้อมูล PostgreSQL
mysql2เชื่อมต่อกับฐานข้อมูล MySQL
mongodbเชื่อมต่อกับฐานข้อมูล MongoDB
redisเชื่อมต่อกับแคช Redis
keyvบันทึกข้อมูลแบบ Key-Value
prismaORM (มีเครื่องมือเยอะ แนะนำให้ใช้)
drizzle-ormORM (น่าสนใจและกำลังเป็นที่นิยม)
typeormORM (ใช้ร่วมกับ TypeScript OOP)
mikro-ormORM (ใช้ร่วมกับ TypeScript OOP)
sequelizeORM (ของเก่า และไม่แนะนำ)
mongooseODM (สำหรับ MongoDB)

HTTP Client Packages

Packageคำอธิบาย
axiosHTTP Client ที่ดีกว่าเดิม (แนะนำ)
kyHTTP Client ที่กำลังเป็นที่นิยมสูงขึ้น
ofetchHTTP Client อีกตัวที่น่าสนใจ
node-fetchHTTP Client สำหรับการใช้ fetch() ที่มีคุณสมบัติเพิ่มบน Node.js
localtunnelเปิด localhost บนเครื่องเราให้สามารถเข้าถึงออนไลน์ได้แบบชั่วคราว

Backend Frameworks

Packageคำอธิบาย
expressFramework ที่นิยมมากที่สุด
fastifyFramework อีกตัวที่มีความนิยมระดับหนึ่ง (แนะนำ)
koaFramework อีกตัวที่มีความนิยมระดับหนึ่ง
honoFramework ใหม่ที่ผมแนะนำให้ใช้หากเป็นงาน Full-stack
@nestjs/cliFramework แบบ Opinionated (มีโครงสร้างชัดเจน)
@trpc/serverFramework สำหรับเชื่อมระหว่างหน้าบ้านที่ง่ายขึ้น
elysiaFramework ฝีมือคนไทย (แต่ออกแบบสำหรับ Bun เป็นหลัก)
wsสำหรับการสร้าง WebSocket Server
socket.ioสำหรับการสร้าง WebSocket Server อีกรูปแบบ

Frontend Frameworks

Packageคำอธิบาย
http-serverสำหรับการจำลอง HTTP Server อย่างง่าย
webpackBundler เก่าที่เคยนิยม แต่ไม่แนะนำ
viteBundler ที่ยอดนิยมอย่างมาก ใช้ได้กับทุก Framework
create-viteCLI ของ Vite สำหรับสร้างโปรเจกต์อย่างรวดเร็ว
slidevสไลด์ที่ผมใช้ทำในปัจจุบัน
astroFramework ที่แนะนำสำหรับการสร้างเว็บหลากหลายรูปแบบ
reactReact - Frontend Framework ยอดนิยม
vueVue.js - Frontend Framework ยอดนิยม
angularAngular - Frontend Framework ขนาดใหญ่
svelteSvelte - Frontend Framework ที่ออกแบบใหม่
solidjsSolid.js - Framework ที่ให้ประสิทธิภาพสูง

Scraper Packages

Packageคำอธิบาย
cheerioแปลงจาก HTML String เป็น DOM แบบ jQuery ที่ใช้งานบน Node.js ได้
puppeteerสร้างบอทใช้งาน Web Browser ใน Node.js (แนะนำ)
playwrightสร้างบอทใช้งาน Web Browser ใน Node.js (มาใหม่และน่าสนใจ)
cypressสร้างบอทใช้งาน Web Browser ใน Node.js (เหมาะสำหรับทดสอบเว็บ)

Logger Packages

Packageคำอธิบาย
winstonLogger แบบกำหนดเองได้ขั้นสูง
log4jsLogger เหมาะกับสร้างไฟล์ Log
pinoLogger อย่างง่ายบน Console
consolaLogger อย่างง่ายบน Console

Desktop Frameworks

Packageคำอธิบาย
electronสร้างโปรแกรม Desktop แบบ Cross-platform (ของเก่า แต่มีความนิยมสูง)
create-tauri-appสร้างโปรแกรม Desktop แบบ Cross-platform (ของใหม่ น่าสนใจ)

Image Packages

Packageคำอธิบาย
sharpImage Processing
qrcodeQRCode Generator

Video Packages

Packageคำอธิบาย
FFmpegติดตั้ง FFmpeg บนระบบต่างๆ
ffmpegแก้ไขและจัดการวิดีโอบน Node.js
fluent-ffmpegใช้งานได้ง่ายกว่าตัวข้างต้น

Spreadsheet Packages

Packageคำอธิบาย
fast-csvแปลงข้อมูลระหว่าง JSON กับ CSV
exceljsแก้ไขและจัดการกลุ่มไฟล์ Excel (แนะนำและใช้ได้ดีกว่า)
xlsxแก้ไขและจัดการกลุ่มไฟล์ Excel (ของเก่า แต่ยังมีความนิยมสูง)

PDF Packages

Packageคำอธิบาย
pdfkitสร้างไฟล์เอกสาร PDF
pdfmakeสร้างไฟล์เอกสาร PDF
jspdfสร้างไฟล์เอกสาร PDF

Zip Packages

Packageคำอธิบาย
adm-zipบีบอัดไฟล์ Zip
archiverบีบอัดไฟล์ Zip
jszipบีบอัด อ่าน และแก้ไข Zip
yauzlคลายไฟล์ Unzip
extract-zipคลายไฟล์ Unzip

Queue Systems

Packageคำอธิบาย
RedisRedis สำหรับทำระบบ Memory Cache ในการเก็บคิว
bullระบบ Queue
kueระบบ Queue

Job Schedulers

Packageคำอธิบาย
node-scheduleรันโปรแกรมทุกช่วงเวลาที่กำหนด
cronรันโปรแกรมทุกช่วงเวลาที่กำหนด
PM2 Restart Strategiesใช้ร่วมกับ PM2

Test Frameworks

Packageคำอธิบาย
jestสร้างชุดทดสอบโปรแกรม (แนะนำ)
vitestสร้างชุดทดสอบโปรแกรม (มาใหม่และน่าสนใจ)
mochaสร้างชุดทดสอบโปรแกรม (แบบใช้พื้นฐาน)
supertestสร้างชุดทดสอบโปรแกรม (สำหรับ Backend)
cypressสร้างชุดทดสอบโปรแกรม (สำหรับ Frontend)