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 มาตรฐาน เช่น
ononNetemitemitNetexportssetTick
และไม่มี 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 รองรับ
เช่น
fspathcryptorequirenode_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
.nodePackage เก่ามาก
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 ยาก
⑯ ทำไมต้องลดจำนวนสิ่งที่เปลี่ยนพร้อมกัน?
สมมติคุณทำพร้อมกัน
Legacy → Enhanced
Node รุ่นเก่า → Node 26
npm Update ทุก Package
Rewrite JavaScript
เปลี่ยน 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 ตัวอย่าง
| Resource | npm | Native Module | Enhanced | สถานะ |
|---|---|---|---|---|
| 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
Post a Comment