¿Elegiría Node.js / Express.js o Play framework (Java) para un nuevo proyecto de aplicación web? ¿Por qué?

Bueno, para mi último trabajo, en una empresa de publicación de medios (con una fuerte presencia en línea, por supuesto), pasamos por el proceso de decidir cuál sería nuestro marco de aplicación web predeterminado, y teníamos algunas opciones sobre la mesa, incluida Play , Node Express, Python Flask / Tornado y Ruby on Rails.

Echamos a Ruby on Rails por problemas de rendimiento, aunque se perderían los formularios instantáneos tipo Django creados a partir de su modelo de base de datos.

Me asignaron la tarea de evaluar Play 2, y ya teníamos experiencia en Play / Scala, aunque la mitad de los desarrolladores estaban enfocados en el front-end (pero estaban abiertos a Scala). Así que tuve en cuenta la curva de aprendizaje, junto con su familiaridad con JavaScript, al considerar el juego.

Al jefe se le ocurrió una larga lista de puntos, y me propuse abordarlos a todos (tenga en cuenta que nos estábamos inclinando hacia la opción Scala, pero tanto Java como Scala están disponibles para usted):

  • Jugar es simple para comenzar “reproducir nuevo ” .. sin configuración del entorno.
  • Fuerte soporte MVC
  • Solicitudes asincrónicas debido a netty, una tecnología madura y rápida.
  • La convención sobre la configuración … sin XML, se elimina rápidamente al escribir código. Pasas más tiempo escribiendo código, pero de cierta manera.
  • Archivo de rutas extremadamente intuitivo que admite expresiones regulares
  • Comprobación de tipos en tiempo de compilación para aplicaciones completas, rutas y plantillas. Muy bueno para mantener aplicaciones grandes, suavizando la necesidad de una cobertura de prueba infalible.
  • Play se basa en sbt que permite experimentar con classpath cargado. Puede hacer cosas como probar los puntos finales de su controlador para ver qué devuelven.
  • Sbt también es ideal para “prueba automática al guardar”. LinkedIn confirma que esto mejora dramáticamente la productividad del desarrollador sobre otros marcos de Java.
  • JVM madurez / optimización / rendimiento compilado
  • Play viene con una base de datos integrada en memoria
  • Los IDE de Java son muy potentes, y los IDE de Scala son bastante buenos ahora, incluidas las herramientas de depuración.
  • Scala, que también es totalmente compatible con Play, atrae a desarrolladores de élite, y la base de usuarios de Scala está creciendo rápidamente en Nueva York
  • Pruebas asincrónicas en scala usando specs2
  • Websockets fuera de la caja:
  def index = WebSocket.using [String] {request => 
  
   // Registrar eventos en la consola
   val in = Iteratee.foreach [String] (println) .mapDone {_ =>
     println ("Desconectado")
   }
  
   // Envía un solo '¡Hola!'  mensaje
   val out = Enumerator ("¡Hola!")
  
   (En fuera)
 }
  • Las aplicaciones JVM son las más fáciles de implementar / mantener y tienen el rendimiento más predecible.
  • Java / Scala tiene simultaneidad incorporada sin sacrificar la flexibilidad, como con la VM de un solo subproceso de Node.
  • Scala puede ser críptico, pero esto se alivia mucho al dividir las funciones en funciones simples / obvias con nombres descriptivos. A su vez, es recompensado con la “expresividad” del código, diciendo más con menos.
  • Amplio soporte de biblioteca de terceros
  • Según LinkedIn, casi todo es flexible / conectable / configurable
  • compila coffeescript / less y muestra errores en el navegador.
  • Proporciona automáticamente archivos Javascript minificados
  • Soporte simple de NoSQL
  • Usando Ok (anyMethodThatGenerateSomeHtml) puede conectar cualquier otro sistema de plantillas existente.
  • Se puede usar con el marco de plantilla “Japid” para un rendimiento que puede acercarse fácilmente al de los archivos estáticos
  • Los actores Akka (Java / Scala), y los futuros / promesas y para las comprensiones (scala) permiten E / S sin bloqueo sin “callback hell” (código de espagueti profundamente anidado que salta por todo el lugar)
  • Autenticación incorporada
  • Soporte completo de integración continua con Play para Java y Scala con Jenkins. Probablemente los otros principales sistemas de CI también.

Así que terminé esa lista y no recibí mucha respuesta. Era más o menos un TL; DR. Entonces, el tipo que presentaba Flask / Tornado (marco web asíncrono de Python) no ofreció mucho, para mi decepción. El chico que presentó Node.js era un chico de front end con mucha familiaridad con Javascript. Solo abordó un puñado de puntos, sin comparar / contrastar mucho. Acabo de pasar al modo Steve Jobs, con algunas diapositivas, que muestran lo fácil que fue comenzar y algunas de las herramientas disponibles.

