12

Fullstack sin dolor con Adonis.js

Hacer aplicaciones con Node.JS es doloroso
Admitamos que para hacer una aplicación fullstack de manera tradicional tenemos que instalar muchísimos módulos para echar a andar nuestra idea, módulos que nos permiten conectarnos a bases de datos, mostrar html, tener sockets, tener autenticación, sesiones, jwt, además, inventarnos convenciones o guiarnos de existentes para organizar todo nuestro código, esperar que el proyecto escale razonablemente (generalmente escala de manera irrazonablemente caótica) y esperar, esperar con todo el corazón que nuestra arquitectura sea lo suficientemente sólida para resistir su ciclo de vida esperado. Es doloroso hacer algo en Node.JS incluso usando Express.

Modulos y más modulos

Express.JS es una base minimalista
Hacer una aplicación con Express es comprar una hamburguesa de tamaño infantil y modificarla hasta hacerla un monstruo de 3 pisos con 40 ingredientes extra conservando la carne y el pan.

Una base minimalista

¡Meteor.JS es demasiado!
Lo admito, a veces un ecosistema que te dé ya todo hecho con convenciones tan estrictas puede ser una desventaja, e incluso es incómodo tener cosas que no usas de su stack ahi en tu proyecto robando espacio de disco lastimando tus sentimientos ingenieriles. Deriamos tener una base sólida con una muy buena propuesta de arquitectura pero lo suficientemente flexible para poder integrar lo que queramos.

Sails, Feathers, Koa, blablabla
Todas son muy buenas e implementan su propia base para empezar proyectos grandes, sin embargo todas están basadas en express y sus convenciones muchas veces son propuestas a modo. Usar estas herramientas es como comer las hamburguesas de las que hablé arriba hechas por otras personas que tampoco estaban contentas con la hamburguesa básica.

Django, Rails, Laravel, Phoenix…
Una base sólida con mucha flexibilidad esta resuelta en otros lenguajes. A veces siento envidia y me gustaría tener algo tan bonito como Django en node, o bien armado como Phoenix de Elixir, me gustaría tener un CLI tan bueno como el de Rails, o tener una base como la de Laravel que trajo buenas prácticas a PHP y que son cómodas y naturales de seguir al escribir el proyecto. A veces me gusta ver al vecino de enfrente con sus frameworks sexys.

!Es un pájaro!¡Es un avión! ¡¡¡No, es Adonis!!!

Adonis.JS

Así es hermano, pare de sufrir en su camino de desarrollador FullStack, Adonis.JS esta aquí para hacernos la vida más fácil, Adonis.JS viene ya con:

  • Un CLI
  • Autenticaciones
  • Sistema MVC
  • Un ORM con modelos, migraciones, factorys y seeds.
  • Soporte incluido para internacionalización i18n
  • Soporte de primera clase para tests
  • Login social
  • Sistema de plantillas
  • Validaciones
  • Servidor de sockets y cliente
  • y muchas cosas más

Y no esta basado en express, esta escrito en Javascript puro y te permite empezar a usar ES6 al escribir tu código, todo sin sacrificar el performance.

¿Cómo lo instalo?

// Instálalo, en la terminal escribe:
npm i -g @adonisjs/cli// Observa lo que Adonis tiene para ti:
adonis --help

¿Quieres una base para FullStack con soporte para el ORM, plantillas, validaciones y muchas cosas?

adonis new MiAsombrosaApp
cdMiAsombrosaApp
adonis start

¿Sólo quieres lo necesario para un API? Sin problema

adonis new MiAsombrosaAPI --apy-only
cd MiAsombrosaAPI
adonis start

¿Sólo quieres el esqueleto y agregarle de poco a poco los módulos que vayas necesitando? Aquí tienes Adonis sin grasa:

adonis new MiAsombrosaAppSinGrasa --slim
cd MiAsombrosaAppSinGrasa
adonis start

Adonis.JS en acción | Sistema de rutas

const Route = use('Route')

Route.get('/', ( ) => '¡Hola mamá, estoy programando!')
Route.get('/portafolio', 'PortfolioController.index')
// ¿Tienes un controlador con todo un sistema para administrar un recurso (CRUD etc)?
Route.resource('users', 'UserController')

// Agregar middleware de autenticación
Route
    .get('/botonRojo', 'PresidentController.Apocalipsis')
    .middleware('auth')

Adonis.JS en acción | Active Record ORM

Podemos crear Modelos, factorys, seeds y migraciones de manera muy fácil:

// En consola:
adonis make:model Cupcake --migration

En database/migrations/blabla_cupcake.js

const Schema = use('Schema')

classCupcakesSchemaextendsSchema{
  up () {
    this.create('cupcakes', (table) => {
      table.increments()
      table.string('name', 80).unique()
      table.charset('description', 150)
      table.integer('price')
      table.timestamps()
    })
  }

  down () {
    this.drop('cupcakes')
  }
}

module.exports = UsersSchema

Corremos las migraciones con:

adonis migration:run

Podemos ver el estatus de las migraciones con:

adonismigration:status

El modelo lo podemos ver en app/Models/Cupcake.js y podemos crear relaciones con otros modelos:

const Model = use('Model')

classCupcakeextendsModel{
  sells() {
		returnthis.hasMany('App/Models/Sell')
	}
}

module.exports = User

En la ruta (aunque podría ir mejor en el controlador):

const Route = use('Route')
const User = use('App/Models/Cupcake')
Route
	.get('cupcakes', async () => {
		returnawait Cupcake.all()
	})

Para verlo en una plantilla Edge de Adonis debemos llamarla en la ruta y crear el archivo edge en resources/views:

  • start/routes.js
Route
  .get('cupcakes', async ({view}) => {
		const cupcakes = await Cupcake.all()

		return view.render('ListaCupcakes', {cupcakes})
	})
  • resoucers/views/ListaCupcakes.edge
    <ul>
    	@each(cupcake in cupcakes)
    		<li>Nombre: {{ cupcake.name }} | Precio : {{ cupcake.price }}</li>
    	@endeach
    </ul>

Recursos para aprender más:

Adonis JS tiene muchos recursos gratuitos de calidad para aprenderlo y sacarle jugo, pueden verlos aquí:

Documentación oficial
Recursos en video
Tutoriales escritos

Creo que tenemos un gran framework javascript que nos permitirá tener proyectos con buenas prácticas, que sean escalables y nos permitan ser más productivos.

Mandame un comentario si quieres conocer más o conoces otros recursos geniales sobre AdonisJS.

Escribe tu comentario
+ 2
1
4679Puntos

Excelente articulo, seria chevere q hicieran un curso de este framework…