本文へスキップ

Dart Sassへの移行ガイド:@useと@forward、ビルトインモジュールの書き方

Sassの実行環境について

Sassの新機能は、公式が推奨するDart Sassにだけ実装されます。また、今までの記述方法の中には、非推奨となり、今後廃止されるものもあります。

実行環境

説明

Ruby Sass

最初に作られたRubyベースのSassの実行環境
2019年3月に公式のサポートは終了

LibSass

以前広く使われていたC++ベースのSassの実行環境
2020年10月に公式が非推奨とし、新機能は追加されない

Dart Sass

現在公式が推奨しているDartベースのSassの実行環境
@importの代わりとなる@useや@forwardが使える唯一の実行環境

どうすればいいのか

以前から有名なVisual Studio Code(以下「VS Code」といいます)の拡張機能ではDart Sassが使われていないので、Dart Sassに対応した拡張機能を使う必要があります。

※Gulpやnpm-scriptsなどで実行している場合も、Dart Sassに対応したパッケージ(sass)に変更する必要があります。

以前からVS Codeでよく使われてきた拡張機能

次の拡張機能は、いずれも2020年までに更新が止まっています。

Dart Sass対応のLive Sass Compilerを使ってみる

VS CodeでDart Sassが使える拡張機能はLive Sass Compiler⁠(新しいタブで開く)がいいと思います。

以前の拡張機能とは異なり、作者が「Glenn Marks」となっているものをインストールしてください。

新旧のLive Sass Compilerを並べた画像
新旧のLive Sass Compilerを並べた画像

画面右下のWatch Sassをクリックすれば対象ファイルの監視が始まり、ファイルを保存するとコンパイルされます。

ステータスバーの「Watch Sass」ボタン

拡張機能の設定をする

対応ブラウザを指定して、コンパイル時に付与するベンダープレフィックスを制限しましょう。

Live Sass Compile › Settings: Autoprefixの「settings.json で編集」をクリックするとファイルが開くので、下記の例を参考に追記してください。

settings.jsonJSON · 17行
{  "liveSassCompile.settings.autoprefix": [    "last 2 major versions",    "> 0.5%",    "not opera > 0",    "not op_mini all",    "not dead"  ],  "liveSassCompile.settings.formats": [    {      "format": "expanded",      "extensionName": ".css",      "savePath": "/css",      "savePathReplacementPairs": null    }  ]}

私は上記の設定にしていますが、対応ブラウザの書き方はBrowserslist⁠(新しいタブで開く)のサイトで確認できます。

@importは非推奨、今後は@useを使用

パーシャルファイルを読み込むときに使っていた@importは非推奨になり、代わりに@useを使うことになります。しかしこれが少し厄介で、@importとは書き方が変わります。

@importは、2024年10月リリースのDart Sass 1.80.0で非推奨になり、コンパイル時に警告が出るようになりました。Dart Sass 3.0.0で廃止される予定で、3.0.0のリリースは早くても1.80.0の2年後(2026年10月)以降とされています。

例えば、「parts」フォルダにある「_variables.scss」を読み込みたいとき、@use "parts/variables";と指定します。読み込んだ_variables.scssの中にある変数を、読み込み先のstyle.scssで使用するには以下のように記述します。

ファイル名が名前空間(namespace)になるので、使う場所で「名前空間.変数名」と指定します。

parts/_variables.scssSCSS · 1行
$color-red: #f00;
style.scssSCSS · 5行
@use "parts/variables";p {  color: variables.$color-red;}

ここからがさらにややこしいのですが、「パーツ系のパーシャル(parts/_mixin.scssやparts/_function.scssなど) → パーシャルを1つにまとめたパーシャル(parts/_index.scss) → コンパイル対象のstyle.scss」のように中間に何かファイルを挟む場合は、中間のファイルでの読み込みに@forwardを使用します。そして、_index.scssの場合は、読み込むときにディレクトリの指定まででOKです。

