Würden Sie Node.js / Express.js oder Play Framework (Java) für ein neues Web-App-Projekt auswählen? Warum?

Nun, für meinen letzten Job bei einem Medienverlag (natürlich mit einer starken Online-Präsenz) haben wir uns entschieden, welches unser Standard-Web-App-Framework sein soll, und wir hatten ein paar Optionen auf dem Tisch, einschließlich Play , Node Express, Python Flask / Tornado und Ruby on Rails.

Wir haben Ruby on Rails wegen Leistungsproblemen rausgeschmissen, obwohl die Django-ähnlichen Insta-Formulare, die aus Ihrem Datenbankmodell erstellt wurden, fehlen würden.

Ich hatte die Aufgabe, Play 2 zu evaluieren, und wir hatten bereits einige Erfahrungen mit Play / Scala, obwohl die Hälfte der Entwickler sich auf das Front-End konzentrierte (aber offen für Scala war). Daher habe ich bei der Betrachtung des Stücks die Lernkurve und die Vertrautheit mit JavaScript im Hinterkopf behalten.

Der Chef hat eine Wäscheliste mit Punkten erstellt, und ich habe mich vorgenommen, sie alle anzusprechen. (Beachten Sie, dass wir uns zur Scala-Option neigten, aber sowohl Java als auch Scala für Sie verfügbar sind.)

  • Das Spielen ist ganz einfach. “Neuen abspielen”. Keine Umgebungseinstellung.
  • Starke MVC-Unterstützung
  • Asynchrone Anforderungen aufgrund von netty, einer ausgereiften, schnellen Technologie.
  • Konvention über Konfiguration … kein XML, kommt beim Schreiben von Code schnell aus dem Weg. Sie verbringen mehr Zeit damit, Code zu schreiben, aber auf eine bestimmte Art und Weise.
  • Extrem intuitive Routendatei, die Regex unterstützt
  • Typüberprüfung während der Kompilierung für die gesamte Anwendung, Routen und Vorlagen. Sehr gut für die Aufrechterhaltung großer Anwendungen geeignet, wodurch die Notwendigkeit einer unfehlbaren Testabdeckung gemindert wird.
  • Das Spiel basiert auf sbt, was das Experimentieren mit geladenen Klassenpfaden ermöglicht. Sie können beispielsweise Ihre Controller-Endpunkte testen, um zu sehen, was sie zurückgeben.
  • Sbt eignet sich auch hervorragend für “Auto-Test beim Speichern”. LinkedIn bestätigt, dass dies die Entwicklerproduktivität im Vergleich zu anderen Java-Frameworks dramatisch verbessert.
  • JVM-Laufzeit / -Optimierung / kompilierte Leistung
  • Play wird mit einer integrierten Speicherdatenbank geliefert
  • Java-IDEs sind sehr leistungsfähig, und Scala-IDEs sind derzeit recht gut, einschließlich Debugging-Tools.
  • Scala, das auch von Play voll unterstützt wird, zieht Elite-Entwickler an, und die Scala-Nutzerbasis wächst in NYC rasant
  • Asynchrone Tests in Scala mit specs2
  • Websockets aus der Box:
  def index = WebSocket.using [String] {request => 
  
   // Ereignisse in der Konsole protokollieren
   val in = Iteratee.foreach [String] (println) .mapDone {_ =>
     println ("Getrennt")
   }
  
   // Sende ein einzelnes 'Hallo!'  Botschaft
   val out = Enumerator ("Hallo!")
  
   (rein, raus)
 }
  • JVM-Anwendungen sind am einfachsten bereitzustellen / zu warten und weisen die vorhersehbarste Leistung auf.
  • In Java / Scala wurde die Parallelität integriert, ohne die Flexibilität zu beeinträchtigen, z. B. mit der Single-Threaded-VM von Node.
  • Scala kann kryptisch sein, dies wird jedoch durch die Aufteilung von Funktionen in einfache / offensichtliche Funktionen mit beschreibenden Namen erheblich erleichtert. Sie werden wiederum mit “Expressivität” des Codes belohnt, indem Sie mit weniger mehr sagen.
  • Breite Unterstützung für Bibliotheken von Drittanbietern
  • Laut LinkedIn ist fast alles flexibel / steckbar / konfigurierbar
  • kompiliert coffeescript / less und zeigt Fehler im Browser an.
  • Stellt automatisch minimierte Javascript-Dateien bereit
  • Einfache NoSQL-Unterstützung
  • Mit Ok (anyMethodThatGenerateSomeHtml) können Sie jedes andere vorhandene Vorlagensystem verbinden.
  • Kann mit dem “Japid” -Vorlagen-Framework für die Leistung verwendet werden, das sich leicht dem von statischen Dateien annähert
  • Akka-Schauspieler (Java / Scala) und Futures / Versprechungen und für das Verständnis (Scala) ermöglichen nicht blockierende E / A ohne “Rückruf-Hölle” (tief verschachtelter Spaghetti-Code, der überallhin springt)
  • Eingebaute Authentifizierung
  • Volle kontinuierliche Integrationsunterstützung mit Play for Java und Scala unter Verwendung von Jenkins. Wahrscheinlich auch die anderen wichtigen CI-Systeme.

