FiveM Enhanced Node.js 26 คืออะไร? Script ต้องแก้ไหม

FiveM Enhanced อัปเดต JavaScript Runtime ครั้งใหญ่ โดยฝั่ง Server ใช้ Node.js 26 และฝั่ง Client ใช้ V8 14.6.202 ตามข้อมูลอย่างเป็นทางการจาก Cfx.re

การเปลี่ยนแปลงนี้สำคัญกับ Developer ที่เขียน FiveM Resource ด้วย

  • JavaScript

  • TypeScript

  • Node.js

  • npm Packages

  • Third-party Libraries

  • Database Libraries

  • REST API

  • Discord Integration

  • Web Services

แต่ไม่ได้หมายความว่า JavaScript Resource เก่าทุกตัวต้อง Rewrite ใหม่ทั้งหมด

Resource ที่ใช้ FiveM API มาตรฐาน เช่น

  • on

  • onNet

  • emit

  • emitNet

  • exports

  • setTick

และไม่มี Dependency ที่ผูกกับ Node.js Version เก่ามาก มักเป็นกลุ่มที่ควรนำไปทดสอบบน Enhanced ก่อน แล้วค่อยแก้เฉพาะส่วนที่มีปัญหา

สิ่งที่ต้องระวังมากกว่าคือ Resource ที่ใช้

  • Native Node Modules

  • Package รุ่นเก่า

  • Deprecated Node APIs

  • Custom Binary Add-ons

  • File System

  • Reflection-like Dynamic Loading

  • Database Drivers

  • npm Package ที่ล็อก Node Version

บทความนี้จาก comsiam จะอธิบายว่า Node.js 26 ของ FiveM Enhanced คืออะไร แตกต่างจาก JavaScript Runtime เดิมอย่างไร และต้องตรวจอะไรบ้างก่อนย้าย Server จริง

① FiveM Enhanced Node.js 26 คืออะไร?

คือ JavaScript Runtime ฝั่ง Server ของ FiveM Enhanced

Cfx.re ระบุว่า Enhanced อัปเดต JavaScript Runtime เป็น

Server → Node.js 26
Client → V8 14.6.202

ดังนั้นต้องแยกให้ชัดว่าฝั่ง Server และ Client ไม่ได้ใช้ Runtime แบบเดียวกันทั้งหมด

② Node.js 26 ใช้ฝั่งไหน?

Server-side JavaScript

ตัวอย่าง Resource:

server.js

สามารถใช้ Node.js APIs และ Package ที่ FiveM Environment รองรับ

เช่น

  • fs

  • path

  • crypto

  • require

  • node_modules

ตามข้อจำกัดของ Cfx Sandbox

③ แล้ว JavaScript ฝั่ง Client ใช้อะไร?

ฝั่ง Client ใช้ V8 14.6.202

ไม่ได้ใช้ Node.js Environment แบบ Server

ดังนั้น Code Client ไม่ควรคิดว่าจะเรียก

require('fs')

หรือใช้ Node-only APIs ได้เหมือน Server

④ Node.js กับ V8 ต่างกันอย่างไร?

V8 คือ JavaScript Engine

ส่วน Node.js สร้าง Runtime รอบ V8 และเพิ่ม APIs เช่น

  • Filesystem

  • Networking

  • Streams

  • Process-related APIs

FiveM Client ใช้ V8 สำหรับ JavaScript Runtime

ส่วน Server ใช้ Node.js

⑤ Script JavaScript เก่าต้องแก้ไหม?

ไม่จำเป็นทุกตัว

ควรใช้หลัก

Resource เดิม
↓
Enhanced Test
↓
ถ้าผ่าน → ใช้ต่อ
↓
ถ้าไม่ผ่าน → แก้เฉพาะ Compatibility Issue

ไม่ควร Rewrite Resource ทั้งหมดโดยไม่มีเหตุผล

⑥ Resource แบบไหนมีโอกาสใช้ต่อได้ง่าย?

เช่น Resource ที่ใช้เพียง

  • FiveM Events

  • Commands

  • Exports

  • Basic JavaScript

  • JSON

  • Simple Database Calls

และไม่มี Native Dependency ซับซ้อน

มักมี Migration Risk ต่ำกว่า

⑦ Resource แบบไหนเสี่ยงกว่า?

โดยเฉพาะ Resource ที่มี

  • Native npm Module

  • Binary .node

  • Package เก่ามาก

  • Deprecated Node API

  • Custom Filesystem Logic

  • MongoDB/Database Driver

  • Child Process

  • Custom Network Library

ควร Audit ก่อน

⑧ JavaScript Resource ฝั่ง Server ใช้ require ได้ไหม?

FiveM JavaScript Runtime รองรับ Node-style Module Loading ฝั่ง Server

ตัวอย่าง:

const fs = require('fs');