Bueno, de todos modos tenía un pie fuera de la puerta, así que realmente no iba a presionar a nadie para que adoptara tecnologías que no le entusiasmaban. Eligieron Node.js, probablemente por el sesgo de front-end, y el hecho de que nadie realmente dijo, o podría decir algo horriblemente malo sobre Node.js, para los fines de lo que la compañía requería. Creo que, independientemente de la experiencia existente y la preferencia de los empleados, en un mundo ideal, Play / Scala habría sido la elección correcta, pero aprendí, como se sugirió cuando inicialmente hice una consulta sobre Quora aquí … ¿Cómo elijo entre marcos web asincrónicos? Mi grupo de tecnología es bastante independiente del lenguaje y estamos tratando de estandarizar algunas tecnologías. … que estos marcos web tenían diferencias insignificantes en términos de capacidad, por lo que la experiencia / preferencia realmente debería considerarse con el mayor peso.

Hay 10 categorías principales que debe considerar al evaluar un marco web:

  1. Aprender : comenzar, aumentar, curva de aprendizaje general.
  2. Desarrollar : enrutamiento, plantillas, i18n, formularios, json, xml, acceso al almacén de datos, web en tiempo real.
  3. Prueba : pruebas unitarias, pruebas funcionales, pruebas de integración, cobertura de prueba.
  4. Seguro : CSRF, XSS, inyección de código, encabezados, autenticación, avisos de seguridad.
  5. Compilación : compilar, ejecutar pruebas, preprocesar contenido estático (sass / less / CoffeScript), paquete.
  6. Implementación : hosting, monitoreo, configuración.
  7. Depuración : depurador paso a paso, perfiladores, registro,
  8. Escala : rendimiento, latencia, concurrencia.
  9. Mantener : reutilización de código, estabilidad, madurez, tipo de seguridad, IDEs.
  10. Compartir : actividad de código abierto, listas de correo, popularidad, complementos, soporte comercial, trabajos.

Echa un vistazo a mi charla Node.js vs Play Framework para obtener un desglose detallado de cómo estos dos marcos se comparan en estas 10 dimensiones.

Si está programando para un cliente corporativo, podría ser mejor elegir marcos basados ​​en Java.

1.) Desearía estabilidad en su aplicación muchos años más adelante. Tener un cliente llamándote que algo no funciona cuando node.js se está actualizando no es divertido. O si hay seguridad actualizada en node.js, tendría que parchearlos rápidamente. Un más
Un marco maduro reduciría la cantidad de tiempo dedicado a solucionar esos “pequeños” problemas.

2.) es más fácil entregárselo a su cliente al momento de la entrega del software, ya que es más fácil para ellos aprovechar el gran grupo de programadores web Java existentes. Lo mismo aplica para tus proyectos personales.

3.) Dependiendo de tu equipo, tener un lenguaje fuertemente tipado es increíble. Evita que la gente la cague demasiado. Y siempre hay un buen IDE en el que confiar.

Dicho esto, soy un fan de node.js: p Lo que he explicado anteriormente está dirigido a los softwares empresariales.

Quiero responder a esta pregunta desde una perspectiva comercial, en lugar de las excelentes respuestas tecnológicas existentes.

Utilicé una pila MEAN (MySql en lugar de Mongo, Express, AngularJS, NodeJS) para crear TrendyCoders (más información: Ayudamos a los reclutadores a encontrar los mejores candidatos de TI del Reino Unido)

Para un equipo de dos personas con una pequeña base de código, esto estaba bien, pero los equipos más grandes pueden comenzar a verse atrapados en un servidor complejo.

Soy un veterano de diez años de lenguajes JVM, así que vea las ventajas que Scala Play tendría para una base de código / equipo más grande:

  • Escritura estática: herramientas de refactorización, cadenas de compilación y depuración (IntelliJ / Eclipse, etc.). Los marcos con tipos dinámicos como NodeJS con ExpressJS no pueden competir
  • El estilo funcional permite una brevedad del código similar a la moderna JS
  • El diseño reactivo con un nivel web sin estado significa una escala infinita
  • Convención sobre configuración significa que ninguno de los estándares de Java EE, por lo que puede comenzar con pequeñas cantidades de código como MEAN
  • E / S sin bloqueo con concurrencia de actor de Akka posiblemente más limpia que Node

