SASS初心者がSASSコマンドでSASSファイルを監視する時に知っておいたほうがいいこと

SASSの監視用にバッチを作る時に知っておいたほうがいいことをまとめてみました。

**環境**

- OS : Windows10 64bit と macOS Sierra version10.12.5 64bit
- RubyGems : 2.6.11
- Sass : 3.4.24 (Selective Steve)
- あえてCompassなどはない

### RubyGems で SASS をインストールする。
プロジェクトで使う環境に合わせてインストールします。
SASSだけあればOKです。

- [Windows10にRubyGemsをインストールする方法](http://qiita.com/ponsuke0531/items/b9036afd4a28f99e89c5)
- [RubyGemsでSASSとCompassとSASS版Bootstrapをインストールする方法](http://qiita.com/ponsuke0531/items/ad8b196ce1813a5d7f97)
- [BundlerでSASSとCompassとSASS版Bootstrapをバージョン指定してインストールする方法](http://qiita.com/ponsuke0531/items/958c0c4046209f8ce597)

### sassファイルを書くand配置する
sassファイルの書き方は「sass 書き方」でググると親切なサイト様がたくさんあって教えて頂けます。
こんなドシンプルに配置してみました。
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/1c32d4e5-32c7-dceb-7c6e-8a3d972b5c63.jpeg)
※. sassファイルの内容はどっかから頂いたものです。内容は今回気にしません。

### sassファイルをコンパイルする方法

```shell-session
$ sass {sassのファイル名}:{cssのファイル名}
```

これでCSSファイルが出来上がります。

```shell-session
$ cd {FirstSass/sass/までのパス}
$ sass style.scss:./../css/style.css
```

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/f86d0dc2-9686-d0fa-3dca-4dc48157feda.jpeg)

が、書いて保存するたびにコンパイルするなんて・・・面倒くさい。
保存したら自動でコンパイルしておいて欲しいな。

### sassファイルを監視する方法

```shell-session
$ sass --watch {sassのファイル名orディレクトリ名}:{cssのファイル名orディレクトリ名}
```

これでsassファイルを保存するたびにコンパイルしてもらえます。

```shell-session
$ cd {FirstSass/までのパス}
$ sass --watch sass:css
>>> Sass is watching for changes. Press Ctrl-C to stop.
>>> Change detected to: sass/style.scss <------- 保存を検知
      write css/style.css
      write css/style.css.map
>>> Change detected to: sass/style.scss <------- 保存を検知
      write css/style.css
      write css/style.css.map
>>> Change detected to: sass/style.scss <------- 保存を検知
      write css/style.css
      write css/style.css.map
```
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/e1d76afc-bef7-38bc-565f-eefd9961bd23.jpeg)


### 「.sass-cache」を出力しない方法
ところで、コンパイルするたびに出力される「.sass-cache」ディレクトリ・・・これはいるのでしょうか？
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/c19ed2ff-0b1e-09e7-78f9-2315c3123dc5.jpeg)

「.sass-cache」は出力されるからには意味があります。
> 時間のかかる処理結果などを保管しておき次回以降のコンパイルをより高速化するためのものです。
> [Compassに依存しない！ Sass (SCSS) をちゃんと学ぶ その1 &#8211; Webtomahawk](http://webtomahawk.com/archives/84)

コンパイル対象が大きくなると時間がかかるので出力せざる負えません。
**出力するけど共有したくない時の対応案**
1. 妥協して諦める
2. sassファイルの修正が終わったら消す
3. Gitを使っていれば.gitignoreに書いてローカルだけに置いておく

**出力しない方法**

```shell-session
$ sass --watch --no-cache {sassのファイル名orディレクトリ名}:{cssのファイル名orディレクトリ名}
```

こうすると「.sass-cache」が出力されなくなります。

```shell-session
$ cd {FirstSass/までのパス}
$ sass --watch --no-cache sass:css
>>> Sass is watching for changes. Press Ctrl-C to stop.
>>> Change detected to: sass/style.scss
      write css/style.css
      write css/style.css.map
```

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/57784bdb-d960-d8e8-e364-56014144ae9f.jpeg)

