Wails: la apuesta de Golang por las aplicaciones de escritorio para superar a Electron

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

Transcript

00:00:00Wails es una tecnología multiplataforma que te permite crear aplicaciones de escritorio con Go.
00:00:04Me han pedido muchísimo esto en el canal tras hacer varios videos comparando
00:00:08frameworks de escritorio. Hoy voy a mostrarles cómo usar Wails para crear aplicaciones de escritorio
00:00:13y a compararlo con frameworks como Electron y Tauri. Vamos a repasar la construcción
00:00:17de un grabador de pantalla para escritorio (que ya hemos hecho antes) y compararemos el tamaño de archivo,
00:00:22el rendimiento y la experiencia de desarrollo. Wails es completamente nuevo para mí, así que
00:00:27vamos a aprender juntos en este video. Wails funciona de forma muy similar a Tauri, pero
00:00:36el backend está escrito en Go en lugar de Rust. Sigues construyendo el frontend en una vista web usando tecnologías web
00:00:41y luego llamas a las API nativas gestionadas por Golang. Esto significa que puedes compilar una aplicación
00:00:47compatible tanto con Mac como con Windows. A diferencia de Electron, Wails no incluye un navegador web. En su lugar,
00:00:52reutiliza el motor de renderizado nativo de cada plataforma, tal como lo hace Tauri. Así que el paquete
00:00:58técnicamente debería ser mucho más pequeño, pero lo comprobaremos más adelante en la comparación.
00:01:03Si les gusta este tipo de contenido, suscríbanse para ver más. Esta es la herramienta de grabación de pantalla
00:01:07que desarrollé con Wails, y también hice lo mismo con Electron y Tauri. Vamos a
00:01:12seleccionar la pantalla que queremos grabar. Presionamos grabar. Puedes mover el ratón. La propia
00:01:16aplicación de escritorio no aparecerá en la grabación. Presiono detener. Luego puedes ver la pantalla que acabo de
00:01:21grabar. Podría recortarla si quisiera y luego simplemente hacer clic en exportar a MP4 para guardar el video
00:01:27directamente en mi equipo. Si echamos un vistazo a la estructura de este proyecto, verán que es muy similar
00:01:32a lo que esperarías en Electron. Tenemos todos los archivos del frontend en una carpeta “frontend”
00:01:36y luego tenemos el archivo de entrada. En este caso es un archivo de Go llamado main.go, y dentro de este
00:01:41tenemos una función main. Nuevamente, esperarías ver algo parecido en Electron, y podemos hacer
00:01:47cosas como declarar el título, el ancho y el alto, definir el color de fondo y luego establecer
00:01:52configuraciones específicas para Mac. Así que si quieres diferencias entre Mac y Windows, es completamente
00:01:57posible. Si miramos dentro del frontend, en la carpeta src, verán todo el código
00:02:02de React. Si miramos dentro de app.tsx, es código React estándar, salvo porque llamamos a
00:02:09API definidas del lado de Go. Si vemos esta importación de API y sus usos a lo largo del
00:02:16archivo, verán que hacemos API.onrecording finished, onrecording failed, start recording, y esa API es
00:02:22generada automáticamente por Wails. Si revisamos la API misma, verán que todas las funciones
00:02:27principales vienen de este archivo wails.js/go/main/app. Si miramos
00:02:33aquí dentro, verán que este archivo se genera automáticamente y tiene comentarios en galés e inglés
00:02:39en la parte superior, porque, aunque no lo crean, el creador de Wails es galés. Tenemos todas estas funciones
00:02:43aquí como export video, list sources, request screen access, todo lo necesario para una
00:02:49herramienta de grabación de pantalla. Si pasamos al lado de Go en app.go y comentamos
00:02:54list sources y guardamos el archivo, verán que de repente nos da un error en API.ts porque ahora
00:02:59list sources no existe, y esto sucede porque estamos ejecutando wails dev. Cada vez que hay un cambio
00:03:05en el archivo de Go, vuelve a renderizar automáticamente las definiciones de TypeScript. Si volvemos ahora y
00:03:11descomentamos esa línea, verán que el error desaparece y la aplicación de escritorio se recarga
00:03:16porque todos los cambios del lado de Go, es decir, del backend, recompilan y renderizan
00:03:23la aplicación automáticamente. Hagamos algunas comparaciones para ver la diferencia entre estos tres frameworks.
00:03:27Primero veamos el tamaño del paquete. Wails pesa 52 megabytes, Tauri 57 megabytes y Electron,
00:03:34para sorpresa de nadie, 324 megabytes. Wails y Tauri son notablemente más pequeños aquí, ya que no
00:03:41empaquetan Chromium, por lo que es algo esperado. Sin embargo, al usar la vista web nativa
00:03:47de cada plataforma (que es lo que hacen Wails y Tauri), es más probable notar pequeñas diferencias entre plataformas.
00:03:51Ese es un problema mucho menor hoy en día, pero es algo a tener en cuenta. Básicamente, Tauri y
00:03:57Wails van a generar ejecutables similares en cuanto a tamaño del paquete, porque ambos frameworks están
00:04:02una arquitectura casi idéntica, a pesar de usar tecnologías muy distintas por dentro.
00:04:07Ahora veamos el tiempo de inicio, y como en videos anteriores sobre apps de escritorio, vamos a
00:04:12iniciar cada una de estas apps 10 veces y sacaremos el promedio. Wails tarda 395
00:04:18milisegundos, Tauri 410 milisegundos y Electron 350 milisegundos. En inicios en frío, donde
00:04:26borramos la caché cada vez, Wails obtiene 2337 ms, Tauri 2049 ms y Electron resulta ser un poco más rápido
00:04:34con 1890 ms. En cuanto al rendimiento, al igual que con Tauri, el rendimiento en tiempo de ejecución al grabar
00:04:40la pantalla es mucho mejor que en Electron. Esto se debe a nuestra configuración, donde usamos el
00:04:45ScreenCaptureKit nativo de Mac, por lo que no pasan datos por el bridge; mientras que en Electron grabamos desde
00:04:51la propia vista web y enviamos los datos al backend, lo cual genera cierta sobrecarga.
00:04:56Técnicamente podrías usar ScreenCaptureKit escribiendo código en C personalizado en Electron,
00:05:02pero esta es la forma estándar de hacer las cosas en Electron, y por eso lo comparamos así
00:05:06hoy. Ahora echemos un vistazo a la experiencia de desarrollo, que es donde realmente veremos la
00:05:11mayor diferencia. Disfruté mucho desarrollando con Wails; sin embargo, diría que la parte de la
00:05:15captura de pantalla no fue tan fácil como con Tauri. Tuve que escribir código en Objective-C para acceder a ScreenCaptureKit,
00:05:21mientras que en Tauri podías mantenerte completamente en Rust. Esto se debe a que Rust tiene un gran ecosistema
00:05:28de crates creadas por la comunidad que envuelven los frameworks nativos de Apple. En Tauri solo incluí una crate llamada
00:05:33screen capture kit y toda la API de grabación es Rust normal. Go no tiene nada decente para ScreenCaptureKit que yo
00:05:39haya podido encontrar, pero tiene algo llamado Cgo, que es la forma integrada de Go para compilar código en C.
00:05:44Esto significa que con Go puedes escribir C nativo en un archivo .m, exponerlo como funciones C puras y luego
00:05:50indicarle a Go con qué frameworks de Apple debe vincularse. Terminas escribiendo Objective-C real
00:05:56y llamando a las mismas API de Apple que la crate de Rust, pero esta vez tú eres el dueño de todo el código.
00:06:02Eso terminó siendo unas 450 líneas de código Objective-C que la app de Rust no necesitó. En general,
00:06:08me inclino un poco más hacia Tauri. El ecosistema de crates de Rust es mejor por lo que he visto,
00:06:14pero en realidad todo se reduce a preferencias. Si te gusta desarrollar en Go, Wails es una muy buena
00:06:18opción, y si te gusta Rust, elige Tauri. Sin embargo, si eliges Wails, es posible que tengas que
00:06:24escribir algo de código nativo solo porque el ecosistema no está tan consolidado. Bueno, espero que les haya gustado este video,
00:06:29amigos. Suscríbanse para más contenido como este. Si quieren ver más videos comparativos
00:06:33de frameworks de escritorio, como donde comparamos Deno desktop con Electrobun, les dejé un video justo
00:06:39aquí para que lo vean. De lo contrario, muchas gracias por ver el video. Soy Warren de Better Stack
00:06:43y nos vemos en el próximo. Lamentablemente, amigos, Milo dijo que no hay más videos por esta semana, así que
00:06:49nos vemos el lunes.
00:06:50*suena música*