Sin embargo, al usar un lenguaje común en el servidor / front-end con NodeJS, existen algunas ventajas distintas para los sitios web de SPA (aplicación de página única):

  • Carga de página instantánea con React (de Facebook). Representa en el navegador o el servidor y adjunta el código JS en carga. No más FOUC (Flash de contenido sin estilo)
  • Utilice el ecosistema NodeJS NPM de bibliotecas y gestión de dependencias que está utilizando en su servidor en el navegador con Browserify y el paquete de módulos webpack.
  • JSON es nativo, por lo que la integración de API / (des) serialización es perfecta
  • Sin repetitivo de escritura estática mientras realiza la creación de prototipos

En conclusión, si usted es un Lean Startup, simplemente comience a obtener un aprendizaje validado de sus clientes lo antes posible con una pila MEAN. Si desarrolla requisitos de escala o su servidor se convierte en un problema complejo, considere volver a trabajar en su servidor con Scala Play.

Desde el punto de vista de Lean, me gustaría mencionar también Meteor.js, que lo ayudará a aprender de sus clientes de manera obscena rápidamente.

Actualizaré esto a medida que continúe mis experimentos

He estado haciendo alguna comparación entre Node.js (MEAN stack) y Play 2 recientemente. Tengo casi 10 años de experiencia con Java, sin experiencia en Scala. Y tengo 2 años de experiencia con JavaScript front-end y back-end. Escribí dos aplicaciones usando MEAN.

La razón por la que estoy considerando pasar de Node.js a Play 2 se debe principalmente a lo siguiente:

  • JavaScript es un lenguaje de tipo suelto y la refactorización de una variable o nombre de función con IDE, incluso WebStorm causará un reemplazo inesperado de lo que no sabe.
  • Debe prestar mucha atención cuando pase argumentos a otras funciones. Debido a que la estructura de datos del argumento podría cambiar en el futuro y no hay forma de que pueda averiguarlo, excepto que hay un problema en el tiempo de ejecución o escribe un código de prueba unitaria para probarlo. (Sí, probablemente argumentaría que la comprobación no estática del parámetro proporciona más flexibilidad. Sin embargo, según mi experiencia, causa más problemas que conveniencia). Y sin la comprobación de tipo estático durante la compilación, su código puede romperse en cualquier momento el futuro si otros miembros del equipo cambian el código inesperadamente.

En cuanto a Play 2, parece mejor usar Scala en lugar de Java. Y hay una curva de aprendizaje, pero supongo que no será demasiado difícil tener experiencia en Scala.

Entonces, voy a probar Scala y Play2.

Actualizaciones
Intenté jugar 2.4.2 con Java 8. Y tengo que decir que mi experiencia es horrible. El sbt sigue resolviendo dependencias y descargando dependencias incluso si ya se han descargado. Y la compilación tomó mucho tiempo debido a esto. Hice una búsqueda y parece que es un problema común.

Cuando finalmente resolví todas las dependencias, probé la función que me interesa: la recarga automática. Solo funcionó una vez. Y después de eso, no importa cómo lo intenté con activator ~ run o activator y luego ~ run, no se recarga automáticamente. Vi en la consola que se cumplen las clases, pero la interfaz de usuario no se actualizó cuando actualicé el navegador. ¡Es simplemente decepcionante!

En este momento, estoy considerando Sprint Boot. Tienen recarga automática. Voy a intentarlo. Si funciona bien El plan es tener Node.js sentado frente a las aplicaciones Spring Boot. Node.js servirá principalmente como aplicaciones de capa web y Spring Boot como microservicios.

Y JHipster es realmente un buen generador que envuelve Spring Boot, AngularJS, Bootstrap. ¡Quiéralo!

Como está familiarizado con Node.js, sabrá que hay una gran cantidad de bibliotecas, documentación y preguntas y respuestas disponibles en Internet para el marco. Lo mismo con Ruby on Rails. Play Framework ha sido diseñado sobre la arquitectura MVC similar a RoR, no tiene tanto soporte de la comunidad, faltan módulos ‘plug-n-play’ y no es un placer trabajar con usted a menos que usted ‘ Estamos construyendo todo desde cero, eso incluye la autenticación. Sin embargo, Java: el lenguaje en sí es muy compatible, el marco es bueno, no. Por lo tanto, la productividad es mucho más baja. No, a menos que esté ejecutando una aplicación empresarial (cooperación, negocios y requisitos extensivos de escalabilidad), ni siquiera consideraría Play.

Si está planeando operaciones pesadas de E / S, node.js es excelente.

Pero el problema de los lenguajes de tipo dinámico es que son difíciles de mantener y refactorizar, si cree que puede dividir sus módulos en pequeños artefactos deplorables, node.js es increíble.

