Hugo:优化博客速度

在 layouts\partials\extend_head.html 中添加以下代码: 1 2 3 4 5 6 7 8 9 <!-- Preload scripts --> <link rel="preload" as="script" href="https://www.googletagmanager.com/gtag/js?id=G-8TSPGDFPRC"> {{ if .IsPage -}} <link rel="preload" as="script" href="https://giscus.app/client.js"> <link rel="preload" as="script" href="https://cyrusyip.disqus.com/embed.js"> {{ end -}} <link rel="preload" as="script" href="https://unpkg.com/@swup/head-plugin@2"> <link rel="preload" as="script" href="https://unpkg.com/@swup/preload-plugin@3"> <link rel="preload" as="script" href="https://unpkg.com/swup@4"> 新建 layouts\partials\body-end.html,并添加以下代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 <!-- Load scripts --> 并添加以下代码: ```html <script> function loadScript({ url, delay, onloadCallback, async, preloadCallback, attributes = {}, }) { function load() { if (preloadCallback) preloadCallback(); const script = document.createElement("script"); script.src = url; script.async = async; // Set attributes Object.entries(attributes).forEach(([key, value]) => { script.setAttribute(key, value); }); if (onloadCallback) script.onload = onloadCallback; document.body.appendChild(script); } if (typeof delay !== "undefined") { setTimeout(load, delay); } else { load(); } } function isCyrusYipDomainOrLocalhost() { const currentDomain = window.location.hostname; const tartgetDomain = "cyrusyip.org"; console.log(`hostname: ${currentDomain}`); return ( currentDomain === tartgetDomain || currentDomain.endsWith("." + tartgetDomain) || currentDomain === "localhost" || currentDomain === "127.0.0.1" ) } // Google Analytics // Only load it on cyrusyip.org, preventing unwanted data collections when people fork this repository if (isCyrusYipDomainOrLocalhost()) { loadScript({ url: "https://www.googletagmanager.com/gtag/js?id=G-8TSPGDFPRC", delay: 100, async: false, onloadCallback: function () { window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag("js", new Date()); gtag("config", "G-8TSPGDFPRC"); console.log("Google Analytics loaded") } }) } </script> {{/* Only load comment services for regular page */}} {{ if .IsPage }} <script> // Check languages for comment services let giscusLang, disqusLang; if (document.documentElement.lang === "zh-CN") { giscusLang = "zh-CN"; disqusLang = "zh"; } else { giscusLang = "en"; disqusLang = "en"; } // Giscus const giscusConfig = { url: 'https://giscus.app/client.js', delay: 100, async: false, onloadCallback: () => console.log("Giscus loaded"), attributes: { 'data-repo': 'CyrusYip/blog-comments', 'data-repo-id': 'MDEwOlJlcG9zaXRvcnkzNDg2NjkxMTQ=', 'data-category': 'Comments', 'data-category-id': 'DIC_kwDOFMhEus4ChUiV', 'data-mapping': 'pathname', 'data-strict': '0', 'data-reactions-enabled': '1', 'data-emit-metadata': '0', 'data-input-position': 'bottom', 'data-theme': 'preferred_color_scheme', 'data-lang': giscusLang, 'data-loading': 'lazy', 'crossorigin': 'anonymous' } } loadScript(giscusConfig); // Disqus loadScript({ url: "https://cyrusyip.disqus.com/embed.js", delay: 100, async: false, attributes: { "data-timestamp": +new Date() }, preloadCallback: function () { window.disqus_config = function () { this.language = disqusLang; } }, onloadCallback: function () { console.log("Disqus loaded") }, }) </script> {{ end }} <script> // swup head plugin loadScript({ url: "https://unpkg.com/@swup/head-plugin@2", async: false, delay: 200, onloadCallback: function () { console.log("swup head plugin loaded"); }, }) // swup preload plugin loadScript({ url: "https://unpkg.com/@swup/preload-plugin@3", async: false, delay: 200, onloadCallback: function () { console.log("swup preload plugin loaded") } }) // swup progress bar plugin loadScript({ url: "https://unpkg.com/@swup/progress-plugin@3", async: false, delay: 200, onloadCallback: function () { console.log("swup progress bar plugin loaded") } }) // swup loadScript({ url: "https://unpkg.com/swup@4", async: false, delay: 200, onloadCallback: function () { const swup = new Swup({ containers: ["body"], plugins: [ new SwupHeadPlugin(), new SwupPreloadPlugin({ preloadVisibleLinks: true }), new SwupProgressPlugin(), ], animationSelector: false, }); console.log("swup loaded"); swup.hooks.on("page:view", () => { // Load comment services let giscusLang, disqusLang; if (document.documentElement.lang === "zh-CN") { giscusLang = "zh-CN"; disqusLang = "zh"; } else { giscusLang = "en"; disqusLang = "en"; } function loadGiscus() { const giscusConfig = { url: 'https://giscus.app/client.js', delay: 100, async: true, onloadCallback: () => console.log("Giscus loaded"), attributes: { 'data-repo': 'CyrusYip/blog-comments', 'data-repo-id': 'MDEwOlJlcG9zaXRvcnkzNDg2NjkxMTQ=', 'data-category': 'Comments', 'data-category-id': 'DIC_kwDOFMhEus4ChUiV', 'data-mapping': 'pathname', 'data-strict': '0', 'data-reactions-enabled': '1', 'data-emit-metadata': '0', 'data-input-position': 'bottom', 'data-theme': 'preferred_color_scheme', 'data-lang': giscusLang, 'data-loading': 'lazy', 'crossorigin': 'anonymous' } } loadScript(giscusConfig); } const giscusElement = document.querySelector("div.giscus"); // Only load Giscus if .giscus exists if (giscusElement) { loadGiscus(); } function loadDisqus() { // Reload if (typeof DISQUS === 'object') { DISQUS.reset({ reload: true, config: function () { this.page.url = window.location.href; this.language = disqusLang; } }); DISQUS_RECOMMENDATIONS.reset(); console.log("Disqus reloaded"); } else { // Load loadScript({ url: "https://cyrusyip.disqus.com/embed.js", // delay: 100, async: true, attributes: { "data-timestamp": +new Date() }, preloadCallback: function () { window.disqus_config = function () { this.language = disqusLang; } }, onloadCallback: function () { console.log("Disqus loaded") }, }) } } const disqusElement = document.querySelector("div#disqus_thread"); if (disqusElement) { setTimeout(() => { loadDisqus(); }, 100) } }) } }) </script> 参考教程 optimize-blog-speed-with-pjax-dynamic-script-preload-minification

 ·  · 

Hugo:添加图片点击放大功能

前言 通过 FancyBox 给 Hugo 博客添加图片点击放大功能。 配置 在 config/_default/params.yaml 中添加配置开关: 1 fancybox: true 新建 layouts/_default/_markup/render-image.html,写入内容: 1 2 3 4 5 6 7 {{if .Page.Site.Params.fancybox }} <div class="post-img-view"> <a data-fancybox="gallery" href="{{ .Destination | safeURL }}"> <img src="{{ .Destination | safeURL }}" alt="{{ .Text }}" {{ with .Title}} title="{{ . }}"{{ end }} /> </a> </div> {{ end }} 在 layouts/partials下的 extend_head.html 或者 extend_footer.html 中添加: 1 2 3 4 5 6 <!-- FancyBox --> {{if .Page.Site.Params.fancybox }} <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/[email protected]/dist/jquery.fancybox.min.css" /> <script src="https://cdn.jsdelivr.net/gh/fancyapps/[email protected]/dist/jquery.fancybox.min.js"></script> {{ end }} 使用语法: ...

 ·  · 

Hugo:代码配置

前言 优化代码块: 添加语言显示 Chroma主题切换 代码块折叠展开 PaperMod 主题默认使用的是 highlight.js, 这是一种由 js 生成的高亮方案。相比 highlight.js, Hugo 官方更倾向使用 Chroma 来生成代码高亮。 Chroma 是由 Go 写的语法高亮工具,其编译速度更快,且 Hugo 内置了 Chroma 工具。 Hugo 关于 Chroma 的文档在 Syntax Highlighting。 ...

 ·  · 

PaperMod:配置搜索页

PaperMod 已集成 Fuse.js 实现搜索功能。 PaperMod 官方文档: Search Page 搜索页面 新建 search.md 文件,内容参考如下: 1 2 3 4 5 6 7 --- title: "🔍 搜索" layout: "search" url: "/search/" hideTags: true placeholder: "请输入关键词..." --- 在 config/_default/menus.yaml 添加下面内容: 1 2 3 4 5 6 7 --- main: - identifier: search name: 🔍 搜索 url: /search weight: 4 --- 在 config\_default\params.yaml 添加下面内容: 1 2 3 4 5 6 7 8 9 10 11 # 添加搜索参数,参考 https://fusejs.io/api/options.html fuseOpts: # 搜索配置 isCaseSensitive: false # 是否大小写敏感 includeMatches: true # 是否包含匹配项 shouldSort: true # 是否排序 location: 0 distance: 1000 threshold: 0.0 # 完全匹配。PaperMod 默认为 0.4 minMatchCharLength: 0 # limit: 10 keys: ["title", "permalink", "summary", "content"] 参考教程 hugo-papermodx-add-search 添加标签云 修改逻辑控制 layouts/_default/terms.html,把之前的 terms-tags 标签控制代码注释掉,替换: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <ul class="terms-tags"> {{- $type := .Type }} {{- range $key, $value := .Data.Terms.Alphabetical }} {{- $name := .Name }} {{- $count := .Count }} {{- with $.Site.GetPage (printf "/%s/%s" $type $name) }} <li> {{ $largestFontSize := 1.5 }} {{ $smallestFontSize := 1 }} {{ $fontSpread := sub $largestFontSize $smallestFontSize }} {{ $max := add (len (index $.Site.Taxonomies.tags.ByCount 0).Pages) 1 }} {{ $min := len (index $.Site.Taxonomies.tags.ByCount.Reverse 0).Pages }} {{ $spread := sub $max $min }} {{ $fontStep := div $fontSpread $spread }} {{ $weigth := div (sub (math.Log $count) (math.Log $min)) (sub (math.Log $max) (math.Log $min)) }} {{ $currentFontSize := (add $smallestFontSize (mul (sub $largestFontSize $smallestFontSize) $weigth)) }} <a href="{{ .Permalink }}" style="font-size: {{ $currentFontSize }}rem; font-weight: {{ mul $currentFontSize 200 }};"> {{ .Name }} <sup><strong><sup>{{ $count }}</sup></strong></sup> </a> </li> {{- end }} {{- end }} </ul> 修改样式 assets/css/common/terms.css,替换: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 .terms-tags { text-align: center; } .terms-tags li { display: inline-block; margin: 5px; font-weight: 500; } .terms-tags li:hover { transform: scale(1.1); } .terms-tags a { background: none; border-radius: 30px; transition: transform 0.5s; } .terms-tags a:hover { background: none; webkit-transform: scale(1.2); -moz-transform: scale(1.2); -ms-transform: scale(1.2); -o-transform: scale(1.2); transform: scale(1.3); } .dark .terms-tags a { background: none; } .dark .terms-tags a:hover { background: none; webkit-transform: scale(1.2); -moz-transform: scale(1.2); -ms-transform: scale(1.2); -o-transform: scale(1.2); transform: scale(1.3); } .terms-tags a:active { background: var(--tertiary); transform: scale(0.96); } 参考教程 tag-cloud 配置标签云到搜索页 修改 search.md 文件,内容参考如下: 1 2 3 4 5 6 7 8 --- title: "🔍 搜索" layout: "search" url: "/search/" hideTags: false tagsTitle: 🎯 标签 placeholder: "请输入关键词..." --- 修改 layouts/_default/search.html 添加下面内容: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 {{- if not (.Param "hideTags") }} {{- $taxonomies := .Site.Taxonomies.tags }} {{- if gt (len $taxonomies) 0 }} <h2 style="margin-top: 32px">{{- (.Param "tagsTitle") | default "tags" }}</h2> <ul class="terms-tags"> {{- range $name, $value := $taxonomies }} {{- $count := .Count }} {{- with site.GetPage (printf "/tags/%s" $name) }} <li> {{ $largestFontSize := 1.5 }} {{ $smallestFontSize := 1 }} {{ $fontSpread := sub $largestFontSize $smallestFontSize }} {{ $max := add (len (index $.Site.Taxonomies.tags.ByCount 0).Pages) 1 }} {{ $min := len (index $.Site.Taxonomies.tags.ByCount.Reverse 0).Pages }} {{ $spread := sub $max $min }} {{ $fontStep := div $fontSpread $spread }} {{ $weigth := div (sub (math.Log $count) (math.Log $min)) (sub (math.Log $max) (math.Log $min)) }} {{ $currentFontSize := (add $smallestFontSize (mul (sub $largestFontSize $smallestFontSize) $weigth)) }} <a href="{{ .Permalink }}" style="font-size: {{ $currentFontSize }}rem; font-weight: {{ mul $currentFontSize 200 }};"> {{ .Name }} <sup><strong><sup>{{ $count }}</sup></strong></sup> </a> </li> {{- end }} {{- end }} </ul> {{- end }} {{- end }} {{- end }}{{/* end main */}} <!-- 在最后一行前加入上面的代码 -->

 ·  · 

Hugo:PicX图床

本教程基于 PicX 搭建个人博客图床。 PicX 是基于 Github 仓库和 cdn 加速的免费图床工具。通过 Github 授权 PicX 仓库管理权限(包含 GitHub OAuth 授权登录 和 填写 GitHub Token 登录 这两种方式),PicX 通过 Github Api 管理 Github 仓库(也就是我们的图库),提供了图片压缩、自定义命名、自定义水印等功能,简单且免费。 ...

 ·  · 

PaperMod:主题个性化

PaperMod主题魔改

 ·  · 

博客搭建:Hugo+PaperMod

基于Hugo搭建博客和介绍如何使用PaperMod博客框架

 ·  ·