当网站结构复杂的时候,使用 sass 就很必要了。但是 hugo+sass 的教程很少见,我这里参考一些英语资料总结一些你可能需要的 tips。
一、Sass 的支持
从 0.43版本之后,Hugo 就支持了 Sass 的编译,这意味着在编译静态网站的时候不用同时运行 Gulp 或者其他的什么前端工具。
什么,你连 Sass 是什么都不知道,快戳这个链接看看吧。
二、Sass 的文件结构
在 Hugo 中,你只能把 Sass 的源文件放到 /assets/scss/
或 /themes/your-theme/assets/scss/
下,没有别的路径可以选择。
这里假设入口 scss 文件为 main.scss。根据《Architecture for a Sass Project》的建议,我们也在 scss 文件夹下创建这样的目录:
vendor/ 预设文件
base/
|
|-- _variables.scss 变量
|-- _mixins.scss
|-- _placeholders.scss
layout/ 框架
components/ 模块
pages/
main.scss 入口
对了,这篇文章的作者叫做 Hugo Giraudel,如果你在Google 中搜索 hugo + sass ,大概率搜索到的是这位大牛写的关于 sass 的文章……
接着,在 main.scss 中将这些模块都 @import 进去。
三、通过 Hugo 编译 scss 文件
如果你前面做的都没问题,那么在对应的模板中加入:
{{ $styles := resources.Get "scss/main.scss" | toCSS | minify | fingerprint }}
其中 resouces.Get
是 Huho 提供的函数获取 scss 文件内容,后面的 toCSS,minify,fingerprint是一些管道操作,用来编译和压缩 CSS。
Fingerprint 这个技术可以给生成的文件加上独一无二的 hash 文件名,这样网站更新后,用户从CDN拉取的也是最新的 css 而不是缓存中的老文件。
接着,在 html 的 head 中加入
<link rel=”stylesheet” href=”{{ $styles.Permalink }}” integrity="{{ $styles.Data.Integrity" media=”screen”>
基本就完成了整个引入的操作。
四、覆写主题中已有的 scss
如果你已经引入了别人的主题,对方有一个 scss 文件,你自己想要覆写,你可以在本地的 /assets/scss/ 下建立一个同名的文件,这个文件的优先级比主题中的更高。
五、根据 Hugo 的模板来写 scss
我目前使用的是 hugo-paper 主题,当然我自己已经魔改好几轮了。包括:
- 增加图片展示
- 增加 valine 支持
- 增加 脑图 支持
- 增加 category 支持
- etc
姑且把这个主题叫做 hugo-paper-plus 吧。
这个主题的模板很简单,一共包括四个部分:
- 全局的 header.html
- 全局的 footer.html
- 文章列表页 list.html
- 文章页 single.html
所以针对这个结构,我想到对应的 scss 结构是这样的:
- /pages/single.scss
- /pages/list.scss
- /layout/header.scss
- /layout/footer.scss
- /components/list-item.scss
六、分割 CSS,重写
这段就没什么好说的了,苦逼编码中。目前已经将一个大的 css 文件分割成了若干个小文件。
啊对了,如果你和我一样用的 netlify 来编译网站的话,记得修改一下 hugo 的版本,最新的版本是 0.54.0
。
参考文章:
How to cache-bust and concatenate JS and SASS files with Hugo in 2018