Also habe ich diese Liste fertiggestellt und nicht viel Rückmeldung bekommen. Es war so ziemlich eine TL; DR. Also hat der Typ, der Flask / Tornado (asynchrones Python-Webframework) präsentiert, zu meiner Enttäuschung nicht viel geboten. Der Typ, der Node.js präsentiert, war ein Front-End-Typ mit starker Javascript-Vertrautheit. Er sprach nur eine Handvoll Punkte an und verglich / kontrastierte nicht viel. Ich bin gerade in den Steve Jobs-Modus gegangen und habe einige Folien gezeigt, wie einfach der Einstieg ist, und einige der verfügbaren Tools.

Nun, ich hatte sowieso einen Fuß vor der Tür, also würde ich niemanden unter Druck setzen, Technologien einzusetzen, für die sie nicht begeistert waren. Sie entschieden sich für Node.js, wahrscheinlich wegen der Vorurteile im Front-End-Bereich, und der Tatsache, dass niemand wirklich etwas fürchterlich Schlechtes über Node.js sagte oder sagen konnte, um die Anforderungen des Unternehmens zu erfüllen. Ich denke, in einer idealen Welt wäre Play / Scala, unabhängig von der vorhandenen Erfahrung und den Präferenzen der Mitarbeiter, die richtige Wahl gewesen, aber ich habe gelernt, wie vorgeschlagen, als ich hier eine Anfrage zu Quora gestellt habe… Wie wähle ich zwischen asynchrone Webframeworks? Meine Technologiegruppe ist ziemlich sprachunabhängig und wir versuchen, einige Technologien zu standardisieren. … Dass diese Web-Frameworks vernachlässigbare Leistungsunterschiede aufwiesen, daher sollte Erfahrung / Präferenz wirklich mit dem höchsten Gewicht berücksichtigt werden.

Es gibt 10 Hauptkategorien, die Sie bei der Bewertung eines Webframeworks berücksichtigen sollten:

  1. Lernen : Erste Schritte, Hochfahren, allgemeine Lernkurve.
  2. Entwicklung : Routing, Vorlagen, i18n, Formulare, JSON, XML, Datenspeicherzugriff, Echtzeit-Web.
  3. Test : Unit-Tests, Funktionstests, Integrationstests, Testabdeckung.
  4. Sicher : CSRF, XSS, Code-Injection, Header, Authentifizierung, Sicherheitshinweise.
  5. Erstellen : kompilieren, Tests ausführen, statischen Inhalt vorverarbeiten (sass / less / CoffeScript), Paket.
  6. Bereitstellen : Hosting, Überwachung, Konfiguration.
  7. Debug : Schritt für Schritt Debugger, Profiler, Protokollierung,
  8. Maßstab : Durchsatz, Latenz, Nebenläufigkeit.
  9. Pflegen : Wiederverwendung von Code, Stabilität, Reife, Typensicherheit, IDEs.
  10. Teilen : Open Source Aktivität, Mailinglisten, Popularität, Plugins, kommerzieller Support, Jobs.

In meinem Vortrag Node.js vs Play Framework finden Sie eine detaillierte Aufschlüsselung des Vergleichs dieser beiden Frameworks in diesen 10 Dimensionen.

Wenn Sie für einen Firmenkunden programmieren, ist es möglicherweise am besten, sich für Java-basierte Frameworks zu entscheiden.

1.) Sie möchten über viele Jahre hinweg Stabilität in Ihrer Anwendung. Es macht keinen Spaß, wenn ein Kunde Sie anruft, dass etwas nicht funktioniert, wenn node.js aktualisiert wird. Oder wenn die Sicherheit in node.js aktualisiert wurde, müssten Sie diese schnell patchen. Ein mehr
Ein ausgereifter Rahmen würde den Zeitaufwand für die Behebung dieser „kleinen“ Probleme verringern.

