Do you want to switch to Platzi in English?
9

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
Ordenar por:
6
12467Puntos

fe de erratas:

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

Buenas. Estoy empezando con Sails.js, y me topé con este tutorial. Vengo de Laravel, y por lo que veo no me va a costar nada utilizar este Framework, ya que lo veo bastante similar. También me llama la atención de que utilice Vanilla Javascript. Necesito un Framework para crear una aplicación que también se pueda “convertir” en una APP, con Cordova o algo similar.

¿Crees que es mi Framework?

4
12467Puntos
5 meses

Alo! Pues creo que es más fácil que se pueda convertir en una PWA con Vue o React 😃, hay un proyecto para hacer un boilerplate con Nuxt llamado Adonuxt https://github.com/nuxt-community/adonuxt-template.

Aunque igual podrías armar un api REST o con GraphQL para que la consuma tu APP 😃 usando fetch.

Si vienes del mundo de Laravel yo creo que si es tu framework, lo he visto muy versátil, podrías usar este Boilerplate que sería casi empezar un proyecto con Lumen de Laravel:

adonis new MiAsombrosaAPIParaMiApp --api-only
cd MiAsombrosaAPI
adonis start

Ahora que estás en el mundo de las apps, podrías usar React Native, hay muchos proyectos geniales que te ayudan con el tema de UI 😄 por ejemplo NativeBase que te generan un app nativa que se ve bien en vez de usar un web view 😃, te sorprenderás de los rápido que es hacer cosas con React Native y NativeBase 😄

4
7136Puntos
5 meses

Hola Buenas.
Bueno, la verdad es que no estoy metido en el mundo de las Apps. Solo quería hacer una pequeña app de una aplicación web.

He estado investigando estos días, y sí, es muy muy parecido a Laravel, a mí me está gustando mucho.

Se podría hacer una PWA con Vue y conectarlo mediante API a este Framework.

Muchas gracias!

3
12467Puntos
5 meses

@herrerosmiguel no hay de qué 😄, espero todo salga genial con tu proyecto y lo presumas/compartas 😃

4
862Puntos

Exclente, llega en el momento indicado esté framework, gracias

1
12467Puntos
5 meses

No hay de qué 😄, este Framework se me hizo muy cool, espero tenga un crecimiento tan bueno como Vue 😃

3
9775Puntos

Propongo elevar este tutorial como blog en la plataforma, me interesa darle seguimiento al tema, y más por los comentarios emitidos en relación a su similitud con Laravel … y más porque me estaba disponiendo a empezar a estudiar node.js hasta que vi esta línea:

Es doloroso hacer algo en Node.JS incluso usando Express…

2
12467Puntos
2 meses

Jeje bueno, es un comentario personal, muchas cosas se podrían resolver con un framework que prefiera la convención sobre la configuración. Sin embargo hay veces en que la naturaleza es tan especial que necesitas hacer algo con express o no necesitas “tanta potencia/baterías”, si yo quisiera hacer algo sobre IoT, arte interactivo, o algo muy “fuera del molde” y que no necesitara tantas convenciones me iría por Express, pero si mi idea se nutriría mejor del patrón MVC yo me iría por Adonis, Laravel, Django, Rails o Phoenix 😃. Para mi Express es doloroso para hacer MVC, pero para hacer experimentos o herramientas a modo para IoT es genial!

2
12467Puntos
2 meses

Mandé la propuesta también jeje, espero poder escribir más articulos sobre iniciación al tema. Por otro lado un amigo mio tiene tutoriales muy bueno (sólo que en ingles) te dejo la liga: Tutoriales de AdonisJS

2
977Puntos

Excelente, voy a pegarle un ojo este finde. Una pregunta, tenes proyectos en Adonis?

1
12467Puntos
5 meses

Hola @faherrera, actualmente estoy haciendo cosas para mi trabajo con Adonis, Neo4j y Postgres, recién lo descubrí y no he hecho aún algo público en github jojo, pero estaría bueno proponer un reto de Adonis.JS y buscar resolverlo solo por diversión 😄

1
12467Puntos
5 meses

@faherrera, qué tal te fue con Adonis 😃?