ตลอดหลายปีที่ผ่านมา Node.js เป็น JavaScript Runtime เพียงหนึ่งเดียวที่ครองโลก Server-side JavaScript แต่ในปี 2026 นี้ สถานการณ์เปลี่ยนไปอย่างมาก เพราะมี Runtime ใหม่สองตัวที่กำลังท้าชิงบัลลังก์ นั่นคือ Deno และ Bun ทั้งสองตัวนี้เกิดมาเพื่อแก้ปัญหาที่ Node.js มีมาตั้งแต่ต้น และนำเสนอแนวทางใหม่ที่ทันสมัยกว่า เร็วกว่า และปลอดภัยกว่า
บทความนี้จะพาคุณทำความรู้จักกับ Deno และ Bun อย่างละเอียด ตั้งแต่ที่มาที่ไป ฟีเจอร์เด่น ไปจนถึงการเปรียบเทียบ Performance แบบตัวต่อตัวกับ Node.js เพื่อช่วยให้คุณตัดสินใจได้ว่าควรเลือกใช้ Runtime ตัวไหนสำหรับโปรเจกต์ถัดไปของคุณ
ทำไม Node.js ถึงต้องมีคู่แข่ง?
Node.js ถูกสร้างขึ้นในปี 2009 โดย Ryan Dahl เป็นการนำ V8 Engine ของ Chrome มาใช้รัน JavaScript นอก Browser ซึ่งปฏิวัติวงการ Web Development อย่างมาก แต่หลังจากใช้งานมากว่า 17 ปี Node.js ก็มีปัญหาสะสมหลายอย่างที่ยากจะแก้ไขโดยไม่ทำลาย Backward Compatibility
ปัญหาของ Node.js ที่ถูกวิพากษ์
1. Security ที่หละหลวม: Node.js ให้สิทธิ์เข้าถึง File System, Network และ Environment Variables ทั้งหมดโดย Default ไม่มี Permission System ทำให้ Package ที่เป็นอันตรายสามารถทำอะไรก็ได้บนเครื่องของคุณ เหตุการณ์ Supply Chain Attack เช่น event-stream incident ในปี 2018 เป็นตัวอย่างที่ชัดเจน
2. node_modules ที่บวมเกินจำเป็น: ระบบ Package Management ของ Node.js สร้าง node_modules folder ที่มีขนาดใหญ่มากจนกลายเป็น meme ของวงการ โปรเจกต์ธรรมดาอาจมี node_modules หลายร้อย MB เพราะ Dependency ซ้อน Dependency ไม่รู้จบ
3. CommonJS vs ESM ที่สับสน: Node.js เริ่มต้นด้วย CommonJS Module System (require/module.exports) แต่โลกเปลี่ยนไปใช้ ES Modules (import/export) การรองรับทั้งสองระบบทำให้เกิดความซับซ้อนและปัญหา Compatibility มากมาย
4. ต้องพึ่ง Tools ภายนอกมากเกินไป: ถ้าคุณจะเริ่มโปรเจกต์ Node.js จริงจัง คุณต้องติดตั้ง TypeScript Compiler, Bundler (Webpack/Vite/esbuild), Test Runner (Jest/Vitest), Linter (ESLint) แยกต่างหาก ไม่มีอะไรมาพร้อมในตัว
5. Callback Hell และ API ที่ไม่สม่ำเสมอ: แม้จะมี Promise และ async/await แล้ว แต่ Core API หลายตัวยังใช้ Callback Pattern เก่า และมี API Design ที่ไม่สม่ำเสมอตลอดทั้ง Standard Library
Deno คืออะไร? — การแก้ตัวของ Ryan Dahl
Deno (อ่านว่า ดี-โน) คือ JavaScript/TypeScript Runtime ที่สร้างโดย Ryan Dahl คนเดียวกับที่สร้าง Node.js เขาประกาศเปิดตัว Deno ในงาน JSConf EU 2018 ด้วยการพูดหัวข้อ "10 Things I Regret About Node.js" ซึ่งกลายเป็น Talk ที่ดังมากในวงการ
Deno ถูกออกแบบมาเพื่อแก้ปัญหาทั้งหมดที่ Ryan Dahl เสียใจที่ทำไว้ใน Node.js โดยเริ่มต้นใหม่ตั้งแต่ศูนย์ ใช้ V8 Engine เหมือนเดิม แต่เขียนด้วย Rust แทน C++ และมีปรัชญาการออกแบบที่แตกต่างอย่างสิ้นเชิง
Secure by Default
ฟีเจอร์เด่นที่สุดของ Deno คือ Permission System ที่เข้มงวด โปรแกรมที่รันบน Deno จะไม่สามารถเข้าถึง File System, Network, Environment Variables หรือ Subprocess ได้เลย เว้นแต่จะได้รับอนุญาตอย่างชัดเจน
# ไม่ให้สิทธิ์อะไรเลย — อ่านไฟล์ไม่ได้ เชื่อมต่อ Network ไม่ได้
deno run app.ts
# ให้สิทธิ์อ่านไฟล์เฉพาะ folder data/
deno run --allow-read=./data app.ts
# ให้สิทธิ์เชื่อมต่อ Network เฉพาะ domain
deno run --allow-net=api.example.com app.ts
# ให้สิทธิ์ทั้งหมด (ไม่แนะนำสำหรับ Production)
deno run -A app.ts
# ให้หลายสิทธิ์
deno run --allow-read --allow-net --allow-env app.ts
TypeScript Native
Deno รองรับ TypeScript ตั้งแต่แกะกล่อง ไม่ต้องติดตั้ง TypeScript Compiler แยก ไม่ต้อง tsconfig.json ไม่ต้อง Build Step ใดๆ แค่เขียนไฟล์ .ts แล้วรันได้เลย
// hello.ts — รันได้ทันทีด้วย deno run hello.ts
interface User {
name: string;
age: number;
email: string;
}
function greetUser(user: User): string {
return `สวัสดี ${user.name} คุณอายุ ${user.age} ปี`;
}
const user: User = {
name: "สมชาย",
age: 30,
email: "somchai@example.com"
};
console.log(greetUser(user));
URL Imports และ Import Maps
Deno ใช้ URL-based Module System แทน Package Manager ซึ่งเป็นวิธีที่ Web Browser ใช้จริงๆ ตาม Web Standard
// Import จาก URL โดยตรง
import { serve } from "https://deno.land/std@0.220.0/http/server.ts";
import { z } from "https://deno.land/x/zod@v3.22.4/mod.ts";
// หรือใช้ Import Map ใน deno.json
// deno.json
{
"imports": {
"std/": "https://deno.land/std@0.220.0/",
"oak": "https://deno.land/x/oak@v12.6.1/mod.ts",
"zod": "https://deno.land/x/zod@v3.22.4/mod.ts"
}
}
// แล้วใช้แบบสั้นๆ
import { Application } from "oak";
import { z } from "zod";
Deno 2.0 — ก้าวกระโดดครั้งใหญ่
Deno 2.0 ที่ออกมาในปลายปี 2024 เปลี่ยนเกมอย่างมาก โดยเพิ่มความสามารถในการใช้งานร่วมกับ Node.js Ecosystem ได้อย่างเต็มที่
npm Compatibility: Deno 2.0 สามารถ Import npm Package ได้โดยตรง โดยใช้ npm: prefix ไม่ต้อง node_modules ไม่ต้อง npm install
// ใช้ npm packages ใน Deno 2.0+
import express from "npm:express@4";
import { PrismaClient } from "npm:@prisma/client";
import chalk from "npm:chalk@5";
const app = express();
app.get("/", (req, res) => {
res.json({ message: "Hello from Deno + Express!" });
});
app.listen(3000);
Node Built-in Compatibility: รองรับ node:* prefix สำหรับ Built-in Modules ของ Node.js
// ใช้ Node.js built-in modules ใน Deno
import fs from "node:fs";
import path from "node:path";
import { createServer } from "node:http";
import { EventEmitter } from "node:events";
const data = fs.readFileSync("config.json", "utf-8");
console.log(path.resolve("./src"));
package.json Support: Deno 2.0 สามารถอ่าน package.json ของโปรเจกต์ Node.js ที่มีอยู่แล้วได้ ทำให้การ Migrate จาก Node.js มา Deno ง่ายขึ้นมาก
Deno Built-in Tools
Deno มาพร้อมเครื่องมือครบชุดในตัว ไม่ต้องติดตั้ง Dependencies เพิ่มเติม
# Formatter (เหมือน Prettier)
deno fmt
# Linter (เหมือน ESLint)
deno lint
# Test Runner (เหมือน Jest/Vitest)
deno test
# Type Checker
deno check app.ts
# Bundler
deno bundle app.ts output.js
# Documentation Generator
deno doc app.ts
# Dependency Inspector
deno info app.ts
# Task Runner (เหมือน npm scripts)
deno task dev
# Compile เป็น Binary (Self-contained executable)
deno compile --output myapp app.ts
Deno Deploy — Serverless Platform
Deno มี Cloud Platform ของตัวเองชื่อ Deno Deploy ที่ให้คุณ Deploy Edge Functions ได้ง่ายมาก รันบน V8 Isolates ทั่วโลก 35+ regions ค่า Cold Start ต่ำมากเพียง 1-2ms เหมาะสำหรับ API, Middleware และ Server-Side Rendering
// ตัวอย่าง Deno Deploy — Fresh Framework
// routes/api/users.ts
import { Handlers } from "$fresh/server.ts";
export const handler: Handlers = {
async GET(_req, _ctx) {
const users = await fetchUsersFromDB();
return new Response(JSON.stringify(users), {
headers: { "Content-Type": "application/json" },
});
},
};
Bun คืออะไร? — Runtime ที่เร็วที่สุด
Bun (อ่านว่า บัน) คือ JavaScript Runtime ที่สร้างโดย Jarred Sumner เปิดตัวเวอร์ชัน 1.0 ในเดือนกันยายน 2023 Bun มีเป้าหมายชัดเจนคือเป็น JavaScript Runtime ที่เร็วที่สุดในโลก และเป็น All-in-One Toolkit ที่ทดแทนได้ทั้ง Node.js, npm, Webpack, Babel และ Jest ในตัวเดียว
สิ่งที่ทำให้ Bun พิเศษคือมันไม่ได้ใช้ V8 Engine เหมือน Node.js และ Deno แต่ใช้ JavaScriptCore (JSC) Engine จาก Apple WebKit ซึ่งเป็น Engine เดียวกับที่ Safari ใช้ และเขียนด้วยภาษา Zig ซึ่งเป็นภาษา Low-level ที่ให้ Performance สูงมาก
ทำไม Bun ถึงเร็ว?
1. JavaScriptCore Engine: JSC มี Startup Time ที่เร็วกว่า V8 อย่างเห็นได้ชัด เพราะ JSC ใช้ Tier-based JIT Compilation ที่เริ่มทำงานได้เร็วกว่า แม้ว่า V8 จะมี Peak Performance สูงกว่าในบางกรณี แต่สำหรับ Server-side Workload ที่ต้อง Start/Stop บ่อย JSC ได้เปรียบชัดเจน
2. เขียนด้วย Zig: Zig เป็นภาษา System Programming ที่ให้ Performance ใกล้เคียง C/C++ แต่เขียนง่ายกว่าและปลอดภัยกว่า Bun ใช้ Zig เพื่อทำ Low-level Optimization ที่ Runtime อื่นทำไม่ได้
3. Optimized I/O: Bun ใช้ io_uring บน Linux ซึ่งเป็น Asynchronous I/O API ที่เร็วที่สุดในปัจจุบัน แทนที่จะใช้ libuv เหมือน Node.js ทำให้ File I/O และ Network I/O เร็วกว่าหลายเท่า
Bun เป็น All-in-One Toolkit
จุดขายสำคัญของ Bun คือมันรวมทุกอย่างที่คุณต้องการไว้ในตัวเดียว
Package Manager (แทน npm/yarn/pnpm):
# ติดตั้ง Dependencies — เร็วกว่า npm ถึง 25 เท่า
bun install
# เพิ่ม Package
bun add express
bun add -d typescript @types/node
# ลบ Package
bun remove express
# รัน Script
bun run dev
bun run build
Bundler (แทน Webpack/Vite/esbuild):
# Bundle สำหรับ Browser
bun build ./src/index.ts --outdir ./dist --target browser
# Bundle สำหรับ Bun Runtime
bun build ./src/server.ts --outfile ./server.js --target bun
# Minify
bun build ./src/index.ts --outdir ./dist --minify
# Splitting (Code Splitting)
bun build ./src/index.ts --outdir ./dist --splitting
Test Runner (แทน Jest/Vitest):
// math.test.ts — ใช้ bun test ได้เลย
import { expect, test, describe } from "bun:test";
import { add, multiply } from "./math";
describe("Math Functions", () => {
test("add ควรบวกเลขถูก", () => {
expect(add(2, 3)).toBe(5);
expect(add(-1, 1)).toBe(0);
});
test("multiply ควรคูณเลขถูก", () => {
expect(multiply(3, 4)).toBe(12);
});
});
# รัน Tests
bun test
# Watch Mode
bun test --watch
# Coverage
bun test --coverage
SQLite Built-in: Bun มี SQLite Driver มาในตัว ไม่ต้องติดตั้ง Package เพิ่ม เร็วกว่า better-sqlite3 ถึง 4 เท่า
import { Database } from "bun:sqlite";
const db = new Database("mydb.sqlite");
db.run("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)");
// Insert
const insert = db.prepare("INSERT INTO users (name, email) VALUES (?, ?)");
insert.run("สมชาย", "somchai@example.com");
// Query
const users = db.query("SELECT * FROM users").all();
console.log(users);
// Transaction
const insertMany = db.transaction((users) => {
for (const user of users) {
insert.run(user.name, user.email);
}
});
insertMany([
{ name: "สมหญิง", email: "somying@example.com" },
{ name: "สมศักดิ์", email: "somsak@example.com" },
]);
Bun เป็น Drop-in Replacement สำหรับ Node.js
Bun ออกแบบมาให้เข้ากันได้กับ Node.js มากที่สุด โปรเจกต์ Node.js ส่วนใหญ่สามารถรันบน Bun ได้ทันทีโดยไม่ต้องแก้ไขอะไร
# รัน Node.js project บน Bun
bun run index.js # แทน node index.js
bun run index.ts # รัน TypeScript ได้เลย
# ใช้ node_modules และ package.json ที่มีอยู่ได้เลย
bun install # อ่าน package.json เหมือน npm
bun run dev # รัน scripts จาก package.json
Bun รองรับ Node.js APIs ส่วนใหญ่ เช่น fs, path, http, crypto, stream, buffer, child_process, worker_threads, cluster และอื่นๆ อีกมาก ณ ปี 2026 ความเข้ากันได้กับ Node.js อยู่ที่ประมาณ 95% ซึ่งเพียงพอสำหรับ Production Use
Performance Benchmarks: Node.js vs Deno vs Bun
มาดู Benchmark ที่เปรียบเทียบ Performance ของทั้ง 3 Runtime ในด้านต่างๆ ตัวเลขเหล่านี้อ้างอิงจากการทดสอบบนเครื่อง Linux x86_64 ที่มีสเปกเดียวกัน ในปี 2026
HTTP Server Performance (Requests/second)
| Runtime | Simple JSON | File Serving | Database Query |
|---|---|---|---|
| Node.js 22 | 65,000 req/s | 32,000 req/s | 18,000 req/s |
| Deno 2.1 | 85,000 req/s | 38,000 req/s | 20,000 req/s |
| Bun 1.2 | 120,000 req/s | 55,000 req/s | 28,000 req/s |
Startup Time
| Runtime | Hello World | Medium App | Large App |
|---|---|---|---|
| Node.js 22 | ~45ms | ~200ms | ~800ms |
| Deno 2.1 | ~30ms | ~150ms | ~600ms |
| Bun 1.2 | ~5ms | ~30ms | ~120ms |
Package Install Speed
| Tool | Clean Install (medium project) | With Lockfile |
|---|---|---|
| npm | ~25 seconds | ~12 seconds |
| pnpm | ~10 seconds | ~5 seconds |
| Deno (npm compat) | ~8 seconds | ~3 seconds |
| bun install | ~2 seconds | ~0.5 seconds |
เปรียบเทียบ Node.js vs Deno vs Bun แบบครบทุกมิติ
| คุณสมบัติ | Node.js | Deno | Bun |
|---|---|---|---|
| สร้างโดย | Ryan Dahl (2009) | Ryan Dahl (2018) | Jarred Sumner (2022) |
| Engine | V8 (Chrome) | V8 (Chrome) | JSC (Safari) |
| เขียนด้วย | C++ | Rust | Zig + C++ |
| TypeScript | ต้องติดตั้งแยก | Built-in | Built-in |
| Package Manager | npm/yarn/pnpm | URL imports + npm: | bun install (built-in) |
| Security | ไม่มี Sandbox | Permission System | ไม่มี Sandbox |
| Test Runner | ต้องติดตั้งแยก | deno test (built-in) | bun test (built-in) |
| Bundler | ต้องติดตั้งแยก | deno bundle | bun build (built-in) |
| node_modules | ใช่ | ไม่จำเป็น | ใช่ (เร็วกว่ามาก) |
| npm Compatibility | 100% | ~90% (npm: prefix) | ~95% |
| Web Standard APIs | บางส่วน | เต็ม (fetch, URL, etc) | เต็ม |
| Startup Speed | ช้า | ปานกลาง | เร็วมาก |
| Ecosystem | ใหญ่ที่สุด | กำลังโต | ใช้ npm ได้ |
| Production Ready | สมบูรณ์มาก | พร้อมใช้งาน | พร้อมใช้งาน |
Framework ที่ออกแบบมาสำหรับแต่ละ Runtime
Fresh — Web Framework สำหรับ Deno
Fresh เป็น Full-stack Web Framework ที่ออกแบบมาสำหรับ Deno โดยเฉพาะ ใช้หลักการ Islands Architecture ที่ส่ง JavaScript ไป Client เฉพาะส่วนที่จำเป็น ทำให้หน้าเว็บเร็วมาก
// routes/index.tsx — Fresh Framework
import { PageProps } from "$fresh/server.ts";
import Counter from "../islands/Counter.tsx";
export default function Home(props: PageProps) {
return (
<div>
<h1>Fresh Framework</h1>
<p>เนื้อหานี้ render บน Server — ไม่ส่ง JS ไป Client</p>
<Counter start={3} /> {/* เฉพาะ Component นี้ที่เป็น Interactive */}
</div>
);
}
Elysia — Web Framework สำหรับ Bun
Elysia เป็น Web Framework ที่สร้างมาเพื่อ Bun โดยเฉพาะ โดดเด่นเรื่อง End-to-End Type Safety และ Performance ที่สูงมาก
// server.ts — Elysia Framework
import { Elysia, t } from "elysia";
const app = new Elysia()
.get("/", () => "Hello from Elysia!")
.get("/users/:id", ({ params: { id } }) => {
return { id, name: "สมชาย" };
})
.post("/users", ({ body }) => {
return { message: "สร้างผู้ใช้สำเร็จ", user: body };
}, {
body: t.Object({
name: t.String(),
email: t.String({ format: "email" })
})
})
.listen(3000);
console.log(`Elysia is running at http://localhost:3000`);
Hono — Framework ที่รันได้ทุก Runtime
Hono (ภาษาญี่ปุ่นแปลว่า "เปลวไฟ") เป็น Ultrafast Web Framework ที่รันได้บน Node.js, Deno, Bun, Cloudflare Workers และ AWS Lambda ทำให้เป็นตัวเลือกที่ดีถ้าคุณไม่อยากผูกตัวกับ Runtime ใดตัวหนึ่ง
// app.ts — Hono (รันได้ทุก Runtime)
import { Hono } from "hono";
import { cors } from "hono/cors";
import { logger } from "hono/logger";
const app = new Hono();
app.use("*", cors());
app.use("*", logger());
app.get("/", (c) => c.json({ message: "Hello Hono!" }));
app.get("/api/products", async (c) => {
const products = await getProducts();
return c.json(products);
});
app.post("/api/products", async (c) => {
const body = await c.req.json();
const product = await createProduct(body);
return c.json(product, 201);
});
// สำหรับ Bun
export default app;
// สำหรับ Deno
// Deno.serve(app.fetch);
// สำหรับ Node.js
// import { serve } from "@hono/node-server";
// serve(app);
Package Management เปรียบเทียบ
Node.js — npm / yarn / pnpm
# package.json เป็นศูนย์กลาง
npm init -y
npm install express
npm install -D typescript
# Lock file: package-lock.json / yarn.lock / pnpm-lock.yaml
# ทุก Package อยู่ใน node_modules/
Deno — URL Imports + npm Compatibility
// deno.json — Configuration file
{
"imports": {
"oak": "https://deno.land/x/oak@v12.6.1/mod.ts",
"zod": "npm:zod@3.22",
"express": "npm:express@4",
"lodash": "npm:lodash-es"
},
"tasks": {
"dev": "deno run --watch --allow-net --allow-read main.ts",
"test": "deno test --allow-all",
"lint": "deno lint",
"fmt": "deno fmt"
},
"compilerOptions": {
"strict": true,
"jsx": "react-jsx",
"jsxImportSource": "preact"
}
}
// Lock file: deno.lock (auto-generated)
// Cache: ~/.cache/deno/ (global, shared)
Bun — bun install
# ใช้ package.json เหมือน Node.js
bun init # สร้าง package.json + tsconfig.json
bun add hono # เพิ่ม Package
bun add -d bun-types # Dev dependency
# Lock file: bun.lockb (binary, เร็วกว่า JSON lockfile)
# node_modules: ใช้ hardlinks ประหยัดเนื้อที่
# Workspace support
bun install # ติดตั้ง monorepo ทั้งหมด
Testing เปรียบเทียบ
Node.js Test Runner (Built-in ตั้งแต่ Node 20)
// test/math.test.mjs — Node.js Built-in Test Runner
import { test, describe } from "node:test";
import assert from "node:assert/strict";
import { add } from "../src/math.mjs";
describe("Math", () => {
test("add", () => {
assert.equal(add(1, 2), 3);
});
});
// รัน: node --test
Deno Test
// math_test.ts — Deno (ไฟล์ลงท้ายด้วย _test.ts)
import { assertEquals, assertThrows } from "https://deno.land/std@0.220.0/assert/mod.ts";
import { add } from "./math.ts";
Deno.test("add - ค่าปกติ", () => {
assertEquals(add(2, 3), 5);
});
Deno.test("add - ค่าลบ", () => {
assertEquals(add(-1, -2), -3);
});
// รัน: deno test
Bun Test
// math.test.ts — Bun (ใช้ Jest-compatible syntax)
import { expect, test, describe, beforeEach, mock } from "bun:test";
import { add } from "./math";
describe("Math", () => {
test("add ค่าปกติ", () => {
expect(add(2, 3)).toBe(5);
});
test("mock function", () => {
const fn = mock(() => 42);
expect(fn()).toBe(42);
expect(fn).toHaveBeenCalledTimes(1);
});
});
// รัน: bun test
Deployment Options
Node.js Deployment
- Traditional: VPS + PM2 + Nginx (รูปแบบคลาสสิก)
- Container: Docker + Kubernetes (Enterprise standard)
- PaaS: Railway, Render, Heroku, DigitalOcean App Platform
- Serverless: AWS Lambda, Google Cloud Functions, Azure Functions
- Edge: Cloudflare Workers (ใช้ Miniflare), Vercel Edge Functions
Deno Deployment
- Deno Deploy: Official platform, Edge runtime, 35+ regions, Free tier
- Docker: ใช้ official Deno Docker image
- Self-hosted: VPS + deno compile เป็น Binary
- Netlify Edge Functions: รองรับ Deno natively
Bun Deployment
- Docker: ใช้ oven/bun Docker image
- Self-hosted: VPS + Bun binary (Startup เร็วมาก)
- Railway/Render: รองรับ Bun แล้ว
- Fly.io: รองรับ Bun natively
# Dockerfile สำหรับ Bun
FROM oven/bun:1.2
WORKDIR /app
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile
COPY . .
EXPOSE 3000
CMD ["bun", "run", "src/index.ts"]
# Dockerfile สำหรับ Deno
FROM denoland/deno:2.1.0
WORKDIR /app
COPY deno.json deno.lock ./
RUN deno cache main.ts
COPY . .
EXPOSE 3000
CMD ["deno", "run", "--allow-net", "--allow-read", "--allow-env", "main.ts"]
Migration จาก Node.js
Migration ไป Deno
การย้ายจาก Node.js ไป Deno ในปี 2026 ง่ายกว่าเดิมมาก เพราะ Deno 2.0 รองรับ npm packages และ Node.js APIs แล้ว ขั้นตอนหลักๆ คือ
- สร้าง deno.json แทน package.json (หรือใช้ package.json เดิมก็ได้)
- เปลี่ยน require() เป็น import (ถ้ายังใช้ CommonJS)
- เพิ่ม npm: prefix สำหรับ npm packages
- ตั้งค่า Permissions ที่เหมาะสม
- ทดสอบด้วย deno test แทน jest/vitest
Migration ไป Bun
การย้ายไป Bun ง่ายที่สุดในสามตัว เพราะ Bun ตั้งใจเป็น Drop-in Replacement
- ติดตั้ง Bun:
curl -fsSL https://bun.sh/install | bash - รัน
bun installแทนnpm install - รัน
bun run devแทนnpm run dev - ถ้าใช้ TypeScript อยู่แล้ว ไม่ต้องเปลี่ยนอะไร
- เปลี่ยน Test Framework มาใช้ bun:test (ถ้าต้องการ)
Ecosystem Maturity — ความสมบูรณ์ของ Ecosystem
ปัจจัยสำคัญที่สุดในการเลือก Runtime ไม่ใช่ Performance แต่คือ Ecosystem ถ้า Library หรือ Framework ที่คุณต้องใช้ไม่รองรับ Runtime นั้น มันก็ไม่มีประโยชน์
Node.js Ecosystem (อายุ 17 ปี): มี Package บน npm มากกว่า 2 ล้าน Package เป็น Ecosystem ที่ใหญ่ที่สุดในโลก ทุก Library, Framework และ Tool ที่คุณนึกออก มีให้ใช้บน Node.js แน่นอน ไม่ว่าจะเป็น Express, Fastify, Nest.js, Next.js, Prisma, TypeORM หรืออะไรก็ตาม
Deno Ecosystem (อายุ 8 ปี): มี Deno-specific Modules บน deno.land/x ประมาณ 7,000+ Module แต่เพราะ Deno 2.0 รองรับ npm packages ได้แล้ว จึงเข้าถึง npm Ecosystem ได้เกือบทั้งหมด ข้อจำกัดคือ Packages บางตัวที่ใช้ Native Addons อาจยังไม่ทำงาน
Bun Ecosystem (อายุ 4 ปี): Bun ไม่มี Package Registry ของตัวเอง แต่ใช้ npm Registry โดยตรง ทำให้เข้าถึง npm Packages ได้เกือบทั้งหมด ข้อจำกัดคล้ายกับ Deno คือ Native Addons บางตัวอาจมีปัญหา
เมื่อไหร่ควรเลือก Runtime ไหน?
เลือก Node.js เมื่อ:
- ต้องการ Ecosystem ที่สมบูรณ์ที่สุด ทุก Package ทำงานได้แน่นอน
- ทีมมีประสบการณ์กับ Node.js อยู่แล้ว
- โปรเจกต์ Enterprise ที่ต้องการ Long-term Support (LTS)
- ใช้ Framework ที่ผูกกับ Node.js เช่น Next.js, Nest.js
- ต้องการ Native Addons เช่น sharp, bcrypt, canvas
เลือก Deno เมื่อ:
- ต้องการ Security เป็นหลัก (Permission System)
- ต้องการ TypeScript แบบ Zero-config
- เริ่มโปรเจกต์ใหม่ที่ไม่ต้อง Legacy support
- ต้องการ Deploy บน Edge (Deno Deploy)
- ชอบ Standard Library ที่ดีกว่าของ Deno (std/)
- ต้องการ Built-in Formatter, Linter, Test Runner
เลือก Bun เมื่อ:
- ต้องการ Performance สูงสุด โดยเฉพาะ Startup Time
- ต้องการ All-in-One Tool (Runtime + Package Manager + Bundler + Test)
- ต้องการ Drop-in Replace Node.js โดยแก้โค้ดน้อยที่สุด
- ใช้ SQLite เป็น Database หลัก
- ต้องการ bun install ที่เร็วมากสำหรับ CI/CD
- สร้าง API Server ที่ต้องการ Throughput สูง
ตัวอย่างการสร้าง REST API บนทั้ง 3 Runtime
Node.js + Express
// server.js — Node.js
import express from "express";
const app = express();
app.use(express.json());
const todos = [];
let nextId = 1;
app.get("/api/todos", (req, res) => {
res.json(todos);
});
app.post("/api/todos", (req, res) => {
const todo = { id: nextId++, ...req.body, done: false };
todos.push(todo);
res.status(201).json(todo);
});
app.listen(3000, () => console.log("Node.js server running on :3000"));
Deno + Oak
// server.ts — Deno
import { Application, Router } from "https://deno.land/x/oak@v12.6.1/mod.ts";
const router = new Router();
const todos: Array<{ id: number; title: string; done: boolean }> = [];
let nextId = 1;
router.get("/api/todos", (ctx) => {
ctx.response.body = todos;
});
router.post("/api/todos", async (ctx) => {
const body = await ctx.request.body().value;
const todo = { id: nextId++, ...body, done: false };
todos.push(todo);
ctx.response.status = 201;
ctx.response.body = todo;
});
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
console.log("Deno server running on :3000");
await app.listen({ port: 3000 });
Bun + Elysia
// server.ts — Bun
import { Elysia, t } from "elysia";
const todos: Array<{ id: number; title: string; done: boolean }> = [];
let nextId = 1;
const app = new Elysia()
.get("/api/todos", () => todos)
.post("/api/todos", ({ body }) => {
const todo = { id: nextId++, ...body, done: false };
todos.push(todo);
return todo;
}, {
body: t.Object({
title: t.String()
})
})
.listen(3000);
console.log("Bun + Elysia running on :3000");
อนาคตของ JavaScript Runtimes
ในปี 2026 เราเห็นแนวโน้มที่ชัดเจนหลายอย่าง ประการแรก WinterCG (Web-interoperable Runtimes Community Group) กำลังผลักดัน Minimum Common API ที่ทุก Runtime ต้องรองรับ เช่น fetch, Request, Response, URL, crypto, TextEncoder ทำให้โค้ดที่เขียนครั้งเดียวสามารถรันได้ทุก Runtime
ประการที่สอง การแข่งขันระหว่าง Runtime ทำให้ทุกตัวดีขึ้น Node.js ก็เพิ่ม Built-in Test Runner, Watch Mode และ TypeScript Support (ผ่าน --experimental-strip-types) มาเพื่อตอบโต้ Deno และ Bun
ประการที่สาม Edge Computing กำลังเป็น Trend ใหญ่ ทั้ง Deno Deploy, Cloudflare Workers, Vercel Edge Functions ล้วนใช้ JavaScript Runtime ที่ Lightweight และ Start เร็ว ซึ่งเป็นจุดแข็งของ Deno และ Bun
ประการที่สี่ AI/LLM Integration กำลังเปลี่ยนวิธีที่เราเขียนและรัน JavaScript ทุก Runtime กำลังเพิ่มฟีเจอร์สำหรับ AI เช่น WebGPU support, ONNX Runtime integration เป็นต้น
สิ่งที่สำคัญที่สุดคือ ไม่ว่าคุณจะเลือก Runtime ไหน ทักษะ JavaScript/TypeScript ของคุณยังคงใช้ได้ทั้งหมด เพราะทุก Runtime รัน JavaScript/TypeScript เหมือนกัน ต่างกันแค่ระบบนิเวศรอบข้างเท่านั้น
สรุป
JavaScript Runtime ในปี 2026 มีทางเลือกที่ดีขึ้นมาก Node.js ยังคงเป็นตัวเลือกที่ปลอดภัยและ Ecosystem ใหญ่ที่สุด เหมาะสำหรับ Enterprise และโปรเจกต์ที่ต้องการความเสถียรสูงสุด Deno เหมาะสำหรับคนที่ต้องการ Security, TypeScript Native และ Modern API Design โดยเฉพาะสำหรับ Edge Deployment ส่วน Bun เหมาะสำหรับคนที่ต้องการ Performance สูงสุดและ All-in-One Toolkit ที่จบในตัวเดียว
คำแนะนำสำหรับนักพัฒนาไทย คือลองเล่นทั้ง Deno และ Bun ดูในโปรเจกต์เล็กๆ ก่อน ทำความเข้าใจจุดเด่นจุดด้อยของแต่ละตัว แล้วค่อยตัดสินใจว่าจะใช้ตัวไหนเป็นหลักในโปรเจกต์ถัดไป ไม่ว่าจะเลือกตัวไหน ทักษะที่คุณมีจะไม่สูญเปล่า เพราะทุกตัวคือ JavaScript เหมือนกัน