รวมถึงการโหลด Package จาก

node_modules

ตาม Environment และ Resource Structure

⑨ package.json ใช้ได้ไหม?

ใช้ได้กับ JavaScript Server Resources ที่จัด Dependency ผ่าน Node Ecosystem

ตัวอย่าง:

{
  "dependencies": {
    "some-package": "1.0.0"
  }
}

แต่ Package ต้อง Compatible กับ Runtime และ FiveM Sandbox ด้วย

⑩ Node.js 26 ทำให้ npm Package ทุกตัวใช้ได้ไหม?

ไม่

Package สามารถมีข้อจำกัด เช่น

  • Node Engine Version

  • Native Binary

  • Operating System

  • Filesystem Requirement

  • Network Requirement

  • Sandbox

ดังนั้น Node.js ใหม่ไม่ได้แปลว่า npm ทั้ง Registry ใช้กับ FiveM ได้ทุก Package

⑪ Package Pure JavaScript เสี่ยงน้อยกว่าไหม?

โดยทั่วไป ใช่

Package ที่เป็น JavaScript ล้วนและไม่พึ่ง

  • Native Binary

  • OS-specific Library

มักย้าย Runtime ได้ง่ายกว่า

แต่ยังต้อง Functional Test

⑫ Native npm Module คืออะไร?

Package บางตัวมี Binary Component เช่นไฟล์

*.node

ซึ่ง Compile สำหรับ

  • Node Version

  • ABI

  • Operating System

  • CPU Architecture

เฉพาะบางชุด

เมื่อเปลี่ยน Runtime รุ่นใหญ่ Package เหล่านี้ต้องได้รับการตรวจเป็นพิเศษ

⑬ Native Module เก่าใช้กับ Node.js 26 ได้เลยไหม?

ไม่ควรรับประกัน

อาจต้อง

  • Update Package

  • Rebuild Native Add-on

  • ใช้ Version ใหม่

  • เปลี่ยน Package

ขึ้นอยู่กับ Module นั้น

นี่เป็นหนึ่งใน Migration Risk สำคัญ

⑭ package-lock.json ควรเก็บไหม?

ควร

Lockfile ช่วยให้ Test Environment ใช้ Dependency Version เดียวกับ Production

ตัวอย่าง

package.json
package-lock.json

หรือ Lockfile จาก Package Manager ที่ใช้

ช่วยลดปัญหา “เครื่องหนึ่งใช้ได้ แต่อีกเครื่องไม่ได้”

⑮ ควร Update npm ทุกตัวพร้อม Node.js 26 ไหม?

ไม่แนะนำ

ถ้า Resource เดิมทำงานอยู่ ให้ Test Version เดิมก่อน

จากนั้นค่อย Upgrade Package ที่

  • ไม่ Compatible

  • Deprecated

  • Security Risk

  • ไม่รองรับ Runtime ใหม่

การ Update ทุก Dependency พร้อมกันทำให้ Debug ยาก

⑯ ทำไมต้องลดจำนวนสิ่งที่เปลี่ยนพร้อมกัน?

สมมติคุณทำพร้อมกัน

  1. Legacy → Enhanced

  2. Node รุ่นเก่า → Node 26

  3. npm Update ทุก Package

  4. Rewrite JavaScript

  5. เปลี่ยน Database Driver

ถ้า Resource พังจะไม่รู้ว่าเกิดจากส่วนใด

ควรเปลี่ยนเป็นขั้นตอน

⑰ TypeScript ใช้กับ FiveM Enhanced ได้ไหม?

สามารถใช้ TypeScript Workflow แล้ว Compile/Bundler ออกมาเป็น JavaScript สำหรับ Resource ได้

Cfx.re มี Official Type Definitions เช่น

@citizenfx/client
@citizenfx/server

เพื่อช่วยเรื่อง Typings และ Auto-completion

⑱ @citizenfx/client คืออะไร?

เป็น Package สำหรับ Type Definitions ของ FiveM Client API

ช่วยให้ Editor รู้จัก

  • FiveM Functions

  • Natives

  • Client APIs

และช่วยตรวจ Type ตอนเขียน TypeScript

⑲ @citizenfx/server ใช้ทำอะไร?

ใช้กับ Server-side Type Definitions

เหมาะกับ TypeScript Project ที่มี

server.ts

ช่วยให้ Development Environment เข้าใจ FiveM Server APIs

⑳ Client JavaScript ใช้ Node.js API ได้ไหม?

ไม่ได้โดยทั่วไป

Cfx.re ระบุว่าฝั่ง Client ไม่มี Node-specific APIs เช่น

  • Node Filesystem

  • Node Modules แบบ Server

ดังนั้นต้องแยก Code อย่างชัดเจน

㉑ Client JavaScript มี DOM ไหม?