### ソースマップファイルを出力しない方法
ところで、コンパイルするたびに出力される「*.css.map(ソースマップファイル)」・・・これはいるのでしょうか？
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/6bfd4942-509b-6b85-b29b-5a4e5f5ae63f.jpeg)

ソースマップファイルは出力されるからには意味があります。
> コンパイルや圧縮されて難読化されたコードがオリジナルファイルの何行目になるのか、マッピング情報が書かれたファイルであり、元の読みやすい状態にしてくれる方法です。
> Chrome Developer ToolsがSource Mapsに対応してくれたおかげで、メタ言語のデバッグがとても快適になりました。Fire FoxのアドオンFireSassでも対処しています。
> [SassのデバッグにSource Mapsを使うべきたくさんの理由 - ROCHAS](http://dresscording.com/blog/sass/sass_sourcemaps.html)

ソースマップファイルの中身はこんな感じです。
![Screen Shot 2017-07-03 at 22.42.35.png](https://qiita-image-store.s3.amazonaws.com/0/159761/b984a236-b590-f801-19f7-0a8daa720359.png)

CSSにはどのソースマップファイルかが記載されています。
![Screen Shot 2017-07-03 at 22.43.02.png](https://qiita-image-store.s3.amazonaws.com/0/159761/8200f800-e776-7f36-e7e7-58cb6e769804.png)

「このスタイルどこに書いているの？」をサクッと見るには出力せざる負えません。
**出力するけど共有したくない時の対応案**
1. 妥協して諦める
2. デバックが終わったら消す
3. Gitを使っていれば.gitignoreに書いてローカルだけに置いておく

**出力しない方法**

```shell-session
$ sass --watch --sourcemap=none {sassのファイル名orディレクトリ名}:{cssのファイル名orディレクトリ名}
```
こうするとソースマップファイルが出力されなくなります。

```shell-session
$ sass --watch --sourcemap=none sass:css
>>> Sass is watching for changes. Press Ctrl-C to stop.
>>> Change detected to: sass/style.scss
      write css/style.css <---- CSSだけ
```

![Screen Shot 2017-06-29 at 0.31.37.png](https://qiita-image-store.s3.amazonaws.com/0/159761/d5c5f30e-266f-bdbf-ab3f-1f671c60a2ba.png)

出力されたCSSの最終行にあったmapファイルの情報`/*# sourceMappingURL=style.css.map */`も出力されされません。

### 出力スタイルを指定する方法
```shell-session
$ sass --watch --style {スタイルの種類} {sassのファイル名orディレクトリ名}:{cssのファイル名orディレクトリ名}
```

出力スタイルの種類は「nested」「expanded」「compact」「compressed」の４つです。なにも指定しなければ「nested」になります。
:arrow_lower_right:にはサンプル付きで説明があります。
[File: SASS_REFERENCE &mdash; Sass Documentation](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style)

何も指定しないでこうなっていたのが、
![Screen Shot 2017-06-29 at 23.05.21.png](https://qiita-image-store.s3.amazonaws.com/0/159761/92acc730-a17a-6194-e9ee-114769ff6bde.png)

指定するとこうなります。

```shell-session
$ sass --watch --style expanded sass:css
>>> Sass is watching for changes. Press Ctrl-C to stop.
>>> Change detected to: sass/style.scss
      write css/style.css
      write css/style.css.map
```
![Screen Shot 2017-06-29 at 23.12.29.png](https://qiita-image-store.s3.amazonaws.com/0/159761/6d26025b-088c-85f0-1593-01b2e73004d6.png)

### 文字コードと改行コードを指定する方法
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/e13f8211-d0cb-2565-bde8-85515e84f8cb.jpeg)

文字コードと改行コードの出力が気になったので試してみました。
そして、出力する文字コードと改行コードは指定した方がいいことに気が付きました。
文字コードと改行コードを指定しないでいろんな環境の人が使うと面倒なことになりそうです。

|OS|SCSS<br/>文字コード|SCSS<br/>改行コード|CSS<br/>文字コード|CSS<br/>改行コード|
|:-:|:-:|:-:|:-:|:-:|
|Windows|SJIS<br/>(日本語あり)|-|エラー|-|
|Windows|UTF-8<br/>(日本語あり)|unix|UTF-8|Windows|
|Windows|UTF-8<br/>(日本語あり)|Windows|UTF-8|Windows|
|Mac|SJIS<br/>(日本語あり)|-|エラー|-|
|Mac|SJIS<br/>(日本語なし)|unix|UTF-8|unix|
|Mac|UTF-8<br/>(日本語あり)|unix|UTF-8|unix|
|Mac|UTF-8<br/>(日本語あり)|Windows|UTF-8|unix|


「SCSSファイルに日本語が書いてある」&&「文字コードがUTF-8以外」の時のエラー

```shell-session
sass --watch sass:css
>>> Sass is watching for changes. Press Ctrl-C to stop.
      error sass/style.scss (Line 1: Invalid UTF-8 character "\x93")
```

**文字コードを指定する方法**

```shell-session
$ sass --watch --default-encoding {文字コード} {スタイルの種類} {sassのファイル名orディレクトリ名}:{cssのファイル名orディレクトリ名}
```

文字コードは特に何も指定しなければ「UTF-8」になります。
ただ、バッチで指定すれば「UTF-8にしたい」という意思表示にはなると思います。
> 超ざっくりな一部訳 : Unicodeのバイトオーダーマーク > @charset宣言 > Rubyの文字列エンコーディングの順にチェックします。
> 
> When running on Ruby 1.9 and later, Sass is aware of the character encoding of documents. Sass follows the CSS spec to determine the encoding of a stylesheet, and falls back to the Ruby string encoding. This means that it first checks the Unicode byte order mark, then the @charset declaration, then the Ruby string encoding. If none of these are set, it will assume the document is in UTF-8.
> [File: SASS_REFERENCE &mdash; Sass Documentation](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#encodings)

※. 英語はとても弱いのでどなたか初心者向け一言和訳があれば教えてください。

指定するとこんな感じです。

```shell-session
$ sass --watch --default-encoding US-ASCII sass:css
>>> Sass is watching for changes. Press Ctrl-C to stop.
>>> Change detected to: sass/style.scss
      error sass/style.scss (Line 1: Invalid US-ASCII character "\xE6") <----- 「/* 日本語 */」がだめと言われました。消すと無事コンパイルされます。
>>> Change detected to: sass/style.scss
      write css/style.css
      write css/style.css.map
$ nkf -g css/style.cssss
ASCII
$ sass --watch --default-encoding utf-8 sass:css
>>> Sass is watching for changes. Press Ctrl-C to stop.
>>> Change detected to: sass/style.scss
      write css/style.css
      write css/style.css.map
$ nkf -g css/style.css
ASCII <---------------------- おっと「/* 日本語 */」がないと「ASCII」に・・・このあと追記してコンパイルします。
$ sass --watch --default-encoding utf-8 sass:css
>>> Sass is watching for changes. Press Ctrl-C to stop.
      write css/style.css
      write css/style.css.map
$ nkf -g css/style.css
UTF-8
```

**改行コードにUnix(LF)を指定する方法**
@scivolaさんに教えて頂きました。

```shell-session
$ sass --watch --unix-newlines {スタイルの種類} {sassのファイル名orディレクトリ名}:{cssのファイル名orディレクトリ名}
```

Windowsマシンで指定しないとCSSは「Windows(CRLF)」になります。

```shell-session
$ sass --watch sass:css
>>> Sass is watching for changes. Press Ctrl-C to stop.
>>> Change detected to: sass/style.scss
     write css/style.css
     write css/style.css.map
バッチ ジョブを終了しますか (Y/N)? y
```
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/cdd90eb5-b0f3-3d94-b8a7-71f6175aa3d6.jpeg)

Windowsマシンで「--unix-newlines」を指定するとCSSは「unix(LF)」になります。

```shell-session
sass --watch --unix-newlines sass:css
>>> Sass is watching for changes. Press Ctrl-C to stop.
>>> Change detected to: sass/style.scss
     write css/style.css
     write css/style.css.map
バッチ ジョブを終了しますか (Y/N)? y
```

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/129418a6-2d0f-8fdf-5a44-a25718604dd8.jpeg)

**改行コードにWindows(CRLF)を指定する方法**
不明
どなたかsassコマンドだけで改行コードにWindows(CRLF)を指定する方法を教えて下さい。