2.) Es ist einfacher, es bei der Softwarebereitstellung an Ihren Kunden weiterzugeben, da dieser leichter auf den großen Pool der vorhandenen Java-Webprogrammierer zugreifen kann. Gleiches gilt für Ihre persönlichen Projekte.

3.) Abhängig von Ihrem Team ist es fantastisch, eine stark typisierte Sprache zu haben. Verhindert, dass Menschen zu viel vermasseln. Und es gibt immer eine nette IDE, auf die man sich verlassen kann.

Davon abgesehen bin ich ein Fan von node.js: p Was auch immer ich oben erklärt habe, ist auf Unternehmenssoftware ausgerichtet.

Ich möchte diese Frage eher aus geschäftlicher Sicht beantworten als anhand der hervorragenden vorhandenen technischen Antworten.

Ich habe einen MEAN-Stack (MySql anstelle von Mongo, Express, AngularJS, NodeJS) verwendet, um TrendyCoder zu erstellen. (Weitere Informationen: Wir helfen Personalvermittlern, die besten IT-Kandidaten in Großbritannien zu finden.)

Für ein Zwei-Mann-Team mit einer kleinen Code-Basis war dies in Ordnung, aber größere Teams könnten auf einem komplexen Server unter Druck geraten.

Ich bin ein zehnjähriger Veteran von JVM-Sprachen. Sehen Sie also die Vorteile von Scala Play für eine größere Codebasis / ein größeres Team:

  • Statische Typisierung: Unterstützung für Refactoring-, Build-Chain- und Debugging-Tools (IntelliJ / Eclipse usw.). Dynamisch typisierte Frameworks wie NodeJS mit ExpressJS können nicht mithalten
  • Der funktionale Stil ermöglicht eine Kürze des Codes, die der modernen JS ähnelt
  • Reaktives Design mit einem zustandslosen Web Tier bedeutet unendliche Skalierung
  • Konvention über Konfiguration bedeutet, dass keine Java EE-Boilerplate vorhanden ist, sodass Sie mit kleinen Codemengen wie MEAN loslegen können
  • Nicht blockierende E / A mit Akka Actor Concurrency, wahrscheinlich besser als Node

Die Verwendung einer gemeinsamen Sprache auf dem Server / Front-End mit NodeJS bietet jedoch einige eindeutige Vorteile für SPA-Websites (Single Page App):

  • Sofortiges Laden der Seite mit React (von Facebook). Rendert im Browser oder auf dem Server und hängt JS-Code beim Laden an. Nie mehr FOUC (Flash mit nicht gestylten Inhalten)
  • Verwenden Sie das NodeJS NPM-Bibliothekssystem und das Abhängigkeitsmanagement, das Sie auf Ihrem Server im Browser mit Browserify und dem Webpack-Modulbündler verwenden.
  • JSON ist nativ, daher ist die API-Integration / (De-) Serialisierung nahtlos
  • Kein statisch typisierendes Boilerplate während des Prototyping

Fazit: Wenn Sie ein Lean-Startup sind, können Sie mit einem MEAN-Stack schnell und einfach validiertes Lernen von Ihren Kunden erhalten. Wenn Sie Skalierungsanforderungen entwickeln oder Ihr Server zu einer komplexen Problemdomäne wird, sollten Sie Ihren Server mit Scala Play überarbeiten.

Aus Lean-Sicht möchte ich auch Meteor.js erwähnen, mit dem Sie unglaublich schnell von Ihren Kunden lernen können.

Ich werde dies aktualisieren, während ich meine Experimente fortsetze

Ich habe kürzlich einen Vergleich zwischen Node.js (MEAN-Stack) und Play 2 durchgeführt. Ich habe fast 10 Jahre Erfahrung mit Java, keine Scala-Erfahrung. Und ich habe 2 Jahre Erfahrung mit JavaScript-Front-End und Back-End. Ich habe zwei Apps mit MEAN geschrieben.

