Jos olet seurannut tätä blogia, olet saattanut huomata, että tärkein bloggausalustani on... Kutsutaan sitä "innostusti suunnitelluksi". PostgreSQL JA vektoritietokannat, semanttinen JA täystekstihaku GIN-hakemistoilla, automaattinen käännös 14 kielelle, useita isäntäpalveluita, Hagfire-työn aikataulutus, Prometheus-mittarit, Serilog-jäljitys, HTMX-vuorovaikutus, omien nuget-pakettien käyttö ja tarpeeksi Docker-kontteja, jotta laivasta tulee mustasukkainen.
Se on täysin tarkoituksellista. Tämä sivusto on elävä laboratorioni - leikkikenttä, jossa kokeilen teknologioita, testien käyttöönottostrategioita, mittaan suoritusominaisuuksia ja rakennan uudelleenkäytettäviä paketteja. oletettava Olla ylimuokattu, koska niin opin: ratkomalla ongelmia, joita useimmilla blogeissa ei todellisuudessa ole, pakkaamalla ratkaisut avoimiksi kirjastoiksi, joita muut voivat käyttää.
Mutta asia on näin: Et luultavasti tarvitse mitään sellaista blogin pitämiseen.
Siksi minä loin Enimmäkseen lucid.MinimalBlog - näyttää, mitä tapahtuu, kun kaikki kokeilut poistetaan ja keskitytään olennaiseen. Ei tietokantaa. Ei rakenneputkea. Ei monimutkaisuutta. Vain kansioon merkittyjä tiedostoja, jotka näkyvät verkossa. Tältä blogi näyttää, kun sitä ei käytetä laboratoriona.
HUOMAUTUS: Katso artikkelin lopusta linkin lähde, aion julkaista tämän Nugettipaketti Heti kun ehdin varmistaa, että se on sataprosenttisen luotettava ja perf ei ole liian kamala ( joten etsi k6-testiartikkelit pian!).
Koko projekti on suunniteltu yhden periaatteen varaan: pidä asia yksinkertaisena. Ei tietokantaa, ei rakennusputkea, ei Javascript-kehystä. Vain ASP.NET 9.0, Markdig markdown-käännöksestä ja noin 500 riviä koodia yhteensä.
HUOMAUTUS: Voit jopa tehdä tämän asiakkaan puolella käyttämällä kuten markdown-it sitten vain on palvelinsivuston kartta staattinen .md Tiedostot ja tehdä siitä jopa SIMPLER, mutta...no tämä on ASP.NET-blogi (jollain tavalla).
Katsotaanpa, miten projekti on järjestetty:
Mostlylucid.MinimalBlog/
├── Pages/
│ ├── Index.cshtml # Homepage with post list
│ ├── Post.cshtml # Individual post page
│ ├── Categories.cshtml # List of all categories
│ ├── Category.cshtml # Posts in a category
│ ├── _Layout.cshtml # Shared layout
│ ├── _ViewImports.cshtml # Shared imports
│ └── _ViewStart.cshtml # Layout selection
├── wwwroot/
│ └── css/
│ └── site.css # All the CSS you need
├── MarkdownBlogService.cs # Core blog logic
├── MetaWeblogService.cs # XML-RPC for external editors
├── Program.cs # Application setup
├── appsettings.json # Configuration
└── Mostlylucid.MinimalBlog.csproj # Project file
Blogin ydin on MarkdownBlogService Se on huomattavan yksinkertainen 120 riviä koodia, jotka käsittelevät:
Näin se toimii:
Palvelu skannaa konfiguroidun hakemiston .md tiedostot ja lataa ne kaikki muistiin:
private List<BlogPost> LoadAllPosts()
{
if (!Directory.Exists(_markdownPath)) return [];
return Directory.GetFiles(_markdownPath, "*.md", SearchOption.TopDirectoryOnly)
.Where(f => Path.GetFileName(f).Count(c => c == '.') == 1) // Only base .md files
.Select(ParseFile)
.Where(p => p is { IsHidden: false })
.OrderByDescending(p => p!.PublishedDate)
.ToList()!;
}
Huomaa ovela suodatus: Count(c => c == '.') == 1 takaa, että saamme vain tukikohdan .md tiedostot, ei käännetyt versiot kuten post.ar.md tai post.de.md (Jos haluat lisätä käännökset myöhemmin).
Jokainen markdown-tiedosto noudattaa yksinkertaista käytäntöä:
# Post Title
Your content here...
Jäsentäjä ammentaa tämän metadatan säännöllisillä lausekkeilla ja Markdig AST:lla:
private BlogPost? ParseFile(string filePath)
{
var markdown = File.ReadAllText(filePath);
var slug = Path.GetFileNameWithoutExtension(filePath);
var document = Markdown.Parse(markdown, _pipeline);
// Extract title from first H1
var title = document.Descendants<HeadingBlock>()
.FirstOrDefault(h => h.Level == 1)?
.Inline?.FirstChild?.ToString() ?? slug;
// Extract categories:
var categoryMatch = CategoryRegex().Match(markdown);
var categories = categoryMatch.Success
? categoryMatch.Groups[1].Value.Split(',', StringSplitOptions.TrimEntries)
: [];
// Extract date:
var dateMatch = DateTimeRegex().Match(markdown);
var publishedDate = dateMatch.Success && DateTime.TryParse(dateMatch.Groups[1].Value, out var dt)
? dt : File.GetCreationTimeUtc(filePath);
return new BlogPost
{
Slug = slug,
Title = title,
Categories = categories,
PublishedDate = publishedDate,
HtmlContent = Markdown.ToHtml(markdown, _pipeline),
IsHidden = markdown.Contains("<hidden")
};
}
Palvelun jokainen menetelmä käyttää IMemoryCache Välttääksesi tiedostojen uudelleenlukemisen ja uudelleen jäsentelyn jokaisesta pyynnöstä:
public IReadOnlyList<BlogPost> GetAllPosts()
{
return cache.GetOrCreate("all_posts", entry =>
{
entry.SetOptions(CacheOptions);
return LoadAllPosts();
}) ?? [];
}
Tauluissa on 30 minuutin liukuva käyttöaika ja 2 tunnin ehdoton käyttöaika. Yksinkertaista, tehokasta.
Koko sovellusasetus on vain 43 riviä: Razor-sivut, muistivälimuisti, lähtövälimuisti, kaksi singleton-palvelua, staattinen tiedostopalvelu ja MetaWeblog XML-RPC-päätetapahtuma. Kaikki välimuistit ovat singletoneja, koska mikään ei muutu, ellei tiedostoja muokata.
UI on silkkaa palvelimen renderöimää HTML:ää. Ei JavaScriptia, ei HTMX:ää, ei alppi.js:iä. @Html.Raw(post.HtmlContent) jossa on [OutputCache] Attribuutti tunnin mittaiselle HTML-välilyönnille. Neljä sivua yhteensä, kukin alle 30 riviä.
Koko visuaalista muotoilua käsittelee yksi CSS-tiedosto, jossa on vain 55 riviä. Se käyttää CSS-ominaisuuksia teemailuun ja luo puhtaan, tumman GitHub-vaikutteisen ilmeen:
:root {
--bg: #0d1117;
--bg-card: #161b22;
--text: #c9d1d9;
--text-muted: #8b949e;
--accent: #58a6ff;
--border: #30363d;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.6;
max-width: 48rem;
margin: 0 auto;
padding: 2rem 1rem;
}
/* ... more styles ... */
Ei esiprosessoria, ei rakennusvaihetta, ei tuhansia apuohjelmia, vain puhdasta, luettavaa CSS:ää, joka toimii.
Kirjailijoille, jotka pitävät enemmän omista markown-toimittajista Markdown-hirviöProjekti sisältää täyden MetaWeblog API -toteutuksen. XML-RPC API:n avulla ulkoiset toimittajat voivat:
Toteuttaminen on MetaWeblogService.cs Tämä tarkoittaa, että voit kirjoittaa blogikirjoituksesi suosikkieditoriisi ja julkaista ne suoraan blogiisi.
Koko asetustiedosto on vain 14 riviä:
{
"MarkdownPath": "../Mostlylucid/Markdown",
"ImagesPath": "wwwroot/images",
"MetaWeblog": {
"Username": "admin",
"Password": "changeme",
"BlogUrl": "http://localhost:5000"
},
"Logging": {
"LogLevel": {
"Default": "Information"
}
}
}
MarkdownPath - missä markdown-tiedostosi asuvatImagesPath - jossa kuvia säilytetäänMetaWeblog - valtakirjat ulkoiseen editoriinKuten edellä mainittiin, SOON on saatavilla, mutta ei vielä :)
Blogi on nyt saatavilla NuGet-pakettina, joten ASP.NET Core -sovelluksen lisääminen on vähäpätöistä:
dotnet add package mostlylucid.MinimalBlog
Sitten sinun Program.cs:
builder.Services.AddRazorPages();
builder.Services.AddMinimalBlog(options =>
{
options.MarkdownPath = "Markdown";
options.ImagesPath = "wwwroot/images";
options.EnableMetaWeblog = false; // Optional, defaults to true
});
var app = builder.Build();
app.UseStaticFiles();
app.UseMinimalBlog();
app.MapRazorPages();
app.Run();
Siinä kaikki - vain kaksi metodipuhelua (AddMinimalBlog sekä UseMinimalBlog) ja sinulla on työblogi.
Mukana olevan näyteprojektin suorittaminen:
cd Mostlylucid.MinimalBlog
dotnet run
Vierailu http://localhost:5000 Ja näet blogin merkittyjen polkujen markown-tiedostojen kera.
Luodaksesi uuden blogikirjoituksen:
.md tiedosto konfiguroidussa muodossa MarkdownPath# Your Post Title
Your content here...
Lisää kuvia vain asetuksillasi ImagesPath Hakemisto ja viitteet maaliin:

