把 Sass 编译为 CSS
用 css.Sass 把 Sass 或 SCSS 编译为 CSS,并压缩与加指纹。
适用前提
用 css.Sass 函数把 Sass 转译为 CSS。Hugo 的 extended 版与 extended/deploy 版内置了 LibSass 转译器;若想使用 Sass 语言的最新特性,则需另行安装 Dart Sass。Sass 有 SCSS 与缩进语法两种书写形式,Hugo 都支持。
转译器的选择由 transpiler 选项决定,取值为 libsass 或 dartsass,默认是 libsass。内置的 LibSass 转译器已标记为过时并将在未来的版本中移除,因此建议改用 Dart Sass:把 transpiler 设为 dartsass 即可。
采用 Dart Sass 时,把它装进 PATH 覆盖到的位置,Hugo 就能找到它。用 hugo env 命令可以列出当前生效的转译器。在持续集成的构建环境中,通常需要在构建开始前先安装 Dart Sass,除非你已按原样把 resources 目录提交进仓库。
取得资源
样式表同样要先作为资源取出,再进入管道。资源位于资产目录 assets 中,例如 assets/sass/main.scss 就写为 resources.Get "sass/main.scss"。
管道方法链
{{ $opts := dict "transpiler" "dartsass" }}
{{ $r := resources.Get "sass/main.scss" | css.Sass $opts }}选项以映射形式传入,要与其他函数串成管道链时紧随其后:
{{ $r := resources.Get "sass/main.scss" | css.Sass $opts | resources.Minify | resources.Fingerprint }}配置选项
css.Sass 接受一个选项映射,常用键如下。
transpiler:转译器,libsass或dartsass,默认libsass。outputStyle:输出样式。LibSass 可取nested(默认)、expanded、compact、compressed;Dart Sass 取expanded(默认)或compressed。enableSourceMap:是否生成 source map,默认false。另有sourceMapIncludeSources决定是否把源文件嵌入 source map,默认false,适用于 Dart Sass。targetPath:目标路径,相对于publishDir;若不设置,则默认为资源原路径换用.css扩展名。includePaths:一个路径切片,用于解析@use与@import,例如node_modules/bootstrap/scss。precision:浮点运算精度,默认8,适用于 LibSass。silenceDeprecations与silenceDependencyDeprecations:用于压制度弃告警,后者默认false,适用于 Dart Sass。vars:键值映射,用来生成 Sass 变量。
Sass 变量
vars 中的变量会在样式表里遇到 hugo:vars 这一内部标识符时注入。在配置文件中集中定义颜色与字号,再交给模板,是一种常见做法:
[params.theme.style]
font-family = '"Times New Roman", Times, serif'
font-size = '24px'
primary-color = 'blue'{{ $opts := dict "transpiler" "dartsass" "vars" site.Params.theme.style }}
{{ $r := resources.Get "sass/main.scss" | css.Sass $opts }}样式表中以 @use 'hugo:vars' as v; 引入后,即可用 v.$primary-color 这样的形式取值。传入 vars 时,Hugo 会用正则匹配识别 24px、#FF0000 一类常见的带类型 CSS 值;必要时可用 css.Quoted 或 css.Unquoted 明确指定类型,避免自动推断造成歧义。
示例
{{ with resources.Get "sass/main.scss" }}
{{ $opts := dict
"transpiler" "dartsass"
"targetPath" "css/main.css"
"outputStyle" (cond hugo.IsDevelopment "expanded" "compressed")
"includePaths" (slice "node_modules/bootstrap/scss")
}}
{{ with . | css.Sass $opts | fingerprint }}
<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
{{ end }}
{{ end }}缓存与并发
管道链的结果按整条链缓存,同一次构建中只执行一次,反复调用不会重复编译。
发布与指纹
调用 .RelPermalink 或 .Permalink 会触发发布。生产环境通常再串上 resources.Fingerprint,得到带哈希的文件名与 .Data.Integrity,便于设置长缓存并启用子资源完整性校验。