JavaScript Game Runtime ปกติ ไม่มี DOM

เช่น

document.querySelector(...)

ไม่ได้มีอยู่ใน Game Script Runtime

ถ้าต้องการ Web UI ให้ใช้ NUI ซึ่งเป็นอีก Environment

㉒ NUI กับ Client JavaScript เหมือนกันไหม?

ไม่เหมือนกัน

Client Script

รันใน FiveM JavaScript Runtime

NUI

รันใน Browser-based UI Environment

ดังนั้น Code แบบ

document.getElementById(...)

ควรอยู่ใน NUI

ไม่ใช่ FiveM Client Script โดยตรง

㉓ Server กับ Client ควรแยกไฟล์ไหม?

ควร

ตัวอย่าง:

resource/
├── fxmanifest.lua
├── client.js
├── server.js
└── shared.js

ช่วยลดการใช้ API ผิด Environment

㉔ fxmanifest.lua ต้องเปลี่ยนไหม?

JavaScript Resource ยังคงถูกกำหนดผ่าน Resource Manifest

ตัวอย่างแนวคิด

client_script 'client.js'
server_script 'server.js'

แต่ Enhanced-specific Runtime Setting ควรใช้ตาม Documentation ปัจจุบัน

อย่าเดา ConVar หรือ Manifest Option เอง

㉕ ต้องใส่ node_version '26' ไหม?

ไม่ควรใส่เพียงเพราะ Enhanced ใช้ Node.js 26

Cfx.re ประกาศว่า Enhanced Server Runtime ใช้ Node.js 26 แต่เอกสาร Resource Manifest ทั่วไปปัจจุบันยังอธิบาย node_version สำหรับ Legacy Runtime โดยมี Node 16/22

ดังนั้นอย่าเดาว่า

node_version '26'

เป็น Syntax ที่รองรับจนกว่า Enhanced Documentation จะระบุชัด

㉖ ทำไม Documentation ถึงดูต่างกัน?

เพราะ FiveM ยังมีทั้ง

  • Legacy

  • Enhanced

และ Documentation บางหน้าครอบคลุม Runtime แบบเดิม

ขณะที่ Development Update ของ Enhanced ระบุ Runtime ใหม่โดยเฉพาะ

เวลา Migration ต้องดู Context ของเอกสารทุกครั้ง

㉗ สรุปเรื่อง node_version อย่างไรดีที่สุด?

สำหรับ Legacy ให้ใช้ Manifest Option ตาม Legacy Documentation

สำหรับ Enhanced ให้ใช้ Runtime ที่ Cfx Server Enhanced จัดให้ และอย่าเพิ่ม Version Directive ที่ Documentation ยังไม่ได้ระบุว่ารองรับ

นี่ปลอดภัยกว่าการเดา Configuration

㉘ CommonJS ยังต้องรู้ไหม?

FiveM JavaScript Resources จำนวนมากใช้ CommonJS Pattern

เช่น

const something = require('something');

Resource เก่าจำนวนมากจึงอยู่ในรูปแบบนี้

ถ้าใช้ ES Modules ควรตรวจ Build/Resource Configuration ให้เหมาะกับ Runtime

㉙ ES Modules ใช้ได้ไหม?

Modern Node รองรับ ES Modules แต่ FiveM Resource Environment มี Loading/Packaging Context ของตัวเอง

ดังนั้นควร Test

import ...

ตาม Resource Setup ที่ใช้จริง

อย่าเปลี่ยน CommonJS → ESM พร้อม Migration โดยไม่มีเหตุผล

㉚ ควรใช้ Bundler ไหม?

สำหรับ TypeScript หรือ Resource ใหญ่สามารถใช้

  • esbuild

  • Rollup

  • Webpack

หรือ Tool ที่ทีมถนัด

เพื่อ Compile/Bundle Output

แต่ Bundling เป็น Development Workflow ไม่ใช่ Requirement ว่า Enhanced ทุก Resource ต้อง Bundle

㉛ Resource JavaScript ธรรมดาต้อง Bundle ไหม?

ไม่จำเป็น

ไฟล์ .js ธรรมดาสามารถเป็น FiveM Script ได้

ถ้าไม่มี TypeScript หรือ Dependency Complexity มาก การไม่ Bundle อาจ Debug ง่ายกว่า

㉜ FiveM Event API ยังสำคัญเหมือนเดิมไหม?

ใช่

JavaScript Resource ใช้ Function เช่น

on(...)
onNet(...)
emit(...)
emitNet(...)

เป็นพื้นฐาน

Runtime Upgrade ไม่ได้เปลี่ยนหลักการว่า Client และ Server Communicate ผ่าน FiveM Event System

㉝ ตัวอย่าง Server Event

onNet('myResource:hello', (name) => {
    console.log(`Hello ${name}`);
});

แต่ Event จาก Client ต้องตรวจ Security