Key Takeaway

Wails permite crear aplicaciones de escritorio de solo 52 MB usando Go en el backend y tecnología web en el frontend, ofreciendo un rendimiento nativo superior a Electron pero exigiendo código C personalizado cuando faltan librerías en su ecosistema.

Highlights

  • Wails reduce el tamaño del ejecutable a 52 MB al reutilizar el motor de renderizado nativo del sistema operativo en lugar de empaquetar Chromium como Electron.

  • En la grabación de pantalla sobre Mac, Wails y Tauri aprovechan la API nativa ScreenCaptureKit, ofreciendo un rendimiento en tiempo de ejecución superior al de Electron.

  • El comando `wails dev` sincroniza el backend y el frontend recompilando el código de Go y regenerando automáticamente las definiciones de TypeScript al guardar cambios.

  • Electron registra el inicio más rápido en frío con 1890 ms, superando a Tauri con 2049 ms y a Wails con 2337 ms.

  • Desarrollar la captura de pantalla nativa en Wails requirió escribir 450 líneas de código en Objective-C mediante Cgo debido a la falta de librerías maduras en Go.

Timeline

Arquitectura y funcionamiento de Wails

  • Wails combina un backend escrito en Golang con un frontend basado en tecnologías web vistas en un motor nativo.
  • El marco omite la inclusión de un navegador Chromium para reducir el tamaño del paquete empaquetado.
  • Las aplicaciones compiladas con Wails mantienen compatibilidad multiplataforma entre sistemas macOS y Windows.

