Excalidraw Electron dejó de estar disponible y se reemplazó por la versión web

Descubre por qué el proyecto Excalidraw decidió dar de baja su wrapper de Electron en favor de la versión web.

Thomas Steiner
Thomas Steiner

En el proyecto Excalidraw, decidimos dar de baja Excalidraw Desktop, un wrapper de Electron para Excalidraw, en favor de la versión web que puedes encontrar (y siempre pudiste encontrar) en excalidraw.com. Después de un análisis cuidadoso, decidimos que la aplicación web progresiva (PWA) es el futuro en el que queremos basarnos. Sigue leyendo para descubrir por qué.

Cómo surgió Excalidraw para computadoras

Poco después de que @vjeux creara la versión inicial de Excalidraw en enero de 2020 y lo publicara en un blog, propuso lo siguiente en el problema n.° 561:

Sería genial unir Excalidraw en Electron (o un equivalente) y publicarlo como una aplicación [específica de la plataforma] en las distintas tiendas de aplicaciones.

La reacción inmediata de @voluntadpear fue sugerir lo siguiente:

¿Qué tal si la conviertes en una AWP? Actualmente, Android admite agregarlas a Play Store como Trusted Web Activities y, con suerte, iOS hará lo mismo pronto. En computadoras, Chrome te permite descargar un atajo de escritorio a una AWP.

La decisión que tomó @vjeux al final fue simple:

Deberíamos hacer ambas cosas :)

Si bien @voluntadpear inició el trabajo para convertir la versión de Excalidraw en una AWP y, más tarde, otros lo hicieron, @lipis siguió adelante de forma independiente y creó un repositorio independiente para Excalidraw para computadoras.

Hasta el día de hoy, aún no se alcanza el objetivo inicial que estableció @vjeux, es decir, enviar Excalibur a las diversas tiendas de aplicaciones. Honestamente, nadie siquiera comenzó el proceso de envío a ninguna de las tiendas. Pero ¿por qué? Antes de responder, veamos a Electron, la plataforma.

¿Qué es Electron?

El argumento de venta único de Electron es que te permite “crear apps de escritorio multiplataforma con JavaScript, HTML y CSS”. Las apps compiladas con Electron son "compatibles con Mac, Windows y Linux", es decir, "las apps de Electron se compilan y ejecutan en tres plataformas". Según la página principal, las partes difíciles que Electron facilita son las actualizaciones automáticas, los menús y las notificaciones a nivel del sistema, los informes de fallas, la depuración y la generación de perfiles, y los instaladores de Windows. Resulta que algunas de las funciones prometidas requieren un análisis detallado de la letra pequeña.

  • Por ejemplo, las actualizaciones automáticas "solo [actualmente] [se admiten] en macOS y Windows. No hay compatibilidad integrada con el actualizador automático en Linux, por lo que se recomienda usar el administrador de paquetes de la distribución para actualizar la app".

  • Los desarrolladores pueden crear menús a nivel del sistema llamando a Menu.setApplicationMenu(menu). En Windows y Linux, el menú se establecerá como el menú superior de cada ventana, mientras que en macOS hay muchos menús estándar definidos por el sistema, como el menú Servicios. Para que los menús sean estándares, los desarrolladores deben configurar el role de su menú según corresponda, y Electron los reconocerá y los convertirá en menús estándares. Esto significa que mucho código relacionado con el menú usará la siguiente verificación de plataforma: const isMac = process.platform === 'darwin'.

  • Los instaladores de Windows se pueden crear con windows-installer. En el archivo readme del proyecto, se destaca que "para una app de producción, debes firmar tu aplicación. El filtro SmartScreen de Internet Explorer bloqueará la descarga de tu app, y muchos proveedores de antivirus la considerarán software malicioso, a menos que obtengas una certificación válida" [sic].