อย่า Trust Parameters ที่ Client ส่งมา

㉞ emitNet ใช้ทำอะไร?

ใช้ส่ง Network Event

เช่น Server → Client

หรือ Client → Server ตาม Context

แต่ข้อมูลสำคัญอย่าง

  • Money

  • Items

  • Permissions

ต้อง Validate ฝั่ง Server

㉟ Node.js 26 ทำให้ Event ปลอดภัยขึ้นเองไหม?

ไม่

Runtime Version ไม่แทน Secure Coding

Server ต้องตรวจ

  • source

  • Permission

  • Input Type

  • Range

  • Player State

  • Ownership

เหมือนเดิม

㊱ Resource ที่รับจำนวนเงินจาก Client ต้องทำอย่างไร?

ไม่ควรทำแบบ

Client บอกให้เงิน 1,000,000
→ Server เชื่อ

ต้องตรวจ Transaction ฝั่ง Server

Enhanced และ Node 26 ไม่ได้ป้องกัน Logic Exploit แบบนี้ให้

㊲ Thread Affinity คืออะไร?

นี่เป็นจุดสำคัญของ FiveM Node Runtime

Cfx.re ระบุว่า Callback ที่เกิดจาก Node.js สามารถทำงานบน Thread ของ libuv Event Loop

ขณะที่ CitizenFX Server Natives ต้องถูกเรียกบน Main Game Thread

㊳ ปัญหา Thread Affinity มีอาการอย่างไร?

ถ้าเรียก FiveM Native ตรงจาก Node Callback บางประเภท อาจเกิด Error เช่นแนวคิด

No current resource manager

ดังนั้นต้องนำ Execution กลับ Main Thread ก่อน

㊴ ใช้ setImmediate ทำอะไร?

Cfx.re แนะนำ setImmediate เพื่อ Schedule Code กลับมาทำงานใน Game Tick เมื่อจะเรียก FiveM Server Native จาก Node Callback

ตัวอย่าง:

const fs = require('fs');

fs.readFile('data.txt', 'utf8', (err, data) => {
    if (err) return;

    setImmediate(() => {
        console.log(data);
    });
});

㊵ ต้องใช้ setImmediate กับทุก Callback ไหม?

ไม่

ใช้เมื่อ Node Callback ต้องกลับไปเรียก FiveM/CitizenFX Native ที่ต้อง Main Thread

ถ้า Callback ทำงาน Node-only ต่อ เช่น

  • Parse Data

  • File Processing

ก็ไม่จำเป็นต้องสลับกลับ Main Threadทุกครั้ง

㊶ ทำไมใช้ setImmediate เกินจำเป็นไม่ดี?

เพิ่ม Scheduling Work โดยไม่จำเป็น

Cfx.re แนะนำว่าอย่ากลับ Main Thread หาก Code ยังทำ Node-only Operations อยู่

ให้กลับเมื่อจำเป็นต้องแตะ CitizenFX API

㊷ fs ใช้ได้ไหม?

Server-side Node Resource สามารถใช้ Filesystem API ตามข้อจำกัดของ FiveM Sandbox

ตัวอย่าง

const fs = require('fs');

แต่ Filesystem Access ไม่ได้เปิดอิสระทั้งเครื่อง

㊸ FiveM Sandbox คืออะไร?

เป็นระบบจำกัดสิ่งที่ Resource สามารถเข้าถึง เพื่อความปลอดภัย

เช่น Filesystem Access มีข้อจำกัดตาม Resource/Platform

Node.js 26 ไม่ได้หมายความว่า Resource ได้สิทธิ์เต็มเหมือน Node Application ที่รันนอก FiveM

㊹ Package ที่ตรวจ Environment อาจมีปัญหาไหม?

ได้

Library บางตัวตรวจ

  • Container

  • Filesystem

  • OS

  • Environment

ด้วยวิธีที่ไม่เข้ากับ FiveM Sandbox

จึงอาจต้องใช้ Version หรือ Configuration ที่เหมาะสม

㊺ Database Driver ต้องทดสอบไหม?

ต้อง

หาก Resource JavaScript ใช้

  • MySQL

  • MariaDB

  • PostgreSQL

  • MongoDB

ผ่าน Node Package

ต้องตรวจ Driver Compatibility กับ

  • Node 26

  • FiveM Sandbox

  • Database Version

แยกต่างหาก

㊻ ถ้าใช้ oxmysql ยังได้รับผลจาก Node 26 ไหม?

Server Owner ควรใช้ Release ที่ผู้พัฒนารองรับและทดสอบ Stack จริง

อย่าแก้ Internal Runtime ของ Resource เองโดยไม่มีเหตุผล

Resource ที่มี JavaScript Component อาจได้รับผลจาก Runtime Change แม้ Framework หลักจะเป็น Lua

