Comenzando con Elixir y Phoenix

phoenix-elixir

Como desarrolladores, estamos siempre buscando nuevas herramientas que nos ayuden a crecer. Últimamente, he estado aprendiendo sobre programación funcional y cómo puede afectar el código que escribo en general. Durante esa búsqueda, descubrí sobre Elixir, un lenguaje funcional que aprovecha el Erlang virtual machine.

Erlang se utiliza para sistemas concurrentes y tolerantes a fallas. Elixir puede usar directamente las bibliotecas Erlang y tiene una sintaxis que ayuda a escribir código claro y conciso.

Obviamente, siendo principalmente un desarrollador web, comencé a buscar marcos web. Me encanta Django (la mayor parte), así que ese es mi punto de comparación. En elixir, el marco web principal se llama Phoenix. ¿Por qué es diferente? En sus propias palabras:

Phoenix recupera la simplicidad y la alegría de escribir aplicaciones web modernas al combinar tecnologías probadas y verdaderas con una brisa fresca de ideas funcionales.

Cree experiencias ricas e interactivas en navegadores, aplicaciones móviles nativas y dispositivos integrados con nuestra tecnología de transmisión en tiempo real llamada Channels.

Phoenix aprovecha la capacidad de Erlang VM para manejar millones de conexiones junto con la hermosa sintaxis y las herramientas productivas de Elixir para construir sistemas tolerantes a fallas.

Una de las cosas que no me gustan mucho en Django es el channels project. Funciona, y ha sido de gran ayuda en varios proyectos, pero parece que fue forzado a entrar en el framework (lo fue). Phoenix tiene una tecnología similar (creativamente llamada channels también) pero se ha construido junto con el framework. Es tan prometedor que crean LiveView. En pocas palabras, la representación del lado del servidor en tiempo real utilizando websockets.

Este fue el punto que me hizo seguir adelante y darle una oportunidad a Phoenix. ¿Una forma de hacer que los channels sean menos dolorosos? Por favor, quiero algo de eso.

Prerequisitos

Obviamente, Phoenix necesita Elixir, y Elixir necesita Erlang VM. También necesitaremos el administrador de paquetes Hex. Puede encontrar instrucciones para instalar Elixir aquí.

Una vez que tenga Elixir en su lugar, el administrador de paquetes Hex se puede instalar con:

mix local.hex

E instale el mix archive de elixir con:

mix archive.install hex phx_new 1.4.10

El último comando instalará las mix tasks requeridas para crear su aplicación.

Creando una aplicación Phoenix

Es tan simple como ejecutar:

mix phx.new hello

Esto creará la nueva carpeta «hello» que contiene todo el proyecto. También le preguntará si debe buscar dependencias. Esto incluye instalar las dependencias npm. Oh, olvidé mencionar que viene con webpack preconfigurado.
Si usted es uno de los que no le gusta el paquete web o prefiere configurarlo manualmente, puede configurar la opción --no-webpack al crear un proyecto.
El comando asumirá que vamos a usar la base de datos Postgres, pero puede, al igual que con webpack, usar otra cosa pasando un flag: --database mysql.

La configuración inicial supone que tiene un usuario con los permisos correctos y la contraseña «postgres». Si no lo hace, deberá ajustar las configuraciones para usar las credenciales correctas.

Suponiendo que haya terminado con las cosas triviales (que no deberían tomar más de 2 minutos), puede crear la base de datos e iniciar su servidor de desarrollo local:

mix ecto.create
mix phx.server

Debería ver lo siguiente en http://localhost:4000:

Fácil, ¿verdad? Cuando inició el servidor, debe haber notado que webpack también se inició. No más servidores proxy npm para configurar (lo cual es increíble).

Creando un CRUD simple

CRUD es la tarea única, repetitiva, aburrida y tediosa que tenemos que realizar cada vez que creamos un nuevo modelo. Es la comunicación con la entidad de base de datos recién creada.
Crearemos una tabla de base de datos simple y le pediremos a Phoenix que nos ayude un poco con la parte inicial. Lo haremos usando contexts. Contexts son solo una forma de separar la lógica dentro de su aplicación.

Crearemos una tabla llamada usuarios, en el contexto Accounts. Lo haremos con el siguiente comando:

mix phx.gen.html Accounts User users name:string username:string:unique

Como habrá notado, le decimos a Phoenix qué campos queremos y qué restricciones deben tener. Phoenix creará un esquema Ecto. Ecto es la biblioteca utilizada para comunicarse con las bases de datos, realizar consultas, validar datos, etc. El esquema se utiliza para validar los datos antes de enviarlos a la base de datos (por lo tanto, es validación a nivel de aplicación).
El comando también creará una migración, que debemos ejecutar para aplicar los cambios a la base de datos:

mix ecto.migrate

También necesitamos agregar el nuevo recurso a nuestras URL, para que podamos navegar allí. Podemos hacerlo modificando lib / hello_web / router.ex y agregando:

scope "/", HelloWeb do
...
  resources "/users", UserController
...
end

Ahora, veamos qué tenemos listo con este proceso de 2 minutos:

  • Un esquema de base de datos para validación de datos.
  • Una migración para aplicar los cambios a la base de datos.
  • Un recurso para las urls.

Espera, de hecho, eso debería significar que ya debe haber algo en esas URL (/usuarios), ¿verdad?


Podemos listar usuarios
Crear nuevos usuarios
Ver el detalle y editar usuarios
Nuevos usuarios se muestran en la lista
Y puede borrar usuarios de la lista

Tenemos un CRUD básico y funcional de forma gratuita. Impresionante, ¿verdad? Pero hay más. phx.gen.json puede ayudarnos si no estamos creando vistas html regulares, pero si estamos creando una API.

Y hay una cosa más que obtenemos de forma gratuita: las pruebas. Así es, obtenemos las pruebas CRUD (entre las tareas aburridas y repetitivas que representa un CRUD, las pruebas son las más aburridas). Puede verificarlos yendo a test / hello_web / controllers / user_controller_test.exs y ejecútelos con:

mix test

Probablemente ahora piense: hay tantas cosas que haré de manera diferente y que tendré que modificar … las pruebas ni siquiera se tienen en cuenta si el usuario está autenticado (solo un ejemplo aleatorio).
Y tendrá razón. El marco no puede pensar por usted. Sin embargo, desde el primer momento obtuvimos tantas cosas, que sumergirse para modificar la funcionalidad predeterminada será más rápido que comenzar desde cero. Y cuando necesitamos una nueva tabla o funcionalidad, podemos repetir el mismo proceso.

En Django, usando Class Based Views todavía puede tomar algún tiempo configurar todo esto. En Phoenix, todo esto es explícito, y si no lo necesita, puede eliminar los bits que no le son útiles. Eliminar es más rápido que agregar (al menos en este caso).

Palabras finales

Todavía estoy enamorado de Django. He trabajado con eso por muchos años. Sin embargo, Phoenix y Elixir ofrecen algunas características agradables que hacen que la pila de tecnología sea interesante.

Lo bueno de la programación funcional es que puede aplicar los conceptos aprendidos en cualquier lenguaje. Entonces, incluso si al final del día no termino usando Phoenix y Elixir, los conceptos que usaré allí pueden darme más información sobre lo que estoy haciendo en otras tecnologías, y me ayudarán a mejorar desarrollador.