Si tiene un gran grupo de desarrolladores y tiene un problema de dominio complejo y sus artefactos deberían ser grandes, entonces usaría un lenguaje estáticamente escrito como java / Scala.

Otra ventaja para el nodo es la productividad debido al ciclo de retroalimentación rápido. Es súper rápido en fase de desarrollo. Pero un buen diseño en la JVM le permite obtener un bucle de retroalimentación bastante decente, pero no uno impresionante.

Basado en los comentarios de todos ustedes, definitivamente sugeriría echar un vistazo a Sails: está basado en Express, admite bases de datos relacionales (por ejemplo, PostgreSQL / MySQL) y no relacionales (por ejemplo, MongoDB / Redis / Couch), lo que le brinda muchos de los beneficios de un marco MVC estructurado mientras le permite aprovechar la eficiencia / flexibilidad y mantenerse al centro de la filosofía de Node.js. (advertencia: lo escribí: p)

Lamento ser el “advocatus diaboli” aquí, pero antes de que una pregunta tan genérica pueda ser respondida sin respuestas obstinadas, “hippster-throwing-framework-x”, debo preguntar: “¿Cuál es su caso de uso?” Cuál es su modelo de negocio? ”“ ¿Cuál es su marco de tiempo? ”“ ¿Cuál es su estrategia a medio / largo plazo? ”.

Cada respuesta sin esta recopilación previa de requisitos solo puede ser verdadera en un 50%.

Gracias de antemano por los comentarios.

Elijo escribir la aplicación con Play Framework 2 usando Scala. Nuestro equipo comienza a escribir servicios web móviles que manejan 300 usuarios concurrentes por nodo usando Play Framework 2. Scala es una programación corta e impresionante que he usado.

Si la suya es una aplicación Enterprise, especialmente en las instalaciones, lo pensaría dos veces antes de elegir MEAN stack. Las herramientas basadas en JVM son aceptadas casi en cualquier TI. Las operaciones de TI de muchas empresas no admitirán pilas como Node.js o Rails. Una de nuestras aplicaciones Enterprise se creó en JVM a pesar de que Ruby / Mongo era la mejor opción técnica. Pero esa aplicación se está ejecutando actualmente con éxito en compañías de Fortune 100, lo que no hubiera sido posible con una pila que no sea JVM. He escrito por qué elegí JVM sobre MEAN aquí: http://bit.ly/U3HwPZ

Nodo / Express. <- Esa respuesta es tan perspicaz como su pregunta. Como estoy seguro de que escuchará con bastante frecuencia, depende del ADN del equipo y la naturaleza de su proyecto. Más detalles en su pregunta le darán una mejor respuesta.

Jugar se siente como rieles para Java, si prefieres Java y quieres un marco MVC para el juego web-dev es una buena opción.

Pero aún así, prefiero nodo, si tengo una opción.

Node.js, tipo de: MEAN.io – Un marco Javascript Fullstack – MEAN.io – Un marco Javascript Fullstack

More Interesting

¿Alguien podría nombrar a dos (después de 1970) importantes ingenieros de software (y sus contribuciones) que no recibieron una educación formal en informática?

Además de algunos secretos comerciales, ¿podría ser que Microsoft teme que su código sea de código abierto porque tiene muchos problemas de seguridad no verificados?

¿Cuáles podrían ser las mejores ideas de aplicaciones de software para los próximos 5 a 10 años?

¿Hay alguna manera de que los conceptos de Bitcoin, BitTorrent, Namecoin (P2P DNS) y Tor puedan integrarse en un protocolo en el futuro?

¿Cuál es la mejor herramienta de gestión de proyectos / gestión de tiempos y por qué?

¿Cuál es el diseño de base de datos más complejo?

¿Cómo funciona Erply con el hardware POS cuando está basado en un navegador?

Ingeniería de software: ¿Qué sucede cuando un Bitcoin se transfiere o subdivide?

¿Qué tan importante es evitar la recursividad recursiva?

¿Cuáles son algunos consejos de supervivencia para un recién llegado que vino a Bangalore en busca de un trabajo soñado en la industria del software?

Cómo implementar HP UFT en un proceso ágil

¿Son mejores los trabajos de entrenador de TI que los trabajos de ingeniero de software de TI?

Quiero trabajar en algún proyecto paralelo en el espacio móvil (no remunerado, solo por diversión y aprendizaje) aparte de mi trabajo diario. ¿Cómo puedo encontrar / acercarme a las compañías que buscan tales oportunidades?

¿Cuál es su proceso personal para encontrar una solución a un problema de programación?

Cómo lidiar con mi enfermedad social de las mariposas