Der Grund, warum ich erwäge, von Node.js zu Play 2 zu wechseln, ist hauptsächlich folgender:

  • JavaScript ist eine frei geschriebene Sprache, und das Umgestalten eines Variablen- oder Funktionsnamens mit IDE, selbst wenn WebStorm verwendet wird, führt zu unerwarteten Ersetzungen, die Sie nicht kennen.
  • Sie müssen sehr genau darauf achten, wenn Sie Argumente an andere Funktionen übergeben. Da sich die Datenstruktur des Arguments in Zukunft möglicherweise ändert und Sie dies nur dann herausfinden können, wenn ein Problem in der Laufzeit vorliegt, oder wenn Sie Unit-Test-Code schreiben, um dies zu testen. (Ja, Sie würden wahrscheinlich argumentieren, dass eine nicht statische Überprüfung des Parameters mehr Flexibilität bietet. Meiner Erfahrung nach verursacht sie jedoch mehr Probleme als Bequemlichkeit.) Und ohne statische Typprüfung während der Kompilierung kann Ihr Code jederzeit beschädigt werden die Zukunft, wenn andere Teammitglieder den Code unerwartet ändern.

Für Play 2 scheint es besser zu sein, Scala anstelle von Java zu verwenden. Und es gibt eine Lernkurve, aber ich gehe davon aus, dass es nicht allzu schwer sein wird, Erfahrungen mit Scala zu sammeln.

Also werde ich Scala und Play2 ausprobieren.

Aktualisierung
Versuchtes Spielen 2.4.2 mit Java 8. Und ich muss sagen, meine Erfahrung ist schrecklich. Das sbt löst weiterhin Abhängigkeiten auf und lädt Abhängigkeiten herunter, auch wenn diese bereits heruntergeladen wurden. Und die Zusammenstellung hat deswegen lange gedauert. Ich habe nach etwas gesucht und es scheint, dass es ein häufiges Problem ist.

Als ich endlich alle Abhängigkeiten gelöst habe, habe ich die Funktion getestet, die mich interessiert: Auto-Reload. Es hat nur einmal funktioniert. Und danach, egal wie ich es mit activator ~ run oder activator and then ~ run versucht habe, wird es nicht automatisch neu geladen. Ich habe in der Konsole gesehen, dass die Klassen erfüllt sind, aber die Benutzeroberfläche wurde beim Aktualisieren des Browsers nicht aktualisiert. Es ist nur enttäuschend!

Im Moment denke ich über Sprint Boot nach. Sie haben Auto-Reload. Ich werde es versuchen. Wenn es gut geht. Der Plan ist, Node.js vor den Spring Boot-Apps zu haben. Node.js wird hauptsächlich als Web-Layer-Server und Spring Boot-Apps als Micro-Services eingesetzt.

Und JHipster ist ein wirklich guter Generator, der Spring Boot, AngularJS und Bootstrap zusammenbringt. Liebe es!

Da Sie mit Node.js vertraut sind, wissen Sie, dass im Internet sehr viele Bibliotheken, Dokumentationen sowie Fragen und Antworten für das Framework verfügbar sind. Das gleiche gilt für Ruby on Rails. Das Play Framework wurde ähnlich wie RoR auf Basis der MVC-Architektur entwickelt. Es wird von der Community nicht so gut unterstützt. Es fehlen Plug-n-Play-Module und es ist kein Vergnügen, mit ihnen zu arbeiten, es sei denn, Sie. Neuerstellung von Grund auf, einschließlich Authentifizierung. Java – die Sprache selbst wird jedoch sehr unterstützt, das Framework ist gut, nicht. Daher ist die Produktivität viel geringer. Nur wenn Sie eine Unternehmensanwendung ausführen (Kooperations-, Geschäfts- und umfassende Skalierbarkeitsanforderungen), würde ich Play überhaupt nicht in Betracht ziehen.

Wenn Sie schwere E / A-Vorgänge planen, ist node.js großartig.

Das Problem dynamischer typisierter Sprachen ist jedoch, dass sie schwer zu warten und umzugestalten sind. Wenn Sie glauben, dass Sie Ihre Module in winzige bedauerliche Artefakte zerlegen können, ist node.js fantastisch.

Wenn Sie eine große Gruppe von Entwicklern haben und ein komplexes Domänenproblem haben und Ihre Artefakte groß sein sollten, würde ich mich für statisch typisierte Sprachen wie Java / Scala entscheiden.

Ein weiterer Vorteil für den Knoten ist die Produktivität aufgrund der schnellen Rückkopplungsschleife. Es ist super schnell in der Entwicklungsphase. Durch gutes Design der JVM erhalten Sie eine recht anständige, aber keine großartige Rückkopplungsschleife

Basierend auf den Kommentaren von y’all würde ich definitiv empfehlen, einen Blick auf Sail zu werfen – es basiert auf Express, unterstützt relationale (z. B. PostgreSQL / MySQL) und nicht relationale (z. B. MongoDB / Redis / Couch) Datenbanken und bietet Ihnen viele Vorteile eines strukturierten MVC-Frameworks, während Sie dennoch die Effizienz / Flexibilität nutzen und den Kern der Philosophie von Node.js. (Einschränkung: Ich habe es geschrieben: p)

