{"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":"lenguajes-de-codificacion-fivem","status":"publish","type":"post","link":"https:\/\/rpcrate.com\/es\/fivem-coding-languages\/","title":{"rendered":"Lenguajes de programaci\u00f3n de FiveM: Lua, JavaScript y C# comparados"},"content":{"rendered":"<p><strong>FiveM es compatible oficialmente con Lua, JavaScript y C#. Elige el entorno de ejecuci\u00f3n que se adapte a tu framework, las habilidades de tu equipo y las bibliotecas necesarias, no una supuesta clasificaci\u00f3n de rendimiento universal.<\/strong> Los tres pueden llamar a las funciones nativas de FiveM, manejar eventos y exponer API de recursos. Las diferencias pr\u00e1cticas son el l\u00edmite del entorno de ejecuci\u00f3n, el ecosistema de paquetes, el flujo de trabajo de compilaci\u00f3n y el c\u00f3digo ya utilizado por tus dependencias.<\/p>\n<p>Los ejemplos de configuraci\u00f3n y c\u00f3digo aqu\u00ed est\u00e1n dirigidos a FiveM para GTA V Legacy. Enhanced tiene diferentes reglas de tiempo de ejecuci\u00f3n y compatibilidad; consulta <a href=\"https:\/\/docs.fivem.net\/docs\/developers\/legacy-vs-enhanced\/\">los cambios de Legacy a Enhanced de Cfx.re<\/a> antes de aplicarlos a un servidor Enhanced.<\/p>\n<h2 id=\"fivem-language-comparison\">Comparaci\u00f3n de lenguajes de FiveM<\/h2>\n<div aria-label=\"Tabla con desplazamiento horizontal\" class=\"fmx-guide-table\" role=\"region\" tabindex=\"0\">\n<table>\n<thead>\n<tr>\n<th>Entorno de ejecuci\u00f3n<\/th>\n<th>Buena opci\u00f3n<\/th>\n<th>L\u00edmite importante<\/th>\n<th>Flujo de trabajo t\u00edpico<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Lua<\/td>\n<td>Marcos Lua existentes, recursos compactos y ejemplos directos de FiveM<\/td>\n<td>CfxLua es un entorno de ejecuci\u00f3n Lua 5.4 modificado, no una instalaci\u00f3n Lua de sistema arbitraria<\/td>\n<td>Edita los archivos fuente y c\u00e1rgalos a trav\u00e9s del manifiesto de recursos<\/td>\n<\/tr>\n<tr>\n<td>JavaScript<\/td>\n<td>Equipos que utilizan herramientas JavaScript\/TypeScript y npm<\/td>\n<td>Los scripts de cliente no reciben APIs de navegador o Node.js; los scripts de servidor usan el entorno de ejecuci\u00f3n de Node de FiveM<\/td>\n<td>Ejecuta la fuente directamente o compila\/agrupa TypeScript en JavaScript listado en el manifiesto<\/td>\n<\/tr>\n<tr>\n<td>C#<\/td>\n<td>Equipos .NET, c\u00f3digo de dominio tipado y proyectos compilados<\/td>\n<td>El recurso debe enviar los ensamblados y archivos esperados por el entorno de ejecuci\u00f3n de Cfx.re<\/td>\n<td>Compila a partir de una plantilla de Cfx.re y despu\u00e9s despliega los archivos generados.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h2 id=\"lua-the-direct-framework-path\">Lua: la ruta directa del framework<\/h2>\n<p>Cfx.re documenta <a href=\"https:\/\/docs.fivem.net\/docs\/scripting-manual\/runtimes\/lua\/\" rel=\"nofollow noopener\">CfxLua como un entorno de ejecuci\u00f3n modificado de Lua 5.4<\/a>. Eso importa cuando comparas el c\u00f3digo de FiveM con tutoriales antiguos de Lua: las caracter\u00edsticas del lenguaje y el comportamiento del entorno de ejecuci\u00f3n deben verificarse con CfxLua, no inferirse del paquete del sistema operativo de un servidor.<\/p>\n<p>Lua suele ser la opci\u00f3n menos disruptiva cuando el framework y los recursos vecinos ya est\u00e1n escritos en Lua. Puedes mantener eventos, exportaciones y configuraci\u00f3n compartida en el mismo lenguaje y evitar agregar un paso de compilaci\u00f3n solo por estilo. Un peque\u00f1o manifiesto puede listar scripts de cliente, servidor y compartidos separados. Mant\u00e9n los secretos y las comprobaciones de autoridad solo del servidor fuera de los archivos del cliente, incluso cuando ambos lados usen Lua.<\/p>\n<p>La sintaxis corta facilita el escaneo de los manejadores de eventos, pero no reemplaza el dise\u00f1o de la interfaz. Documenta cada carga \u00fatil de evento, valida los valores en el servidor y evita tratar un evento de cliente como prueba de que el dinero, el inventario o los permisos son v\u00e1lidos.<\/p>\n<h2 id=\"javascript-and-typescript-know-which-side-is-running\">JavaScript y TypeScript: saber qu\u00e9 lado se est\u00e1 ejecutando<\/h2>\n<p class=\"translation-block\">La <a href=\"https:\/\/docs.fivem.net\/docs\/scripting-manual\/runtimes\/javascript\/\" rel=\"nofollow noopener\">gu\u00eda oficial del entorno de ejecuci\u00f3n JavaScript<\/a> describe el soporte para ES2017 y una distinci\u00f3n fundamental entre cliente y servidor. Los scripts de cliente se ejecutan en el entorno de FiveM y no disponen de API del navegador ni de Node.js. Los scripts de servidor utilizan un entorno Node.js personalizado. En el entorno Legacy, la versi\u00f3n predeterminada documentada del servidor es Node.js 16; un recurso puede elegir Node.js 22 mediante <code>node_version '22'<\/code> en <code>fxmanifest.lua<\/code>.<\/p>\n<p class=\"translation-block\">No des por hecho que un paquete que funciona en un proyecto Node normal tambi\u00e9n funciona en un script de cliente de FiveM. Mant\u00e9n las dependencias de sistema de archivos, base de datos y npm del lado del servidor en el servidor. Para el editor y las definiciones de TypeScript, Cfx.re publica los paquetes <code>@citizenfx\/client<\/code> y <code>@citizenfx\/server<\/code>. Mejoran la comprobaci\u00f3n de tipos, pero no proporcionan API de las que carece el entorno de ejecuci\u00f3n seleccionado.<\/p>\n<p>FiveM tambi\u00e9n documenta las restricciones de afinidad de subprocesos para algunas llamadas nativas del lado del servidor. Cuando el c\u00f3digo as\u00edncrono de Node necesite volver al hilo principal del juego, sigue la gu\u00eda de entorno de ejecuci\u00f3n y usa <code data-no-translation=\"\" translate=\"no\">setImmediate<\/code> donde sea necesario. Prueba el JavaScript compilado que realmente implementas, incluidos los mapas de origen y el orden de inicio, en lugar de solo el c\u00f3digo fuente TypeScript.<\/p>\n<h2 id=\"c-use-the-supported-project-shape\">C#: usa la forma de proyecto compatible<\/h2>\n<p class=\"translation-block\">La <a href=\"https:\/\/docs.fivem.net\/docs\/scripting-manual\/runtimes\/csharp\/\" rel=\"nofollow noopener\">documentaci\u00f3n del entorno de ejecuci\u00f3n C#<\/a> proporciona plantillas de proyecto e instrucciones de compilaci\u00f3n actuales. Empieza por ah\u00ed en lugar de copiar una estructura antigua de ensamblados de otra aplicaci\u00f3n .NET. Un recurso C# normalmente incluye un proyecto que referencia los ensamblados CitizenFX compatibles, compila su c\u00f3digo y coloca los archivos resultantes donde el manifiesto pueda cargarlos.<\/p>\n<p>C# puede ser una buena opci\u00f3n cuando el equipo ya utiliza tipos, herramientas y pr\u00e1cticas de prueba de .NET. La contrapartida es operativa: los colaboradores y la CI necesitan el SDK y el comando de compilaci\u00f3n correctos, y el artefacto implementado debe permanecer sincronizado con su origen. Registra la plantilla, el marco de destino y el proceso de lanzamiento en el repositorio para que una actualizaci\u00f3n del servidor sea reproducible.<\/p>\n<h2 id=\"the-shared-model-manifests-natives-events-and-exports\">El modelo compartido: manifiestos, nativos, eventos y exportaciones<\/h2>\n<p>La elecci\u00f3n del lenguaje no cambia el contrato del recurso. Cada recurso necesita un <code data-no-translation=\"\" translate=\"no\">fxmanifest.lua<\/code> que declara metadatos y los archivos a cargar. El c\u00f3digo del cliente se ejecuta para los jugadores conectados; el c\u00f3digo del servidor se ejecuta bajo FXServer. Los archivos compartidos se entregan a ambas partes, por lo que no deben contener credenciales ni decisiones de confianza solo del servidor.<\/p>\n<ul>\n<li><strong>Nativos<\/strong> exponen funciones del juego y de la plataforma. Consulta la referencia nativa actual y si una funci\u00f3n nativa es del lado del cliente o del servidor.<\/li>\n<li><strong>Eventos<\/strong> mueven mensajes dentro o a trav\u00e9s del l\u00edmite cliente\/servidor. Trata la entrada de red como no confiable y val\u00eddala en el lado del servidor.<\/li>\n<li><strong>Exportaciones<\/strong> publican funciones para otros recursos. Mant\u00e9n documentados los nombres, par\u00e1metros, valores de retorno y dependencias de inicio.<\/li>\n<li><strong>Dependencias<\/strong> pertenecen al manifiesto o al orden de inicio del servidor cuando otro recurso debe estar disponible primero.<\/li>\n<\/ul>\n<p>Un servidor de lenguaje mixto es normal. El l\u00edmite estable es el evento o la exportaci\u00f3n documentados, no el lenguaje de implementaci\u00f3n detr\u00e1s de ellos. Esto hace posible reemplazar un recurso sin reescribir toda la pila.<\/p>\n<h2 id=\"how-to-choose-for-a-real-project\">C\u00f3mo elegir para un proyecto real<\/h2>\n<ol>\n<li><strong>Empieza con el framework.<\/strong> Si el servidor depende de un ESX, QBCore, Qbox o recurso independiente establecido, utiliza sus puntos de extensi\u00f3n y convenciones de lenguaje compatibles.<\/li>\n<li><strong>Lista las bibliotecas requeridas.<\/strong> Confirma que cada controlador de base de datos, puente UI y paquete sea compatible con el entorno de ejecuci\u00f3n del cliente o servidor donde se ejecutar\u00e1.<\/li>\n<li><strong>Adapta la elecci\u00f3n al equipo.<\/strong> Prefiere el lenguaje que los colaboradores puedan revisar, probar y mantener despu\u00e9s de que el autor original se vaya.<\/li>\n<li><strong>Define la compilaci\u00f3n.<\/strong> Lua puede enviarse directamente; TypeScript y C# suelen necesitar una compilaci\u00f3n reproducible y un directorio de salida claro.<\/li>\n<li><strong>Crea un prototipo de la interfaz entre componentes.<\/strong> Prueba una llamada nativa, un evento de red validado por el servidor, una exportaci\u00f3n y un reinicio de dependencia antes de construir la funci\u00f3n completa.<\/li>\n<\/ol>\n<h2 id=\"minimal-verification-checklist\">Lista m\u00ednima de comprobaciones<\/h2>\n<ul>\n<li>Inicia el recurso en un servidor de prueba e inspecciona los registros del servidor y del cliente F8.<\/li>\n<li>Vuelve a conectar un cliente limpio y reinicia el recurso para exponer archivos faltantes o suposiciones de orden.<\/li>\n<li>Env\u00eda cargas \u00fatiles de eventos no v\u00e1lidas y no autorizadas y confirma que el servidor las rechaza.<\/li>\n<li>Verifica la versi\u00f3n de Node documentada o la salida de compilaci\u00f3n de .NET en el host de implementaci\u00f3n real.<\/li>\n<li>Fija las versiones de las dependencias y guarda una copia de reversi\u00f3n del \u00faltimo recurso que funcion\u00f3.<\/li>\n<\/ul>\n<p>No hay ninguna raz\u00f3n basada en la evidencia para considerar que uno de los tres lenguajes de programaci\u00f3n de FiveM sea siempre el m\u00e1s r\u00e1pido o el m\u00e1s popular para todos los recursos. Selecciona Lua, JavaScript\/TypeScript o C# seg\u00fan las caracter\u00edsticas documentadas que admite su entorno de ejecuci\u00f3n, el framework que lo rodea y el coste de mantenimiento que tu equipo realmente pueda asumir.<\/p>\n<h2 id=\"enhanced-runtime-differences\">Diferencias del entorno de ejecuci\u00f3n Enhanced<\/h2>\n<p>Enhanced cambia el entorno de ejecuci\u00f3n de JavaScript y C# y algunos comportamientos de la plataforma. Utiliza la documentaci\u00f3n de la edici\u00f3n exacta de cliente\/servidor en lugar de aplicar suposiciones de Legacy Node o Mono. Reconstruye y prueba las dependencias contra ese entorno.<\/p>","protected":false},"excerpt":{"rendered":"<p>FiveM es compatible oficialmente con Lua, JavaScript y C#. Elige el entorno de ejecuci\u00f3n que se adapte a tu framework, las habilidades de tu equipo y las bibliotecas necesarias, no una supuesta clasificaci\u00f3n de rendimiento universal. Los tres pueden llamar a las funciones nativas de FiveM, manejar eventos y exponer API de recursos. Las diferencias pr\u00e1cticas son el l\u00edmite del entorno de ejecuci\u00f3n, el ecosistema de paquetes, el flujo de trabajo de compilaci\u00f3n y el c\u00f3digo ya utilizado por tus dependencias.<\/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\/es\/wp-json\/wp\/v2\/posts\/162272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/comments?post=162272"}],"version-history":[{"count":1,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/posts\/162272\/revisions"}],"predecessor-version":[{"id":212551,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/posts\/162272\/revisions\/212551"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/media\/162273"}],"wp:attachment":[{"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/media?parent=162272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/categories?post=162272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/tags?post=162272"}],"curies":[{"name":"gracias","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}