㊼ mysql2 Package เก่าควรทำอย่างไร?

ถ้า Custom Resource พึ่ง npm Database Package โดยตรง

ให้ตรวจ

  • Current Version

  • Node Engine

  • Connection

  • Pool

  • Query

  • Reconnect

บน Enhanced Test Server

อย่า Update Production ก่อน Test

㊽ HTTP API Resource ต้องทดสอบไหม?

ต้อง

โดยเฉพาะระบบ

  • Discord

  • Web API

  • License API

  • Payment

  • Backend

  • Webhooks

ตรวจ

  • HTTP Request

  • TLS

  • Timeout

  • Retry

  • JSON Parsing

ให้ครบ

㊾ fetch ใช้ได้ไหม?

Modern Node มี Web-compatible APIs มากขึ้น แต่ Resource ควรยึด Runtime ที่ FiveM Enhanced จัดให้และทดสอบ API จริง

ถ้า Production Resource ใช้ axios หรือ Library เดิมอยู่แล้ว ไม่จำเป็นต้อง Rewrite เป็น fetch เพียงเพราะ Node รุ่นใหม่รองรับ

㊿ อย่า Refactor พร้อม Migration ถ้าไม่จำเป็น

ตัวอย่างเดิมใช้

axios.get(...)

แล้วทำงานดี

ไม่จำเป็นต้องเปลี่ยน

fetch(...)

พร้อมย้าย Enhanced

Migration กับ Code Modernization ควรแยกกัน

51. Discord Bot Library ต้องตรวจไหม?

ต้อง

ถ้า Resource ใช้ Package เช่น Discord Client/SDK

Library รุ่นเก่าอาจล็อก Node Version หรือ API รุ่นเก่า

ตรวจ Version Compatibility ก่อน Enhanced Cutover

52. package engines คืออะไร?

Package บางตัวระบุ

"engines": {
  "node": ">=..."
}

เพื่อกำหนด Node Version ที่รองรับ

ตอน Audit Dependency ควรตรวจ Field นี้

โดยเฉพาะ Package ที่ไม่ได้ Update มานาน

53. Node 26 ทำให้ Package เก่าพังได้ไหม?

เป็นไปได้

Major Runtime Upgrade สามารถถอด Deprecated Behavior หรือเปลี่ยน Compatibility กับ Native Modules

ดังนั้น Resource ที่ไม่ Update มาหลายปีควรได้รับความสำคัญก่อน

54. JavaScript Syntax เก่าจะพังไหม?

Basic JavaScript ส่วนใหญ่ไม่ได้พังเพียงเพราะ Runtime ใหม่

ความเสี่ยงมักอยู่ที่

  • Deprecated APIs

  • Runtime Assumptions

  • Dependencies

มากกว่าคำสั่งพื้นฐานอย่าง if, for, Functions หรือ Objects

55. Modern JavaScript Feature ใช้ได้มากขึ้นไหม?

Runtime ใหม่หมายถึง JavaScript Engine รุ่นใหม่ขึ้นมาก

แต่ Developer ควรใช้ Feature ตาม Client/Server Runtime ที่ Target จริง

เพราะ Client คือ V8 14.6.202 และ Serverคือ Node.js 26

ไม่ควรคิดว่า Feature Server ทุกตัวใช้ Client ได้เหมือนกัน

56. Shared JavaScript ต้องระวังอะไร?

ถ้าไฟล์เดียวถูกโหลดทั้ง Client และ Server

ห้ามใส่ Node-only API ลงไปโดยไม่แยก Context

ตัวอย่างไม่เหมาะ:

const fs = require('fs');

ใน Shared File ที่ Client ต้องโหลดด้วย

เพราะ Client ไม่มี Node Filesystem

57. Shared Code ควรเป็นอะไร?

เหมาะกับ

  • Constants

  • Pure Functions

  • Shared Config

  • Data Structures

ที่ไม่พึ่ง Runtime-specific APIs

ช่วยให้ใช้ได้ทั้ง Client และ Server

58. Resource Start ได้ถือว่าผ่าน Node 26 ไหม?

ยังไม่พอ

ต้องทดสอบ

  • Events

  • Database

  • npm Dependencies

  • File I/O

  • HTTP

  • Resource Restart

  • Player Join/Drop

Resource สามารถ Start ได้แต่ Function ลึก ๆ พังตอนถูกเรียกภายหลัง

59. Resource Restart สำคัญไหม?

สำคัญ

ทดสอบ

restart resource_name

แล้วตรวจว่า

  • Timers หยุด

  • Event Listeners ไม่ซ้ำ

  • DB Connections ไม่ Leak

  • HTTP Server/Socket ปิด

  • Cache ถูก Reset

Resource ที่ผ่าน Server Boot แต่ Restart ไม่ได้ยังมีปัญหา Operational

