DEV Community

Cover image for Elixir para React.js Devs
Camilo for JavaScript Chile

Posted on • Updated on

Elixir para React.js Devs

¿Qué es Elixir?

Elixir es un maravilloso lenguaje de programación, creado por José Valim el 2011 (Brasil) y a sus usuarios les gusta denominarse "alquimistas". Grandes empresas como Pinterest han ahorrado más de 2 millones de dólares al año en costos de servidores gracias a esta grandiosa tecnología.

¿Cómo Aprenderlo?

Para comenzar recomendamos el libro online gratuito Joy Of Elixir donde podrás realizar ejercicios para aprender lo básico del lenguaje. Es importante complementarlo con la herramienta Livebook ya que con ello podrás instalar Elixir fácilmente y ejecutar scripts.

También recomendamos mucho el clásico "Elixir in Action" para aprender más profundamente el ecosistema de Elixir y Erlang.

Comunidad de 🧙 Elixir Chile 🇨🇱

🧙 Elixir Chile 🇨🇱 tiene el objetivo de crear artefactos de software, documentación y actividades para el fomento de la tecnología Elixir en el país.

Todas las personas son bienvenidas, aunque no estén dentro de Chile. El único requisito es ser amables y apoyarnos mutuamente.

Pueden visitarnos en nuestra web https://elixircl.github.io/ y hablar con nosotros en Discord.

¿Para qué sirve Elixir?

Elixir es mucho más que un lenguaje de programación para backends. Es todo un ecosistema que sirve para distintos propósitos y cada día hay nuevas herramientas. Ciertamente si decides invertir en esta tecnología, podrás acceder a muchos campos laborales y proyectos entretenidos.

La siguiente tabla muestra algunas de las herramientas disponibles en el ecosistema.

Categoría Nombre Descripción Enlace
AI Nx Matrices multidimensionales (tensores) y definiciones numéricas para Elixir. (Similares a Numpy). https://github.com/elixir-nx/nx
AI Axon Axon brinda control total sobre cada aspecto de la creación y capacitación de una red neuronal. (Deeplearning Similares a Tensorflow/Pytorch). https://github.com/elixir-nx/axon
AI Scholar Algoritmos para la clasificación, regresión, agrupación, reducción de dimensionalidad, métricas y preprocesamiento. (Similar a SKLearn) https://github.com/elixir-nx/scholar
AI Bumblebee Bumblebee proporciona modelos de red neuronales previamente capacitados usando Axon. (Similar a Transformers). https://github.com/elixir-nx/bumblebee
AI Explorer Explorer trae la serie (unidimensional) y los marcos de datos (bidimensionales) para la exploración de datos rápidos a Elixir. (Similar a Pandas). https://github.com/elixir-explorer/explorer
AI EXGBoost Implementa algoritmos de aprendizaje automático en el marco de impulso de gradiente (Gradient Boosting framework). (Bind para XGBoost) https://github.com/acalejos/exgboost
IOT Nerves Construir e implementar fácilmente sistemas incrustados de producción. https://nerves-project.org/
Multimedia Membrane Un marco multimedia fácilmente comprensible y personalizable. https://membrane.stream/
Mobile Liveview Native Crea aplicaciones nativas Android e iOS utilizando Elixir. https://github.com/liveview-native
Mobile Elixir Desktop Crea aplicaciones de escritorio, Android e iOS utilizando Phoenix (Webview). https://github.com/elixir-desktop/desktop
Web Phoenix Framework Crea sistemas Webs tanto backend como frontend (con Liveview) https://www.phoenixframework.org/
Web Surface UI Extensión para Phoenix. Permite crear interfaces Web con inspiración de React.js y Vue.js https://surface-ui.org/
Web Ash Framework Extensión para Phoenix. Permite estandarizar la creación de APIs Rest y GraphQL. https://ash-hq.org/
ORM Ecto Una capa para llamar a las bases de datos https://hexdocs.pm/ecto/Ecto.html
HTTP Req Cliente HTTP con baterías incluidas (similar a python requests) https://github.com/wojtekmach/req
Serverless Flame Protocolo para aplicaciones tipo Serverlss similar a AWS Lambda. https://github.com/phoenixframework/flame
Herramientas Oban Procesamiento de Tareas https://github.com/sorentwo/oban
Herramientas Broadway Eventos (Similar a Kafka o RabbitMQ) https://github.com/dashbitco/broadway
Herramientas Livebook Automatizar flujos de trabajo de código y datos con cuadernos interactivos. (Similar a Jupyter Notebooks) https://livebook.dev/

¿Por qué Usarlo?

Razón Técnica: La Erlang VM (Beam) tiene más de 30 años de evolución en entornos distribuidos y concurrentes, lo que la hace ideal para los sistemas de hoy.

Un ejemplo es el experimento de Leandro donde se probó la cantidad de conexiones TCP. Elixir y Erlang superaron incluso a tecnologías como Go y Rust.

