
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?

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:
Tipo | Se usa en… | Lado que expone |
---|---|---|
Cliente | Client-side | client.lua |
Servidor | Server-side | server.lua |
Compartido | Client/Server | shared.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 (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

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.