Fivem Logo
Fivem Logo

Si estás comenzando a desarrollar en FiveM, seguramente ya has escuchado hablar de los famosos exports. En este artículo, te explicaremos cómo usar los exports en FiveM para que puedas crear recursos modulares y reutilizables entre tus scripts.

Cuando desarrollamos, a menudo necesitamos que múltiples scripts se comuniquen entre sí. Por ejemplo, tal vez un sistema de inventario debe ser usado desde un sistema de tiendas, o una base de datos centralizada debe ser consultada por varios recursos.


¿Como crear exports en fivem?

Exports en fivem

Son una funcionalidad que permite exponer funciones desde un recurso para que puedan ser llamadas desde otro. Si vienes de otros lenguajes o entornos, puedes pensar en los exports como un mecanismo para hacer públicas ciertas funciones o APIs entre módulos.

Por ejemplo, puedes tener un recurso llamado inventory que tenga funciones como AddItem o RemoveItem, y luego usar esas funciones desde otro recurso como shops.

En términos simples, un export es una función pública que puede ser llamada por otros recursos. Esto permite que un script «A» pueda ejecutar funciones que están definidas en un script «B», sin tener que duplicar código.


Tipos de exports en fivem

FiveM permite exports en cliente y en servidor. Dependiendo de dónde está la función, usas uno u otro:

TipoSe usa en…Lado que expone
ClienteClient-sideclient.lua
ServidorServer-sideserver.lua
CompartidoClient/Servershared.lua

Cómo declarar exports en fivem

Lo principal a tomar en cuenta es la estructura de la función exports:

exports(NombreFuncion, Funcion)

Donde,

  • NombreFuncion: será el nombre con el cual queramos identificar a esta exportación.
  • El nombre se puede repetir por cada script, pero no dentro del mismo, es decir, si tienes un script A, podras solo usar NombreFuncion una sola vez, sin embargo, en B podrás repetir nuevamente NombreFuncion, dado que estas exportaciones se almacenan por recurso.

function GetPlayerData(playerId)
    return {
        name = "Carlos",
        level = 10,
        inventory = {"agua", "pan"}
    }
end

exports('GetPlayerData', GetPlayerData)

--- Aunque tambien puede ser
exports('CualquierNombre', GetPlayerData)

¿Qué hace este código?

  • Defines una función llamada GetPlayerData que retorna una tabla con datos simulados de un jugador.
  • Usas exports('NombreExport', funcion) para exponer esa función.
  • Esta función ahora puede ser llamada desde otros recursos del servidor, como si fuera una función pública.

En el ejemplo anterior, observamos que hemos creado una exportación con el mismo nombre que la función, esto por lo general debe ser así para no enredar el código.

Algunos errores comunes de los exports en fivem

attempt to call a nil value
attempt to call a nil value
attempt to call a nil value (method 'X')

Esto ocurre cuando el recurso exportador no está iniciado aún, la solución es iniciar el recurso principal (el que lleva la función de exportación) antes del recurso que lo usa.

Ejemplo, si en el recurso A creas una exportación y en B lo utilizas, procura iniciar A antes que B.


No such export in resource
No such export in resource

Esto ocurre cuando el recurso exportador contiene algún error en el nombre del recurso o de la función, la solución es verificar que el nombre sea correcto en el recurso donde se utiliza la exportación.

Ejemplo, si en el recurso A creas una exportación llamada ‘GetUser’ y en B lo utilizas como ‘getUser’, asegúrate que sea tal cual donde creas la exportación: ‘GetUser’.


Como usar los exports en fivem

Supongamos que en otro recurso necesitas acceder a los datos del jugador. Puedes hacerlo así:

-- Supongamos que estás dentro de otro recurso del servidor

local data = exports.nombreDeMiScript:GetPlayerData(source) 
-- Tambien puede ser exports['nombreDeMiScript']:GetPlayerData(source)

print(json.encode(data))
-- Resultado:
-- {"name":"Carlos","level":10,"inventory":["agua","pan"]}

Buenas prácticas de código

Usar exports en fivem de forma correcta no solo mejora la estructura de tu código, sino que también facilita la escalabilidad, el mantenimiento y la colaboración en proyectos grandes. A continuación, detallamos las mejores prácticas que debes seguir al trabajar con exports en FiveM, tanto en Lua como en JavaScript:

Usa nombres claros y coherentes para la función exportada

Los nombres de los exports en fivem deben ser autoexplicativos y coherentes con su propósito. Piensa que otros desarrolladores (o tú en el futuro) usarán esa función sin ver su implementación interna.

Ejemplo malo al usar nombres claros y coherentes

exports('x1', GetPlayerData)

Ejemplo bueno al usar nombres claros y coherentes

exports('GetPlayerData', GetPlayerData)

Además, es recomendable seguir una convención de nombres clara:

  • Get para obtener información (GetInventory, GetJob)
  • Set para modificar (SetHealth, SetPlayerRole)
  • Has para validar condiciones (HasPermission, HasLicense)
  • Add / Remove para manipular listas o contenedores (AddItem, RemoveVehicle)

Documenta cada función exportada

Aunque FiveM no requiere que documentes tus funciones, es una práctica esencial para evitar errores y malentendidos, sobre todo cuando tus scripts crecen o colaboras con otros.

Incluye al menos:

  • Qué hace la función
  • Qué parámetros recibe (tipo y descripción)
  • Qué retorna

Ejemplo de uso

--[[
    GetPlayerData(playerId: number): table
    Retorna información básica del jugador, incluyendo nombre, nivel e inventario.
    @param playerId (number) - ID del jugador (source)
    @return table - { name = string, level = number, inventory = table }

    Ejemplo:
        local data = exports['mi_recurso']:GetPlayerData(source)
]]
function GetPlayerData(playerId)
    -- ...
end

Evita dependencias circulares

Una dependencia circular ocurre cuando:

  • Recurso A exporta una función que usa algo del recurso B.
  • Y el recurso B exporta algo que necesita lo del recurso A.

Esto genera conflictos, errores de carga o comportamiento impredecible porque los recursos pueden intentar accederse mutuamente antes de que uno esté completamente cargado.

Cómo evitarlo:

  • Centraliza ahí las funciones reutilizables.
  • Extrae la lógica compartida a un tercer recurso «core» que actúe como dependencia común.
  • Ese recurso debe ser inicializado antes que A o B.

Consejo extra: verificar si el export existe antes de usarlo

Aunque no es obligatorio, puedes validar el export con una verificación sencilla:

local export = exports.nombreDeMiScript
if export and export.GetPlayerData then
    local data = export:GetPlayerData(source)
    print(data.name)
end

Esto evita errores si por alguna razón el recurso aún no está disponible.


Aprender a usar exports en FiveM es fundamental si quieres que tu servidor sea escalable, mantenible y profesional. Los exports permiten que múltiples recursos colaboren entre sí, sin tener que copiar y pegar funciones o escribir código duplicado.

Ya sea en Lua o JavaScript, ahora tienes toda la base para comenzar a estructurar tus scripts de forma limpia y eficiente.

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuarlo!

Promedio de puntuación 5 / 5. Recuento de votos: 1

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.