Elixir vs Go TCP Throutput

Razón Negocio: Utilizar tecnologías modernas como Elixir permite contratar personas curiosas, lo que es más probable que sean buenos candidatos. La disminución de las dependencias permitirá ahorrar costos a mediano y largo plazo.

Razón Emocional: Elixir y Phoenix son lenguajes y frameworks modernos y fáciles de aprender, lo que los hace entretenidos y permite motivar a las personas a experimentar y generar nuevas ideas o soluciones. Además son bien valorados en el mercado y las ofertas laborales están bien remuneradas.

Razón Profesional: Utilizar Elixir y Phoenix traerá oportunidades laborales novedosas, además de mejorar las probabilidades de destacar en el mercado al utilizar una tecnología con menor cantidad de competencia.

Para más detalles se puede leer:

Elixir para JS Devs

Una pequeña comparación entre los dos lenguajes basado en la página web Elixir for a JS Dev

Importar Módulos

Javascript


 import React, { useState } from 'react';
 import React as MyReact from 'react';

Enter fullscreen mode Exit fullscreen mode

Elixir


# En Elixir se puede importar solo llamando 
# al módulo de forma completa 
# (no depende de la estructura de directorios). 
# También notar la separación utilizando puntos.
import MySuperSpecialProject.HelperModule

# Un alias permite utilizar el módulo 
# sin especificar la ruta completa. 
# En este caso podremos usar HelperModule.
alias MySuperSpecialProject.HelperModule

# También podremos importar una función 
# en específico desde un módulo.
import MySuperSpecialProject.HelperModule, 
       only: [my_function, 1]
Enter fullscreen mode Exit fullscreen mode

Funciones

Javascript

 function add(n1, n2) {
   return n1 + n2;
 }
 const add = (n1, n2) => n1 + n2;
Enter fullscreen mode Exit fullscreen mode

Elixir

# Las funciones utilizan el keyword def
# similar a Python. Y utilizando bloques do y end
# similar a Ruby.
def add(n1, n2) do
  n1 + n2
end

# Las funciones pueden ser asignadas a variables
# En su forma larga (con fn)
add = fn(a, b) -> a + b end

# Y en su forma abreviada (usando &)
add = &(&1 + &2)

# Las funciones pueden ser privadas dentro de un módulo
# Similar a métodos privados de una clase.
defp private_add(n1, n2) do
  n1 + n2
end
Enter fullscreen mode Exit fullscreen mode

De-estructuración

Javascript

 const o = { nested: { prop: '¡Hola!' } };

 const { nested: { prop } = {} } = o;

 console.log(prop);
 // ¡Hola!
Enter fullscreen mode Exit fullscreen mode

Elixir

o = %{nested: %{prop: "¡Hola!"}}

# Esto es lo que se conoce como Pattern Matching
# Una herramienta muy poderosa en los lenguajes
# funcionales como Elixir.
%{nested: %{prop: prop}} = o

IO.inspect(prop)

# ¡Hola!
Enter fullscreen mode Exit fullscreen mode

Surface UI para React.js Devs

Ahora veremos una pequeña introducción a Surface UI y cómo alguien que conoce React.js puede aprenderlo fácilmente, permitiendo acceder al maravilloso mundo de Elixir y Phoenix.

Para comenzar esta pequeña comparación de tecnologías. Considerando React.js para Server Side Rendering (SSR) en el framework Next.js.

