{"id":162272,"date":"2024-10-11T19:50:33","date_gmt":"2024-10-11T17:50:33","guid":{"rendered":"https:\/\/hifivem.com\/?p=162272"},"modified":"2026-08-10T07:53:30","modified_gmt":"2026-08-10T05:53:30","slug":"fivem-kodierungssprachen","status":"publish","type":"post","link":"https:\/\/rpcrate.com\/de\/fivem-coding-languages\/","title":{"rendered":"FiveM Programmiersprachen: Lua, JavaScript und C# im Vergleich"},"content":{"rendered":"<p><strong>FiveM unterst\u00fctzt offiziell Lua, JavaScript und C#. W\u00e4hle die Laufzeitumgebung, die zu deinem Framework, den F\u00e4higkeiten deines Teams und den ben\u00f6tigten Bibliotheken passt \u2013 nicht eine vermeintliche universelle Leistungsrangliste.<\/strong> Alle drei k\u00f6nnen FiveM-Natives aufrufen, Ereignisse verarbeiten und Ressourcen-APIs bereitstellen. Die praktischen Unterschiede liegen in der Laufzeitgrenze, dem Paket-\u00d6kosystem, dem Build-Workflow und dem Code, der bereits von deinen Abh\u00e4ngigkeiten verwendet wird.<\/p>\n<p>Die hier gezeigten Konfigurations- und Codebeispiele beziehen sich auf FiveM f\u00fcr GTA V Legacy. Enhanced hat andere Laufzeit- und Kompatibilit\u00e4tsregeln; \u00fcberpr\u00fcfe <a href=\"https:\/\/docs.fivem.net\/docs\/developers\/legacy-vs-enhanced\/\">die Legacy-zu-Enhanced-\u00c4nderungen von Cfx.re<\/a> bevor du sie auf einen Enhanced-Server anwendest.<\/p>\n<h2 id=\"fivem-language-comparison\">FiveM Sprachvergleich<\/h2>\n<div aria-label=\"Horizontal verschiebbare Tabelle\" class=\"fmx-guide-table\" role=\"region\" tabindex=\"0\">\n<table>\n<thead>\n<tr>\n<th>Laufzeitumgebung<\/th>\n<th>Geeignet f\u00fcr<\/th>\n<th>Wichtige Grenze<\/th>\n<th>Typischer Arbeitsablauf<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Lua<\/td>\n<td>Bestehende Lua-Frameworks, kompakte Ressourcen und direkte FiveM-Beispiele<\/td>\n<td>CfxLua ist eine modifizierte Lua 5.4-Laufzeitumgebung, keine beliebige System-Lua-Installation<\/td>\n<td>Bearbeite Quelldateien und lade sie \u00fcber das Ressourcen-Manifest<\/td>\n<\/tr>\n<tr>\n<td>JavaScript<\/td>\n<td>Teams, die JavaScript\/TypeScript und npm-Tools verwenden<\/td>\n<td>Client-Skripte erhalten keine Browser- oder Node.js-APIs; Server-Skripte verwenden FiveMs Node-Laufzeitumgebung<\/td>\n<td>F\u00fchre Quellcode direkt aus oder kompiliere beziehungsweise b\u00fcndele TypeScript zu JavaScript, das im Manifest aufgef\u00fchrt ist<\/td>\n<\/tr>\n<tr>\n<td>C#<\/td>\n<td>.NET-Teams, typisierter Dom\u00e4nencode und kompilierte Projekte<\/td>\n<td>Die Ressource muss die von der Cfx.re-Laufzeitumgebung erwarteten Assemblies und Dateien liefern<\/td>\n<td>Erstelle aus einer Cfx.re-Vorlage und stelle dann die Build-Ausgabe bereit<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h2 id=\"lua-the-direct-framework-path\">Lua: der direkte Framework-Pfad<\/h2>\n<p>Cfx.re dokumentiert <a href=\"https:\/\/docs.fivem.net\/docs\/scripting-manual\/runtimes\/lua\/\" rel=\"nofollow noopener\">CfxLua als modifizierte Lua 5.4 Laufzeit<\/a>. Das ist wichtig, wenn du FiveM-Code mit \u00e4lteren Lua-Tutorials vergleichst: Sprachfunktionen und Laufzeitverhalten sollten gegen CfxLua gepr\u00fcft werden, nicht aus dem Betriebssystempaket eines Servers abgeleitet werden.<\/p>\n<p>Lua ist normalerweise die am wenigsten st\u00f6rende Wahl, wenn das Framework und benachbarte Ressourcen bereits in Lua geschrieben sind. Du kannst Ereignisse, Exporte und gemeinsame Konfiguration in derselben Sprache beibehalten und vermeiden, einen Build-Schritt nur f\u00fcr den Stil hinzuzuf\u00fcgen. Ein kleines Manifest kann separate Client-, Server- und gemeinsame Skripte auflisten. Halte serverseitige Geheimnisse und Berechtigungspr\u00fcfungen aus Client-Dateien heraus, auch wenn beide Seiten Lua verwenden.<\/p>\n<p>Die kurze Syntax erleichtert das Scannen von Event-Handlern, ersetzt aber nicht das Interface-Design. Dokumentiere jede Event-Payload, validiere Werte auf dem Server und behandle ein Client-Event nicht als Beweis daf\u00fcr, dass Geld, Inventar oder Berechtigungen g\u00fcltig sind.<\/p>\n<h2 id=\"javascript-and-typescript-know-which-side-is-running\">JavaScript und TypeScript: Beachte, auf welcher Seite der Code l\u00e4uft<\/h2>\n<p class=\"translation-block\">Die offizielle <a href=\"https:\/\/docs.fivem.net\/docs\/scripting-manual\/runtimes\/javascript\/\" rel=\"nofollow noopener\">Anleitung zur JavaScript-Laufzeit<\/a> beschreibt die ES2017-Unterst\u00fctzung und eine wichtige Trennung zwischen Client und Server. Client-Skripte laufen in der FiveM-Client-Laufzeit und haben weder Browser-APIs noch Node.js-APIs. Server-Skripte nutzen eine angepasste Node.js-Laufzeit. F\u00fcr die Legacy-Laufzeit ist Node.js 16 als Serverstandard dokumentiert; eine Ressource kann mit <code>node_version '22'<\/code> in <code>fxmanifest.lua<\/code> Node.js 22 ausw\u00e4hlen.<\/p>\n<p>Gehe nicht davon aus, dass ein Paket, das in einem gew\u00f6hnlichen Node-Projekt funktioniert, auch in einem FiveM-Client-Skript funktioniert. Platziere Dateisystem-, Datenbank- und serverseitige npm-Abh\u00e4ngigkeiten an der Servergrenze. F\u00fcr Editor- und TypeScript-Definitionen ver\u00f6ffentlicht Cfx.re die <code data-no-translation=\"\" translate=\"no\">@citizenfx\/client<\/code> und <code data-no-translation=\"\" translate=\"no\">@citizenfx\/server<\/code> Pakete. Diese verbessern die Typ\u00fcberpr\u00fcfung, gew\u00e4hren aber keine APIs, die der ausgew\u00e4hlten Laufzeit fehlen.<\/p>\n<p>FiveM dokumentiert auch Thread-Affinit\u00e4tsbeschr\u00e4nkungen f\u00fcr einige serverseitige native Aufrufe. Wenn asynchroner Node-Code zum Haupt-Game-Thread zur\u00fcckkehren muss, befolge die Laufzeitanleitung und verwende <code data-no-translation=\"\" translate=\"no\">setImmediate<\/code> wo erforderlich. Teste das erstellte JavaScript, das du tats\u00e4chlich bereitstellst, einschlie\u00dflich Source Maps und Startreihenfolge, anstatt nur die TypeScript-Quelle.<\/p>\n<h2 id=\"c-use-the-supported-project-shape\">C#: Verwende die unterst\u00fctzte Projektform<\/h2>\n<p class=\"translation-block\">Die <a href=\"https:\/\/docs.fivem.net\/docs\/scripting-manual\/runtimes\/csharp\/\" rel=\"nofollow noopener\">C#-Laufzeitdokumentation<\/a> bietet aktuelle Projektvorlagen und Build-Anleitungen. Beginne dort, statt eine alte Assembly-Struktur aus einer anderen .NET-Anwendung zu kopieren. Eine C#-Ressource enth\u00e4lt normalerweise ein Projekt, das die unterst\u00fctzten CitizenFX-Assemblies referenziert, seinen Code kompiliert und die erzeugten Dateien dort ablegt, wo das Manifest sie laden kann.<\/p>\n<p>C# kann gut passen, wenn das Team bereits .NET-Typen, Werkzeuge und Testverfahren nutzt. Daf\u00fcr m\u00fcssen Mitwirkende und CI \u00fcber das passende SDK und den richtigen Buildbefehl verf\u00fcgen; das bereitgestellte Artefakt muss zum Quellstand passen. Dokumentiere Vorlage, Zielframework und Release-Prozess im Repository, damit Serverupdates reproduzierbar bleiben.<\/p>\n<h2 id=\"the-shared-model-manifests-natives-events-and-exports\">Das gemeinsame Modell: Manifeste, Natives, Events und Exports<\/h2>\n<p>Die Sprachwahl \u00e4ndert die technischen Vorgaben f\u00fcr Ressourcen nicht. Jede Ressource ben\u00f6tigt ein Manifest namens <code data-no-translation=\"\" translate=\"no\">fxmanifest.lua<\/code> , das Metadaten und die zu ladenden Dateien deklariert. Client-Code l\u00e4uft f\u00fcr verbundene Spieler; Server-Code l\u00e4uft unter FXServer. Geteilte Dateien werden an beide Seiten geliefert, daher d\u00fcrfen sie keine Anmeldeinformationen oder nur serverseitige Vertrauensentscheidungen enthalten.<\/p>\n<ul>\n<li><strong>Natives<\/strong> stellen Spiel- und Plattformfunktionen bereit. Pr\u00fcfe die aktuelle Native-Referenz und ob ein Native auf dem Client oder Server ausgef\u00fchrt wird.<\/li>\n<li><strong>Events<\/strong> \u00fcbertragen Nachrichten innerhalb eines Kontexts oder zwischen Client und Server. Behandle Netzwerkeingaben als nicht vertrauensw\u00fcrdig und validiere sie serverseitig.<\/li>\n<li><strong>Exporte<\/strong> stellen Funktionen f\u00fcr andere Ressourcen bereit. Dokumentiere Namen, Parameter, R\u00fcckgabewerte und Startabh\u00e4ngigkeiten.<\/li>\n<li><strong>Abh\u00e4ngigkeiten<\/strong> Geh\u00f6ren in das Manifest oder die Serverstartreihenfolge, wenn eine andere Ressource zuerst verf\u00fcgbar sein muss.<\/li>\n<\/ul>\n<p>Ein gemischtsprachiger Server ist normal. Die stabile Grenze ist das dokumentierte Ereignis oder der Export, nicht die Implementierungssprache dahinter. Das erm\u00f6glicht es, eine Ressource zu ersetzen, ohne den gesamten Stack neu schreiben zu m\u00fcssen.<\/p>\n<h2 id=\"how-to-choose-for-a-real-project\">Wie du f\u00fcr ein echtes Projekt w\u00e4hlst<\/h2>\n<ol>\n<li><strong>Beginne mit dem Framework.<\/strong> Wenn der Server von einem etablierten ESX, QBCore, Qbox oder einer eigenst\u00e4ndigen Ressource abh\u00e4ngt, verwende deren unterst\u00fctzte Erweiterungspunkte und Sprachkonventionen.<\/li>\n<li><strong>Liste ben\u00f6tigte Bibliotheken auf.<\/strong> Pr\u00fcfe, ob jeder Datenbanktreiber, jede UI-Bridge und jedes Paket mit der Client- oder Server-Laufzeit kompatibel ist, in der es ausgef\u00fchrt wird.<\/li>\n<li><strong>Richte dich nach dem Team.<\/strong> Bevorzuge die Sprache, die Mitwirkende \u00fcberpr\u00fcfen, testen und pflegen k\u00f6nnen, nachdem der urspr\u00fcngliche Autor gegangen ist.<\/li>\n<li><strong>Definiere den Build.<\/strong> Lua kann direkt ausgeliefert werden; TypeScript und C# ben\u00f6tigen normalerweise eine reproduzierbare Kompilierung und ein klares Ausgabeverzeichnis.<\/li>\n<li><strong>Erstelle einen Prototyp der Grenze.<\/strong> Beweise einen nativen Aufruf, ein servervalidiertes Netzwerkereignis, einen Export und einen Abh\u00e4ngigkeitsneustart, bevor du die vollst\u00e4ndige Funktion erstellst.<\/li>\n<\/ol>\n<h2 id=\"minimal-verification-checklist\">Minimale \u00dcberpr\u00fcfungs-Checkliste<\/h2>\n<ul>\n<li>Starte die Ressource auf einem Staging-Server und \u00fcberpr\u00fcfe sowohl die Server- als auch die F8-Client-Protokolle.<\/li>\n<li>Verbinde einen sauberen Client erneut und starte die Ressource neu, um fehlende Dateien oder Annahmen zur Reihenfolge aufzudecken.<\/li>\n<li>Sende ung\u00fcltige und nicht autorisierte Event-Payloads und best\u00e4tige, dass der Server sie ablehnt.<\/li>\n<li>\u00dcberpr\u00fcfe die dokumentierte Node-Version oder die .NET-Build-Ausgabe auf dem tats\u00e4chlichen Deployment-Host.<\/li>\n<li>Pinne Abh\u00e4ngigkeitsversionen und bewahre eine Rollback-Kopie der letzten funktionierenden Ressource auf.<\/li>\n<\/ul>\n<p>Es gibt keinen evidenzbasierten Grund, eine der drei FiveM-Programmiersprachen als universell schnellste oder beliebteste f\u00fcr jede Ressource zu kr\u00f6nen. W\u00e4hle Lua, JavaScript\/TypeScript oder C# aus den unterst\u00fctzten Laufzeitfaktoren, dem umgebenden Framework und den Wartungskosten, die dein Team tats\u00e4chlich tragen kann.<\/p>\n<h2 id=\"enhanced-runtime-differences\">Laufzeitunterschiede bei Enhanced<\/h2>\n<p>Enhanced \u00e4ndert die JavaScript- und C#-Laufzeitumgebung sowie einige Plattformverhaltensweisen. Verwende die Dokumentation f\u00fcr die genaue Client-\/Server-Edition, anstatt Legacy Node- oder Mono-Annahmen darauf anzuwenden. Erstelle und teste Abh\u00e4ngigkeiten gegen diese Umgebung neu.<\/p>","protected":false},"excerpt":{"rendered":"<p>FiveM unterst\u00fctzt offiziell Lua, JavaScript und C#. W\u00e4hle die Laufzeitumgebung, die zu deinem Framework, den F\u00e4higkeiten deines Teams und den ben\u00f6tigten Bibliotheken passt \u2013 nicht eine vermeintliche universelle Leistungsrangliste. Alle drei k\u00f6nnen FiveM-Natives aufrufen, Ereignisse verarbeiten und Ressourcen-APIs bereitstellen. Die praktischen Unterschiede liegen in der Laufzeitgrenze, dem Paket-\u00d6kosystem, dem Build-Workflow und dem Code, der bereits von deinen Abh\u00e4ngigkeiten verwendet wird.<\/p>","protected":false},"author":1,"featured_media":162273,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2340,1899],"tags":[3001],"class_list":["post-162272","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-lua-scripting","category-tutorials","tag-fivem-script"],"_links":{"self":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts\/162272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/comments?post=162272"}],"version-history":[{"count":1,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts\/162272\/revisions"}],"predecessor-version":[{"id":212551,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts\/162272\/revisions\/212551"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/media\/162273"}],"wp:attachment":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/media?parent=162272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/categories?post=162272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/tags?post=162272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}