60. Timer ต้อง Cleanup ไหม?

ต้อง

ถ้าใช้

setInterval(...)
setTimeout(...)

ควรเก็บ Handle และ Cleanup ตาม Resource Lifecycle เมื่อจำเป็น

ไม่เช่นนั้นอาจเกิด Duplicate Tasks หลัง Restart ตาม Implementation ของ Resource

61. Event Listener ต้องระวังไหม?

Resource ที่ Register Listener หลายจุดควรตรวจว่า Lifecycle ถูกต้อง

โดยเฉพาะ Custom EventEmitter หรือ Node Library ภายนอก

หาก Listener เพิ่มเรื่อย ๆ อาจเกิด

  • Memory Growth

  • Duplicate Action

ได้

62. Memory Leak ต้องทดสอบไหม?

ต้อง

Enhanced Cfx Server มี Metrics ที่ครอบคลุม JavaScript Memory Usage

จึงสามารถใช้ Monitoring ตรวจว่า Resource JavaScript ใช้ Memory เพิ่มผิดปกติหรือไม่

นี่เป็นประโยชน์มากกับ Long-running Server

63. Node.js Garbage Collector แก้ Memory Leak ทุกอย่างไหม?

ไม่

ถ้า Code ยังเก็บ Reference เช่น

const players = new Map();

แล้ว Player Disconnect แต่ไม่ลบออก

Object ยังสามารถค้างใน Memory ได้

ต้องแก้ Logicเอง

64. Player Cache ต้อง Cleanup

ตัวอย่าง:

const players = new Map();

on('playerDropped', () => {
    players.delete(source);
});

แนวคิดคือข้อมูลที่ไม่จำเป็นแล้วต้องถูกเอาออก

ไม่ควรหวัง Garbage Collector แก้ Logical Reference Leak

65. Promise ต้อง Catch Error ไหม?

ต้อง

หลีกเลี่ยง Unhandled Promise Rejection

ตัวอย่างที่ดีกว่า:

someAsyncTask()
    .catch((err) => {
        console.error(err);
    });

หรือใช้ try/catch กับ await

Error Logging สำคัญมากตอน Runtime Migration

66. async/await ใช้ได้ไหม?

ได้ใน Modern JavaScript

เหมาะกับ

  • Database

  • HTTP

  • File Operations

แต่ต้องระวัง

  • Error Handling

  • Blocking Logic

  • Concurrency

async ไม่ทำให้งาน CPU หนักกลายเป็นเบาอัตโนมัติ

67. CPU-heavy JavaScript ต้องระวังอะไร?

งาน เช่น

  • Loop ข้อมูลจำนวนมาก

  • JSON ใหญ่มาก

  • Pathfinding Custom

  • Encryption หนัก

ยังสามารถ Block Event Loop ได้

Node.js 26 ไม่ได้ทำให้ Single-threaded JavaScript Logic ที่หนักมากหายไป

68. Event Loop สำคัญอย่างไร?

Node.js ใช้ Event Loop สำหรับงาน Async จำนวนมาก

ถ้า JavaScript ทำ CPU-heavy Task ต่อเนื่องนานเกินไป Event Loop จะตอบสนองช้า

อาการอาจเป็น

  • Callback Delay

  • HTTP Delay

  • Resource Lag

ต้อง Optimize Code จริง

69. Enhanced มี Metrics Event Loop ไหม?

Cfx.re ระบุ Expanded Metrics ของ Enhanced รวมถึงข้อมูลเกี่ยวกับ

  • JavaScript Memory

  • Event Loop Queue Depths

ช่วยให้ Developer วิเคราะห์ Resource ที่มี Backlog ได้ดีขึ้น

70. Profiler ใช้กับ JavaScript ได้ไหม?

ได้

Enhanced เปลี่ยน Profiler Backend ไปใช้ Perfetto

สามารถใช้ Workflow หลัก เช่น

profiler record <duration>
profiler save <filename>.json

เพื่อตรวจ Timeline และ Resource Performance

71. Node.js 26 ทำให้ Script เร็วขึ้นแน่นอนไหม?

ไม่ควรรับประกัน

Runtime รุ่นใหม่มีความก้าวหน้ามากขึ้น แต่ Performance จริงขึ้นกับ

  • Script

  • Dependencies

  • Workload

  • Database

  • Cfx Runtime Integration

ต้อง Benchmark Resource ของคุณเอง

72. ควร Benchmark อะไร?

ก่อนและหลัง Migration ดู

  • CPU

  • RAM

  • JavaScript Memory

  • Event Loop

  • Tick Time

  • Database Latency

  • HTTP Latency

โดยใช้ Workload ใกล้เคียงกัน

73. TypeScript Build Target ควรเปลี่ยนเลยไหม?

