JavaScript FiveM คืออะไร? ใช้เขียน Script FiveM อย่างไร
JavaScript FiveM คือการใช้ภาษา JavaScript สำหรับเขียน Resource และ Script ที่ทำงานบน FiveM ทั้งฝั่ง Client และ Server
FiveM รองรับ JavaScript เป็นหนึ่งใน Scripting Runtime อย่างเป็นทางการร่วมกับ Lua และ C# ดังนั้น Developer ที่มีพื้นฐาน JavaScript หรือ Node.js อยู่แล้วสามารถนำความรู้เดิมมาต่อยอดกับ FiveM ได้ทันที ไม่จำเป็นต้องเปลี่ยนมาใช้ Lua เสมอไป
JavaScript สามารถใช้สร้างระบบต่าง ๆ ได้ เช่น
Command
Event
Vehicle
Player System
Job
Inventory
Database
Admin System
Networking
NUI
Resource Custom
แต่ต้องเข้าใจให้ชัดว่า FiveM Client JavaScript, FiveM Server JavaScript และ JavaScript ใน NUI ไม่ใช่ Environment เดียวกันทั้งหมด
บทความนี้จะอธิบายตั้งแต่ JavaScript FiveM คืออะไร ทำงานอย่างไร เขียน Client/Server Script อย่างไร ใช้ Native, Event และ Node.js ได้หรือไม่ รวมถึง JavaScript เหมาะกับใครเมื่อเทียบกับ Lua
① JavaScript FiveM คืออะไร
FiveM มี Scripting Runtime หลัก ได้แก่
Lua
JavaScript
C#
หากเลือก JavaScript ไฟล์ Script จะใช้นามสกุล
.js
ตัวอย่างเช่น
client.js
server.js
shared.js
ตัวอย่าง JavaScript ง่าย ๆ
console.log('Hello FiveM');
หรือสร้าง Command
RegisterCommand('hello', () => {
console.log('Hello FiveM!');
}, false);
Code นี้ใช้ JavaScript Syntax แต่เรียก API ของ FiveM
ดังนั้นภาพรวมคือ
JavaScript
+
FiveM Runtime
+
FiveM API
+
GTA V Natives
② FiveM รองรับ JavaScript จริงหรือไม่
รองรับอย่างเป็นทางการ
Cfx.re ระบุ JavaScript เป็นหนึ่งใน Scripting Runtime ของ FiveM โดยตรง เช่นเดียวกับ Lua และ C#
ดังนั้น JavaScript สามารถใช้เขียน Resource สำหรับ FiveM ได้โดยไม่ต้องแปลงเป็น Lua
ตัวอย่าง Resource
my_js_resource/
├── fxmanifest.lua
├── client.js
└── server.js
จากนั้น fxmanifest.lua สามารถกำหนดไฟล์ JavaScript ได้โดยตรง
fx_version 'cerulean'
game 'gta5'
client_script 'client.js'
server_script 'server.js'
FiveM จะเลือก Runtime ให้ตามชนิดของ Script ที่กำหนดไว้
③ JavaScript FiveM ใช้ฝั่ง Client ได้ไหม
ได้
Client JavaScript ทำงานบนเครื่องของผู้เล่นแต่ละคน
เหมาะกับงาน เช่น
Player Ped
Vehicle
Marker
Blip
Camera
Animation
Controls
Gameplay
NUI
GTA V Natives
ตัวอย่าง
const ped = PlayerPedId();
const coords = GetEntityCoords(ped);
console.log(coords);
Code นี้ทำงานฝั่ง Client
PlayerPedId() ใช้หา Player Ped และ GetEntityCoords() ใช้หา Coordinates ของ Entity
แนวคิดเหมือนกับ Lua เพียงแต่ Syntax ต่างกัน
④ JavaScript FiveM ใช้ฝั่ง Server ได้ไหม
ได้เช่นกัน
Server JavaScript ทำงานบน FXServer
เหมาะกับ Logic เช่น
Player Validation
Permission
Events
Database
Reward
Inventory
Server State
Security
Resource Logic
ตัวอย่าง
onNet('example:hello', () => {
console.log('Received event from client');
});
Server JavaScript สามารถรับ Network Event จาก Client ได้
ดังนั้น Resource หนึ่งสามารถใช้ JavaScript ทั้งสองฝั่งได้ เช่น
client.js
↓
FiveM Client
server.js
↓
FXServer
⑤ Client JavaScript กับ Server JavaScript ต่างกันอย่างไร
แม้ใช้ภาษาเดียวกัน แต่ Environment ต่างกัน
Client
ทำงานใน FiveM Client Runtime
สามารถเข้าถึง Game Natives ที่เกี่ยวข้องกับ Client เช่น
PlayerPedId();
GetEntityCoords();
Server
ทำงานใน Server JavaScript Runtime
ใช้สำหรับ Logic กลางของ Server และสามารถใช้ Node.js API บางส่วนตาม Runtime ที่ FiveM จัดเตรียมไว้
ดังนั้นไม่ใช่ Code ทุกบรรทัดจะย้ายจาก
client.js
ไป
server.js
แล้วทำงานเหมือนกัน
Developer ต้องตรวจ API Set ของ Native และ Function ทุกครั้ง
⑥ FiveM Client JavaScript คือ Browser JavaScript หรือไม่
ไม่ใช่
นี่เป็นเรื่องที่ Web Developer ต้องระวังมากที่สุด
FiveM Client JavaScript ไม่มี Browser API ทั่วไป เช่น
document
window
localStorage
IndexedDB
WebGL
ดังนั้น Code แบบนี้
document.getElementById('menu');
ไม่สามารถใช้ใน client.js ปกติได้เพียงเพราะเป็น JavaScript
เพราะ client.js ไม่ได้ทำงานอยู่ในหน้า Browser
⑦ แล้ว document ใช้ที่ไหนใน FiveM
document ใช้ใน JavaScript ของ NUI
ตัวอย่าง Resource
my_resource/
├── fxmanifest.lua
├── client.js
└── html/
├── index.html
├── style.css
└── app.js
ภายใน
html/app.js
สามารถใช้
const menu = document.getElementById('menu');
ได้ เพราะ NUI ทำงานใน Browser Environment
ดังนั้นต้องแยกสามส่วนนี้ออกจากกัน
FiveM Client JavaScript
≠
FiveM Server JavaScript
≠
NUI JavaScript
แม้ว่าทั้งหมดจะใช้ภาษา JavaScript เหมือนกัน
⑧ JavaScript FiveM รองรับ Native หรือไม่
รองรับ
Native ของ GTA V และ FiveM ถูก Map ให้เรียกเป็น Global JavaScript Function ได้
ตัวอย่าง Native เดิม
PLAYER_PED_ID
ใน JavaScript สามารถเรียก
PlayerPedId();
ตัวอย่างเต็ม
RegisterCommand('coords', () => {
const ped = PlayerPedId();
const coords = GetEntityCoords(ped);
console.log(coords);
}, false);
เมื่อใช้ Command coords จะดึงตำแหน่ง Player ออกมา
แนวคิดจึงแทบเหมือน Lua
Lua
local ped = PlayerPedId()
JavaScript
const ped = PlayerPedId();
สิ่งที่ต่างคือ Syntax ของภาษา ไม่ใช่ Native หลักที่เรียกใช้งาน
⑨ JavaScript FiveM มี Type Definitions ไหม
มี
Cfx.re แนะนำ Official NPM Packages สำหรับ Type Definitions ได้แก่
@citizenfx/client
@citizenfx/server
Package เหล่านี้ช่วย Editor เช่น Visual Studio Code แสดง
Auto Completion
Function Names
Parameter
Native Definitions
API Types
ทำให้การเขียน JavaScript หรือ TypeScript สำหรับ FiveM สะดวกขึ้น
โดยเฉพาะ Project ขนาดใหญ่
⑩ ตัวอย่างสร้าง Resource JavaScript ตัวแรก
สร้าง Folder
resources/
└── [local]/
└── js_training/
├── fxmanifest.lua
└── client.js
จากนั้นสร้าง fxmanifest.lua
fx_version 'cerulean'
game 'gta5'
author 'Your Name'
description 'My First FiveM JavaScript Resource'
version '1.0.0'
client_script 'client.js'
ใน client.js
console.log('JavaScript resource started');
จากนั้นเพิ่มใน server.cfg
ensure js_training
เมื่อ Resource Start ไฟล์ JavaScript จะถูกโหลดโดย FiveM Runtime
⑪ วิธีสร้าง Command ด้วย JavaScript FiveM
สามารถใช้
RegisterCommand()
ได้เหมือน Lua
ตัวอย่าง
RegisterCommand('hello', () => {
console.log('Hello FiveM');
}, false);
สามารถรับ Argument ได้
RegisterCommand('hello', (source, args) => {
const name = args[0];
if (name) {
console.log(`Hello ${name}`);
} else {
console.log('Please enter a name');
}
}, false);
ตัวอย่างการเรียก
hello John
ตรงนี้ได้ใช้พื้นฐาน JavaScript หลายเรื่องพร้อมกัน เช่น
Function
Array
Condition
Template Literal
⑫ Event ใน JavaScript FiveM ใช้อย่างไร
JavaScript Runtime ของ FiveM มี Function สำหรับ Event เช่น
on
onNet
emit
emitNet
สามารถคิดแบบง่าย ๆ ว่า
on
→ รับ Local Event
emit
→ ส่ง Local Event
onNet
→ รับ Network Event
emitNet
→ ส่ง Network Event
นี่เป็นพื้นฐานสำคัญมากของ JavaScript FiveM
⑬ Local Event ใช้อย่างไร
ตัวอย่าง
on('example:hello', () => {
console.log('Event received');
});
เรียกด้วย
emit('example:hello');
Flow คือ
emit
↓
Event Name
↓
on
↓
Callback Function
เหมาะสำหรับ Event ภายใน Context เดียวกัน
⑭ Client ส่ง Event ไป Server อย่างไร
Client JavaScript สามารถใช้
emitNet()
ส่ง Network Event ไป Server
ตัวอย่าง Client
RegisterCommand('testserver', () => {
emitNet('example:hello');
}, false);
Server
onNet('example:hello', () => {
console.log('Server received event');
});
Flow คือ
Client
↓
emitNet
↓
Network
↓
Server
↓
onNet
นี่เทียบได้กับแนวคิด TriggerServerEvent และ RegisterNetEvent ใน Lua
⑮ Server ส่ง Event ไป Client อย่างไร
Server ก็สามารถใช้ emitNet()
ตัวอย่าง Server
RegisterCommand('welcome', (source) => {
emitNet('example:welcome', source);
}, false);
Client
onNet('example:welcome', () => {
console.log('Welcome!');
});
Flow คือ
Server
↓
emitNet
↓
Client
↓
onNet
↓
Function
ถ้าต้องการส่งให้ทุก Client จาก Server สามารถใช้ Target ที่ FiveM กำหนดสำหรับ Broadcast เช่น -1 ตาม API ที่เกี่ยวข้อง
⑯ JavaScript FiveM มี setTick คืออะไร
JavaScript Runtime มี
setTick()
สำหรับสร้าง Function ที่ทำงานซ้ำตาม Tick
ตัวอย่าง
setTick(() => {
const ped = PlayerPedId();
});
แนวคิดคล้าย Loop ที่ต้องถูกเรียกต่อเนื่องใน FiveM
แต่ต้องระวัง Performance
ไม่ควรทำ Logic หนักทุก Tick หากไม่จำเป็น
⑰ วิธีทำ Loop ที่มี Delay
ใน JavaScript สามารถใช้แนวทาง Async เพื่อควบคุม Delay ได้
ตัวอย่าง Helper
const delay = (ms) =>
new Promise(resolve => setTimeout(resolve, ms));
จากนั้น
setTick(async () => {
await delay(1000);
console.log('Running...');
});
อย่างไรก็ตาม ต้องออกแบบ Loop ให้เหมาะกับ FiveM Runtime และไม่สร้าง Callback หรือ Task ซ้ำแบบไม่ตั้งใจ
สำหรับ Logic ที่ต้องทำทุก Frame setTick เหมาะกว่า แต่หากไม่ต้องตรวจทุก Tick ควรออกแบบ Interval ให้เหมาะสม
⑱ JavaScript Script กิน CPU ได้ไหม
ได้ ถ้าเขียนไม่ดี
ไม่ว่าภาษาจะเป็น
Lua
JavaScript
C#
ก็สามารถสร้าง Resource ที่กิน CPU ได้
เช่น
setTick(() => {
for (let i = 0; i < 1000000; i++) {
// งานหนัก
}
});
Code นี้พยายามทำงานจำนวนมากทุก Tick
ควรพิจารณา
ต้องทำทุก Tick จริงไหม
Cache ข้อมูลได้ไหม
ลด Native Calls ได้ไหม
ใช้ Event แทน Polling ได้ไหม
แยก Logic ออกจาก Rendering ได้ไหม
Performance ขึ้นกับ Architecture มากกว่าชื่อภาษาเพียงอย่างเดียว
⑲ JavaScript FiveM Server ใช้ Node.js ได้ไหม
ได้ใน Server Runtime
เอกสาร Cfx.re ปัจจุบันระบุว่า FiveM Server JavaScript มี Customized Node.js Runtime และสามารถใช้
require()
เพื่อเรียก Node Built-ins หรือ Package จาก node_modules ของ Resource ได้
ตัวอย่าง
const fs = require('fs');
จากนั้นสามารถใช้ Node.js API ที่รองรับใน Server Context
นี่เป็นข้อได้เปรียบสำหรับ Developer ที่มาจาก Node.js
⑳ FiveM Server ใช้ Node.js เวอร์ชันอะไร
ตามเอกสาร Cfx.re ปัจจุบัน Server JavaScript ใช้ Customized Node.js 16.x เป็นค่าเริ่มต้น
และสามารถเลือก Node.js 22 สำหรับ Server Script ได้ผ่าน Resource Manifest
ตัวอย่าง
node_version '22'
ใน fxmanifest.lua
เช่น
fx_version 'cerulean'
game 'gta5'
node_version '22'
server_script 'server.js'
เรื่องนี้สำคัญหาก Package ที่ใช้ต้องการ Node รุ่นใหม่
㉑ ต้องใช้ node_version '22' ทุก Resource ไหม
ไม่จำเป็น
ถ้า Resource ทำงานได้กับ Runtime Default และ Dependency ไม่ต้องการ Node.js 22 ก็ไม่จำเป็นต้องเพิ่ม
ควรเลือก Node Version ตาม Requirement ของ Project
อย่าเพิ่ม
node_version '22'
เพียงเพราะคิดว่าเลขเวอร์ชันสูงกว่าจะทำให้ Script เร็วขึ้นอัตโนมัติ
ควรดู Compatibility ของ Package ก่อน
㉒ JavaScript FiveM ใช้ npm ได้ไหม
สำหรับ Project JavaScript สามารถใช้ NPM Ecosystem ใน Development Workflow ได้
เช่น
npm
package.json
node_modules
TypeScript
ESLint
Prettier
Bundler
ตัวอย่างติดตั้ง Type Definitions
npm install --save-dev @citizenfx/client
หรือฝั่ง Server
npm install --save-dev @citizenfx/server
ถ้าเป็น Project TypeScript หรือ JavaScript ขนาดใหญ่ Tooling เหล่านี้ช่วยให้ดูแลง่ายขึ้นมาก
㉓ FiveM รองรับ package.json ไหม
Server JavaScript สามารถใช้ Node Package จาก node_modules ของ Resource ได้
ตัวอย่าง Structure
my_resource/
├── fxmanifest.lua
├── package.json
├── node_modules/
└── server.js
ใน server.js
const somePackage = require('some-package');
แต่ต้องตรวจว่า Package นั้น
รองรับ Node Version ที่ Resource ใช้อยู่
ไม่ต้องใช้ Environment ที่ FiveM ไม่มี
ไม่มี Native Binary Dependency ที่ไม่รองรับ
License ใช้งานได้ตาม Project
อย่าคิดว่า NPM Package ทุกตัวจะทำงานใน FiveM ได้โดยอัตโนมัติ
㉔ FiveM JavaScript Server กับ Node.js ปกติเหมือนกันไหม
ไม่ทั้งหมด
ถึง Server Runtime จะมี Node.js API แต่ FiveM มี Runtime Integration ของตัวเอง
โดยเฉพาะเรื่อง Thread Affinity
Callback บางอย่างจาก Node.js อาจทำงานบน Thread ของ libuv แต่ CitizenFX Server Native ต้องถูกเรียกบน Main Game Thread
ดังนั้นบางกรณีต้องใช้
setImmediate()
เพื่อกลับมารัน Logic ที่เรียก FiveM Native บน Thread ที่เหมาะสม
นี่เป็นเรื่องขั้นสูงที่ Developer ฝั่ง Node.js ควรรู้
㉕ ตัวอย่างปัญหา Thread Affinity
สมมติอ่านไฟล์ด้วย Node.js
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
// Node callback
});
ถ้าต้องการเรียก CitizenFX Native หรือบาง Runtime Function จาก Callback ที่อยู่ผิด Thread อาจเกิด Error
แนวทางที่ Cfx.re แนะนำในกรณีที่ต้องกลับ Main Thread คือ
fs.readFile('example.txt', 'utf8', (err, data) => {
setImmediate(() => {
console.log(data);
});
});
แต่ไม่จำเป็นต้องใช้ setImmediate() ทุก Callback
ใช้เมื่อมี Requirement ด้าน Thread Affinity จริง ๆ
㉖ JavaScript FiveM ใช้ Export ได้ไหม
ได้
สร้าง Export เช่น
exports('getPrice', () => {
return 500;
});
Resource อื่นสามารถเรียกตามชื่อ Resource และ Export
แนวคิดคือ
Resource A
↓
Export Function
↓
Resource B
การใช้ Export ช่วยให้ Resource แยก Module ออกจากกันได้ดีขึ้น
㉗ JavaScript FiveM ใช้ Database ได้ไหม
ได้
Server JavaScript สามารถเชื่อม Database ผ่าน Library หรือ Resource ที่รองรับ
ตัวอย่าง Architecture
FiveM Server JavaScript
↓
Database Library
↓
MySQL / MariaDB
↓
Database
ใช้เก็บข้อมูล เช่น
Character
Money
Vehicle
Inventory
Job
House
Transaction
สิ่งสำคัญคือ Database Logic ควรอยู่ Server-side
อย่าให้ Client ติดต่อ Database โดยตรง
㉘ JavaScript FiveM ใช้กับ oxmysql ได้ไหม
สามารถใช้งานกับ Resource/Library ที่รองรับ JavaScript API ของ oxmysql ได้ตาม Version และวิธีที่ Library กำหนด
ก่อนใช้ควรตรวจ Documentation ของ Version ที่ติดตั้ง เพราะ Syntax และ Export อาจเปลี่ยนได้
หลักสำคัญคือ
Client
↓
Server Event
↓
Server JavaScript
↓
Database Layer
↓
MySQL / MariaDB
Server ควรเป็นผู้ตรวจสอบข้อมูลก่อนทำ Query ที่สำคัญ
㉙ JavaScript FiveM ใช้กับ NUI ดีไหม
ดีมาก โดยเฉพาะ Developer ที่มีพื้นฐาน Web อยู่แล้ว
ตัวอย่าง Resource
my_ui/
├── fxmanifest.lua
├── client.js
└── html/
├── index.html
├── style.css
└── app.js
Game Script ใช้ JavaScript
และ UI ก็ใช้ JavaScript
แต่ทั้งสอง Environment ยังต้องแยกจากกัน
ตัวอย่าง
FiveM client.js
↓
NUI Message
↓
html/app.js
↓
DOM
ข้อดีคือ Developer ใช้พื้นฐานภาษาเดียวกันได้ทั้ง Game Script และ UI Logic
㉚ JavaScript FiveM ใช้กับ React หรือ Vue ได้ไหม
ได้ในส่วนของ NUI Development
สามารถสร้าง Front-end ด้วย
React
Vue
Svelte
หรือ Framework อื่น
จากนั้น Build เป็น Static Assets สำหรับ NUI
Architecture ตัวอย่าง
React / Vue
↓
Build
↓
HTML / CSS / JavaScript
↓
FiveM NUI
แต่สำหรับมือใหม่ไม่จำเป็นต้องเริ่มจาก React
HTML + CSS + JavaScript ธรรมดาก็เพียงพอสำหรับเรียน Flow ของ NUI ก่อน
㉛ JavaScript FiveM กับ TypeScript ต่างกันอย่างไร
JavaScript เป็น Runtime ที่ FiveM รันโดยตรง
ส่วน TypeScript โดยทั่วไปต้อง
TypeScript
↓
Compile / Bundle
↓
JavaScript
↓
FiveM Runtime
TypeScript เพิ่ม Type Checking เช่น
const money: number = 5000;
ทำให้ Project ขนาดใหญ่สามารถตรวจ Error บางประเภทก่อน Runtime ได้
ดังนั้นถ้าคุ้น TypeScript อยู่แล้ว ก็เป็นตัวเลือกที่ดีสำหรับ FiveM JavaScript Project
㉜ TypeScript เป็น Runtime ตัวที่สี่ของ FiveM หรือไม่
ไม่ใช่
FiveM Runtime หลักคือ
Lua
JavaScript
C#
TypeScript เป็นภาษา Development ที่ Compile เป็น JavaScript
ดังนั้นอย่าคิดว่า FiveM มี
Lua
JavaScript
TypeScript
C#
เป็น Runtime สี่ชุดแยกจากกัน
TypeScript ยังทำงานผ่าน JavaScript Runtime หลัง Build
㉝ JavaScript ใช้กับ ESX ได้ไหม
ได้ หาก Resource หรือ API ที่ใช้งานรองรับ Flow ที่คุณต้องการ
แต่ Ecosystem ของ ESX มี Lua Resource จำนวนมาก
ถ้าตั้งใจอ่าน แก้ หรือพัฒนา ESX Resource ที่มีอยู่ การรู้ Lua ยังมีประโยชน์มาก
JavaScript Developer สามารถเขียน Standalone Resource หรือ Integration ของตัวเองได้ แต่ต้องเข้าใจ API และ Event ของ Framework
㉞ JavaScript ใช้กับ QBCore ได้ไหม
ได้ในเชิง FiveM Runtime แต่ QBCore Resource จำนวนมากใช้ Lua
ดังนั้นถ้าเป้าหมายคือแก้ Core หรือ Script Community จำนวนมาก การอ่าน Lua ได้จะช่วยมาก
อย่างไรก็ตาม FiveM ไม่ได้บังคับว่าทุก Resource ใน QBCore Server ต้องเขียน Lua เท่านั้น
Resource Custom สามารถใช้ Runtime อื่นได้ถ้า Integration ถูกออกแบบอย่างเหมาะสม
㉟ JavaScript ใช้กับ Qbox ได้ไหม
ได้ในหลักการเดียวกัน
Framework ไม่ได้เปลี่ยนข้อเท็จจริงว่า FiveM รองรับ JavaScript Runtime
สิ่งที่สำคัญคือ
API
Export
Event
Dependency
Data Structure
ต้องตรงกับ Framework ที่ใช้อยู่
หาก Community Resource เขียน Lua อยู่ ก็ยังต้องอ่าน Lua หากต้องการแก้ Resource นั้นโดยตรง
㊱ JavaScript กับ Lua FiveM อะไรง่ายกว่า
สำหรับคนไม่เคย Programming มาก่อน Lua มักเริ่มง่ายกว่า
ตัวอย่าง Lua
local money = 5000
if money >= 1000 then
print('Enough')
end
JavaScript
const money = 5000;
if (money >= 1000) {
console.log('Enough');
}
ทั้งสองไม่ได้ยากมาก
แต่ Lua มี Syntax กระชับกว่า
ส่วน JavaScript มี Ecosystem และ Tooling ใหญ่มากกว่า
㊲ JavaScript กับ Lua FiveM ต่างกันอย่างไร
| หัวข้อ | Lua | JavaScript |
|---|---|---|
| FiveM รองรับโดยตรง | ✅ | ✅ |
| เหมาะกับมือใหม่ | ดีมาก | ดี |
| Community FiveM | ใหญ่มาก | ใหญ่ |
| Web Development | ปานกลาง | ดีมาก |
| NUI Workflow | ดี | ดีมาก |
| Node.js Server APIs | ไม่ใช่ Node | ✅ |
| TypeScript | ❌ | ✅ |
| npm Ecosystem | ไม่ใช่หลัก | ✅ |
| Syntax | กระชับ | Familiar สำหรับ Web Dev |
| Framework Community Scripts | เยอะมาก | มี |
ถ้าไม่มีพื้นฐานภาษาใด Lua เป็นจุดเริ่มต้นที่ดี
แต่ถ้าเขียน JavaScript หรือ Node.js อยู่แล้ว JavaScript เป็นตัวเลือกที่สมเหตุสมผลมาก
㊳ JavaScript FiveM Performance ดีกว่า Lua ไหม
ไม่ควรสรุปแบบนั้น
Performance ของ Resource ขึ้นกับ
Architecture
Loop
Tick
Native Calls
Event Frequency
Network Traffic
Database Query
Memory
NUI
Algorithm
มากกว่าการเลือกภาษาจาก Benchmark เดียว
Script JavaScript ที่เขียนไม่ดีสามารถช้ากว่า Lua ที่เขียนดี และกลับกันก็ได้
เลือกภาษาจากความถนัดและ Maintainability ก่อน แล้ว Optimize จาก Profiling จริง
㊴ JavaScript FiveM ปลอดภัยกว่า Lua ไหม
ภาษาไม่ได้ทำให้ Script ปลอดภัยขึ้นอัตโนมัติ
ตัวอย่าง Server Event
onNet('shop:buy', (item, amount) => {
// ต้องตรวจสอบข้อมูล
});
Server ควรตรวจ
Player
Item
Price
Amount
Permission
State
Distance
Cooldown
ไม่ควรเชื่อข้อมูล Client เพียงเพราะ Script เขียนด้วย JavaScript
Security เป็นเรื่องของ Architecture และ Server-side Validation
㊵ Error ที่พบบ่อยใน JavaScript FiveM
ReferenceError
ตัวอย่าง
ReferenceError: player is not defined
แปลว่ากำลังเรียก Variable ที่ไม่มีอยู่ใน Scope
TypeError
เช่น
Cannot read properties of undefined
มักเกิดจาก Object หรือ Variable ไม่มีข้อมูลตามที่คาดไว้
Native ไม่ทำงาน
ตรวจว่า Native นั้นรองรับ Client หรือ Server Context ที่กำลังเรียกหรือไม่
document is not defined
ถ้าเกิดใน client.js มักเป็นเพราะพยายามใช้ Browser DOM API ใน FiveM Client Runtime
Cannot find module
ฝั่ง Server อาจเกี่ยวกับ Node Package หรือ node_modules
No current resource manager
ในบาง Node Callback อาจเกี่ยวกับ Thread Affinity เมื่อพยายามเรียก CitizenFX Native จาก Thread ที่ไม่ถูกต้อง
อ่าน Error ให้ครบก่อนแก้ Code
㊶ วิธี Debug JavaScript FiveM
ใช้
console.log()
เพื่อตรวจค่า
ตัวอย่าง
const ped = PlayerPedId();
console.log('ped:', ped);
หรือ
onNet('example:data', (data) => {
console.log('received:', data);
});
จากนั้นดู Client หรือ Server Console ตาม Context
แนวทางคือ
Resource
↓
File
↓
Line
↓
Variable
↓
Event
↓
Error Message
อย่าแก้ Code แบบสุ่ม
㊷ มือใหม่ควรเรียน JavaScript อะไรก่อน FiveM
อย่างน้อยควรรู้
Variable
const / let
String
Number
Boolean
Array
Object
if / else
Function
Arrow Function
Loop
Scope
Promise
async / await
จากนั้นค่อยต่อด้วย
Resource
fxmanifest.lua
Client
Server
Native
Event
Networking
NUI
Database
Security
Optimization
ไม่จำเป็นต้องเรียน JavaScript ทั้งหมดก่อนสร้าง Resource แรก
㊸ Project สำหรับฝึก JavaScript FiveM
แนะนำทำตามลำดับ
Project 1
สร้าง /hello
Project 2
Command แสดง Coordinates
Project 3
Spawn Vehicle
Project 4
สร้าง Marker
Project 5
ตรวจ Distance
Project 6
Client → Server Event
Project 7
Server → Client Event
Project 8
สร้าง Export
Project 9
เชื่อม Database
Project 10
สร้าง NUI
เมื่อทำครบจะได้พื้นฐาน JavaScript FiveM ที่ค่อนข้างครอบคลุม
㊹ JavaScript FiveM เหมาะกับใคร
เหมาะมากกับคนที่
เป็น Web Developer
เขียน JavaScript อยู่แล้ว
ใช้ Node.js
ใช้ TypeScript
ต้องการสร้าง NUI
ต้องการใช้ npm Tooling
ชอบ JavaScript Ecosystem
แต่ถ้ายังไม่เคย Programming และต้องการเรียน FiveM Community Script จำนวนมาก การเริ่ม Lua ก็ยังเป็นทางเลือกที่ดี
㊺ ควรเลือก JavaScript หรือ Lua สำหรับ FiveM
ใช้หลักง่าย ๆ
ไม่มีพื้นฐาน Programming
เลือก
Lua
เป็นจุดเริ่มต้นได้ง่าย
เป็น JavaScript Developer อยู่แล้ว
เลือก
JavaScript
ได้เลย
ทำ Web + NUI เยอะ
JavaScript หรือ TypeScript มีข้อได้เปรียบด้าน Workflow
ต้องแก้ Script Community Lua จำนวนมาก
เรียน Lua เพิ่มด้วยจะคุ้มมาก
ไม่จำเป็นต้องยึดว่าต้องมีเพียงภาษาเดียวตลอดชีวิตการทำ FiveM Development
คำถามที่พบบ่อยเกี่ยวกับ JavaScript FiveM
FiveM ใช้ JavaScript ได้ไหม
ได้ FiveM รองรับ JavaScript เป็น Scripting Runtime อย่างเป็นทางการ
JavaScript ใช้เขียน Client Script ได้ไหม
ได้ โดยใช้ไฟล์ .js และ API ฝั่ง Client
JavaScript ใช้เขียน Server Script ได้ไหม
ได้ และ Server Runtime สามารถใช้ Node.js API ที่ FiveM รองรับได้
FiveM JavaScript ใช้ Node.js ได้ไหม
ฝั่ง Server ใช้ได้ โดย Runtime ปัจจุบันมี Customized Node.js 16.x เป็นค่าเริ่มต้น และสามารถเลือก Node.js 22 ผ่าน node_version '22'
client.js ใช้ document ได้ไหม
ไม่ได้ เพราะ FiveM Client JavaScript ไม่ใช่ Browser Environment
document ใช้ที่ไหน
ใช้ใน JavaScript ของ NUI ซึ่งทำงานใน Browser Context
JavaScript ใช้ GTA V Native ได้ไหม
ได้ Native ถูก Map เป็น JavaScript Functions
JavaScript FiveM ใช้ npm ได้ไหม
สามารถใช้ npm และ Node Package ใน Development/Server Workflow ตามข้อจำกัดของ Runtime และ Package
JavaScript FiveM ใช้ TypeScript ได้ไหม
ได้ โดย Compile หรือ Bundle TypeScript เป็น JavaScript และ Cfx.re มี Official Type Definitions สำหรับ FiveM API
JavaScript หรือ Lua ดีกว่า
ไม่มีคำตอบเดียว ถ้าไม่มีพื้นฐาน Lua เป็นตัวเลือกเริ่มต้นที่ดี แต่ถ้าเก่ง JavaScript อยู่แล้ว JavaScript เหมาะมาก
สรุป JavaScript FiveM คืออะไร
JavaScript FiveM คือการใช้ JavaScript Runtime ของ FiveM เพื่อสร้าง Resource และ Script ทั้งฝั่ง Client และ Server
FiveM รองรับ JavaScript อย่างเป็นทางการ และ Developer สามารถใช้
JavaScript
Native
Event
Export
Node.js
npm
TypeScript
NUI
Database
ร่วมกันเพื่อสร้างระบบ FiveM ระดับจริงจังได้
สิ่งที่ต้องจำให้แม่นคือ
FiveM Client JavaScript
≠
Browser JavaScript
FiveM Server JavaScript
≠
Client Runtime
NUI JavaScript
= Browser Environment
ถ้าเข้าใจสาม Environment นี้ตั้งแต่แรก จะลดความสับสนและ Error ได้มาก
สำหรับผู้ที่เรียน FiveM Developer กับ comsiam หากมีพื้นฐาน Web Development, JavaScript หรือ Node.js อยู่แล้ว ไม่จำเป็นต้องทิ้งความรู้เดิมแล้วเริ่ม Lua จากศูนย์ เพราะ JavaScript เป็น Runtime ที่ FiveM รองรับโดยตรง
เมื่อเข้าใจ Resource, Client/Server, Native และ Event แล้ว คุณสามารถต่อยอดไป TypeScript, Database, NUI, Networking, Security และการ Optimize Resource ได้ และบทความถัดไปของ comsiam จะเจาะเรื่อง TypeScript สำหรับ FiveM โดยตรง
Comments
Post a Comment