He estado desarrollando aplicaciones web en PHP durante años, pero recientemente he estado construyendo más aplicaciones para iOS. Cuando vuelvo al desarrollo web, realmente extraño la elegancia de Objective-C y su estructura MVC. Pude encontrar una estructura similar para mi JavaScript del lado del cliente, pero mi código del lado del servidor se dejó en los límites de mi zona de confort y PHP. Lo mejor de PHP es su ubicuidad y su baja barrera de entrada. Puede poner en funcionamiento una aplicación web en muy poco tiempo, sin embargo, el código en sí puede convertirse rápidamente en una montaña de código de espagueti. Después de casi todos los trabajos que hago usando PHP, me digo que es hora de comenzar a trabajar de manera más inteligente. Luego comenzaré a investigar nuevos marcos para PHP y pensaré en saltar completamente a una nueva pila que use Java, Ruby o Python. Comenzaré a jugar con el nuevo enfoque y desarrollaré aplicaciones simples. Sin embargo, lo que inevitablemente sucede es que entra un nuevo trabajo y recurro a mi conocimiento de dominio de PHP. Esto se debe en parte a mí, pero al mismo tiempo es el problema de la plataforma que estoy tratando de aprender. He encontrado los puntos de entrada para hacer aplicaciones sólidas que usan otros lenguajes mucho más altos que con PHP. Esto es en parte por qué PHP es un monstruo en la industria y por qué Rails y Django generalmente son relegados a los puristas.
Además de todas las alternativas populares a PHP, hay un chico relativamente nuevo en el bloque llamado Node.js. Cuando comencé a jugar con Node hace unos años, fue refrescante confiar en el conocimiento de JavaScript que tenía para crear el código del lado del servidor. Sin embargo, Node nunca pareció ser un competidor realista de los grandes idiomas a la hora de escribir un código completo del lado del servidor; fue solo para nuevos y no probados.
Recientemente eché otro vistazo al uso de Node como mi idioma principal del lado del servidor y me impresionó su progreso y comunidad. Ha madurado lo suficiente como para ser utilizado como una herramienta esencial para cualquier desarrollador web, pero especialmente para desarrolladores de interfaz de usuario / front-end. Era hora de profundizar en Node nuevamente y ver si me separaría de PHP de una vez por todas.
Nodo 101
Poner Node en funcionamiento en mi MacBook fue tan simple como podrías esperar. Así es como se ve la instalación de OSX:
// Instala homebrew y luego Node
ruby -e “$ (curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install )”
preparar el nodo de instalación
Después de eso, estás listo para ejecutar el código JavaScript en tu servidor. La aplicación Node ‘Hello World’ muestra la estructura básica del código y al mismo tiempo ilustra que es un servidor web muy capaz. Con solo 2 líneas en la terminal, tendrá todo el poder de JavaScript a su disposición y un servidor web para arrancar. Pruébelo, abra un editor de texto e ingrese este código:
var http = require (‘http’);
http.createServer (función (req, res) {
res.writeHead (200, {‘Content-Type’: ‘text / plain’});
res.end (‘Hola Mundo \ n’);
}). escuchar (1337, ‘127.0.0.1’);
console.log (‘Servidor que se ejecuta en http://127.0.0.1:1337/' ;);
Guarde su archivo como app.js y desde la terminal ejecute:
nodo app.js
Cargue su navegador y vaya a http: // localhost: 1337 y ¡listo!
Esto te lleva a donde podrías preguntar, “ok, ¿y ahora qué?”. Al menos eso fue lo que hice la primera vez que le di un crack. No sabía ni entendía cómo aplicar ninguno de mis conocimientos existentes sobre cómo construir una aplicación web adecuada a partir de este ejemplo.
NPM
El nodo se vuelve realmente poderoso cuando comienzas a agregarle. El Node Package Manager * o NPM se incluye con la instalación de Node. La comunidad ha creado algunas aplicaciones, herramientas, marcos y middleware invaluables para ayudar a los desarrolladores de UI a centrarse en las tareas clave que tenemos entre manos; haciendo grandes experiencias de usuario. Si tiene experiencia con el compositor cuando construye sus aplicaciones web PHP, entonces usar NPM no será un gran alcance para usted. Hay algunos sitios geniales para ayudar a comprender los entresijos de NPM, así que solo mencionaré un par de cosas clave. NPM utiliza un archivo llamado package.json para delinear los metadatos de su aplicación y, lo más importante, las dependencias del software de su aplicación web. Puede editar este archivo manualmente y completar las dependencias por su cuenta, tal como lo haría con el archivo composer.json del compositor. También puede instalar paquetes desde la línea de comandos de esta manera:
npm install –save
Normalmente agrego la opción ‘- guardar’ para que el paquete se agregue a la lista de dependencias en mi archivo package.json.
Más allá de su aplicación web, NPM alberga algunas aplicaciones del servidor realmente geniales que querrá usar para facilitarle la vida. Puede instalar paquetes dentro de su directorio de aplicaciones local o puede elegir instalar paquetes globalmente en su sistema. Instalarlos globalmente le dará acceso al paquete desde la línea de comando (deberá agregar la carpeta bin NPM a la RUTA de su terminal). Instalar un paquete globalmente se ve así:
npm install -g
Después de aprender a administrar paquetes, hay algunos esenciales que querrás instalar antes de mojarte los pies con Node.
Construcción y portabilidad de sitios web
No he estado jugando con Node durante demasiado tiempo, pero he encontrado algunas cosas esenciales para que me mueva en la dirección correcta. Aquí hay una selección de los que encontré más útiles.
Exprimir
Quizás el componente más importante para crear aplicaciones web exitosas en Node es Express. Es un paquete de middleware que se basa en los fundamentos de Node al agregar algunas estructuras importantes para crear aplicaciones web con él. El nodo mismo delega gran parte de la responsabilidad del servidor web al programador. Express se basa en un paquete de middleware llamado Connect que llena este vacío para que los desarrolladores no tengan que preocuparse por los pequeños detalles de análisis de entrada y publicación de páginas. Además de eso, Express proporciona un marco muy agradable para que un desarrollador siga y cree un código rico y sostenible. Express se ha convertido en el estándar de facto para crear aplicaciones web en Node. No construiré una aplicación web sin ella. Hay una guía fantástica en el marco de la aplicación web Node.js para comenzar: http://expressjs.com/guide.html
Nota: Me informaron que el equipo Express está construyendo un nuevo marco llamado KoaJS. Definitivamente vale la pena echarle un vistazo: http://koajs.com/ ¡ Gracias @jeswin!
En la página de inicio de Express también hay un enlace a un libro muy útil. Le guiará a través de una descripción muy detallada de Node y se desarrollará para crear aplicaciones web con Express. Me pareció muy útil para comprender los principios básicos de Node antes de saltar a Express. Echa un vistazo: http://www.manning.com/cantelon/
Nodemon
Ejecutar y probar una aplicación Node es muy diferente a construir una en PHP. Por lo general, con PHP se piratea algún código y luego se dirige al navegador y se actualiza. Es posible que de vez en cuando necesite modificar la configuración de Apache y reiniciar el servidor web. El proceso en Node es bastante diferente. Dado que el servidor web y la aplicación están agrupados en un pequeño paquete, cambiar el código significaba tener que reiniciar toda la aplicación web; lo que también significaba reiniciar el servidor web. Cuando estaba aprendiendo cómo construir los conceptos básicos, parecía que había una cantidad interminable de matar el proceso, presionando la flecha hacia arriba para ir a mi último comando y luego presionando enter para reiniciar la aplicación ([Ctrl + C] [Arriba] [Entrar ] ciclo). Esto rápidamente se convirtió en un dolor gigante en el culo. Para que las personas hicieran un trabajo significativo en Node, esto tenía que mejorar. Afortunadamente, aquí es donde Nodemon viene al rescate. Instale Nodemon usando NPM globalmente y en lugar de iniciar su aplicación usando:
nodo app.js
nosotros lo siguiente:
nodemon app.js
Esta aplicación controlará los cambios en el código y reiniciará automáticamente Node por usted. Muy sencillo y muy esencial. Echa un vistazo al repositorio de git para obtener más detalles: https://github.com/remy/nodemon
Trago
Cuando construí aplicaciones web PHP, mi motor de plantillas elegido fue Twig de la buena gente de SensioLabs. Fue un componente del marco de Symfony y facilitó la creación de HTML front-end. Twig era una herramienta esencial para mí y si iba a portar cualquiera de mis proyectos existentes a Node, tenía que reutilizar las plantillas de vista que ya tenía. Swig hizo esta transición increíblemente simple. Casi todas las partes de Twig que utilicé estaban disponibles en Swig. Tuve que hacer un par de modificaciones menores al código de la plantilla, pero en general estaba listo para usar. Es completamente compatible con Express y tiene una guía muy útil para comenzar aquí: http://paularmstrong.github.io/s… .
Hay un puerto directo de Twig to Node pero desafortunadamente ese proyecto se ha estancado. Swig se actualiza muy activamente, así que opté por usarlo en el futuro.
Nota: Supongo que otros pueden encontrar esto útil dado que Twig es uno de los motores de plantillas más populares en PHP. Más allá de Swig, hay numerosos motores de plantillas disponibles para Node. Todos los populares tienen la misma o similar funcionalidad; se trata solo de diferencias de sintaxis en su mayor parte.
MySQL para el nodo
Cuando lees sobre Node, la mayoría de las veces está emparejado con bases de datos de tipo NoSQL como MongoDB. En el futuro, lo más probable es que use Mongo simplemente debido al increíble middleware Mongoose. Hace que la gestión de modelos dentro de las aplicaciones web sea increíblemente sencilla. Sin embargo, dado que tengo algunos proyectos heredados para administrar y transferir, quiero mantener todo lo que pueda. Esto significaba mantener mis esquemas y datos MySQL existentes en su lugar. Hay algunos paquetes MySQL disponibles, pero encontré el de felixge increíblemente completo. Eche un vistazo aquí para obtener más información y uso: https://github.com/felixge/node- …
Pasaporte JS
En la actualidad, casi todas las aplicaciones web tienen algún tipo de conectividad con API de terceros. La autenticación con estos servicios tiene sus desafíos. Afortunadamente, hay numerosos paquetes disponibles en PHP para facilitar el acceso a estas API. Con Node realmente solo necesita preocuparse por PassportJS. Es un paquete compatible con Express que le permite autenticarse en casi cualquier lugar de la web. Incluso puede usarlo para autenticar su propio inicio de sesión local y administrar sesiones si es necesario. Encontré esta herramienta invaluable al autenticar con otros servicios como Twitter, Instagram y Facebook. Desde el wiki del software, dice que puede autenticarse con 140 servicios diferentes. A debe tener para cualquier desarrollador de aplicaciones web. Echa un vistazo a los detalles aquí: http://passportjs.org/guide/
Arrancando los motores
Después de comprender los fundamentos del Nodo y familiarizarme con la nueva pila, estaba listo para saltar y comenzar a crear aplicaciones. Me llevó alrededor de un día leer el libro NodeJS in Action y analizar algunos ejemplos con Express. Con una comprensión básica de cómo funcionaba la mecánica, la siguiente tarea fue hacer que uno de mis viejos proyectos fuera transferido. Para un sitio multilingüe de tamaño pequeño a mediano, el proceso de migración tardó entre 2 y 3 días. La velocidad a la que porto sitios sin duda aumentaría a medida que me familiarice con el proceso y las estructuras de Node y Express. Aquí hay un par de cosas que son notas dignas para otros que se mudan de PHP.
Sincrónico vs Asincrónico
Uno de los cambios más importantes que tuve que entender fue convertir mi código PHP sincrónico en código JavaScript asincrónico. Dado que Node se basa en un sistema de bucle de eventos sin bloqueo de subproceso único, cualquier acción que realice no esperará a que regrese una acción de bloqueo antes de ejecutar la siguiente línea de código. Todas las líneas de código se ejecutan inmediatamente una tras otra. La idea de que los datos solicitados estarán disponibles en la siguiente línea de código no es una garantía. Aquí es donde su experiencia de JavaScript front-end le ayudará. Al igual que el lado del cliente, los eventos se manejan mediante funciones de devolución de llamada y lo mismo ocurre con el código Javascript en el servidor. Para crear código síncrono usando JavaScript, deberá anidar su secuencia de eventos en devoluciones de llamada. Aquí hay un ejemplo:
// PHP
$ sql1 = “SELECCIONAR ID_usuario DE usuarios DONDE correo electrónico =?”;
$ stmt = DB () -> preparar ($ sql);
$ stmt-> execute (array ($ correo electrónico));
$ sql2 = “SELECCIONAR photo_id DE las fotos DONDE user_id =?”;
$ stmt = DB () -> preparar ($ sql);
$ stmt-> execute (array ($ user_id));
Justo lo que esperarías. PHP ejecutará y esperará un resultado de la primera consulta y luego usará los datos recibidos en la segunda. En Node, tendría que anidar las consultas a través de las devoluciones de llamada de finalización de la siguiente manera:
var sql1 = “SELECCIONE user_id DESDE usuarios WHERE email =?”;
connection.query (sql1, [correo electrónico], función (err, filas)
{
var sql2 = “SELECCIONAR photo_id DESDE fotos DONDE user_id =?”;
connection.query (sql2, [filas [0] .user_id], función (err, filas)
{
console.log (filas); // saca todas las fotos
}
}
Puede pensar que este tipo de código crecerá para ser absolutamente difícil de manejar cuando tenga mucho código síncrono para ejecutar, y tiene razón. El uso de promesas resuelve este problema de “Pirámide de la fatalidad”. No haré promesas en este artículo, pero hay un gran paquete para Node llamado Q y le da una idea de cómo las promesas lo solucionarán. Echa un vistazo aquí: http://documentup.com/kriskowal/q/
Los bichos son realmente malos
Dado que Node es un sistema de subproceso único, es importante tener en cuenta que cuando su código tenga una excepción no detectada, se desactivará Node para todos, no solo para la persona que causó el bloqueo. Esto es diferente de PHP y Apache / Nginx porque el hilo que manejó la solicitud muere, no todo el proceso del servidor web. En un entorno de desarrollo, esto está totalmente bien y probablemente lo aliente para que pueda detectar y solucionar los problemas correctamente. Sin embargo, en el entorno de producción, esto puede ser muy perjudicial ya que su aplicación web será eliminada para todos los usuarios que visiten su sitio. La solución a esto es crear un oyente para todas las excepciones no detectadas y manejarlas con gracia (vea la nota a continuación) . El código se ve así:
process.on (‘uncaughtException’, function (err) {
console.log (‘Excepción capturada:’ + err);
});
Esto asegurará que su aplicación se mantenga activa incluso cuando ocurra lo inesperado.
Nota: He leído un poco más sobre este problema y parece que manejar excepciones no detectadas de esta manera no es lo ideal. El uso de dominios parece ser la mejor solución. Lea sobre esto en los documentos de Node API . Otra opción sería utilizar una herramienta como siempre para iniciar la aplicación. Reiniciará automáticamente el servidor cuando ocurra lo inesperado.
Reescribir reglas
Una de las partes poderosas del desarrollo de aplicaciones web es la capacidad de reescribir URL desordenadas en otras agradables y limpias. Esto hace felices a los motores de búsqueda y hace que sus usuarios sean aún más felices. Con PHP no le importaba cómo se veían las URL, solo quería que la entrada funcionara. La reescritura de las URL fue administrada por Apache (o Nginx). Al usar Node para crear aplicaciones web, el mapeo de rutas de Express es la salsa especial para dirigir las solicitudes. Encontré que administrar rutas a través del código de mi aplicación del lado del servidor es un cambio muy bienvenido. Después de sentirse cómodo con esta idea, nunca más querrá escribir otra regla de enrutamiento a través de su entrada . Aquí hay un pequeño ejemplo:
RewriteRule ^ / blog / ([A-Za-z -] +) $ /blog/entry.php?slug=$1
Usando el mapeo de rutas de Express:
app.get (‘/ blog /: slug ([A-Za-z -] +)’, blogController.entry);
No más vueltas a administrar la asignación de rutas de solicitud entre tu servidor web y el código de tu aplicación web. .
Ejecución de múltiples sitios de nodo en un servidor *
Dado que Node es tanto un procesador de código como un servidor web integrado en uno, presenta un desafío cuando se ejecutan múltiples sitios en un solo entorno. La ejecución de un servidor web Node requiere que seleccione un puerto para ejecutar las solicitudes. Una vez que ejecuta un sitio en el puerto 80, no puede asignar un segundo sitio al mismo puerto. Uno podría simplemente decirle que obtenga un nuevo VPS para cada sitio web dado que son tan asequibles en estos días, sin embargo, en muchos casos, un solo VPS es una exageración total para un sitio. En estos casos, puede elegir ejecutar un servidor web estándar como Apache o Nginx y pasar las solicitudes a Node a través de proxy. Opté por proxy usando las reescrituras de Apache porque las uso muy a menudo. Así es como se ve una entrada de ejemplo :
ServerName Ejemplo de dominio
ServerAlias another-example.com
DocumentRoot / my / folder /
RewriteEngine On
RewriteRule ^ (/.*) $ http: //% {HTTP_HOST}: 1337 $ 1 [P]
Para Nginx se vería algo así:
servidor {
escucha 80;
nombre_servidor http://your-domain.com ;
ubicación / {
proxy_pass http: // localhost : {YOUR_PORT};
proxy_http_version 1.1;
proxy_set_header Upgrade $ http_upgrade;
proxy_set_header Conexión ‘actualizar’;
proxy_set_header Host $ host;
proxy_cache_bypass $ http_upgrade;
}
}
También puede elegir un enfoque de JavaScript puro utilizando el paquete Node-Http-Proxy. Usa lo que tiene sentido para ti.
* Nota: He estado recibiendo muchos comentarios sobre este tema y la mayoría dice que usar Nginx no es un cuello de botella tan grande como lo imaginé originalmente y de alguna manera usarlo como proxy ayudará más que eso ‘ lo obstaculizaré. Se suponía que mi punto era tratar de ejecutar múltiples instancias de nodos en el mismo entorno, por lo que reescribí este punto para que sea más útil. Dejaré el debate sobre el rendimiento para la comunidad, ya que no he probado mucho en un entorno de producción ocupado. Thx Reddit!
Busca y encontrarás
Una de las partes más emocionantes de la programación con Node es la comunidad que lo rodea. Están sucediendo tantas cosas en el espacio y está sucediendo muy rápidamente. Cuando estaba portando mi primer sitio, me encontraba con un problema y preguntaba “¿Cómo hago esto en Node?” Simplemente buscaba en Google cualquiera que fuera mi problema y, en cuestión de segundos, tendría respuestas. Nunca me encontré con un problema decisivo que no era fácil de resolver con Node. Es un testimonio del progreso realizado. Si tienes un problema, solo búscalo en Google, sin duda alguien tiene una solución.
Envolver
Después de pasar unos 3-4 días con Node y sus contrapartes, me quedé completamente impresionado con lo fácil que era ponerse en marcha y lo más importante, lo fácil que era ponerse a trabajar haciendo cosas. La barrera de entrada para desarrollar aplicaciones web usando Node todavía no es tan baja como PHP, ¡pero está bastante cerca! Incluso diciendo eso, el valor que obtienes al comprender los administradores de paquetes y los marcos MVC son esenciales para ser un desarrollador web moderno. Esos dos conceptos son probablemente las únicas cosas que mantienen la barrera de entrada de Node + Express más alta que la de PHP. Node + Express te obliga a aprender estos conceptos antes de que puedas cocinar y eso es algo realmente bueno para un desarrollador y el código que escriben.
Finalmente, creo que es importante entender por qué escribir código del lado del servidor en JavaScript es algo tan bueno para un desarrollador web y específicamente para el desarrollador web UI / Front-end.
Control total
La mayoría de los desarrolladores web de IU ya tienen un conocimiento íntimo de JavaScript y sus matices. Aprovechar este conocimiento al preparar el código del lado del servidor aumenta la productividad. Además, mi experiencia me dice que los desarrolladores de lógica empresarial / back end suelen detestar el código UI para crear sitios web. Prefieren centrarse en la ingeniería de las funciones principales de la aplicación. La creación de aplicaciones con Node permite al desarrollador de la interfaz de usuario hacerse cargo de la parte de la aplicación del lado del servidor. La lógica de negocios se puede separar completamente de la interfaz de usuario y acceder a través de llamadas API. La separación del back-end del front-end permite a cada desarrollador elegir la pila con la que desea trabajar para hacer su trabajo.
Hay un gran artículo que detalla más la idea y no podría recomendarlo más: http://www.nczonline.net/blog/20 …
Dada esta experiencia reciente, me he comprometido a mover todos los proyectos futuros a Node (donde sea posible) y a comprometerme con una pila completa de JavaScript para el desarrollo de la interfaz de usuario. Ha sido un lenguaje esencial para crear experiencias de usuario increíbles y ahora se puede aprovechar por completo para crear un excelente código del lado del servidor también. Sinceramente, creo que se convertirá en el lenguaje dominante para construir código de aplicaciones web front-end en el futuro. Aplaudo y agradezco a la comunidad de desarrolladores que pusieron su arduo trabajo en crear estas increíbles herramientas para que personas como yo puedan usarlas para crear sitios web geniales.
Para convertirse en un experto en nodejs, consulte los siguientes cursos:
☞ Aprender y comprender NodeJS
☞ Aprenda Nodejs construyendo 12 proyectos
☞ Tutoriales de Node.js: Bootcamp para desarrolladores web
☞ Angular 2 y NodeJS: la guía práctica de MEAN Stack 2.0
☞ Completa el curso de desarrollador JS de Node Building 5 Real World Apps
☞ Tutoriales de JavaScript: Comprender las partes extrañas