generated from alecodes/base-template
refactor: re-structure frontend code
This commit is contained in:
parent
6b7642b693
commit
3e0dd79217
11 changed files with 101 additions and 7 deletions
12
.justfile
12
.justfile
|
|
@ -20,15 +20,21 @@ build-frontend:
|
||||||
#!/usr/bin/env bun
|
#!/usr/bin/env bun
|
||||||
import sassPlugin from "@alecodes/bun-plugin-sass";
|
import sassPlugin from "@alecodes/bun-plugin-sass";
|
||||||
|
|
||||||
|
const entrypoints = Array.from(
|
||||||
|
new Bun.Glob("frontend/**/*.html").scanSync(".")
|
||||||
|
);
|
||||||
|
|
||||||
const result = await Bun.build({
|
const result = await Bun.build({
|
||||||
entrypoints: ["templates/base.html"],
|
entrypoints,
|
||||||
outdir: "dist",
|
outdir: "dist",
|
||||||
|
publicPath: "/",
|
||||||
|
splitting: true,
|
||||||
|
plugins: [sassPlugin],
|
||||||
naming: {
|
naming: {
|
||||||
entry: "[dir]/[name].[ext]",
|
entry: "[dir]/[name].[ext]",
|
||||||
chunk: "chunks/[name]-[hash].[ext]",
|
chunk: "assets/[name]-[hash].[ext]",
|
||||||
asset: "assets/[name]-[hash].[ext]",
|
asset: "assets/[name]-[hash].[ext]",
|
||||||
},
|
},
|
||||||
plugins: [sassPlugin],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("Assets compiled!");
|
console.log("Assets compiled!");
|
||||||
|
|
|
||||||
51
Cargo.lock
generated
51
Cargo.lock
generated
|
|
@ -187,6 +187,12 @@ version = "0.3.31"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
|
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-sink"
|
||||||
|
version = "0.3.31"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-task"
|
name = "futures-task"
|
||||||
version = "0.3.31"
|
version = "0.3.31"
|
||||||
|
|
@ -245,6 +251,12 @@ dependencies = [
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "http-range-header"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "httparse"
|
name = "httparse"
|
||||||
version = "1.10.0"
|
version = "1.10.0"
|
||||||
|
|
@ -400,6 +412,16 @@ version = "0.3.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mime_guess"
|
||||||
|
version = "2.0.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
|
||||||
|
dependencies = [
|
||||||
|
"mime",
|
||||||
|
"unicase",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "minijinja"
|
name = "minijinja"
|
||||||
version = "2.7.0"
|
version = "2.7.0"
|
||||||
|
|
@ -749,6 +771,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e"
|
checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"backtrace",
|
"backtrace",
|
||||||
|
"bytes",
|
||||||
"libc",
|
"libc",
|
||||||
"mio",
|
"mio",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
|
|
@ -768,6 +791,19 @@ dependencies = [
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tokio-util"
|
||||||
|
version = "0.7.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078"
|
||||||
|
dependencies = [
|
||||||
|
"bytes",
|
||||||
|
"futures-core",
|
||||||
|
"futures-sink",
|
||||||
|
"pin-project-lite",
|
||||||
|
"tokio",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower"
|
name = "tower"
|
||||||
version = "0.5.2"
|
version = "0.5.2"
|
||||||
|
|
@ -792,9 +828,18 @@ checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.8.0",
|
"bitflags 2.8.0",
|
||||||
"bytes",
|
"bytes",
|
||||||
|
"futures-util",
|
||||||
"http",
|
"http",
|
||||||
"http-body",
|
"http-body",
|
||||||
|
"http-body-util",
|
||||||
|
"http-range-header",
|
||||||
|
"httpdate",
|
||||||
|
"mime",
|
||||||
|
"mime_guess",
|
||||||
|
"percent-encoding",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
|
"tokio",
|
||||||
|
"tokio-util",
|
||||||
"tower-layer",
|
"tower-layer",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
"tracing",
|
"tracing",
|
||||||
|
|
@ -888,6 +933,12 @@ dependencies = [
|
||||||
"tracing-log",
|
"tracing-log",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicase"
|
||||||
|
version = "2.8.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.16"
|
version = "1.0.16"
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ notify = "8.0.0"
|
||||||
serde = { version = "1.0.217", features = ["derive"] }
|
serde = { version = "1.0.217", features = ["derive"] }
|
||||||
thiserror = "2.0.11"
|
thiserror = "2.0.11"
|
||||||
tokio = { version = "1.43.0", features = ["macros", "rt-multi-thread"] }
|
tokio = { version = "1.43.0", features = ["macros", "rt-multi-thread"] }
|
||||||
tower-http = { version = "0.6.2", features = ["trace"] }
|
tower-http = { version = "0.6.2", features = ["fs", "trace"] }
|
||||||
tower-livereload = "0.9.6"
|
tower-livereload = "0.9.6"
|
||||||
tracing = "0.1.41"
|
tracing = "0.1.41"
|
||||||
tracing-subscriber = { version = "0.3.19", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3.19", features = ["env-filter"] }
|
||||||
|
|
|
||||||
3
frontend/css/style.css
Normal file
3
frontend/css/style.css
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
h1 {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
@ -3,6 +3,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">
|
||||||
<link rel="stylesheet" href="@mini-strap/core" />
|
<link rel="stylesheet" href="@mini-strap/core" />
|
||||||
|
<link rel="stylesheet" href="../css/style.css" />
|
||||||
<title>
|
<title>
|
||||||
{% block title %}Axum web service!{% endblock %}
|
{% block title %}Axum web service!{% endblock %}
|
||||||
</title>
|
</title>
|
||||||
21
frontend/templates/base_1.html
Normal file
21
frontend/templates/base_1.html
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<link rel="stylesheet" href="../css/style.css" />
|
||||||
|
<title>
|
||||||
|
{% block title %}Axum web service!{% endblock %}
|
||||||
|
</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
{% include "partials/header.html" %}
|
||||||
|
<main>
|
||||||
|
<nav class="msp-d-sm-none msp-d-flex msp-justify-content-end">
|
||||||
|
<button class="msp-offcanvas-toggle" data-msp-target="#main-offcanvas">Toggle</button>
|
||||||
|
</nav>
|
||||||
|
{% block content %}{% endblock %}
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
0
frontend/templates/index.html
Normal file
0
frontend/templates/index.html
Normal file
13
src/main.rs
13
src/main.rs
|
|
@ -1,7 +1,7 @@
|
||||||
#![allow(unused)]
|
#![allow(unused)]
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
|
|
||||||
use compendium::{router, AppState, Link, Result};
|
use compendium::{router, AppState, Error, Link, Result};
|
||||||
use minijinja::{Environment, Value};
|
use minijinja::{Environment, Value};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use tower_http::trace::TraceLayer;
|
use tower_http::trace::TraceLayer;
|
||||||
|
|
@ -12,7 +12,16 @@ fn load_templates() -> Result<Environment<'static>> {
|
||||||
let mut tmpl_env = Environment::new();
|
let mut tmpl_env = Environment::new();
|
||||||
|
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
tmpl_env.set_loader(minijinja::path_loader("templates")); // Path is relative to project root
|
{
|
||||||
|
tmpl_env.set_loader(minijinja::path_loader("dist")); // Path is relative to project root
|
||||||
|
|
||||||
|
let _ = tmpl_env.get_template("base.html");
|
||||||
|
if tmpl_env.templates().count() == 0 {
|
||||||
|
return Err(Error::Runtime(
|
||||||
|
"Templates not found, did you build the frontend with `just build-frontend`??",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// only enable in production build
|
// only enable in production build
|
||||||
#[cfg(not(debug_assertions))]
|
#[cfg(not(debug_assertions))]
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,14 @@
|
||||||
use axum::{extract::State, response::Html, routing::get, Router};
|
use axum::{extract::State, response::Html, routing::get, Router};
|
||||||
use minijinja::context;
|
use minijinja::context;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use tower_http::services::ServeDir;
|
||||||
|
|
||||||
use crate::{AppState, ResultTemplate};
|
use crate::{AppState, ResultTemplate};
|
||||||
|
|
||||||
pub fn new() -> Router<Arc<AppState>> {
|
pub fn new() -> Router<Arc<AppState>> {
|
||||||
Router::new().route("/", get(handler_home))
|
Router::new()
|
||||||
|
.route("/", get(handler_home))
|
||||||
|
.nest_service("/assets", ServeDir::new("dist/assets"))
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn handler_home(State(state): State<Arc<AppState>>) -> ResultTemplate {
|
async fn handler_home(State(state): State<Arc<AppState>>) -> ResultTemplate {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue