week14:静态站点生成器,以HUGO为例

什么是hugo?

A fast and modern static website engine。众多的现代静态网站生成器之一,选择它主要是看中安装非常简单,仅仅一个可执行程序。而不像其他更流行的Jekyll之类的需要装一大堆ruby/gem之类的环境才能用,这样大家就不用学习什么依赖关系包管理等等等等了。


动手试试看吧:


基础准备:

tmux #首先打这个命令

tmux可以在在终端窗口中运行多个终端会话,即终端复用(terminal multiplexer)。在以下场合会很有用:

  • 需要在后台持续运行特定任务
  • 网络连接不稳定,远程连接到服务器经常意外中断

常用的tmux命令

  • 按ctrl+b,松手,再按英文的双引号,也就是shift+’ # 会看到两个分割的Panel
  • ctrl+b之后按方向键 #在Panel之间切换
  • ctrl+b之后按英文问号? #查看更多命令
  • ctrl+b之后按d #离开tmux,使之在后台继续运行
  • tmux ls #列出后台打开的tmux清单
  • tmux at -t 编号或名称 #返回之前的tmux界面

在其中任意一个Panel输入下面的命令来试试。


初始化工作目录并安装第一个主题:

cd #进入用户主目录

hugo new site lol #创建名为lol的工作目录,当然也可以是别的名字
cd lol #进入工作目录
cd themes #进入主题目录
git clone https://github.com/spf13/hyde.git #下载hyde这个主题
cd ~/lol #返回工作目录,注意之后的命令都是在此目录下输入的

直接使用VSCode编辑网站配置文件,也就是“lol”目录下的“config.toml”这个文件。当然你更喜欢命令行也可以用vim或者其他编辑器,不限麻烦也可以去Virtualmin的“File Manager”里面修改

baseURL = "http://2019000000.nnm.jnu.rocks/hugo/" #你的网址
languageCode = "en-us" #语言,先不用改
title = "yet another hugo sample" # 网站标题
theme = "hyde" #你选用的主题

开始创作内容

hugo new test.md #创建一个新的页面,注意编辑时删除draft状态的行才会真的发布
hugo new post/2020.md #创建一个带路径的页面

然后去编辑这些新生成的文件,同样可以直接用VSCode或者通过命令行方式或者Virtualmin的“File Manager”……

注意hugo默认使用Markdown语言进行内容编写:

当然你也可以在其他的任何Markdown编辑器比如说Typora里面写好了粘贴过来。


调试

hugo server

应该会在VSCode的右下角看到类似这样的提示:

选择“在编辑器中预览”,此时你就可以通过VSCode来查看网站内容和配置的实时变化了,注意尽管此时VSCode的“简易浏览器”的地址栏中显示的域名是localhost,但实际上访问的是远程服务器的“localhost”。

甚至你可以选择在终端的输出中按提示按住Ctrl单击链接,在浏览器中也可以打开。这是因为VSCode自动做了远程到本地的端口转发。单击“终端”标签旁的“端口”就可以看到:


发布:

当通过实时调试看到没什么问题,符合你的预期的时候

hugo #自动将内容渲染成html,并放在工作目录的public目录下
rm -Rf ~/public_html/hugo/ #把之前复制过去的旧版本干掉
cp -R public/ ~/public_html/hugo/ #将生成的站点网页文件夹复制到域名对应的系统目录下的hugo子目录rm -Rf ~/public_html/hugo/

接下来就可以用域名来访问了,用浏览器打开http://2019000000.nnm.jnu.rocks/hugo #注意替换成你自己的学号!

每次更新的时候嫌麻烦,将上面三行命令合成一行搞定的话:

hugo -v && rm -Rf ~/public_html/hugo/ && cp -Rf public/ ~/public_html/hugo/ #生成并强行复制,直接覆盖上次的文件

常见问题:

  • 配置没错,但是无法生成静态页面,报错类似:“Error building site: TOCSS: failed to transform “sass/style.sass” (text/x-sass): resource “sass/hugo/sass/style.sass_48b060fe05b0a273d182ef83c0605941” not found in file cache”
    • 原因:使用了某些特殊的主题,使用了sass
    • 解决思路:联系管理员安装扩展版的HUGO
  • 本地图片显示不出来
    • 原因:没有理解HUGO处理本地图片的机制
    • 解决思路:冷静观察对比渲染后生成的具体页面的html里面那个图片显示不出的xx的路径和你的原始md里面写的图片路径,不难发现:
      • 绝对路径/对应的是域名/,无论你的HUGO的BaseURL是否是在/或某个子目录中
      • 相对路径的起始点是该html所在的路径
    • 正确的做法:
      • 图片本身放在工作目录的static子目录下,也可以考虑放在static/media、static/image之类的下级目录里面
      • 这些图片在打hugo命令后,会被自动复制到public中
      • md中根据未来你的HUGO的实际网址来写图片的路径
        • 最终网址如果是网站域名的根目录,那么图片链接就以/开头
        • 最终网址如果是某个子目录例如作业要求的hugo,那么图片链接就以/hugo开头
  • 打开缓慢/排版错位:
    • 原因:多半是静态资源(JS/CSS/字体)等没有正确加载造成
    • 定位:使用浏览器调试工具,Network面板,观察加载的资源来自哪些域名。
      • 理应在站内的资源,请求地址错误
      • 站外的资源(往往是一些公共托管库中的js或者google字体等)如果所在网络不能正常访问,就会诱发各种问题,比如等到超时才继续加载网站页面或导致功能失效、排版错位等
    • 解决思路:
      • 仔细检查配置文件,修改到正确的写法
      • 去除主题中对相应资源的引用(对于字体)或指向国内镜像(对于js)
    • 具体操作:去Terminal,定位到HUGO工作目录的主题目录内,用grep命令查找“定位”步骤发现的域名,找到引用特定资源的文件和行编号,进行处理
      • js公共库可以考虑更换为国内镜像地址
      • 字体等资源可以先注释掉,重新发布观察没有问题,可考虑删除

参考资源:


本周作业:

参考本教程,结合上方对原理解释更清楚的相关资源,尝试在作业服务器上使用HUGO自选主题创建一个网站,并对游客可见。截止时间是week15上课前,即2021-06-07之前。具体要求:

  • 访问网址:最终此网站内容不要放在域名根目录,而要在 http://你的域名/hugo,例如http://2019000000.nnm.jnu.rocks/hugo/
  • 至少包含3个以上的内容页面
  • 文章正文中,至少要包含1个超链接、1张本地图片