Si solo observas estos tres ejemplos, queda claro que Electron está lejos de ser “escribir una vez, ejecutar en todas partes”. Para distribuir una app en tiendas de aplicaciones, se requiere la firma de código, una tecnología de seguridad para certificar la propiedad de la app. El empaquetado de una app requiere el uso de herramientas como electron-forge y pensar dónde alojar los paquetes para las actualizaciones de la app. Se vuelve complejo con relativa rapidez, en especial cuando el objetivo es la compatibilidad multiplataforma. Quiero señalar que es absolutamente posible crear apps de Electron increíbles con suficiente esfuerzo y dedicación. En el caso de Excalidraw para computadoras, no lo hicimos.

Dónde quedó Excalidraw para computadoras

Hasta el momento, Excalidraw para computadoras de escritorio es básicamente la app web de Excalidraw empaquetada como un archivo .asar con una ventana Acerca de Excalidraw agregada. El aspecto de la aplicación es casi idéntico al de la versión web.

La aplicación de escritorio de Excalidraw se ejecuta en un wrapper de Electron.
Excalidraw para computadoras de escritorio es casi indistinguible de la versión web
Ventana "Acerca de" de Excalidraw Desktop que muestra la versión del wrapper de Electron y la app web.
El menú Acerca de Excalibur proporciona estadísticas sobre las versiones

En macOS, ahora hay un menú a nivel del sistema en la parte superior de la aplicación, pero como ninguna de las acciones del menú, aparte de Close Window y About Excalidraw, está conectada a nada, el menú es, en su estado actual, bastante inútil. Mientras tanto, todas las acciones se pueden realizar a través de las barras de herramientas normales de Excalidraw y el menú contextual.

Barra de menú de Excalidraw para computadoras de escritorio en macOS con el elemento de menú “File”, “Close Window” seleccionado.
La barra de menú de Excalidraw para computadoras en macOS

Usamos electron-builder, que admite asociaciones de tipos de archivo. Cuando haces doble clic en un archivo .excalidraw, lo ideal es que se abra la app de Excalidraw para computadoras. El fragmento relevante de nuestro archivo electron-builder.json se ve de la siguiente manera:

{
  "fileAssociations": [
    {
      "ext": "excalidraw",
      "name": "Excalidraw",
      "description": "Excalidraw file",
      "role": "Editor",
      "mimeType": "application/json"
    }
  ]
}

Lamentablemente, en la práctica, esto no siempre funciona según lo previsto, ya que, según el tipo de instalación (para el usuario actual, para todos los usuarios), las apps en Windows 10 no tienen los derechos para asociar un tipo de archivo a sí mismas.

Estas deficiencias y el trabajo pendiente para que la experiencia sea realmente similar a una app en todas las plataformas (que, una vez más, con suficiente esfuerzo es posible) fueron un argumento sólido para que reconsideremos nuestra inversión en Excalidraw para computadoras. Sin embargo, el argumento más importante para nosotros fue que prevemos que, para nuestro caso de uso, no necesitamos todas las funciones que ofrece Electron. El conjunto de capacidades de la Web, que sigue creciendo, nos sirve igual de bien, si no mejor.

Cómo nos sirve la Web hoy y en el futuro

Incluso en 2020, jQuery sigue siendo increíblemente popular. Para muchos desarrolladores, se ha convertido en un hábito usarlo, a pesar de que hoy podrían no necesitar jQuery. Hay un recurso similar para Electron, llamado You Might Not Need Electron. Permíteme explicar por qué creemos que no necesitamos Electron.

App web progresiva instalable

Actualmente, Excalidraw es una app web progresiva instalable con un service worker y un manifiesto de app web. Almacena en caché todos sus recursos en dos cachés, una para las fuentes y el CSS relacionado con ellas, y otra para todo lo demás.

Pestaña Application de las Herramientas para desarrolladores de Chrome que muestra las dos cachés de Excalidraw.
Contenido de la caché de Excalidraw

Esto significa que la aplicación es completamente sin conexión y puede ejecutarse sin una conexión de red. Los navegadores basados en Chromium para computadoras y dispositivos móviles le solicitan al usuario que instale la app. Puedes ver el mensaje de instalación en la siguiente captura de pantalla.

Excalidraw le solicita al usuario que instale la app en Chrome en macOS.
Diálogo de instalación de Excalidraw en Chrome

