
Eine Meinung der Starter-App für Full-Stack-Webanwendungen in Clojure
Sie benötigen den Start sowie Java 1.8+ und PostgreSQL 9.6+. Docker wird auch für die lokale Entwicklung empfohlen.
Der beste Weg, um ein neues Projekt zu starten, besteht darin, einfach auf die Schaltfläche "Diese Vorlage verwenden" oben auf der Github -Seite zu klicken. Wenn Sie GitHub für Ihr Projekt nicht verwenden möchten, können Sie den Master .zip, das lokale und git init von dort aus verwenden.
Um die Entwicklungsumgebung zu starten, tun Sie:
docker-compose up &
boot dev
Dies beginnt sowohl die Backend- als auch die Frontend -Zusammenstellung, wobei die Website auf Localhost: 7000 gehostet wird. API-Dokumentation finden Sie auch unter http: // localhost: 7000/api-docs
Um das Projekt zu einem Uberjar zu bauen:
boot build <target-dir>
Ein Uberjar namens "App- (Version) -Standalone.jar" findet sich im Zielverzeichnis. Die Projektversionsnummer kann in build.boot festgelegt werden.
Die Konfiguration wird über EDN -Dateien im resources/config behandelt. base.edn liefert die Basiskonfiguration, die für alle Umgebungen gilt, während die beiden Profile dev.edn und prod.edn in ihren jeweiligen Umgebungen geladen sind und Vorrang gegenüber base.edn haben. Zusätzlich werden die Konfigurationsdateien zur Ladezeit mit dem in domain.cljc befindlichen Config überprüft.
Die Frontend -Konfiguration wird über die API bei GET /api/config bereitgestellt und bietet eine Untergruppe der Konfiguration, wie im FrontendConfig -Schema in domain.cljc definiert.
Die Haupt-Backend-API ist in api.clj zu finden und ist in Compojure-API geschrieben. Es gibt auch ein Tutorial zur Arbeit mit Compojure-API-Syntax.
Die Abhängigkeitsinjektions- und Systemkomponentenhandhabung wird über das System und das Raamwerk -Modell behandelt. Dies ermöglicht das Live -Nachladen des Backends, aber auch alle Komponenten der App (statische und API -Server, Konfiguration, DB usw.). Die Hauptkonstruktoren für diese finden sich in app.systems . Es gibt eine Basis build-system Systemfunktion, die einen Konfigurationsprofilnamen aufnimmt und die Basissystemkarte für dieses Profil erzeugt und dann Funktionen der Produkt- und Dev-Systeme funktioniert.
Am wichtigsten ist der :site-endpoint , der die Komponente ist, die statische Routen wie den Hauptindex übernimmt und auf app.routes/site verweist, und :api-endpoint , das die Komponente für die Rest-API ist und auf app.api/api-routes verweist. Jede dieser Funktionen nimmt ein einzelnes Argument (als sys nach Konvention bezeichnet) ein, bei dem es sich um eine Teilmenge der Systemkarte handelt, die die als Abhängigkeiten im Vektor aufgeführten Schlüssel enthält, die an die component/using übergeben wurden. Damit eine Komponente für den Endpunkt zur Verfügung steht, muss dieser Vektor der Schlüssel hinzugefügt werden.
Datenbankmigrationen werden mit einer Ragtime -Komponente behandelt, die so konfiguriert ist, dass sie automatisch auf Serverstart oder neu geladen werden. Migrationen befinden sich in resources/db/migrations , die .up.sql und .down.sql -Dateien für Migrationen enthält, die gemäß dem in der Ragtime -Dokumentation beschriebenen Schema benannt sind. Die Ragtime-Konfigurationskarte ist über die Systemmap als :migrations verfügbar und kann somit über die Reply oder aus einer beliebigen Komponente zugegriffen werden, die sie als Abhängigkeit erbt. Diese Karte kann an die Funktionen in ragtime.repl übergeben werden.
Für die SQL -Abstraktion wird Honeysql auf clojure.java.jdbc verwendet. Honeysql bietet eine Möglichkeit zum Schreiben von SQL -Abfragen als Karten, die daher als jede andere Clojure -Karte erstellt und komponiert werden können und dann in SQL formatiert werden, um mit dem JDBC -Treiber aufzurufen. Eine Helferfunktion, app.query/make-query finden Sie in query.sql zum Wickeln des Aufrufs an den JDBC-Treiber, sodass man nur die Systemkarte und die SQL-Abfragekarte angeben muss, um ein Ergebnis zu erzielen.
Das Frontend wird mit Reagenz mit einer Kombination aus Multimethod-Versand für die Rendertierung jeder Ansicht und die clientseitige Routing mit BIde gebaut. Das Hinzufügen einer neuen Unteransicht erfordert daher einige Schritte, die wichtig sind, um sich zu erinnern:
app.views Namespace, dh. app.views.foo in cljs/app/views/foo.cljsapp.views.dispatch/dispatch-view Multimethod und erstellen Sie Ihr eigenes Multimethod zum Versand von einem geeigneten Schlüssel, dh. :app.foo . Die Methode sollte zwei Argumente annehmen, der erste ist der Schlüssel selbst, der zweite ist alle Parameter des URI.index.cljs .router.cljs hinzu. Der Haupt-App-Status wird in einem gemeinsam genutzten Reagenzatom unter app.state/app-state gehalten. Für gemeinsame API -Aufrufe wird auch ein app.api -Namespace bereitgestellt.
Ein wichtiger Hinweis zum Routing: Wenn Sie mit einer anderen Komponente innerhalb der App verknüpfen, verwenden Sie am besten die Funktion app.router/app-link da diese diese in das Routing-System einbindet. Normale HREFs funktionieren, erzwingen jedoch eine Seite neu, die langsamer ist und auch App-State zurückgesetzt wird.
Zusätzlich zum Frontend und zum Backend sind auch einige gemeinsame Namespaces über .cljc -Dateien in src/cljc/app enthalten, mit denen wichtige Daten und Funktionen vorne und hinten gemeinsam genutzt werden können. Das wichtigste von diesen ist app.domain in src/cljc/app/domain.cljc . Dies liefert die gemeinsamen Datenschemas für die Anwendung, einschließlich des Schemas für die Konfigurationsdateien.
Ein Docker-compose.yml wurde bereitgestellt, um eine grundlegende Postgres-Konfiguration mit Standardeinstellungen mit einem einfachen docker-compose up zu starten.
Die Standardkonfiguration öffnet NREPL -Verbindungen an beiden Frontends bei Port 6809 und Backend in Port 6502.
Es gibt auch ein zusätzliches Reagenzie-De-Dev-Tools-Element, das der Seite im Dev-Modus hinzugefügt wird, das den aktuellen App-Status reflektiert.
Es wird eine boot cljfmt -Aufgabe bereitgestellt, mit der CLJFMT in allen Dateien im SRC -Verzeichnis ausgeführt wird. Die check und fix von Boot-CLJFMT sind ebenfalls direkt verfügbar und können nach Bedarf mit einzelnen Dateien oder Verzeichnissen ausgeführt werden.
Sowohl Frontend- als auch Backend -Code wurden konfiguriert, um die Dateiänderungen automatisch neu zu laden. Es gibt sogar einen hilfreichen Audio -Hinweis, um Sie zu benachrichtigen, sobald ein Wiederaufbau abgeschlossen ist.
Beachten Sie, dass das vollständige Backend -Serversystem nur dann vollständig neu gestartet wird, wenn sich bestimmte Dateien ändern. Dies wird über die build.boot -Dev -Aufgabe mit dem Parameter :files zum system konfiguriert.
Einige grundlegende Integrationstests wurden durchgeführt. Sie können diese mit boot test oder mit boot test-watch ausführen, mit dem ein Beobachter startet und alle Tests in der Dateiänderung ausgeführt werden.
Die Tests umfassen Browser-Tests über Etaoin, und Sie müssen auch den Firefox-basierten geckowebdriver installieren. Informationen und Links dazu finden Sie hier. Auf dem Mac kann es mit brew install geckodriver , auf Ubuntu mit firefox-geckowebdriver oder unter Windows mit scoop install geckodriver installiert werden. Sie werden natürlich auch Chrome brauchen.
Diese App basiert ursprünglich auf System-Template mit weiteren Anleitungen von Tenzing.
Entwickelt von Annaia Danvers (@jarcane). Entwicklung ermöglicht durch Futurice.
Copyright (C) 2018 Annaia Danvers. Der Code wird unter der Eclipse Public Lizenz v2.0 oder einer späteren Version verteilt. Weitere Informationen finden Sie im LICENSE .