Es tut mir leid, hier der “advocatus diaboli” zu sein, aber bevor eine solche generische Frage unbeantwortet beantwortet werden kann, muss ich fragen: “Was ist Ihr Anwendungsfall?” ist Ihr Geschäftsmodell? “” Wie ist Ihr Zeitrahmen? “” Was ist Ihre mittel- / langfristige Strategie? ”

Jede Antwort ohne diese vorherige Anforderung kann nur zu 50% zutreffen.

Vielen Dank im Voraus für das Feedback.

Ich entscheide mich für das Schreiben einer App mit Play Framework 2 unter Verwendung von Scala. Unser Team beginnt mit dem Schreiben von mobilen Webdiensten, die mit Play Framework 2 300 gleichzeitige Benutzer pro Knoten verarbeiten. Scala ist eine kurze, beeindruckende Programmierung, die ich jemals verwendet habe.

Wenn es sich bei Ihrer Anwendung um eine Enterprise-Anwendung handelt, vor allem vor Ort, würde ich zweimal überlegen, bevor ich mich für MEAN-Stack entscheide. JVM-basierte Tools werden in nahezu jeder IT akzeptiert. Der IT-Betrieb vieler Unternehmen unterstützt keine Stacks wie Node.js oder Rails. Eine unserer Enterprise-Apps wurde mit JVM erstellt, obwohl Ruby / Mongo die beste technische Lösung war. Diese App läuft derzeit jedoch erfolgreich in Fortune 100-Unternehmen, die mit einem Nicht-JVM-Stack nicht möglich gewesen wären. Ich habe hier geschrieben, warum ich JVM anstelle von MEAN gewählt habe: http://bit.ly/U3HwPZ

Knoten / Express. <- Diese Antwort ist so aufschlussreich wie Ihre Frage. Wie Sie sicher oft hören werden, hängt es von der DNA des Teams und der Art Ihres Projekts ab. Mehr Details in Ihrer Frage erhalten Sie eine bessere Antwort.

Spielen fühlt sich für Java an wie Rails, wenn Sie Java bevorzugen und ein MVC-Framework für das Spielen mit Web-Entwicklern möchten, ist dies eine gute Wahl.

Trotzdem bevorzuge ich Knoten, wenn ich die Wahl habe.

Node.js, Art: MEAN.io – Ein Fullstack Javascript Framework – MEAN.io – Ein Fullstack Javascript Framework

More Interesting

Wird Software Engineering bis 2023 eine gute Karriere sein, um Geld zu verdienen?

Verwenden professionelle Codierungsteams im Silicon Valley (z. B. Google, Airbnb) auch Scrum? Oder nutzen sie eine effizientere Methode, um sich gegenseitig zu organisieren?

Was macht Java skalierbarer als alle anderen Plattformen in der Unternehmenswelt (wie .NET oder Ruby)?

Welches ist die beste Software für die Dokumentation?

Was sind die bekanntesten Web-Apps, die auf Node.js aufbauen?

Was ist ein "gutes Portfolio" für einen mittelständischen Ruby on Rails-Entwickler?

Ich weiß, dass Software nicht 100% sicher sein kann, aber wie entwerfen Sie ein gutes Lizenzsystem für Ihre Software?

Interaktionsdesigner: Was ist Ihr Designprozess, insbesondere Ihr Denkprozess, und warum treffen Sie bestimmte Entscheidungen und wann?

Wo finde ich gute virtuelle Whiteboard-Ressourcen, die für verteilte Teams nützlich sind?

Was ist der Mindest-GRE-Wert, der für MS in Software Engineering in Kanada erforderlich ist?

Woran arbeiten Sie leidenschaftlich und technisch am meisten? Woran möchten Sie am meisten arbeiten? Software

Warum verwenden wir Funktionen in einer Programmiersprache? Mein Chef argumentiert, dass wir eine Funktion nur erstellen müssen, wenn sie woanders verwendet wird. Ist das wahr?

Wann haben Softwareingenieure ein Projekt aus ethischen Gründen abgelehnt, insbesondere wenn die Kosten ein Treiber für die Senkung strenger technischer Standards sind?

Warum hat sich Apple für Objective-C für das iPhone entschieden?

Was ist eine reine Echtzeitaufgabe?