タイトルの通りです。Netlifyでhugoを使う際にSass/SCSSが使えるようになりました。
Hugoでは2018/7リリースのv0.43でHugo Pipes
という機能が追加され、Sass/Scssやminifyが使えるようになりました。
なのですが、Netlifyでビルドする場合はビルドイメージがUbuntu 14.04 LTS (Trusty)だったため、Pipesが利用できず、
といったワークアラウンドで対応する必要がありました。
このたびビルドイメージがUbuntu 16.04 LTS (Xenial)になったので、netlifyでのビルド時にもPipesの機能が標準で利用できるようになりました。
A more flexible build architecture with updated Linux
ということでやってみました。
ビルドイメージでUbuntu 16.04 LTS (Xenial)を指定する
新規で作成したプロジェクトは最初からXenialが指定されるようですが、既存のプロジェクトは明示的に変更してあげる必要があります。
Deploys
-> Deploy settings
-> Build image selection
と辿り、Edit settings
をクリックすると次のように選択可能となっているので、Xenialを選択し
Save
をクリックするだけです。簡単ですね。
ふつうにscssのアセットを使う
使い方はhugoの話になるので詳細は下記に書いてある通りです。
たとえばassets/scss/style.scss
というファイルを用意したらテンプレートを下記にように書けばminifyされたcssを読み込みます。
簡単ですね。
{{ $style := resources.Get "scss/main.scss" | resources.ToCSS | resources.Minify }}
<link rel="stylesheet" href="{{ $styles.Permalink }}" >
ちなみにインラインにしたい場合は下記のようにすると実現できます。
<style>
{{ (resources.Get "scss/main.scss" | resources.ToCSS | resources.Minify ).Content | safeCSS }}
</style>
Hugoテンプレートと組み合わせて使う
sass/scssファイルをHugoのテンプレートとして扱うことも可能です。 下記のようにresources.ExecuteAsTemplateを挟むだけです。
{{ $style := $sassTemplate | resources.ExecuteAsTemplate "main.scss" . | resources.ToCSS }}
せっかくSCSSなのでファイルを分割して@import
も使いたいのですが、ExecuteAsTemplate is not resolving SCSS/SASS importsにあるようにExecuteAsTemplate
で扱うと@import
が使えませんので注意です。
2重管理になる点が微妙ですが、scssで完結する範囲はscssで、どうしてもHugoのテンプレートとして扱う必要のある部分は別ファイルに切り出してExecuteAsTemplate
で扱うようにしました。
まとめ
ということでNetlifyでもようやくHugo Pipes
が使えるようになり、SCSSを使うことでスタイルの管理も楽になり、合わせてminifyも使えて非常に便利になりました。