8 puntos que debes saber para pasar de PHP a Nodejs

nodejs oct. 22, 2020

En este artículo quiero hablar de mi experiencia como desarrollador.

Estoy trabajando por más de 15 años, principalmente con PHP y Javascript.  

Y hace unos años surgió la oportunidad de trabajar en proyectos con Nodejs.

No significa que quiera cambiar PHP, sino enriquecer mis habilidades aprendiendo y trabajando con diferentes tecnologías.

Antes de trabajar con una tecnología nueva para mí, primero investigo mucho, y esta vez me costó bastante encontrar la información exacta que necesitaba.

La mayoría de artículos, ejemplos y tutoriales sobre Node Js que revisé, estaban dirigidas a los que recién se iniciaban en el mundo del desarrollo.

Obviamente si tomas un curso desde cero, puedes lograr aprender bien.

Pero eso va a llevar mucho tiempo, y en mi opinión eso no es necesario para alguien con mucho conocimiento y experiencia en desarrollo backend con PHP u otro lenguaje.

Lo que yo quería lograr, es simplemente aprovechar todo ese Know-how que ya tenía para entender y desarrollar mucho antes que un novato.

Por eso dediqué muchas horas buscando lo que realmente sería útil para mí, y así lograr aprender rápidamente y poder empezar cuanto antes.

Entonces si ya sabes PHP y mejor aún, si también conoces Javascript, este artículo va a ser muy interesante si quieres aprender a trabajar lo antes posible con Nodejs.

1 - Diferencias Básicas

Node Js es un entorno de ejecución de código javascript en el lado del servidor que funciona diferente a PHP.

A diferencia de un archivo php, si subes a tu hosting algún archivo, sitio o App hecha con Node js, configuras e ingresas a la ruta con tu navegador, no funcionará.

Eso es por que comúnmente, PHP funciona con un software servidor web como Apache, y normalmente todos los hosting ya vienen preparados para esto.

Claro, en aplicaciones modernas y con frameworks ya se puede usar PHP sin servidores externos.

Node js no necesita de Apache, pero necesitas acceder a una línea de comandos, entonces debes crear un servidor web en con tu propio código para ejecutarlo y acceder públicamente.

Con el Framework Express eso es muy sencillo de realizar, con unas pocas líneas de código ya tienes listo tu servidor, luego ejecutas tu archivo con el comando "node app.js" y ya está corriendo y ya puedes abrir desde tu navegador.

const express = require('express')
const app = express()
const port = 3000
const router = require("./routes/web")

app.use("/", router)

app.listen(port, () => {
    console.log(`Servidor escuchando el puerto ${port}`)
})

Puede que tengas inconvenientes si intentas desplegar algún app node en un hosting compartido que normalmente se usa para páginas PHP, ya que muchos no te facilitan la línea de comandos, es más fácil con un VPS por que ya tienes acceso total.

2 - Consumo de Memoria

PHP en el mejor de los casos, por cada conexión puede utilizar 2mb de memoria (Moodle usa 50mb, WordPress con muchos plugins hasta más 100mb), si tu máquina tiene 4Gb de RAM, teóricamente significa que puede colapsar al tener más de 2.000 usuarios con conexiones concurrentes.  

Eso no sucede con Node Js, en lugar de generar un nuevo hilo que consume memoria por cada conexión, utiliza uno sólo para múltiples conexiones.

Por eso Node Js puede gestionar decenas de miles de conexiones con un sólo servidor modesto, siempre que el proceso que tenga que realizar no sea algo muy grande ni pesado para la CPU.

Además Node Js aprovecha el motor V8 desarrollado por Google, este interpreta y compila Javascript a gran velocidad.

Por eso se dice que Node Js es la solución perfecta para crear Micro Servicios y no tanto para aplicaciones de cálculos intensivos en CPU.

Gracias a Node Js Linkedin pasó de ocupar 30 servidores a sólo 3.

3 - NPM: Administrador de Paquetes de Node

Descarga | Node.js
Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine.

Al instalar Node Js en tu entorno, también se instala el administrador de paquetes NPM.

NPM viene a ser lo que para PHP es Composer, indispensable para trabajar con los proyectos.

Con el comando npm init puedes generar el archivo package.json donde vas a tener bien ordenada la información acerca de los paquetes que tienes instalado y además automatizar con scripts algunos comandos muy útiles.

Para instalar un paquete es muy simple, en línea de comandos debes situarte en el directorio de tu proyecto y teclea: npm i nombre-del-paquete

https://www.npmjs.com/ es el registro de software más grande del planeta, ahí puedes ver todos los paquetes para inspirarte o integrar a tu proyecto.

Los paquetes esenciales a instalar son:

  1. Nodemon: Para reiniciar automáticamente el servidor cuando haya cambios en el código.
  2. Express: Framework más utilizado en nodejs, te facilitan muchas cosas.

4 - Asincronía

Php de forma predeterminada se ejecuta en forma síncrona, el código se ejecuta línea por línea hasta completarse.

Por ejemplo en PHP en un proceso de abrir un archivo, leer el archivo abierto y mostrar el contenido, se va ejecutando paso a paso, hasta que no termine, no puede ejecutarse otro proceso.

En Nodejs en forma predeterminada se ejecuta en forma asíncrona, lo que significa que todo el código se ejecuta a la vez.

Esto es uno de los puntos principales a tener en cuenta para codificar, por que si estamos acostumbrados a la sincronía de PHP nos puede traer muchos fallos inesperados.

Por ejemplo puede suceder que si ejecutas el ejemplo anterior (abrir, leer, mostrar un archivo) pero en Node js, aunque parezca que el código está bien, tal vez no muestre el contenido del archivo.