La estructura interna de Wails replica el modelo de Tauri al delegar el renderizado visual al motor web preinstalado en el sistema operativo. Esta arquitectura elimina la sobrecarga de memoria y disco vinculada a los entornos basados en Chromium. La lógica de negocio y las llamadas a las API del sistema residen directamente en el código de Go.

Estructura del proyecto y vinculación automática de código

  • Las carpetas del proyecto dividen de forma estricta los componentes de React en la vista web del punto de entrada en Go.
  • El entorno de desarrollo genera archivos JavaScript y definiciones de TypeScript a partir de las funciones exportadas en Go.
  • El proceso `wails dev` recarga la interfaz y recompila el ejecutable en tiempo real ante cualquier ajuste en el archivo principal.

La carpeta raíz aloja el archivo `main.go` donde se configuran las dimensiones, títulos y parámetros específicos para cada sistema operativo. El código de React ubicado en la carpeta del frontend consume la API del backend mediante importaciones autogeneradas en la ruta `wails.js/go/main/app`. Al comentar o modificar una función en Go, el servidor de desarrollo actualiza los tipos en TypeScript y notifica los errores de tipado de inmediato.

Métricas de rendimiento, tamaño y tiempos de inicio

  • El paquete final de Wails ocupa 52 MB, frente a los 57 MB de Tauri y los 324 MB de Electron.
  • El tiempo medio de inicio tibio sitúa a Electron en 350 ms, a Wails en 395 ms y a Tauri en 410 ms.
  • El tiempo de inicio en frío tras limpiar la caché favorece a Electron con 1890 ms, seguido de Tauri con 2049 ms y Wails con 2337 ms.

El empaquetado directo sin Chromium otorga a Wails y Tauri una ventaja considerable en espacio en disco respecto a los 324 MB que requiere Electron. Sin embargo, Electron mantiene la delantera en la velocidad de arranque desde cero debido a la optimización de su motor integrado. Las variaciones estéticas o de renderizado entre plataformas representan el único riesgo al depender de las vistas web nativas de cada sistema.

Integración con API nativas y experiencia de desarrollo

  • Wails utiliza Cgo para enlazar y compilar código en Objective-C directamente desde el entorno de Go.
  • La captura de pantalla en macOS requiere redactar manuales de vinculación con ScreenCaptureKit en Wails por falta de módulos comunitarios.
  • El ecosistema de Rust en Tauri ofrece módulos integrados que evitan la escritura de código en C o Objective-C.

Para acceder a marcos de trabajo avanzados como ScreenCaptureKit en macOS, Wails requiere escribir archivos en Objective-C expuestos como funciones de C puro. Go se vincula a estos archivos mediante Cgo, lo que sumó 450 líneas de código adicionales que no fueron necesarias en Tauri gracias al catálogo de librerías disponibles en Rust. La elección entre Wails y Tauri depende principalmente del lenguaje preferido para el backend y de la disposición a gestionar código nativo manualmente.

Community Posts

View all posts