如何简单能成为 ASP@. @NET blog really Be?_
一. 导言导言 导言 导言 导言
如果你一直关注这个博客, ' ,}你可能会注意到我的主要部落格平台是 @... Letñ's, 它叫做“"enthusiastical 工程设计”."PostgreSQL 和矢量数据库@, smantic and full- text weating with GIN Inviolu=%,}自动翻譯为「14 语言 @MS K10多个主机服务}{,_Hangfire 工作日程安排}, Prometheus mindosMS},Serilog 跟踪HTMX互动{HTMTexpactiving@MS15us usign my nugget producle*}和足够多的杜克容器来制造一艘飞船嫉妒性".}
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}这真是深思熟虑 这个网站是我的活实验室 - 是一个操场 我在那里实验技术 □, 测试部署策略}MS K2 测量性能特性 假定 @,}然后把这些解决方案包装成 Open@-来源库, 其他人可以使用#.{
但这里是事情 : 您可能不需要这些来运行一个博客@. @%
这就是为什么我创造了 多数为lucid @ . @ 微小Blog @-@ 显示当您剥去所有实验内容并关注绝对基本需要时会发生什么, 没有数据库=.} 不建管道.}没有复杂吗?. 只是在网络上出现的文件夹\MS K5}中标记文件*%.}这就是博客看起来的样子 当你不把它用作实验室.
Onte: 参见此文章结尾与来源的链接@,I计划将此作为 篮子软件包 一旦我得到时间确保它"'QAS 100%"可靠,而且它的"'QQSperf" 是''QQT ToO 可怕的'MS K4QZoso 寻找"K6Q"测试文章
更低的哲学
整个项目围绕一项原则设计, 保持简单.沒有資料庫,沒有建構管道MS K2沒有 JavaScript frame.只是 ASP}.NETMSKO5馬克迪
您甚至可以使用类似 下调@- @it 然后只有服务器站点地图静态 .md 并连 SIMPLER 文件, 但@... @ well 这是 ASP.}NET 博客 @ (_ kinda sorta {🤓).} 。
项目结构
让我们看看这个项目是如何组织起来的。
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
心脏@: @ 马克唐布劳尔服务
博客的核心是 MarkdownBlogService 类@. @ it'_Qs 非常简单 @ - @ just *120} 处理:{的代码行
- 从目录读取标记下载文件
- 正在解析元数据 ( title, n分类 ,}发布日期{)
- 使用Markdig 将记分转换为 HTML
- 将一切隐藏在记忆中
这里:'}它是如何工作的?
正在加载员额
服务扫描已配置的目录 .md 并把它们全部装入内存@: @%
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()!;
}
注意聪明的过滤器: Count(c => c == '.') == 1 确保我们只有基础 .md {,没有这样的翻译版本 post.ar.md 或 post.de.md @ (_ @ in case you want to addate transfer later * MS K1} 如果您想要在稍后添加译文, @ MPK1
解析元数据
每个标记下载文件遵循简单的常规@ : @
# Post Title
Your content here...
解析器使用正则表达式和 Markdig AST: 提取此元数据
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")
};
}
缓结战略
服务使用的每一种方法 IMemoryCache 以避免在每次请求中重新@ - @ 读取和重新% MS K1} parsing 文件@ MPK2
public IReadOnlyList<BlogPost> GetAllPosts()
{
return cache.GetOrCreate("all_posts", entry =>
{
entry.SetOptions(CacheOptions);
return LoadAllPosts();
}) ?? [];
}
缓存条目有一个“% 30-” 即时滑动过期和“ 2-” 小时绝对到期@ MS K2 @ simple @ MSC3} 有效.{
应用程序设置@:程序 @.}%cs
整个应用程序设置仅是 @43 @ line@ : @ Razor Pages,}%,}输出缓存{,} two sington service *,}提供<,> 的静态文件 和 MetaWeblog XMLQ}-RPC 端点}.}所有东西都作为单吨存储,因为除非文件被修改,否则不会发生任何变化.}
UI: 简单剃刀页面
用户名为纯服务器@- @ rendered HTML% .}No JavaScript,}不使用 HTMX_,}无 Alpine.}主页列表 @Html.Raw(post.HtmlContent) 具有 a 和 [OutputCache] 用于 hour@- @ long HTML caching @ .}四页总和\ ,} 每人在 @ OMK3 线下=.}
CSS 的线条
整个视觉设计由单一的 CSS 文件处理, 它只使用 @ 55} 线条@ MS K1} 使用 CSS 自定义属性来管理它们, 并创建一个干净的Q, dark GitHub-\ impirated look * :}
: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 ... */
没有前处理器@ . @ no build step_ .}没有数千个通用分类 * .\ 只是清理*,}可读的 CSS
MetaWeblog API 文摘:
对于那些喜欢专门减记编辑的作家来说 标记怪物Name@, 这个项目包括完整的 MetaWeblog API 实施@. 此 XML=-RPC APIC 允许外部编辑@MS K3}
- 名单员额
- 创建新职位
- 编辑现有员额
- 删除员额
- 上传图像
- 检索分类
正在执行 MetaWeblogService.cs 并处理完整的 XML-RPC 协议@, 解析请求和生成响应\ . 这意味着你可以在您最喜爱的编辑器中写下您的博客文章,然后直接发布到您的博客 @.}
配置配置
整个配置文件仅是 @ 14_ line@ MS K1}
{
"MarkdownPath": "../Mostlylucid/Markdown",
"ImagesPath": "wwwroot/images",
"MetaWeblog": {
"Username": "admin",
"Password": "changeme",
"BlogUrl": "http://localhost:5000"
},
"Logging": {
"LogLevel": {
"Default": "Information"
}
}
}
MarkdownPath- 您的标记文件所在位置@ infoImagesPath存储图像的 -MetaWeblog- 外部编辑器访问证书
用作 NuGet 软件包
如前所述,它将提供SOON系统,但尚未提供“:)”
该博客现以NuGet profession@,#提供, 使得添加到任何 ASP @.}{NET Core application_:}
dotnet add package mostlylucid.MinimalBlog
然后在你的 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();
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}只有两种方法AddMinimalBlog 和 UseMinimalBlog@)和您有一个工作博客#.
运行样本工程
要运行包含的样本项目 @:
cd Mostlylucid.MinimalBlog
dotnet run
访问 http://localhost:5000 您将会从配置路径@ . t查看带有标记文件的博客
创建内容
创建新博客 post @:
- 创建新
.md在您配置的文件中MarkdownPath - 添加标准元数据@: @%
# Your Post Title Your content here... - 保存文件
- 缓存将在 @ 30 @ minutes @ MPK1@ or 重新启动 AppZ)}内过期
要添加图像@, 仅将其放置在您的配置中 ImagesPath 在您的标记下调@ :中引用目录并引用它们

