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 ต่างกันอย่างไร

หัวข้อLuaJavaScript
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

Popular posts from this blog

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

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

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