Excalidraw está configurado para ejecutarse como una aplicación independiente, por lo que, cuando lo instalas, obtienes una app que se ejecuta en su propia ventana. Está completamente integrado en la IU de multitarea del sistema operativo y obtiene su propio ícono de app en la pantalla principal, la estación de carga o la barra de tareas, según la plataforma en la que lo instales.

Excalidraw se ejecuta en su propia ventana.
La AWP de Excalidraw en una ventana independiente
Ícono de Excalidraw en la estación de trabajo de macOS.
El ícono de Excalidraw en la estación de acoplamiento de macOS

Acceso al sistema de archivos

Excalidraw usa browser-fs-access para acceder al sistema de archivos del sistema operativo. En los navegadores compatibles, esto permite un flujo de trabajo de apertura, edición y guardado real, y un guardado adicional y una opción "Guardar como" reales, con un resguardo transparente para otros navegadores. Puedes obtener más información sobre esta función en mi entrada de blog Cómo leer y escribir archivos y directorios con la biblioteca browser-fs-access.

Compatibilidad con arrastrar y soltar

Los archivos se pueden arrastrar y soltar en la ventana de Excalidraw, al igual que en las aplicaciones específicas de la plataforma. En un navegador que admita la API de acceso al sistema de archivos, se puede editar de inmediato un archivo que se haya dejado caer y guardar las modificaciones en el archivo original. Es tan intuitivo que, a veces, te olvidas de que estás tratando con una app web.

Acceso al portapapeles

Excalidraw funciona bien con el portapapeles del sistema operativo. Se pueden copiar y pegar dibujos completos de Excalidraw o solo objetos individuales en formatos image/png y image/svg+xml, lo que permite una integración sencilla con otras herramientas específicas de la plataforma, como Inkscape o herramientas basadas en la Web, como SVGOMG.

Menú contextual de Excalidraw que muestra los elementos de menú “Copiar en el portapapeles como SVG” y “Copiar en el portapapeles como PNG”.
Menú contextual de Excalidraw que ofrece acciones del portapapeles

Manejo de archivos

Excalidraw ya admite la API de manejo de archivos experimental, lo que significa que se puede hacer doble clic en los archivos .excalidraw en el administrador de archivos del sistema operativo y abrirlos directamente en la app de Excalidraw, ya que Excalidraw se registra como un controlador de archivos para los archivos .excalidraw en el sistema operativo.

Los dibujos de Excalidraw se pueden compartir mediante un vínculo. Este es un ejemplo. En el futuro, si los usuarios tienen Excalidraw instalado como una AWP, esos vínculos no se abrirán en una pestaña del navegador, sino que iniciarán una nueva ventana independiente. A la espera de la implementación, esto funcionará gracias a la captura de vínculos declarativos, que, en el momento de escribir este artículo, es una propuesta de vanguardia para una nueva función de la plataforma web.

Conclusión

La Web ha avanzado mucho, y cada vez más funciones llegan a los navegadores que, hace solo un par de años o incluso meses, eran impensables en la Web y eran exclusivas de aplicaciones específicas de la plataforma. Excalidraw está a la vanguardia de lo que es posible en el navegador, a la vez que reconoce que no todos los navegadores en todas las plataformas admiten cada función que usamos. Cuando apostamos por una estrategia de mejora progresiva, disfrutamos de lo más reciente y lo mejor siempre que sea posible, pero sin dejar a nadie atrás. Se ve mejor en cualquier navegador.

Electron nos ha servido bien, pero en 2020 y en el futuro, podemos vivir sin él. Ah, y con respecto al objetivo de @vjeux: Como Android Play Store ahora acepta AWP en un formato de contenedor llamado Actividad web confiable y Microsoft Store también admite AWP, puedes esperar que Excalidraw esté disponible en estas tiendas en un futuro no muy lejano. Mientras tanto, puedes usar e instalar Excalidraw en el navegador y desde él.

Agradecimientos

@lipis, @dwelle y Joe Medley revisaron este artículo.