まだ間に合う！@importから@useに移行しよう

# はじめに

みなさんは普段からSassを使われていますか？
昨年公式から`@import`の廃止が発表され、サポート終了まで1年を切りました。

えっ？まだなにもしていない！という方もいらっしゃるかと思い、`@import`に変わる`@use`とはどんなものなのか、どう使うのかをご紹介していきます。

# <span>@</span>import
まずこれまで使用してきた`@import`について軽くおさらいします。

sassでは機能ごとファイルを分割して、`style.scss`内で読み込むことで、まとめて1つのcssファイルとしてコンパイルできます。

しかし、`@import`使った場合では定義された変数・mixin・関数（以下、メンバーとします）が、インポートされたすべてのスタイルシートで利用できるためどこで定義されていたのかがわからなくなってしまいます。
つまり、先に呼び出してさえいれば、この後参照するファイルすべてで呼び出しが可能ということです。

# <span>@</span>use
> <span>@</span>useが<span>@</span>importに代わるなら、置き換えればいいだけじゃないの？？

と考える方もいらっしゃるかと思いますが、`@use`は**呼び出したファイルの中でしか**読み込んだ内容を参照することができません。

また、読み込んだ内容を使用する箇所でも、どのファイルを参照するのか明記しなければなりません。
これは**名前空間**を利用することで解決できます。
#### 名前空間

```scss
// @useを使用する際、名前空間を “as ~” で指定する
@use "config/variables" as v;

// プロパティの値に “名前空間.使用するメンバー” と書くことで呼び出せる
color: v.$main-color;
```

`as`以下で指定している名前空間名は省略することもできます。

```scss
// 名前空間は省略も可能。その場合参照したファイル名が名前空間となる
@use "config/variables";

color: variables.$main-color;
```
# <span>@</span>importと<span>@</span>useの比較
では実際に`@import`と`@use`ではどのように異なるのか見ていきましょう。
### <span>@</span>importのとき

```foundation/_variables.scss
$bg-color: #137cbd;
$text-color: #ffffff;
```

```foundation/_mixin.scss
@mixin button {
	width: 300px;
	height: 45px;
	background-color: $bg-color;
	color: $text-color;
	font-size:16px;
}
```

```style.scss
@import "foundation/variables";
@import "foundation/mixin";
```

これらをコンパイルします。

```style.css
button {
	width: 300px;
	height: 45px;
	background-color: #137cbd;
	color: #ffffff;
	font-size:16px;
}
```

先述したとおり、`@import`ではすべてのスタイルシートで参照が可能なため、`style.scss`にインポートすることで、すべて参照されています。

### <span>@</span>useのとき

```foundation/_variables.scss
$bg-color: #137cbd;
$text-color: #ffffff;
```
`_mixin.scss`で`_variables.scss`を参照するために`@use`を記載します。

```foundation/_mixin.scss
@use "variables" as v;

@mixin button {
	width: 300px;
	height: 45px;
	background-color: v.$bg-color;
	color: v.$text-color;
	font-size:16px;
}
```
`sytle.scss`では、`_mixin.scss`のみを参照します。

```style.scss
@use "foundation/mixin" as m;
div {
	@include m.button;
}
```

このように各ファイルに **”どのファイルの”**、**”なにを”** 使うかを明記する必要があります。

```style.css
div {
	width: 300px;
	height: 45px;
	background-color: #137cbd;
	color: #ffffff;
	font-size:16px;
}
```

記述しなければならないものが増えてはしまいますが、
参照しているファイルがプロパティを見ればすぐにわかる点では運用がしやすいと思います。


### プライベートメンバー
定義したファイル内でしか使えないメンバーも作成できます。
変数名の先頭に`-（ハイフン）`または`_（アンダースコア）`を付けます。

```style.scss
$-radius: 3px;

div {
    @include m.button;
    border-radius: $-radius;
}
```

```style.css
div {
	width: 300px;
	height: 45px;
	background-color: #137cbd;
	color: #ffffff;
	font-size:16px;
	border-radius: 3px;
}
```
`_mixin.scss`内の`button`を呼び出した後の`border-radius`にプライベートメンバーの値が設定されました。

```foundation/_parts.scss
$-radius: 5px;

@mixin rounding {
    border-radius: $-radius;
}
```

`_parts.scss`内で設定した`$-radius`は

```style.scss
@use "foundation/parts" as p;

div {
    @include p.rounding;

    // これはエラーになる
    padding: 5px + rounding.$-radius;
}
```
同じ`_parts.scss`内で定義した`mixin`には値が入りますが、`_parts.scss`外のファイルでは参照されません。


# Dart sass
ここまで意気揚々と`@use`についてお話してきましたが、そもそも`@use`を使用するには[Dart Sass](https://sass-lang.com/dart-sass)を使用するしかありません。
今後LibSass(node-sass)でも実装予定となっておりますが、この点ご注意ください。

今回VSCodeで実装してみましたが、プラグインの**DartJS Sass Compiler and Sass Watcher**を利用しました。
↓こちらが大変わかりやすかったです。

https://crestadesign.org/sass-vscode/#Sass-2



# おわりに
いかがでしたでしょうか。
実際の`@import`の廃止については、ユーザーのみなさんが移行完了した時に行う、と公式ドキュメントは言っています。
これに甘んじずみなさんの移行が完了するとともに、この記事が少しでもお役に立てたら嬉しいです。

# 参考
* https://sass-lang.com/blog/the-module-system-is-launched
* https://sass-lang.com/documentation/at-rules/use#loading-members