Si eso sucede, puede que el código "mostrar" se haya ejecutado tan rápido antes que siquiera pueda leerse el contenido del archivo.

Por eso debemos prestar mucha atención a los métodos que se utilizan para manejar la asincronía.

A continuación voy a ir mostrándote los principales temas que tienes que investigar y buscar tutoriales específicos para aprender más.

5 - Callbacks

Lo Callbacks son simplemente funciones que se pasan como argumento dentro de otra función.


function obtenerNombre(usuario, callback){
    const url = `https://api.github.com/users/${usuario}`
    callback(url)
}

//Al llamar la función de arriba, se pasa otra función como argumento
obtenerNombre('Oscaballer',function(callback){
    console.log(callback)
})
//Resultado: https://api.github.com/users/Oscaballer

Se pueden agregar más funciones como argumento dentro cada nueva función.

Esto sigue siendo asíncrono, es decir, se van a ejecutar todo al mismo tiempo, para poder manejarlos en forma síncrona hay que hacer trucos.

Además no es nada prolijo, se hace complejo de leer el código, ahora veremos lo que son las "Promesas" y "Async Away".

6 - Promesas

El concepto de una Promesa es un objeto que nos va a devolver un resultado después que finalice la operación.

Se crea así  "new Promise( (resolve, reject) => {} )" el primero de sus parámetros "resolve" nos devuelve los datos si se cumplen, mientras que el segundo "reject" nos devuelve el error si se produce.

Al llamar a la función se emplea .then() para obtener el resultado de la promesa y continuar con otra .then() o .catch() para obtener los errores.

Veamos en este ejemplo como obtener datos de una web api externa con .then()

//en este caso node-fech ya devuelve una Promesa, no se crea.
const fetch = require('node-fetch')

function obtenerNombre(usuario){
    const url = `https://api.github.com/users/${usuario}`
    return fetch(url)
}

obtenerNombre('Oscaballer')
.then(res => res.json())
.then(json => console.log(json.name))
    
 //Resultado: Oscar Caballero Pixelhaiha

Te recomiendo que busques un tutorial, aprendas y practiques hasta que no te quede duda del concepto, debes estudiarla a profundidad.

7 - Async Await

Este concepto es una mejora para trabajar con Promesas, en la que conseguimos un código aún más legible.

La diferencia es que, al llamar a una función que devuelve una promesa, en vez de utilizar seguidamente .then() se antepone la palabra "await".

Con esto le decimos al código que por favor espere a que tenga el resultado para nosotros, es así de simple.

Pero para que funcione, a esto hay que envolverlo con otra función en la que se antepone la palabra "async".

En el ejemplo vemos la misma función, pero en vez de utilizar .then(), se usa "async/await"

const fetch = require('node-fetch')

async function obtenerNombre(usuario){
    const url = `https://api.github.com/users/${usuario}`
    const response = await fetch(url)
    const json = await response.json()
    console.log(json.name)
}

obtenerNombre('Oscaballer')
    
//Resultado: Oscar Caballero Pixelhaiha

Luego se recomienda envolverlo en un bloque try() catch() para manejar los errores.

8 - Código Js Moderno

Punto y Coma: En Javascript ya no es necesario utilizar los punto y coma por línea;.

Template Strings: Como vimos en los ejemplos anteriores el uso de las comillas simples invertidas `` para delimitar las cadenas y la referencia con símbolo de dólar seguido de paréntesis ${variable} dentro de la cadena.

Ejemplo:

const url = "https://api.github.com/users/"+usuario //Antiguo

const url = `https://api.github.com/users/${usuario}` //Moderno

Variables: Se desaconseja el uso de var para declarar variables, en su lugar se usa let, pero en la mayoría de las veces puedes utilizar constantes const en vez de variables.

Incluir un archivo Js: Se utiliza require('ruta/a/-archivo-js') y no hace falta incluir la extensión .js, y en el archivo que va a ser incluido debe utilizarse module.exports = .

Funciones Flecha: Si ves este símbolo => en un código Javascript que no te confunda, es por que están utilizando funciones flecha.

Es una manera de acortar el código al representar una función, en la versión corta ya no necesita return, y si lleva un sólo parámetro ya no requiere paréntesis y si no lleva ningún parámetro entonces se colocan sólo los paréntesis, fijate en los ejemplos.

//Función larga
function suma(numero1, numero2) {
  return numero1 + numero2;
}
    
//Función corta
const suma = (numero1, numero2) => numero1 + numero2
    
//Función corta con un sólo parámetro ya no lleva paréntesis
const suma = numero => numero + 2
    
//Función corta sin párametros
const suma = () => 1 + 2

Conclusión

Si investigas bien, te concentras en tutoriales y practicas hasta entender bien todos estos conceptos, ya te va a ser fácil trabajar con proyectos Node.

Si estás familiarizado con MVC, Laravel o cualquier Framework, puedes crear dentro de una carpeta /src una estructura similar con los modelos, vistas, controladores, rutas, todo te va a ser muy familiar, inclusive puedes instalar módulos ORM.

Si vas a trabajar con Apis investiga los conceptos de CORS.

Lógicamente hay mucho que aprender, te recomiendo que también investigues Webpack, Babel, Eslint, MongoDB, Yeoman.

Y no olvides compartir este artículo con otros programadores PHP!

Oscar Caballero

Me dedico a investigar tecnologías y métodos que puedan potenciar el desarrollo de Proyectos Web y Apps, Ingeniería de Software, Cloud Computing y Marketing Digital. Puedes escribirme +595985856072

¡Genial! Te has suscrito con éxito.
¡Genial! Ahora, completa el checkout para tener acceso completo.
¡Bienvenido de nuevo! Has iniciado sesión con éxito.
Éxito! Su cuenta está totalmente activada, ahora tienes acceso a todo el contenido.