<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>博客 on LiaoKE</title>
        <link>https://blog.liao-ke.com/tags/%E5%8D%9A%E5%AE%A2/</link>
        <description>Recent content in 博客 on LiaoKE</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Thu, 05 Mar 2026 21:52:34 +0800</lastBuildDate><atom:link href="https://blog.liao-ke.com/tags/%E5%8D%9A%E5%AE%A2/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Hugo自动修正文章最后修改时间的最佳方案</title>
            <link>https://blog.liao-ke.com/p/hugo-add-lastmod-to-posts/</link>
            <pubDate>Sun, 25 Jan 2026 00:00:00 +0000</pubDate>
            <guid>https://blog.liao-ke.com/p/hugo-add-lastmod-to-posts/</guid>
            <description>&lt;h1 id=&#34;hugo-全自动修正文章修改时间的最佳实践serverless-场景&#34;&gt;Hugo 全自动修正文章修改时间的最佳实践（Serverless 场景）&#xA;&lt;/h1&gt;&lt;p&gt;在使用 Hugo 构建静态博客时，&lt;strong&gt;文章的修改时间（Last Modified Time）&lt;/strong&gt; 是一个非常重要但又容易踩坑的问题，尤其是在 &lt;strong&gt;Serverless / CI 自动部署&lt;/strong&gt; 场景下。&lt;/p&gt;&#xA;&lt;p&gt;Hugo 官方目前提供了多种用于确定文章修改时间的方式：&lt;/p&gt;&#xA;&lt;h2 id=&#34;hugo-支持的修改时间来源&#34;&gt;Hugo 支持的修改时间来源&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;:filemodtime&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&#xA;使用文件本身的最后修改时间作为文章的修改时间。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;lastmod&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&#xA;需要在文章 Front Matter 中手动维护 &lt;code&gt;lastmod&lt;/code&gt; 字段。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;:git&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&#xA;使用 Git 中该文件的&lt;strong&gt;最后一次提交时间&lt;/strong&gt;作为修改时间（依赖 &lt;code&gt;gitinfo&lt;/code&gt;）。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;date&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&#xA;使用文章的发布时间作为修改时间。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;各方案的自动化可行性分析&#34;&gt;各方案的自动化可行性分析&#xA;&lt;/h2&gt;&lt;p&gt;在上述方案中：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;✅ &lt;strong&gt;可自动化&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;:filemodtime&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;:git&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;❌ &lt;strong&gt;不适合全自动&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;lastmod&lt;/code&gt;（需要人工维护）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;date&lt;/code&gt;（语义不符）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;filemodtime-在-serverless-场景下的问题&#34;&gt;:filemodtime 在 Serverless 场景下的问题&#xA;&lt;/h2&gt;&lt;p&gt;使用 Hugo 的一个重要原因，正是为了 &lt;strong&gt;方便地将网站部署到 Serverless 平台&lt;/strong&gt;（如 Cloudflare Pages、Vercel、Netlify 等）。&lt;/p&gt;&#xA;&lt;p&gt;然而在 Serverless / CI 场景中：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;每次部署都会重新 &lt;code&gt;git clone&lt;/code&gt; 仓库&lt;/li&gt;&#xA;&lt;li&gt;所有文件的 &lt;strong&gt;文件系统修改时间&lt;/strong&gt; 都会变成「拉取时间」&lt;/li&gt;&#xA;&lt;li&gt;这会导致：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;所有文章的修改时间被错误地更新为“本次部署时间”&lt;/li&gt;&#xA;&lt;li&gt;完全失去文章真实修改时间的意义&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;因此，&lt;strong&gt;&lt;code&gt;:filemodtime&lt;/code&gt; 在默认情况下并不适合 Serverless 场景&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;git-方案的现实问题&#34;&gt;:git 方案的现实问题&#xA;&lt;/h2&gt;&lt;p&gt;理论上，&lt;code&gt;:git&lt;/code&gt; 是最理想的方案：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;修改时间与 Git 提交严格一致&lt;/li&gt;&#xA;&lt;li&gt;完全自动化&lt;/li&gt;&#xA;&lt;li&gt;不依赖文件系统时间戳&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;但在实际使用中：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;即使开启了 &lt;code&gt;enableGitInfo = true&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;某些情况下 &lt;code&gt;:git&lt;/code&gt; &lt;strong&gt;无法正确生效&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;在 CI / Serverless 环境中尤为明显&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;不确定这是环境限制、Git shallow clone、还是 Hugo 本身的 Bug，但结果是：&lt;strong&gt;该方案在实践中不够稳定&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;最终解决方案修改文件时间戳为git-提交时间--filemodtime&#34;&gt;最终解决方案：修改文件时间戳为Git 提交时间 + :filemodtime&#xA;&lt;/h2&gt;&lt;p&gt;综合以上问题，我最终总结出了一套&lt;strong&gt;最适合 Serverless 管理的全自动方案&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;h3 id=&#34;核心思路&#34;&gt;核心思路&#xA;&lt;/h3&gt;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;&lt;strong&gt;在 Hugo 构建之前，将文件的修改时间戳“伪装”为 Git 最后提交时间。&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;具体流程如下：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Hugo 中使用 &lt;code&gt;:filemodtime&lt;/code&gt; 作为文章修改时间来源&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[frontmatter]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lastmod = [&amp;#39;:fileModTime&amp;#39;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;将脚本放在文件夹根目录&lt;/li&gt;&#xA;&lt;li&gt;将自动执行脚本的命令和正式部署命令合二为一(&lt;strong&gt;这里需要注意的是一般的serverless平台拉取项目只是浅层克隆不会把文件的最后提交信息给拉取过来，所以我们要在最前面要执行完整的拉取命令。&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git fetch --unshallow &amp;amp;&amp;amp; chmod +x 1.sh &amp;amp;&amp;amp; ./1.sh &amp;amp;&amp;amp; hugo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;这样就可以做到：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;✅ 修改时间与 Git 提交时间一致&lt;/li&gt;&#xA;&lt;li&gt;✅ 完全自动化&lt;/li&gt;&#xA;&lt;li&gt;✅ 与 Serverless / CI 环境完美兼容&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;自动同步-git-提交时间到文件修改时间的脚本&#34;&gt;自动同步 Git 提交时间到文件修改时间的脚本&#xA;&lt;/h2&gt;&lt;p&gt;下面的脚本用于：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;&lt;strong&gt;将当前目录下所有文件的最后修改时间，统一修改为对应的 Git 最后提交时间&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# （此处放置你的脚本内容）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#!/bin/bash&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# git-set-filetime.sh&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 功能：将 git 仓库中所有被追踪文件的修改时间改为最后一次提交时间&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 确保当前目录是 git 仓库&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; ! -d &lt;span class=&#34;s2&#34;&gt;&amp;#34;.git&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Error: 当前目录不是 git 仓库根目录&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 获取所有被追踪文件（包含特殊字符/空格/中文）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git ls-files -z &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;IFS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt; -r -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; file&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 获取最后一次提交的 Unix 时间戳&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;timestamp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;git log -1 --format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;%ct&amp;#34;&lt;/span&gt; -- &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$timestamp&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 使用 touch 修改文件修改时间&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# -d &amp;#34;@$timestamp&amp;#34; 表示从 Unix 时间戳设置时间&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        touch -d &lt;span class=&#34;s2&#34;&gt;&amp;#34;@&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$timestamp&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Updated: &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; -&amp;gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;date -d &lt;span class=&#34;s2&#34;&gt;&amp;#34;@&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$timestamp&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;+%Y-%m-%d %H:%M:%S&amp;#39;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Skipped (not tracked): &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;All tracked files&amp;#39; modification times updated.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;</description>
        </item><item>
            <title>博客框架的选择</title>
            <link>https://blog.liao-ke.com/p/blog-framework-choose/</link>
            <pubDate>Tue, 02 Dec 2025 00:00:00 +0000</pubDate>
            <guid>https://blog.liao-ke.com/p/blog-framework-choose/</guid>
            <description>&lt;h1 id=&#34;博客框架我们应该如何选择&#34;&gt;博客框架我们应该如何选择？&#xA;&lt;/h1&gt;&lt;p&gt;博客大体上可以分为&lt;strong&gt;静态博客&lt;/strong&gt;和&lt;strong&gt;动态博客&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;动态博客采用的是&lt;strong&gt;前端+后端&lt;/strong&gt;的模式,而静态博客就是&lt;strong&gt;纯前端静态文件&lt;/strong&gt;（方便托管）&lt;/p&gt;&#xA;&lt;h2 id=&#34;动态博客的优缺点&#34;&gt;动态博客的优缺点:&#xA;&lt;/h2&gt;&lt;h3 id=&#34;优点&#34;&gt;优点:&#xA;&lt;/h3&gt;&lt;ol&gt;&#xA;&lt;li&gt;适合大型博客或者论坛&lt;/li&gt;&#xA;&lt;li&gt;自带后台管理评论&lt;/li&gt;&#xA;&lt;li&gt;功能集成很多，适合小白，基本不需要额外去弄什么&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;缺点&#34;&gt;缺点:&#xA;&lt;/h3&gt;&lt;ol&gt;&#xA;&lt;li&gt;资源占用大&lt;/li&gt;&#xA;&lt;li&gt;必须依赖服务器运行，不可使用静态host主机/serverless服务提供商(cloudflare/vercle/github pages)&lt;/li&gt;&#xA;&lt;li&gt;网站加载速度相对较慢&lt;/li&gt;&#xA;&lt;li&gt;有一定的运维成本(服务器/防火墙等费用)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;静态博客的优缺点&#34;&gt;静态博客的优缺点:&#xA;&lt;/h2&gt;&lt;h3 id=&#34;优点-1&#34;&gt;优点:&#xA;&lt;/h3&gt;&lt;ol&gt;&#xA;&lt;li&gt;加载速度相对较快&lt;/li&gt;&#xA;&lt;li&gt;资源占用少。&lt;/li&gt;&#xA;&lt;li&gt;可以将网站交给serverless服务商托管（白嫖党狂喜，不需要专门的服务器）&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;缺点-1&#34;&gt;缺点:&#xA;&lt;/h3&gt;&lt;ol&gt;&#xA;&lt;li&gt;要有一定的web技术功底，会手动改配置文件、布局,写文章模板&lt;/li&gt;&#xA;&lt;li&gt;框架集成的功能较少，如评论功能，音频播放器，需要自行对接第三方接口（不过很多静态博客主题里面已经把功能模板写好了，只需要更换接口地址就行）&lt;/li&gt;&#xA;&lt;li&gt;缺乏统一的后台管理功能&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;动态博客框架&#34;&gt;动态博客框架&#xA;&lt;/h2&gt;&lt;h3 id=&#34;wordpress&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://wordpress.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;WordPress★★★&lt;/a&gt;&#xA;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;  世界知名动态博客框架，主题资源插件丰富，教程多。&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h3 id=&#34;typecho&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://typecho.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Typecho&lt;/a&gt;&#xA;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt; 轻量级动态博客框架，主打一个快速部署，快速上线&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h3 id=&#34;halo&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://halo.run/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Halo★★&lt;/a&gt;&#xA;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt; 界面很漂亮，资源插件相对来说比较丰富，社区正在逐步发展，安装部署方法较为麻烦，比较吃服务器性能&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;静态博客框架&#34;&gt;静态博客框架&#xA;&lt;/h2&gt;&lt;h3 id=&#34;hexo&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://hexo.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Hexo★★★&lt;/a&gt;&#xA;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt; node.js开发,教程很多，社区插件主题资源丰富，缺点是当文章数量&amp;gt;1k时，构建速度会显著减缓&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h3 id=&#34;hugo&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://gohugo.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Hugo★★★&lt;/a&gt;&#xA;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt; go语言开发,使用go template模板，学习门槛相对其他的来说高点。运行build效率很高,支持热加载,更改不需要刷新网页页面即可生效。教程资源丰富,社区插件资源也很多，稍逊hexo,最大的优势是当文章数量很多时，构建静态网站的速度可以快其他框架几倍.&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h3 id=&#34;jekyll&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://jekyllrb.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Jekyll★★&lt;/a&gt;&#xA;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt; 资源插件相对较少,界面简洁直观,但有github官方支持,可以直接将存入仓库的md文件转换成网页&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h3 id=&#34;vitepress&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://vitepress.dev/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;VitePress&lt;/a&gt;&#xA;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt; 资源插件丰富，可扩性强,常用于构建文档，不用于博客&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h3 id=&#34;astro&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://astro.build/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Astro★★&lt;/a&gt;&#xA;&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;新一代静态框架,0 javascript的技术理念让网站首页加载起来非常快,采用服务端渲染的技术理念&#xA;可局部初始化组件为spa,增强网站运行效率,可搭配其他前端框架组件使用，但主题资源相对较少。&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;总结&#34;&gt;总结&#xA;&lt;/h2&gt;&lt;p&gt;对于零基础的小白，想搭建博客，首先推荐动态博客框架，首选wordpress,有一定技术基础，搭建自己个人的轻量博客推荐静态框架,首选hexo/hugo,想要更快的构建速度和热加载，选择hugo.如果想尝试更先进的技术理念和更快的首页加载速度，可以尝试astro&lt;/p&gt;&#xA;&lt;h2 id=&#34;杂谈&#34;&gt;杂谈&#xA;&lt;/h2&gt;&lt;p&gt;本站采用hugo构建,github仓库储存,cloudflare远程克隆部署,评论功能对接waline。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
