Dart Sassでファイルを分割して管理する方法|Dart Sass入門

Sassを使うメリットの1つに「ファイルの分割」が挙げられます。
普通にCSSで書く場合、style.cssのような1つのファイルに書いていくと、気がつけば数千行のコードになってしまい、縦の移動がかなり面倒になってしまいます。
かといって細かくCSSを分けたりすると、どのページでどのCSSを読み込んでいるのか管理がややこしくなります。
また、CSSファイルを追加する度に関連ページのHTMLを修正する必要が出てきてしまうので、気軽に細かくファイルを分割できません。
もちろんルールを決めておけば問題なくなりますし、余計なCSSを読み込まなくて済むので良い方法ではありますが、Sassであればファイルを分割して最終的に1つのCSSファイルにまとめられるので、気軽に細かくファイルを分割していけます。
今回はDart Sassでのファイル分割方法についてまとめておきます。
Dart Sassのファイル分割方法
ファイルの分割
今回は「style.scss」ファイルに、分割したファイルをどんどん読み込んでいくのを想定して、下記のようなフォルダ構成を用意しました。

分割して、他のファイルで読み込むだけのファイルは、名前の先頭にアンダースコア(_)を入力します。
先頭にアンダースコアがついていると、そのファイルはコンパイルされなくなるので余計なCSSが生成されずに済みます。
# button.cssにコンパイルされる
button.scss
# コンパイルされない(他ファイルからの読み込み専用ファイルになる)
_button.scssこの機能を「パーシャル(partial)」と呼びます。
逆にアンダースコアを付けていないと、分割した分すべてのCSSが生成されてしまうので注意が必要です。
分割したファイルの読み込み
今度は分割したファイルの読み込みです。
読み込み元となるファイル(今回の場合はstyle.scss)を開いて、@useのあとに読み込みたいファイルのパスを指定すると読み込めます。
style.scss// base
@use "base/layout";
@use "base/mixin";
@use "base/reset";
@use "base/variable";
// common
@use "common/footer";
@use "common/header";
@use "common/main";
// module
@use "common/button";
@use "common/card";
@use "common/input";
@use "common/modal";
@use "common/pagination";
@use "common/table";
// page
@use "page/about";
@use "page/top";パーチャルを使っていたとしても先頭のアンダースコアは不要で、.scssの拡張子も不要です。
@importは古い書き方
Sassに関する記事を見ていると、ファイルの読み込みは@importで書かれているのを見かけるかもしれません。
これはLibSassなどの古いSassの書き方です。
Dart Sassでは@importは動かないので注意が必要ですし、逆にLibSassを使うときは@useが使えません。
Dart SassとLibSassの違いなど、細かいことは過去に記事にしているので、そちらをご覧ください。
2つ以上前のファイルで定義されている変数を利用したい場合
少しややこしい話になるのですが、Sassでは変数をファイル内で定義して使えます。
別ファイルで定義している変数を使いたい場合に、定義されているファイルを直接読み込んで使う場合は@useで問題ありません。
しかし、読み込むファイル先でさらに別ファイルを読み込んでいて、そこで変数が定義されている変数を使いたい場合は、@useではその変数は利用できません。
2つ以上前のファイルで定義されている変数を利用したい場合は@forwardというものを使います。
@forward "base/button";

CSSの読み込みで「its MIME type (‘text/html’) is not a supported stylesheet MIME type」エラーが表示されて読み込みができない場合の解決方法
SourceTreeのカスタムアクションを使って差分ファイルだけをまとめる方法
Gitで1行しか変更していないはずのに全行変更した判定になってしまう
Google Chromeでinput要素の補完機能を使うと背景に色がついてしまう問題
npm-scriptsでSCSSをコンパイルする環境を構築する方法
WordPressのプラグインはどれを入れたら良い?とりあえず最初に導入をオススメするプラグイン一覧
Vue CLIで共通のSCSSファイルを読み込む方法
TwitterとFacebook用のOGP設定方法と表示確認方法
Vue CLIのtitleタグやmetaタグの設定方法
サイトを運営する時必ず登録しておきたいGoogle Search Console(サーチコンソール)の登録方法
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
Eagleで実現するクリエイティブ素材の簡単管理
かゆいところに手が届く「Supercharge」でMac環境を便利にカスタマイズする
超軽量なコードエディタ 「Zed」をサブエディタとして活用する
Bartender 6で追加されたWidgets機能で自作メニューバーアイテムを簡単に作成する
Googleカレンダーを便利に活用するための小技集(祝日だけを表示・月末の繰り返しイベントを追加)
Obsidianを使った「自己流PKM」で行う知識トレーニング
テキストエディタ・ノートアプリ関連のショートカットキーをKeyboard Maestroで統一する
Path Finderを使ってキーボードだけでファイル操作する方法(応用編)
macOSのコマンドパレット比較!SpotlightとAlfred、Raycastどれを使えばいい?