什么'Qs 错过了(}目的=)}
这个最小的博客故意不包含 @' @t 包括@:}
- 评论意见评论评论评论意见 必要的话,请使用第三种服务
- 搜索 - 保持您的内容按类别排列
- 标签标记 @-_ 分类对于小博客来说已经足够了
- RSS/阿托姆 “-”简单添加,如果需要的话
- 验证 M-MetaWeblog API 只使用基本经认证
- 分析分析 - 添加 JavaScript 片段( 如需要)
- SEO优化 -用基本元标签效果很好
- 响应图像 - 浏览器处理它
- DarkM/光主题切换 只有一个主题就够了
这些特征都是 可能 添加@ , @ {, 但是它们没有默认包含% 1} 因为大多数小博客don' 需要它们的@ MPK3}
性能特点
尽管这个博客简单, 快速快:
- 内存缓存 表示第一个装入后没有文件 I/O
- 输出缓存 表示在第一次请求后,没有 Razor 显示
- 无数据库 意指不询问间接费用
- 无 JavaScript 表示快速的页面负荷
- 简单 CSS 表示最小样式表解析
对于一个中小博客 {(}under 1000}posts @),}这个架构将超过大多数数据库=-}支持的博客平台@.}
何时使用此 vs @ . @ the full Mostlylucid 博客
使用 最优lucid\ . 微小Blog 当:
- 您正在启动个人博客,
- 您的邮资少于 @500
- 您不需要多种语言
- 你想把事情简单化
- 您对标记文件感到舒服@ ' @ label
- 你只想写和出版
使用 完全最湿润的平台 当:
- @' 使用您的博客作为 学习实验室 采用新技术的新的技术
- 您想要实验部署策略@ ,监测 @ MS K1和性能优化
- 您需要特定功能, 如多语种支持@ , @ full @ MS K1\ text search_ ,} 或批注
- 你正在建造一个软件包 需要一个真正的-世界测试台
- 您正在记录复杂的技术实施
- 建造平台的旅程与平台所容纳的内容一样宝贵
结论: 简单性作为地物
在现代网络开发世界中,我们通常会通过默认的“.” 找到复杂的解决方案。我们需要一个博客 “?” 更好地设置一个数据库@, 配置 ORM, 配置一个 ORCM}设置移民+, 添加 caching,实施搜索 @,配置背景工作_...}
但有时简单的解决办法是 右对右 maintimalBlog 证明您可以建立一个功能性@ , fast\ , 并用 @ MS K4}维护可维护的博客平台
- C#的 342 线条 ( @MakdownBlogService@+ @MetaWeblogs Services @+程式$.)
- ~120Razor 标记線 “(4”页面“)”
- 55CSS的线条
- 1NuGet 依赖性 马克迪戈・马科迪・马斯基1
那个M' 总代码行数小于 @ 520% 完整博客平台@. @%
此工程既是一个功能性博客平台, 也是一种提醒@ : @ 。 在您添加复数前请先询问自己是否真的需要它 ,} 有时您只需要一个满载标记文件的文件夹\ MS K3}
您可以在 The 中找到完整的源代码 Mostlucid\ . minimalBlog 目录 主仓库@ . @ I'} 只要I'# m 对代码满意, 即会释放金字塔包\ MS K3}
快乐博客@! @#