Rechtstexte wieder gestylt: als Vite-Einstiege mit app.css gebaut
Die Seiten verlinkten /css/app.css, das es seit dem React-Umbau nicht mehr gibt. Jetzt liegen sie unter frontend/static/docs, Vite baut sie mit und schreibt den Link auf das gehashte app.css um; serveDoc liefert sie unter den bisherigen Adressen /static/docs/… aus web/ aus. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TiXsPUqw7oeomZ8wZrQW5q
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
df0cfec132
commit
43c640dee6
+10
@@ -2,7 +2,10 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/go-chi/chi/v5"
|
||||||
)
|
)
|
||||||
|
|
||||||
// webDir enthält das gebaute React-Frontend (frontend/ -> npm run build):
|
// webDir enthält das gebaute React-Frontend (frontend/ -> npm run build):
|
||||||
@@ -19,6 +22,13 @@ func serveApp(w http.ResponseWriter, r *http.Request) {
|
|||||||
http.ServeFile(w, r, webDir+"/index.html")
|
http.ServeFile(w, r, webDir+"/index.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// serveDoc liefert einen Rechtstext. Sie werden mit dem Frontend gebaut
|
||||||
|
// (frontend/static/docs), damit sie dasselbe app.css bekommen.
|
||||||
|
func serveDoc(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Set("Cache-Control", "no-cache")
|
||||||
|
http.ServeFile(w, r, webDir+"/static/docs/"+path.Base(chi.URLParam(r, "page")))
|
||||||
|
}
|
||||||
|
|
||||||
// serveAssets liefert die gebauten JS/CSS-Dateien. Ihre Namen enthalten einen
|
// serveAssets liefert die gebauten JS/CSS-Dateien. Ihre Namen enthalten einen
|
||||||
// Inhalts-Hash, sie ändern sich also nie -> dauerhaft cachebar. Verzeichnisse
|
// Inhalts-Hash, sie ändern sich also nie -> dauerhaft cachebar. Verzeichnisse
|
||||||
// gibt es nicht zu sehen (kein Listing).
|
// gibt es nicht zu sehen (kein Listing).
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Beitragsordnung - Kontrollverlust</title>
|
<title>Beitragsordnung - Kontrollverlust</title>
|
||||||
<link rel="stylesheet" href="/css/app.css">
|
<link rel="stylesheet" href="/src/app.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Datenschutz - Kontrollverlust</title>
|
<title>Datenschutz - Kontrollverlust</title>
|
||||||
<link rel="stylesheet" href="/css/app.css">
|
<link rel="stylesheet" href="/src/app.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Impressum - Kontrollverlust</title>
|
<title>Impressum - Kontrollverlust</title>
|
||||||
<link rel="stylesheet" href="/css/app.css">
|
<link rel="stylesheet" href="/src/app.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
@@ -16,9 +16,19 @@ export default defineConfig({
|
|||||||
// Das Go-Backend liefert das Build aus web/ aus (siehe frontend.go).
|
// Das Go-Backend liefert das Build aus web/ aus (siehe frontend.go).
|
||||||
// emptyOutDir muss explizit an sein, weil das Ziel außerhalb von frontend/
|
// emptyOutDir muss explizit an sein, weil das Ziel außerhalb von frontend/
|
||||||
// liegt.
|
// liegt.
|
||||||
|
// Die Rechtstexte sind eigene statische Seiten ohne JS; als weitere Einstiege
|
||||||
|
// bekommen sie dasselbe gebaute app.css wie die App.
|
||||||
build: {
|
build: {
|
||||||
outDir: "../web",
|
outDir: "../web",
|
||||||
emptyOutDir: true,
|
emptyOutDir: true,
|
||||||
|
rollupOptions: {
|
||||||
|
input: [
|
||||||
|
"index.html",
|
||||||
|
"static/docs/impressum.html",
|
||||||
|
"static/docs/datenschutz.html",
|
||||||
|
"static/docs/beitragsordnung.html",
|
||||||
|
],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
server: {
|
server: {
|
||||||
proxy: {
|
proxy: {
|
||||||
|
|||||||
@@ -171,8 +171,9 @@ func routes() http.Handler {
|
|||||||
http.Redirect(w, r, "/stats", http.StatusMovedPermanently)
|
http.Redirect(w, r, "/stats", http.StatusMovedPermanently)
|
||||||
})
|
})
|
||||||
r.Handle("/assets/*", serveAssets())
|
r.Handle("/assets/*", serveAssets())
|
||||||
|
r.Get("/static/docs/{page}", serveDoc)
|
||||||
|
|
||||||
// Hochgeladene Medien + statische Dateien (Schriften, Rechtstexte).
|
// Hochgeladene Medien + statische Dateien (Schriften, Bilder).
|
||||||
// nosniff (global via secHeaders) verhindert, dass der Browser eine
|
// nosniff (global via secHeaders) verhindert, dass der Browser eine
|
||||||
// durchgereichte (nicht re-kodierte) Datei als HTML/JS interpretiert ->
|
// durchgereichte (nicht re-kodierte) Datei als HTML/JS interpretiert ->
|
||||||
// schließt Polyglot/Stored-XSS über Bild-Uploads.
|
// schließt Polyglot/Stored-XSS über Bild-Uploads.
|
||||||
|
|||||||
@@ -24,6 +24,10 @@ Vite reicht `/api` und `/static` ans Backend durch (`frontend/vite.config.ts`,
|
|||||||
(gitignored). Von dort liefert das Go-Backend aus (`frontend.go`), lokal also
|
(gitignored). Von dort liefert das Go-Backend aus (`frontend.go`), lokal also
|
||||||
auch ohne Vite: `npm run build`, dann `go run .`.
|
auch ohne Vite: `npm run build`, dann `go run .`.
|
||||||
|
|
||||||
|
Die Rechtstexte (`frontend/static/docs/*.html`) sind reine HTML-Seiten ohne JS,
|
||||||
|
aber weitere Einstiege des Builds (`vite.config.ts`). So bekommen sie dasselbe
|
||||||
|
gebaute `app.css`; ausgeliefert unter `/static/docs/…` (`serveDoc`).
|
||||||
|
|
||||||
### DEV-Container
|
### DEV-Container
|
||||||
|
|
||||||
`./dev-up.sh` baut das Image aus dem Arbeitsverzeichnis und startet den
|
`./dev-up.sh` baut das Image aus dem Arbeitsverzeichnis und startet den
|
||||||
|
|||||||
Reference in New Issue
Block a user