อย่าเปลี่ยนเพียงเพราะ Server Runtime เป็น Node 26

ให้พิจารณา

  • Client V8 Target

  • Server Node Target

  • Bundler

  • Shared Code

แยกกัน

โดยเฉพาะ Project ที่ Bundle Client และ Server จาก Source เดียวกัน

74. Client Target กับ Server Target เหมือนกันไหม?

ไม่จำเป็น

Server มี Node.js 26

Client มี V8 14.6.202

ดังนั้น Build Pipeline ที่ดีสามารถสร้าง

server bundle
client bundle

แยก Target ตาม Runtime จริง

75. NUI Build Target ล่ะ?

NUI เป็นอีก Environment หนึ่ง

จึงควร Build Frontend ตาม Browser Runtime ของ NUI ที่ FiveM ใช้

อย่าเอา Node Server Target ไปใช้ NUI โดยตรงโดยไม่ตรวจ

76. วิธี Migration JavaScript Resource ที่ปลอดภัย

ขั้นที่ 1

Backup/Git

ขั้นที่ 2

สร้าง Enhanced Test Server

ขั้นที่ 3

Copy Resource เดิม

ขั้นที่ 4

ตรวจ Startup Error

ขั้นที่ 5

ตรวจ npm Dependencies

ขั้นที่ 6

ตรวจ Node-specific APIs

ขั้นที่ 7

ทดสอบ Events/Exports

ขั้นที่ 8

ทดสอบ Database

ขั้นที่ 9

ทดสอบ HTTP/API

ขั้นที่ 10

ทดสอบ Multiplayer

ขั้นที่ 11

ทดสอบ Resource Restart

ขั้นที่ 12

Load Test

ขั้นที่ 13

Monitor JS Memory/Event Loop

ขั้นที่ 14

จึงเปิด Production

77. Compatibility Matrix ตัวอย่าง

ResourcenpmNative ModuleEnhancedสถานะ
Admin JSไม่มีไม่มี✅พร้อม
Discord Bridgeมีไม่มี🧪ทดสอบ
Database Toolมีมี⚠️ต้องตรวจ
Loggerมีไม่มี✅พร้อม
Old Botเก่ามากมี❌เปลี่ยน

ช่วยจัด Priority ในการแก้

78. Resource ที่ไม่มี Source ทำอย่างไร?

ถ้าเป็น Packed/Closed JavaScript Resource

ให้

  • ตรวจ Developer

  • หา Enhanced Version

  • Test Resource

  • ตรวจ License

ถ้า Runtime Compatibility มีปัญหาแต่ไม่มี Source คุณอาจแก้เองไม่ได้

79. Paid JavaScript Resource ต้องตรวจไหม?

ต้อง

โดยเฉพาะ Resource Critical เช่น

  • Phone

  • Admin

  • Anti-cheat

  • Framework Bridge

ถามผู้พัฒนาว่า

รองรับ FiveM Enhanced / Node.js 26 แล้วหรือไม่

ก่อน Production Migration

80. Resource เก่าที่ Developer หยุดดูแลควรทำอย่างไร?

ถือเป็น Technical Risk

หาก Resource Critical ควรเริ่มหา

  • Replacement

  • Maintained Fork ที่ถูกกฎหมาย

  • Resource ใหม่

  • Internal Rewrite

ก่อนที่ Legacy Resource จะกลายเป็น Migration Blocker

81. สิ่งที่ไม่ควรทำ

หลีกเลี่ยง

  • Rewrite JavaScript ทั้ง Server พร้อม Migration

  • Update npm ทุก Package พร้อมกัน

  • เดาว่า node_version '26' ต้องใส่

  • ใช้ Node API ใน Client Script

  • ใช้ fs ใน Shared Script โดยไม่แยก Context

  • ไม่ตรวจ Native Modules

  • ไม่ Catch Promise Errors

  • ไม่ Cleanup Timer/Listener

  • ใช้ Production เป็น Test

  • คิดว่า Resource Start = Compatible

ควรแยก Runtime Migration ออกจาก Code Modernization

82. คำถามที่พบบ่อย

FiveM Enhanced ใช้ Node.js เวอร์ชันอะไร?

Cfx.re ระบุว่า Server-side JavaScript ใช้ Node.js 26

Client ใช้ Node.js 26 ด้วยไหม?

ไม่ Client JavaScript ใช้ V8 14.6.202

JavaScript Resource เก่าต้อง Rewrite ไหม?

ไม่จำเป็นทั้งหมด ควรทดสอบ Resource เดิมก่อน

npm Package เก่าใช้ได้ไหม?

มีโอกาส แต่ต้องตรวจ Node Compatibility โดยเฉพาะ Native Modules

ต้องใส่ node_version '26' ไหม?