parts/_variables.scssSCSS · 1行
$color-red: #f00;
parts/_mixin.scssSCSS · 5行
@mixin fontset {  font-size: 16px;  font-weight: normal;  font-style: normal;}
parts/_index.scssSCSS · 2行
@forward "variables";@forward "mixin";
style.scssSCSS · 6行
@use "parts";p {  @include parts.fontset;  color: parts.$color-red;}

そして、@forwardを使っているファイル内で変数などを呼び出したいときは、@forwardと@useを併用する必要があります。

parts/_index.scssSCSS · 8行
@forward "variables";@forward "mixin";@use "variables";a {  color: variables.$color-red;}

毎回呼び出し時に名前空間を指定するのは面倒ですよね。公式の意向としては、これを付けることでどのファイルから呼び出しているかを明確にして、メンテナンスしやすいようにすることが目的のようです。だから@importより扱いが細かくなっているんですね。

ただ、名前空間の指定は、記述を少し追加すれば楽にすることができます。

@use "variables" as varのように、asの後に任意の名前を指定すると、それを名前空間として使用できます。

そして、@use "variables" as *のように*(アスタリスク)を付けると、@importのときと同様に、名前空間の指定なしで使うことができます。

style.scssSCSS · 7行
@use "parts/variables" as *;@use "parts/mixin" as mix;p {  @include mix.fontset;  color: $color-red;}

なお、公式の移行ツール(Sass Migrator⁠(新しいタブで開く))を使うと、@importから@use・@forwardへの書き換えを自動で行えます。

組み込み関数からビルトインモジュールへ

Sassにはlightenやdarkenなどの組み込み関数が用意されています。しかし、Dart Sassではこれに代わってビルトインモジュールを使用することになります。グローバルな組み込み関数も、@importと同じくDart Sass 1.80.0で非推奨になり、3.0.0で廃止される予定です。

実は、除算の/も非推奨になっています(Dart Sass 1.33.0以降。2.0.0で廃止予定)。こちらをご覧ください。これはLibSassで私が使用していた関数です。htmlのfont-sizeを62.5%(1rem = 10px)にしていたので、指定した値を10で割る関数を使っていました。例えば20pxを指定したい場合、計算結果が2remと出せればよいのです。

parts/_functions.scss (LibSass)SCSS · 3行
@function rem($pixels) {  @return ($pixels / 10) * 1rem;}

今まではこの表記でよかったのですが、Dart Sassからは下記の記述をする必要があります。

parts/_functions.scss (Dart Sass)SCSS · 5行
@use "sass:math";@function rem($pixels) {  @return math.div($pixels, 10) * 1rem;}

Sassで用意されているmathモジュールを@useで読み込むことで使えるということです。他にも様々なビルトインモジュールが用意されています。

  • sass:color
  • sass:list
  • sass:map
  • sass:math
  • sass:meta
  • sass:selector
  • sass:string

下記のようにメディアクエリを呼び出すmixinを使っている方は、map-getを、sass:mapを使ったmap.getという形に書き換える必要があります。

parts/_mixin.scss (LibSass)SCSS · 5行
@mixin mq($breakpoint: md) {  @media only #{map-get($breakpoints-up, $breakpoint)} {    @content;  }}
parts/_mixin.scss (Dart Sass)SCSS · 7行
@use "sass:map";@mixin mq($breakpoint: md) {  @media only #{map.get($breakpoints-up, $breakpoint)} {    @content;  }}

なお、Sassではrgba()に16進数のカラーコードを直接指定できますが、この書き方はDart Sassでもそのまま使えます。sass:colorモジュールのcolor.change()でも同じ結果になります。

style.scssSCSS · 10行
@use "sass:color";// どちらも rgba(0, 0, 0, 0.6) になる.overlay-a {  background-color: rgba(#000, .6);}.overlay-b {  background-color: color.change(#000, $alpha: .6);}

まとめ

かなり長くなってしまいましたが、Dart Sassへの移行時は、こまめにコンパイルして、エラーが出ないように少しずつ進めていくと良いと思います。公式の推奨に合わせて、少し苦労してでもDart Sassに移行すべきだと思います。

参考・引用