Qué puede devolver un comando
Cualquier cosa que sepa serializarse, y eso incluye más de lo que parece. Los tipos que llegan bien, los que llegan raro, el caso de los datos binarios, y por qué devolver poco es mejor que devolver todo.
Lo que llega bien
Los datos binarios
Es el caso que más cuesta si se hace mal. Un Vec<u8> se serializa como un array de números, así que un megabyte de datos se convierte en varios megabytes de texto que hay que generar, cruzar y parsear.
Tres salidas, de peor a mejor:
Codificar en texto. Convertir a base64 y devolver una cadena. Es lo más simple, funciona, y sigue costando: la codificación crece el dato en un tercio y hay que codificar y decodificar. Aceptable para cosas pequeñas —un icono, una miniatura—.
Usar el tipo de bytes que el framework reconoce. Tauri sabe devolver datos binarios sin pasarlos por texto, y en el frontend llegan como un búfer que el motor entiende. Es la respuesta correcta para datos medianos.
No devolverlos. Es la mejor, y casi siempre es posible. Si lo que quieres es enseñar una imagen del disco, no la leas y la mandes: sírvela por el protocolo de recursos —nivel 7.4— y pon la URL en la etiqueta correspondiente. El motor la carga directamente, sin pasar por el puente, con la caché y el decodificado que ya sabe hacer.
Ese tercer camino es el mismo razonamiento del nivel 13.5 aplicado a los bytes: la pregunta no es cómo cruzarlos rápido, es por qué cruzan.
Devolver poco
Una tentación frecuente: el comando devuelve el objeto entero «por si acaso». Con un proyecto de tres campos da igual; con uno que lleva el contenido, la lista de ficheros y el historial, no.
// Devuelve lo que la pantalla necesita, no lo que el tipo tiene.#[derive(Serialize)]#[serde(rename_all = "camelCase")]pub struct ProyectoResumen { pub id: ProyectoId, pub nombre: String, pub ficheros: usize, pub modificado: String,}Dos ventajas y una tercera que no es obvia:
- Menos que serializar y menos que cruzar. Es el término proporcional del nivel 13.4.
- El frontend no puede depender de lo que no recibe, así que el contrato es más pequeño y más estable.
- Y la que importa a medio plazo: el tipo que cruza deja de ser el tipo interno. Cambiar la representación interna de un proyecto no rompe el frontend, porque lo que cruza es un resumen que tú decides. Un core que devuelve sus propios structs internos acopla el frontend a la implementación.