ไม่ควรเดา Documentation Resource Manifest ทั่วไปยังระบุ Legacy Node 16/22 ขณะที่ Enhanced Runtime ใช้ Node 26 โดย Platform จึงควรใช้ Enhanced-specific Configuration ที่ Cfx ระบุ

Client ใช้ require('fs') ได้ไหม?

ไม่ใช่ Node.js Environment แบบ Server

Server ใช้ Node APIs ได้ไหม?

ใช้ได้ตาม FiveM Node Runtime และ Sandbox

TypeScript ใช้ได้ไหม?

ใช้ได้ผ่าน Compile/Bundle Workflow และมี Official @citizenfx/client / @citizenfx/server Typings

Node Callback เรียก FiveM Native ได้ทันทีไหม?

บางกรณีไม่ได้ เพราะ Thread Affinity ต้องใช้ setImmediate กลับ Main Thread ก่อน

Node.js 26 ทำให้ Server เร็วขึ้นไหม?

อาจได้รับประโยชน์จาก Runtime รุ่นใหม่ แต่ Performance ต้องวัดจาก Resource และ Workload จริง

83. สรุป FiveM Enhanced Node.js 26 คืออะไร? Script ต้องแก้ไหม

FiveM Enhanced เปลี่ยน JavaScript Runtime เป็น Node.js 26 ฝั่ง Server และ V8 14.6.202 ฝั่ง Client

นี่เป็นการ Upgrade ครั้งใหญ่สำหรับ JavaScript/TypeScript Developer แต่ไม่ได้หมายความว่า Existing Script ทั้งหมดต้องถูกเขียนใหม่

Resource ที่ใช้ FiveM APIs มาตรฐานและ JavaScript ธรรมดาควรถูกนำไป Compatibility Test ก่อน แล้วค่อยแก้เฉพาะจุดที่มีปัญหา

Resource ที่ต้อง Audit เป็นพิเศษคือ Resource ที่ใช้

npm Package → Native Module → Filesystem → Database Driver → HTTP Library → Deprecated Node API

โดยเฉพาะ Native Packages ที่มี Binary Component เพราะสามารถผูกกับ Node ABI และ Runtime Version

อีกจุดที่ Developer ต้องเข้าใจคือ Server กับ Client ใช้ Environment ต่างกัน:

Server
Node.js 26

Client
V8 14.6.202

NUI
Browser UI Environment

ดังนั้น Node-only APIs เช่น Filesystem ไม่ควรถูกใช้ใน Client Script

นอกจากนี้ FiveM Node Runtime ยังมีเรื่อง Thread Affinity ซึ่ง Node callbacks บางประเภททำงานบน libuv Event Loop Thread ขณะที่ CitizenFX Server Natives ต้องทำงานบน Main Game Thread จึงอาจต้องใช้ setImmediate ก่อนเรียก FiveM Native

สิ่งที่ไม่ควรทำคือเห็นประกาศ Node.js 26 แล้วใส่

node_version '26'

ลงทุก fxmanifest.lua ทันที เพราะ Documentation Manifest ทั่วไปในปัจจุบันยังอธิบาย Legacy Node 16/22 ในขณะที่ Enhanced ประกาศ Node 26 เป็น Runtime ของ Cfx Server Enhanced โดยตรง

แนวทางที่ comsiam แนะนำคือ

Legacy Resource → Enhanced Test → Dependency Audit → Functional Test → Multiplayer → Restart Test → Load Test → Metrics → Production

หลังจาก Resource ทำงานเสถียรแล้วจึงค่อย

  • Upgrade npm

  • เปลี่ยน CommonJS → ESM

  • Refactor API

  • Modernize TypeScript

ถ้าต้องการ

สรุปสั้นที่สุด:

FiveM Enhanced Server JS → Node.js 26

FiveM Enhanced Client JS → V8 14.6.202

Script เก่า → ไม่จำเป็นต้อง Rewrite ทั้งหมด

npm Packages → ตรวจ Compatibility

Native Modules → เสี่ยงกว่าปกติ

Client ≠ Node Environment

Node Callback → ระวัง Thread Affinity

node_version 26 → อย่าเดา Configuration

Performance → ต้อง Benchmark จริง

การเปลี่ยนไป Node.js 26 จึงเป็นโอกาสสำคัญในการยกระดับ JavaScript Ecosystem ของ FiveM แต่ Production Server ควร Migration แบบควบคุม Dependency มากกว่าการ Update Package และ Rewrite Resource ทั้งระบบในครั้งเดียว

Comments

Popular posts from this blog

FiveM ยังน่าเล่นไหม? Enhanced เปลี่ยน FiveM แค่ไหน

FiveM คืออะไร เล่นอย่างไร สำหรับมือใหม่ เริ่มต้นตั้งแต่ศูนย์

วิธีตั้ง Admin Permission ด้วย add_ace และ add_principal FiveM แบบละเอียด