Tecnología Framework Lenguaje Realtime
Surface UI (https://surface-ui.org/) Phoenix Elixir LiveView
React.js Next.js Javascript Socket.io

Surface UI es una extensión para LiveView de Phoenix que trae convenciones y herramientas muy similares a las encontradas en frameworks de frontend Javascript como React.js o Vue.js.

React.js permite crear frontends web de forma declarativa en el ambiente cliente con Javascript. Reemplazando la forma imperativa comunmente usada en otras tecnologías como jQuery y HTMx. Actualmente existen herramientas como Next.js que permiten traer esta forma declarativa de crear frontend al servidor, sin embargo estos frameworks de Javascript al nivel de servidor no tienen las mismas características y capacidades ofrecidas por tecnologías que funcionen bajo la BEAM VM.

Phoenix con su herramienta LiveView permite crear frontends web de forma declarativa en el ambiente servidor con Elixir. Sumando la extensión de Surface UI nos permite tener lo mejor de los dos mundos. Primero una excelente y robusta plataforma de servidores y segundo, una forma de crear frontends utilizando convenciones y herramientas de fácil aprendizaje para personas que provengan de ecosistemas como Javascript.

Ejemplo de Módulo Surface

defmodule MyAppWeb.ExampleLive do
   use Surface.LiveView

   # Importamos nuestro componente
   # utilizando un alias
   alias MyAppWeb.Components.ExampleComponent

   def render(assigns) do
       # Renderizamos el HTML final
       # Con una sintaxis similar a JSX de React.js
       ~F"""
            <ExampleComponent>
               ¡Hola Mundo!
            </ExampleComponent>
        """
   end
end
Enter fullscreen mode Exit fullscreen mode

Características Principales de Surface UI

Propiedades

Al igual que React.js podemos definir las propiedades, tanto obligatorias como opcionales de nuestro componente y pasarlas al momento de renderizar el componente.

# Creando el Componente

defmodule Hola do
  use Surface.Component

  @doc "A quien saludar"
  prop nombre, :string, required: true

  def render(assigns) do
    ~F"""
    ¡Hola, {@nombre}!
    """
  end
end

# Usando el Componente

defmodule Ejemplo do
  use Surface.Component

  def render(assigns) do
    ~F"""
    <Hola nombre="Juan Pérez" />
    """
  end
end
Enter fullscreen mode Exit fullscreen mode
Estilos de CSS Colocados

Nos permite separar nuestros CSS en un archivo con el mismo nombre del módulo. (similar a Vue.js SFC CSS).

my_app_web/components
├── ...
├── card.ex
├── card.css
Enter fullscreen mode Exit fullscreen mode

También nos permite utilizar un tag especial <style> para cambiar la apariencia del componente.

def render(assigns) do
  ~F"""
  <style>
    .tag {
      @apply bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2;
    }
  </style>

  <div>
    <span class="tag">#surface</span>
    <span class="tag">#phoenix</span>
    <span class="tag">#tailwindcss</span>
  </div>
  """
end
Enter fullscreen mode Exit fullscreen mode
Hooks de Javascript

También podremos hacer uso de Javascript para ciertos eventos que no son necesarios llevarlos al servidor (Por ejemplo animaciones, reproducción de sonidos o utilización de bibliotecas de gráficos como D3).

Para ésto podemos crear un archivo javascript en el mismo directorio de nuestro componente.

my_app_web/components
├── ...
├── card.ex
├── card.hooks.js
Enter fullscreen mode Exit fullscreen mode
export default {
  mounted(){
    console.log("Componente Card se ha montado")
  }
}
Enter fullscreen mode Exit fullscreen mode

Y luego en el HTML se puede asociar al elemento
que gatillará el evento, utilizando la directiva :hook

<div id="mi_div" :hook>
  ...
</div>
Enter fullscreen mode Exit fullscreen mode
Catálogo de Componentes

De la misma forma que se usa Storybook para React.js, Surface UI cuenta con Catalogue, una ayuda para documentar y ver nuestros componentes de forma fácil y bonita.

Otros Enlaces
Proyectos de Ejemplo

Si desean ver un pequeño proyecto de ejemplo que utiliza Surface UI pueden ver el siguiente repositorio:

GitHub logo ElixirCL / huemulixir

Un juego simple con Elixir usando a Huemul para dar sabios consejos

También una configuración de ejemplo con Tailwind y Sass:

GitHub logo ElixirCL / surface-tailwind-sass

Ejemplo de Configuración de Phoenix con Surface, Tailwind y Sass

Surface + Tailwind + Sass

Realizaremos una configuración básica de Surface UI, Tailwind y Sass en un proyecto Phoenix con LiveView.

A menos que se especifique explícitamente, los contenidos de ésta obra están bajo una Licencia Creative Commons Atribución-No-Comercial-Compartir-Igual 4.0 Internacional Licencia Creative Commons.

El código fuente está bajo la licencia BSD. https://github.com/elixircl/surface-tailwind-sass/

1. Creación de un nuevo proyecto

Vamos a crear un nuevo proyecto, aunque si ya tienes uno previo igual es útil, puesto que realizaremos las configuraciones de…

Este proyecto muestra un Tic Tac Toe

GitHub logo ElixirCL / surface-tictactoe

An example Tic Tac Toe made with Surface 0.11

Surface TicTacToe Example

React Tic Tac Toe Tutorial Implemented in Surface UI (0.11)

  • Requires PostgreSQL running

To start your Phoenix server:

  • Run mix setup to install and setup dependencies
  • Start Phoenix endpoint with mix phx.server or inside IEx with iex -S mix phx.server

Now you can visit localhost:4000 from your browser.

License

BSD 2




Links

Conclusión

Elixir es una tremenda tecnología para invertir en aprenderla y utilizarla profesionalmente, no solo por su sintaxis amigable, también por su cantidad de herramientas y características versátiles que nos permitirán desarrollar y participar en una gran gama de proyectos de distinta índole.

Además el uso de Surface UI permitirá a muchas personas del área frontend Javascript, ingresar al mundo del desarrollo frontend y backend con Elixir, Phoenix y Liveview.

Top comments (1)

Collapse
 
josegermanx profile image
Jose Germán Martínez

Excelente post Camilo!!! Muchas gracias por compartir