Tämä minimaalinen blogi ei tarkoituksellisesti sisällä:
Nämä ominaisuudet ovat kaikki mahdollinen Lisään, mutta ne eivät ole mukana oletuksena, koska suurin osa pienistä blogeista ei tarvitse niitä.
Yksinkertaisuudestaan huolimatta tämä blogi on nopea:
Pienelle tai keskisuurelle blogille (alle 1000 viestiä) tämä arkkitehtuuri päihittää useimmat tietokannan tukemat blogialustat.
Käyttö Enimmäkseen lucid.MinimalBlog kun:
Käytä täysi Enimmäkseen lusid-alusta kun:
Nykyaikaisessa verkkokehityksessä päädymme usein monimutkaisiin ratkaisuihin oletuksena. Tarvitsetko blogia? Parempi perustaa tietokanta, määrittää ORM, perustaa muuttoliikkeet, lisätä välimuistia, toteuttaa hakua, määrittää taustatyöpaikkoja...
Mutta joskus yksinkertainen ratkaisu on oikea Ratkaisu. Enimmäkseen lucid.MinimalBlog todistaa, että voit rakentaa toimivan, nopean ja ylläpidettävän blogialustan:
Niin sitä pitää. yhteensä vähemmän kuin 520 riviä koodia täydelliselle bloggausalustalle.
Projekti toimii sekä toimivana blogialustana että muistutuksena: ennen kuin lisäät monimutkaisuutta, kysy itseltäsi, tarvitsetko sitä. Joskus tarvitset vain kansion, joka on täynnä markdown-tiedostoja.
Täydellisen lähdekoodin löydät osoitteesta Enimmäkseen lucid.MinimalBlog-hakemisto Julkaisen Nuget-paketin heti, kun olen tyytyväinen koodiin.
Hyvää bloggausta!
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.