Sassを今この瞬間から使えるようになるまでの手順

# はじめに
HP制作の段階で「CSSある程度理解して使えるようになったから、Sassを触ってみよう！」と思っても実際に使えるようになるまでにはいくつかの壁があります。
そのうちの１つが環境構築です。

HTMLファイルのheadタグ内にはcssを読み込ませる必要がありますね。
しかし、Sassを使ってサイトのスタイルを整えるためにはそのままHTMLに読み込ませる事はできず、Sass→CSSに変換する必要があります。（これをコンパイル）といいます。

そこで今回は、僕のような初心者向けに”Sass”を使って開発できるようになるまでの手順を示します。

## 目次
1.[Node.jsをインストールする](#anchor1)
2.[Node.jsがインストールされているかターミナル/コマンドプロンプトで確認](#anchor2)
3.[gulp-cliをインストールする](#anchor3)
4.[package.jsonを作成する](#anchor4)(←gulpインストール済みの人はここから)
5.[gulpとgulp-sassをローカル環境にインストール](#anchor5)
6.[node_modulesとpackage-lock.jsonを作成](#anchor6)
7.[gulpfile.jsをpackage.jsonと同じ階層に作成（自作）](#anchor7)
8.[Sassをコンパイル](#anchor8)

## 準備
ターミナル(Mac),コマンドプロンプト(Windows)を多少触ったことある。
<a id="ancho1"></a>
## 1.Node.jsをインストールする
Sassをコンパイルするにあたって、いろんな方法があると思います。自分は、「[Web制作者のためのSassの教科書 これからのWebデザインの現場で必須のCSSメタ言語](https://www.amazon.co.jp/Web%E5%88%B6%E4%BD%9C%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AESass%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AEWeb%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E7%8F%BE%E5%A0%B4%E3%81%A7%E5%BF%85%E9%A0%88%E3%81%AECSS%E3%83%A1%E3%82%BF%E8%A8%80%E8%AA%9E-%E5%B9%B3%E6%BE%A4-%E9%9A%86/dp/4844334662)」という本を使用しながら環境構築したのでこの本に準拠した形で説明します。ちなみに、この本は初心者にとっても優しく書かれているのでWeb制作を行う人にはおすすめです。

まず、Sassを使えるようになるまでの大枠を逆算的に掴みます。

・C/C++ で開発されたLibSassを使えるようになる
・LibSassのライブラリであるnode-sassを使えるようにする
・node-sassを動かすためにNode.jsを使えるようにする
・Node.jsを使えるようになることでnpmコマンドが使えるようになる
・npmコマンドでgulpが使えるようになる
・gulpでSassをCSSにコンパイルできるようになる

以上。

つまり、手始めにnode.sassという本体を操作するためにはNode.jsというコントローラーを手元に持ってこなくてはいけないわけですね。

このNode.jsはインストールするとnpmというパッケージ管理マネージャを使えるようになります。
Node.jsがコントローラーなら、npmはAボタンとかそういう感じでしょうか？npmコマンドは後述しますが、これによって必要な機能をインストールできたりします。

と、いうわけでnode-sassを動かすためにNode.jsをインストールしましょう！

### ①[Node.js公式サイト](https://nodejs.org/ja/)からインストーラーをダウンロード
２つ緑のボタンが中央にありますが、「LTS」と書かれた左のほうのボタンを押して最新のLTSをダウンロードしましょう。
<img width="1673" alt="スクリーンショット 2020-07-22 15.38.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/adcc12de-3624-94ad-3dd8-06d91d95f72f.png">

### ②ダウンロードしたら基本的に「次へ」を進めてインストールを完了させる

これでNode.jsは無事にあなたのPCにインストールされたはずで、node.sassを操作する準備は整いました。
実際に、node.jsがインストールされているか確認してみましょう。

<a id="ancho2"></a>
## 2.Node.jsがインストールされているかターミナル/コマンドプロンプトで確認
ターミナルorコマンドを開いて、以下のコマンドを打ってバージョンが表示されるか確認

```
$ node -v
```
<img width="404" alt="スクリーンショット 2020-07-22 16.09.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/ab7ee764-9fe1-38ff-b371-9565c207b2b7.png">
このようにバーションが表示されればPCにnode.jsがインストールされています！
## 3.gulp-cliをインストールする
つぎにgulpというさまざまなタスクを自動化してくれるツール（タスクランナー）をnode.jsをインストールしたことで使えるようになったnpmコマンドでgulpをインストールしましょう。以下のコマンドを叩いてください

```
$npm install --global gulp-cli
```
上記のコマンドを叩いたあとに、インストールがちゃんとされているか確認しましょう。下記のコマンドです。

```
$gulp -v
```

＊（余談ですが、僕はこのgulpのインストールがうまく行かず何度やっても

```
gulp: command not found
```
という表記がでて、心を折られたんですがerrorメッセージをよく見ると【管理者権限が〜】みたいなこと書かれていたので試しに

```
$sudo npm install --global gulp-cli
```
と打ち直して、管理者権限を確認させるようなコマンドを叩いたら無事にうまくいきました・・・
（この時、errorメッセージはちゃんと読もうと心の底から思いました。）

これで、ようやくSassを使えるようになる道具が揃いました。

<a id="ancho4"></a>
## 4.package.jsonを作成する

### ①任意の場所にファイルを作って、cd コマンドで現在地に移動
僕はデスクトップに「test」というファイルを作り、
「index.html」
「style.scssが入ったsassファイル」

の２つをVSCodeで作成しました。
<img width="540" alt="スクリーンショット 2020-07-22 16.16.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/c9d30c49-06d2-2ba1-cade-2e5008d11651.png">
<img width="340" alt="スクリーンショット 2020-07-22 16.17.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/07fa92cc-e3d1-d48e-a2a6-ebe099b05346.png">

### ②ターミナルを開いてpackage.jsonを作成
npm コマンドで必要なパッケージをインストールしましょう。
"cd"でディレクトリを移動させたあとに以下のコマンドを叩いてください。

```
$npm init -y
```
すると、package.jsonというファイルがindex.htmlらと同じ階層に生成されています
<img width="340" alt="スクリーンショット 2020-07-22 17.07.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/fa85f47c-44e7-7898-3609-f40679aa4649.png">

<a id="ancho5"></a>
## 5.gulpとgulp-sassをローカル環境にインストール
package.jsonを作成したら、gulpのパッケージをnpmコマンドによってインストールさせてあげましょう。
### ①まずは、開発用に使うgulpパッケージをインストール

pacage.jsonに変化が出るので、package.jsonを開いておきます。
<img width="560" alt="スクリーンショット 2020-07-22 17.21.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/67a1ab44-7338-6409-b420-a473dac17c38.png">

そして、以下のコマンドを叩きます。

```
$npm install -D gulp
```
package.jsonに変化が出ました。

<img width="526" alt="スクリーンショット 2020-07-22 17.26.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/52273fab-6bec-2fe7-8c5e-da29e7d6b46c.png">

```
"devDependencies":{
 "gulp": "^4.0.2"
}
```
↑という項目が追加されたのが分かるでしょうか？
### ②続いて、gulp-sassをインストール
以下のコマンドも同様に叩きます

```
$npm install -D gulp-sass
```
<img width="545" alt="スクリーンショット 2020-07-22 17.27.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/a1d8e36a-cee3-651f-ad40-d8699cf9d3a5.png">
今度はgulp-sassという表示が増えましたね

```
 "gulp-sass": "^4.1.0"
}
```
これでgulpとgulp-sassのローカルインストールが終了しました。

<a id="ancho6"></a>
## 6.node_modulesとpackage-lock.jsonを作成
5でローカルにgulpとgulp-sassをインストールすると、「node_modules」と「package-lock.json」が自動的に生成されています。
<img width="340" alt="スクリーンショット 2020-07-22 18.13.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/7d4ad49b-8e89-27ea-ef56-ea67e2f13ef7.png">

<a id="ancho7"></a>
## 7.gulpfile.jsをpackage.jsonと同じ階層に作成（自作）
それでは、さいごにgulpfile.jsを作成していきましょう。
package.jsonと同じ階層に、
<img width="263" alt="スクリーンショット 2020-07-22 18.17.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/00a1ae0d-88a1-233a-96ee-60bb3b495299.png">
gulpfile.jsを作成します。
<img width="268" alt="スクリーンショット 2020-07-22 18.18.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/7d89c8a5-c9ec-423d-b3dc-a5b94f7db1c1.png">
gulpfile.jsの中身を書いていきましょう。

```
"use strict";

var gulp = require("gulp");
var sass = require("gulp-sass");

sass.compiler = require("node-sass");

gulp.task("sass", function () {
  return gulp
    .src("./sass/**/*.scss")
    .pipe(sass().on("error", sass.logError))
    .pipe(sass({ outputStyle: "expanded" }))
    .pipe(gulp.dest("./css"));
});

gulp.task("sass:watch", function () {
  gulp.watch("./sass/**/*.scss", gulp.task("sass"));
});
```
こちらがデフォルトになります。ですが、次々にgulpのタスクを追加することもできますのでこちらの記事を参考にしてください。
[【覚えるべき技５選】Web制作者のためのSassの教科書【備忘録】](https://wayasblog.com/sass-textbook/)

<img width="669" alt="スクリーンショット 2020-07-22 18.52.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/24821422-e3bf-e0f6-f7d4-d29569d71c15.png">


はい、gulpfile.jsの作成が終わりました。
<a id="ancho8"></a>
## 8.Sassをコンパイル
これで準備は一通りおしまいです！
それでは実際にSassを記述してみて、ちゃんとCSSにコンパイルのか確認してみましょう。
使うコマンドは

```
gulp sass:watch
```
"watch"をつけると、ファイルの更新を監視してくれる。つまり、Sassファイルが更新されると自動的にコンパイルしてくれます。
watchを終了させるには、Ctrl + Cで停止します。

まず、Sassで記述してみます。Sassの書き方は以前書いたこの記事を参考に・・・
[Sassについて最低限知っておきたい５つの基本機能](https://qiita.com/daichiada/items/5ebb51f31bb78ab1079f)
<img width="545" alt="スクリーンショット 2020-07-22 19.02.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/49b3e8a8-929a-b7c1-ac39-45aafb4e24a9.png">
ここで"gulp sass:watch"をターミナルで叩きます。
すると、CSSというファイルが新しくできていて⬇
<img width="503" alt="スクリーンショット 2020-07-22 19.01.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/20ac1718-50c4-f9ef-2638-d6b5cabb8af8.png">
style.cssにうまくコンパイルされています
<img width="1373" alt="スクリーンショット 2020-07-22 19.07.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672896/9b4e8f4f-bd3a-b474-7728-b52fe751e17a.png">


お疲れさまでした！

## [追記]　カスタムされたgulpfile.jsの作成
セクション７では、デフォルトのgulpfile.jsを作成しましたが、Sassの他の機能を使うためにはカスタマイズが必要です。

まずは、パッケージをインストールします。

```
$ npm install gulp gulp-sass gulp-sass-glob gulp-sourcemaps gulp-plumber gulp-notify gulp-postcss autoprefixer css-declaration-sorter css-mqpacker -D
```
gulpfile.jsを以下のように記述します。

```
var gulp = require('gulp');
var sass = require('gulp-sass');
var sassGlob = require('gulp-sass-glob');
var plumber = require('gulp-plumber');
var notify = require("gulp-notify");
var postcss = require('gulp-postcss');
var autoprefixer = require('autoprefixer');
var cssdeclsort = require('css-declaration-sorter');
var mqpacker = require('css-mqpacker');
var browserSync  = require('browser-sync');

gulp.task('sass', function() {
  return gulp.src('./sass/**/*.scss')
    .pipe(plumber({errorHandler: notify.onError("Error:<%= error.message %>")}))
    .pipe(sassGlob())
    .pipe(sass({outputStyle: 'expanded'}))
    .pipe(postcss([mqpacker()]))
    .pipe(postcss([cssdeclsort({order: 'alphabetical'})]))
    .pipe(postcss([autoprefixer()]))
    .pipe(gulp.dest('./css'));
});

gulp.task( 'default', function() {
    gulp.watch( './sass/**/*.scss', gulp.task('sass')); 
});
```
ここでは"gulp sass:watch"ではなく、"gulp" のみで自動コンパイルを行ってくれます。

以上です。