{"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":"langages-de-codage-fivem","status":"publish","type":"post","link":"https:\/\/rpcrate.com\/fr\/fivem-coding-languages\/","title":{"rendered":"Langages de programmation FiveM : Comparaison de Lua, JavaScript et C#"},"content":{"rendered":"<p><strong>FiveM prend officiellement en charge Lua, JavaScript et C#. Choisissez le runtime qui correspond \u00e0 votre framework, aux comp\u00e9tences de votre \u00e9quipe et aux biblioth\u00e8ques requises, et non \u00e0 un classement de performances universel suppos\u00e9.<\/strong> Les trois peuvent appeler les natives FiveM, g\u00e9rer les \u00e9v\u00e9nements et exposer les API de ressources. Les diff\u00e9rences pratiques sont la limite du runtime, l'\u00e9cosyst\u00e8me de packages, le flux de travail de construction et le code d\u00e9j\u00e0 utilis\u00e9 par vos d\u00e9pendances.<\/p>\n<p>Les exemples de configuration et de code ici ciblent FiveM pour GTA V Legacy. Enhanced a des r\u00e8gles d'ex\u00e9cution et de compatibilit\u00e9 diff\u00e9rentes ; v\u00e9rifiez <a href=\"https:\/\/docs.fivem.net\/docs\/developers\/legacy-vs-enhanced\/\">les changements Legacy-to-Enhanced de Cfx.re<\/a> avant de les appliquer \u00e0 un serveur Enhanced.<\/p>\n<h2 id=\"fivem-language-comparison\">Comparaison des langages FiveM<\/h2>\n<div aria-label=\"Tableau \u00e0 d\u00e9filement horizontal\" class=\"fmx-guide-table\" role=\"region\" tabindex=\"0\">\n<table>\n<thead>\n<tr>\n<th>Runtime<\/th>\n<th>Bonne ad\u00e9quation<\/th>\n<th>Limite importante<\/th>\n<th>Flux de travail typique<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Lua<\/td>\n<td>Frameworks Lua existants, ressources compactes et exemples FiveM directs<\/td>\n<td>CfxLua est un runtime Lua 5.4 modifi\u00e9, pas une installation Lua syst\u00e8me arbitraire<\/td>\n<td>Modifiez les fichiers source et chargez-les via le manifeste de ressource<\/td>\n<\/tr>\n<tr>\n<td>JavaScript<\/td>\n<td>\u00c9quipes utilisant les outils JavaScript\/TypeScript et npm<\/td>\n<td>Les scripts client ne re\u00e7oivent pas les API de navigateur ou Node.js ; les scripts serveur utilisent le runtime Node de FiveM<\/td>\n<td>Ex\u00e9cutez la source directement ou compilez\/regroupez TypeScript en JavaScript list\u00e9 dans le manifeste<\/td>\n<\/tr>\n<tr>\n<td>C#<\/td>\n<td>\u00c9quipes .NET, code de domaine typ\u00e9 et projets compil\u00e9s<\/td>\n<td>La ressource doit livrer les assemblages et les fichiers attendus par le runtime Cfx.re<\/td>\n<td>Construire \u00e0 partir d'un mod\u00e8le Cfx.re, puis d\u00e9ployer la sortie de la construction<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h2 id=\"lua-the-direct-framework-path\">Lua : le chemin direct du framework<\/h2>\n<p>Cfx.re pr\u00e9sente <a href=\"https:\/\/docs.fivem.net\/docs\/scripting-manual\/runtimes\/lua\/\" rel=\"nofollow noopener\">CfxLua en tant que runtime Lua 5.4 modifi\u00e9<\/a>. Cela est important lorsque vous comparez le code FiveM avec d'anciens tutoriels Lua : les fonctionnalit\u00e9s du langage et le comportement du runtime doivent \u00eatre v\u00e9rifi\u00e9s par rapport \u00e0 CfxLua, et non d\u00e9duits du package du syst\u00e8me d'exploitation d'un serveur.<\/p>\n<p>Lua est g\u00e9n\u00e9ralement le choix le moins perturbateur lorsque le framework et les ressources voisines sont d\u00e9j\u00e0 \u00e9crits en Lua. Vous pouvez conserver les \u00e9v\u00e9nements, les exportations et la configuration partag\u00e9e dans le m\u00eame langage et \u00e9viter d'ajouter une \u00e9tape de construction uniquement pour le style. Un petit manifeste peut lister des scripts client, serveur et partag\u00e9s distincts. Gardez les secrets et les v\u00e9rifications d'autorit\u00e9 c\u00f4t\u00e9 serveur hors des fichiers clients, m\u00eame lorsque les deux c\u00f4t\u00e9s utilisent Lua.<\/p>\n<p>La syntaxe courte facilite la lecture des gestionnaires d'\u00e9v\u00e9nements, mais elle ne remplace pas la conception d'interface. Documentez chaque charge utile d'\u00e9v\u00e9nement, validez les valeurs sur le serveur et \u00e9vitez de traiter un \u00e9v\u00e9nement client comme une preuve que l'argent, l'inventaire ou les autorisations sont valides.<\/p>\n<h2 id=\"javascript-and-typescript-know-which-side-is-running\">JavaScript et TypeScript : sachez quel c\u00f4t\u00e9 est en cours d'ex\u00e9cution<\/h2>\n<p class=\"translation-block\">Le <a href=\"https:\/\/docs.fivem.net\/docs\/scripting-manual\/runtimes\/javascript\/\" rel=\"nofollow noopener\">guide officiel de l\u2019environnement d\u2019ex\u00e9cution JavaScript<\/a> d\u00e9crit la prise en charge d\u2019ES2017 et une distinction essentielle entre client et serveur. Les scripts clients s\u2019ex\u00e9cutent dans l\u2019environnement client de FiveM et ne disposent ni des API du navigateur ni de celles de Node.js. Les scripts serveurs utilisent un environnement Node.js personnalis\u00e9. Pour l\u2019environnement Legacy, la version serveur par d\u00e9faut document\u00e9e est Node.js 16 ; une ressource peut choisir Node.js 22 en ajoutant <code>node_version '22'<\/code> dans <code>fxmanifest.lua<\/code>.<\/p>\n<p class=\"translation-block\">Ne supposez pas qu\u2019un paquet fonctionnant dans un projet Node ordinaire fonctionne aussi dans un script client FiveM. Gardez c\u00f4t\u00e9 serveur les d\u00e9pendances li\u00e9es au syst\u00e8me de fichiers, \u00e0 la base de donn\u00e9es et les d\u00e9pendances npm destin\u00e9es au serveur. Pour les d\u00e9finitions de l\u2019\u00e9diteur et de TypeScript, Cfx.re publie les paquets <code>@citizenfx\/client<\/code> et <code>@citizenfx\/server<\/code>. Ils am\u00e9liorent la v\u00e9rification des types, mais ne donnent pas acc\u00e8s aux API absentes de l\u2019environnement d\u2019ex\u00e9cution choisi.<\/p>\n<p>FiveM documente \u00e9galement les contraintes d'affinit\u00e9 de thread pour certains appels natifs c\u00f4t\u00e9 serveur. Lorsque le code Node asynchrone doit revenir au thread de jeu principal, suivez les directives d'ex\u00e9cution et utilisez <code data-no-translation=\"\" translate=\"no\">setImmediate<\/code> si n\u00e9cessaire. Testez le JavaScript compil\u00e9 que vous d\u00e9ployez r\u00e9ellement, y compris les cartes sources et l'ordre de d\u00e9marrage, plut\u00f4t que seulement la source TypeScript.<\/p>\n<h2 id=\"c-use-the-supported-project-shape\">C# : utilisez la forme de projet prise en charge<\/h2>\n<p class=\"translation-block\">La <a href=\"https:\/\/docs.fivem.net\/docs\/scripting-manual\/runtimes\/csharp\/\" rel=\"nofollow noopener\">documentation de l\u2019environnement d\u2019ex\u00e9cution C#<\/a> fournit les mod\u00e8les de projet et les consignes de compilation actuels. Commencez par l\u00e0 plut\u00f4t que de copier une ancienne organisation d\u2019assemblies provenant d\u2019une application .NET sans rapport. Une ressource C# poss\u00e8de normalement un projet qui r\u00e9f\u00e9rence les assemblies CitizenFX pris en charge, compile son code et place les fichiers produits l\u00e0 o\u00f9 le manifeste peut les charger.<\/p>\n<p>C# peut \u00eatre un excellent choix lorsque l'\u00e9quipe utilise d\u00e9j\u00e0 les types, les outils et les pratiques de test .NET. Le compromis est op\u00e9rationnel : les contributeurs et l'int\u00e9gration continue ont besoin du SDK et de la commande de construction corrects, et l'artefact d\u00e9ploy\u00e9 doit rester synchronis\u00e9 avec sa source. Enregistrez le mod\u00e8le, le framework cible et le processus de publication dans le r\u00e9f\u00e9rentiel afin qu'une mise \u00e0 jour du serveur soit reproductible.<\/p>\n<h2 id=\"the-shared-model-manifests-natives-events-and-exports\">Le mod\u00e8le commun : manifestes, fonctions natives, \u00e9v\u00e9nements et exports<\/h2>\n<p>Le choix du langage ne modifie pas le contrat de ressource. Chaque ressource a besoin d'un <code data-no-translation=\"\" translate=\"no\">fxmanifest.lua<\/code> qui d\u00e9clare les m\u00e9tadonn\u00e9es et les fichiers \u00e0 charger. Le code client s'ex\u00e9cute pour les joueurs connect\u00e9s ; le code serveur s'ex\u00e9cute sous FXServer. Les fichiers partag\u00e9s sont livr\u00e9s aux deux c\u00f4t\u00e9s, ils ne doivent donc pas contenir d'informations d'identification ou de d\u00e9cisions de confiance uniquement c\u00f4t\u00e9 serveur.<\/p>\n<ul>\n<li><strong>Les fonctions natives<\/strong> exposent les fonctions du jeu et de la plateforme. Consultez la r\u00e9f\u00e9rence actuelle des fonctions natives et v\u00e9rifiez si la fonction concern\u00e9e s\u2019ex\u00e9cute c\u00f4t\u00e9 client ou c\u00f4t\u00e9 serveur.<\/li>\n<li><strong>Les \u00e9v\u00e9nements<\/strong> transmettent des messages au sein d\u2019un contexte ou entre le client et le serveur. Consid\u00e9rez les donn\u00e9es re\u00e7ues du r\u00e9seau comme non fiables et validez-les c\u00f4t\u00e9 serveur.<\/li>\n<li><strong>Les exports<\/strong> publient des fonctions pour les autres ressources. Documentez les noms, les param\u00e8tres, les valeurs de retour et les d\u00e9pendances n\u00e9cessaires au d\u00e9marrage.<\/li>\n<li><strong>D\u00e9pendances<\/strong> appartiennent au manifeste ou \u00e0 l'ordre de d\u00e9marrage du serveur lorsqu'une autre ressource doit \u00eatre disponible en premier.<\/li>\n<\/ul>\n<p>Un serveur utilisant plusieurs langages est normal. La limite stable est l'\u00e9v\u00e9nement ou l\u2019export document\u00e9, et non le langage d'impl\u00e9mentation qui le sous-tend. Cela permet de remplacer une ressource sans r\u00e9\u00e9crire toute la pile.<\/p>\n<h2 id=\"how-to-choose-for-a-real-project\">Comment choisir pour un projet r\u00e9el<\/h2>\n<ol>\n<li><strong>Commencez par le framework.<\/strong> Si le serveur d\u00e9pend d'une ressource ESX, QBCore, Qbox \u00e9tablie ou autonome, utilisez ses points d'extension et ses conventions linguistiques pris en charge.<\/li>\n<li><strong>Listez les biblioth\u00e8ques requises.<\/strong> Confirmez que chaque pilote de base de donn\u00e9es, pont UI et package est compatible avec le client ou le runtime serveur o\u00f9 il sera ex\u00e9cut\u00e9.<\/li>\n<li><strong>Tenez compte de l\u2019\u00e9quipe.<\/strong> Privil\u00e9giez le langage que les contributeurs pourront relire, tester et maintenir apr\u00e8s le d\u00e9part de l\u2019auteur initial.<\/li>\n<li><strong>D\u00e9finissez le processus de compilation.<\/strong> Lua peut \u00eatre livr\u00e9 directement ; TypeScript et C# n\u00e9cessitent g\u00e9n\u00e9ralement une compilation reproductible et un r\u00e9pertoire de sortie clair.<\/li>\n<li><strong>Cr\u00e9ez un prototype des interfaces entre les composants.<\/strong> V\u00e9rifiez le fonctionnement d\u2019un appel natif, d\u2019un \u00e9v\u00e9nement r\u00e9seau valid\u00e9 par le serveur, d\u2019un export et d\u2019un red\u00e9marrage de d\u00e9pendance avant de d\u00e9velopper la fonctionnalit\u00e9 compl\u00e8te.<\/li>\n<\/ol>\n<h2 id=\"minimal-verification-checklist\">Liste minimale de v\u00e9rifications<\/h2>\n<ul>\n<li>D\u00e9marrez la ressource sur un serveur de staging et inspectez les journaux du serveur et du client F8.<\/li>\n<li>Reconnectez un client propre et red\u00e9marrez la ressource pour exposer les fichiers manquants ou les hypoth\u00e8ses d'ordonnancement.<\/li>\n<li>Envoyez des charges utiles d'\u00e9v\u00e9nements invalides et non autoris\u00e9es et confirmez que le serveur les rejette.<\/li>\n<li>V\u00e9rifiez la version de Node document\u00e9e ou la sortie de build .NET sur l'h\u00f4te de d\u00e9ploiement r\u00e9el.<\/li>\n<li>\u00c9pinglez les versions des d\u00e9pendances et conservez une copie de restauration de la derni\u00e8re ressource fonctionnelle.<\/li>\n<\/ul>\n<p>Rien ne permet d\u2019affirmer, preuves \u00e0 l\u2019appui, qu\u2019un des trois langages de programmation FiveM est toujours le plus rapide ou le plus populaire pour toutes les ressources. Choisissez Lua, JavaScript\/TypeScript ou C# selon les capacit\u00e9s document\u00e9es du runtime pris en charge, le framework utilis\u00e9 et le co\u00fbt de maintenance que votre \u00e9quipe peut assumer.<\/p>\n<h2 id=\"enhanced-runtime-differences\">Diff\u00e9rences du runtime Enhanced<\/h2>\n<p>Enhanced modifie l'environnement d'ex\u00e9cution JavaScript et C# ainsi que certains comportements de la plateforme. Utilisez la documentation pour l'\u00e9dition client\/serveur exacte plut\u00f4t que d'appliquer les hypoth\u00e8ses Legacy Node ou Mono. Reconstruisez et testez les d\u00e9pendances par rapport \u00e0 cet environnement.<\/p>","protected":false},"excerpt":{"rendered":"<p>FiveM prend officiellement en charge Lua, JavaScript et C#. Choisissez le runtime qui correspond \u00e0 votre framework, aux comp\u00e9tences de votre \u00e9quipe et aux biblioth\u00e8ques requises, et non \u00e0 un classement de performances universel suppos\u00e9. Les trois peuvent appeler les natives FiveM, g\u00e9rer les \u00e9v\u00e9nements et exposer les API de ressources. Les diff\u00e9rences pratiques sont la limite du runtime, l'\u00e9cosyst\u00e8me de packages, le flux de travail de construction et le code d\u00e9j\u00e0 utilis\u00e9 par vos d\u00e9pendances.<\/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\/fr\/wp-json\/wp\/v2\/posts\/162272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/comments?post=162272"}],"version-history":[{"count":1,"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/posts\/162272\/revisions"}],"predecessor-version":[{"id":212551,"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/posts\/162272\/revisions\/212551"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/media\/162273"}],"wp:attachment":[{"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/media?parent=162272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/categories?post=162272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpcrate.com\/fr\/wp-json\/wp\/v2\/tags?post=162272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}