FiveM oficjalnie obsługuje Lua, JavaScript i C#. Wybierz środowisko uruchomieniowe, które pasuje do Twojego frameworka, umiejętności zespołu i wymaganych bibliotek – a nie rzekomy uniwersalny ranking wydajności. Wszystkie trzy mogą wywoływać natywne funkcje FiveM, obsługiwać zdarzenia i udostępniać zasoby API. Praktyczne różnice to granice środowiska uruchomieniowego, ekosystem pakietów, przepływ pracy kompilacji i kod już używany przez Twoje zależności.
Przegląd 10 sierpnia 2026 r. w oparciu o oficjalną dokumentację Cfx.re dla obsługiwanych środowisk uruchomieniowych, wprowadzenie do skryptów I manifesty zasobów. Zachowanie środowiska uruchomieniowego może się zmieniać, dlatego zweryfikuj te strony przed rozpoczęciem długoterminowego projektu.
Porównanie języków FiveM
| Środowisko uruchomieniowe | Dobry wybór | Ważna granica | Typowy przepływ pracy |
|---|---|---|---|
| Lua | Istniejące Lua frameworki, kompaktowe zasoby i bezpośrednie FiveM przykłady | CfxLua to zmodyfikowane środowisko uruchomieniowe Lua 5.4, a nie dowolna instalacja systemu Lua | Edytuj pliki źródłowe i ładuj je za pomocą manifestu zasobu |
| JavaScript | Zespoły używające narzędzi JavaScript/TypeScript i npm | Skrypty klienta nie otrzymują API przeglądarki ani Node.js; skrypty serwera używają środowiska uruchomieniowego Node FiveM | Uruchom źródło bezpośrednio lub skompiluj/zbuduj TypeScript do wymienionych w manifeście JavaScript |
| C# | .Zespoły .NET, typowany kod domenowy i skompilowane projekty | Zasób musi dostarczyć zestawy i pliki oczekiwane przez środowisko uruchomieniowe Cfx.re | Kompiluj z szablonu Cfx.re, a następnie wdrażaj wynik kompilacji |
Lua: bezpośrednia ścieżka frameworka
dokumenty Cfx.re CfxLua jako zmodyfikowane środowisko uruchomieniowe Lua 5.4. Ma to znaczenie przy porównywaniu kodu FiveM z starszymi samouczkami Lua: funkcje językowe i zachowanie środowiska uruchomieniowego powinny być sprawdzane względem CfxLua, a nie wywnioskowane z pakietu systemu operacyjnego serwera.
Lua jest zazwyczaj najmniej inwazyjnym wyborem, gdy framework i sąsiednie zasoby są już napisane w Lua. Możesz zachować zdarzenia, eksporty i współdzieloną konfigurację w tym samym języku i uniknąć dodawania kroku kompilacji tylko dla stylu. Mały manifest może wymieniać oddzielne skrypty klienta, serwera i współdzielone. Trzymaj tajne dane i kontrole uprawnień dostępne tylko na serwerze z dala od plików klienta, nawet gdy obie strony używają Lua.
Krótka składnia ułatwia skanowanie obsługi zdarzeń, ale nie zastępuje projektowania interfejsu. Dokumentuj każde ładunek zdarzenia, waliduj wartości na serwerze i unikaj traktowania zdarzenia klienta jako dowodu na to, że pieniądze, ekwipunek lub uprawnienia są prawidłowe.
JavaScript i TypeScript: wiedz, która strona działa
Oficjalny Przewodnik po środowisku uruchomieniowym JavaScript opisuje obsługę ES2017 i krytyczny podział klient/serwer. Skrypty klienta działają w środowisku uruchomieniowym klienta FiveM i nie mają obiektów przeglądarki API ani obiektów Node.js API. Skrypty serwera używają niestandardowego środowiska uruchomieniowego Node.js. Domyślna udokumentowana wersja serwera to Node.js 16; zasób może wybrać Node.js 22 z node_version '22' w fxmanifest.lua.
Nie zakładaj, że pakiet działający w zwykłym projekcie Node działa również w skrypcie klienta FiveM. Umieść zależności systemu plików, bazy danych i po stronie serwera npm na granicy serwera. W przypadku definicji edytora i TypeScript, Cfx.re publikuje @citizenfx/client I @citizenfx/server pakiety. Poprawiają sprawdzanie typów, ale nie przyznają uprawnień API, których brakuje wybranemu środowisku uruchomieniowemu.
FiveM dokumentuje również ograniczenia powiązań wątków dla niektórych wywołań natywnych po stronie serwera. Kiedy asynchroniczny kod Node musi powrócić do głównego wątku gry, postępuj zgodnie z wytycznymi środowiska uruchomieniowego i użyj setImmediate gdzie jest to wymagane. Przetestuj zbudowany JavaScript, który faktycznie wdrażasz, w tym mapy źródłowe i kolejność uruchamiania, zamiast tylko źródła TypeScript.
C#: użyj obsługiwanego kształtu projektu
The Dokumentacja środowiska uruchomieniowego C# dostarcza aktualne szablony projektów i wskazówki dotyczące kompilacji. Zacznij od tego, zamiast kopiować stary układ zespołu z niepowiązanego .NET application. Zasób C# zazwyczaj ma projekt, który odwołuje się do obsługiwanych zestawów CitizenFX, kompiluje swój kod i umieszcza wynikowe pliki tam, gdzie manifest może je załadować.
C# może być dobrym wyborem, gdy zespół już korzysta z typów, narzędzi i praktyk testowych .NET. Kompromisem jest operacyjny: współtwórcy i CI potrzebują poprawnego SDK i polecenia kompilacji, a wdrożony artefakt musi pozostać zsynchronizowany ze swoim źródłem. Zapisz szablon, docelową strukturę i proces wydawania w repozytorium, aby aktualizacja serwera była odtwarzalna.
Współdzielony model: manifesty, natywy, zdarzenia i eksporty
Wybór języka nie zmienia kontraktu zasobu. Każdy zasób potrzebuje fxmanifest.lua który deklaruje metadane i pliki do załadowania. Kod klienta działa dla połączonych graczy; kod serwera działa pod FXServer. Pliki współdzielone są dostarczane po obu stronach, więc nie mogą zawierać poświadczeń ani decyzji zaufania tylko dla serwera.
- Natywy ujawniaj funkcje gry i platformy. Sprawdź bieżące odniesienie do funkcji natywnych i czy funkcja natywna jest po stronie klienta czy serwera.
- Wydarzenia przesyłaj wiadomości w obrębie lub między granicami klienta/serwera. Traktuj dane wejściowe sieci jako niezaufane i weryfikuj je po stronie serwera.
- Eksporty publikuj funkcje dla innych zasobów. Dokumentuj nazwy, parametry, wartości zwracane i zależności przy uruchamianiu.
- Zależności należą do manifestu lub kolejności uruchamiania serwera, gdy inny zasób musi być dostępny jako pierwszy.
Serwer z wieloma językami jest normalny. Stabilną granicą jest udokumentowane zdarzenie lub eksport, a nie język implementacji stojący za nim. To umożliwia wymianę jednego zasobu bez przepisywania całego stosu.
Jak wybrać dla prawdziwego projektu
- Zacznij od frameworka. Jeśli serwer zależy od ustalonego ESX, QBCore, Qbox lub zasobu samodzielnego, użyj jego obsługiwanych punktów rozszerzeń i konwencji językowych.
- Wymień wymagane biblioteki. Potwierdź, że każdy sterownik bazy danych, UI bridge i pakiet są zgodne z uruchomionym środowiskiem klienta lub serwera.
- Dopasuj zespół. Preferuj język, który współtwórcy mogą recenzować, testować i utrzymywać po odejściu oryginalnego autora.
- Zdefiniuj kompilację. Lua może być wysyłany bezpośrednio; TypeScript i C# zazwyczaj wymagają powtarzalnej kompilacji i czystego katalogu wyjściowego.
- Prototypuj granicę. Udowodnij jedno wywołanie natywne, jedno zdarzenie sieciowe zweryfikowane przez serwer, jeden eksport i jeden restart zależności przed zbudowaniem pełnej funkcji.
Minimalna lista kontrolna weryfikacji
- Uruchom zasób na serwerze stagingowym i sprawdź logi serwera oraz klienta F8.
- Połącz ponownie czystego klienta i zrestartuj zasób, aby ujawnić brakujące pliki lub założenia dotyczące kolejności.
- Wysyłaj nieprawidłowe i nieautoryzowane ładunki zdarzeń i potwierdź, że serwer je odrzuca.
- Zweryfikuj udokumentowaną wersję Node lub wynik kompilacji .NET na rzeczywistym hoście wdrożenia.
- Przypnij wersje zależności i zachowaj kopię zapasową ostatniego działającego zasobu.
Nie ma żadnego opartego na dowodach powodu, aby okrzyknąć jeden z trzech języków programowania FiveM jako uniwersalnie najszybszy lub najpopularniejszy dla każdego zasobu. Wybierz Lua, JavaScript/TypeScript lub C# na podstawie faktów dotyczących środowiska uruchomieniowego, otaczającego frameworka i kosztów utrzymania, na które Twój zespół faktycznie może sobie pozwolić.
