前回はGulp(ガルプ)のタスク作成について学んでいきました。前回までGulp公式のGetting Startedを読み進めてきましたが内容の濃さにうへぇ~😩となってきましたので、今回は当初の目的である「SASSのコンパイル手作業を自動化するぞ」に立ち返り目的を達成できるよう挑戦したいと思います。
さて、初心者としてはガイドが欲しい訳でが、gulp-sassプラグインを公開しているサイトの説明がとっつき易く(英語ですけど)感じたのでそちらを参考にいたしました。
gulp-sass プラグイン
まずは筆者の環境
- OS: Windows7 (x64)
- Node.js: 10.16
- gulp-cli: 2.2.0
- Gulp: 4.0.2
gulp-sassパッケージをインストール
1行目で前回作成したプロジェクトフォルダに移動し、3行目のコマンドを実行しgulp-sassパッケージをインストールします。–save-dev (もしくは-D)オプションを付けることでローカルインストールを行います。 package.jsonの devDependencies に追記されます。ローカルインストールしたパッケージはプロジェクトフォルダ内に格納されます。
インストールコマンドをよく見てみると、gulp-sass と一緒に node-sass もインストールしているようです。これは必要なんでしょうか?
どうやらgulp-sassでは「Dart Sass」または「Node Sass」のどちらを使用するかオプションで選択できるようで、「Node Sass」がデフォルトで使用されるとあります。
もし「Dart Sass」を使用する場合はそのままではパフォーマンスが劣るので追加パッケージが必要だとも書いてあります。
面倒なのは避けたいので node-sass を一緒に入れておけば問題なさそうです。
cd c:\inetpub\wwwroot\my-project
npm install node-sass gulp-sass --save-dev
・・(途中省略)・・
Binary is fine
npm WARN my-project@1.0.0 No description
npm WARN my-project@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules\fse
vents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@
1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"}
)
+ gulp-sass@4.0.2
+ node-sass@4.12.0
added 118 packages from 124 contributors and audited 7583 packages in 80.336s
found 0 vulnerabilities
インストール中にワーニング(WARN)が出ましたがプロジェクトの説明など省略してるのは承知してるので無視、またWindows環境でサポートされていないパッケージが含まれてるようですが何かしら支障が出たら調べることにしてこのまま対応なしで進めました。
プロジェクトフォルダ内のディレクトリ構成を決めておきましょう。次のようにシンプルな構成にしました。足りないフォルダを追加しておきます。
my-project/
├css/
├images/
├js/
└sass/
gulpfile.js
package.json
さらに動作確認のために適当なscssファイルをsassフォルダに格納しておきます。これがGulpのコマンドでcssファイルになればまずは成功です!
// サンプルSASS
.hoge {
p {
font-weight: bold;
}
}
$fontColor: #333;
h1 {
color: $fontColor;
}
さて、gulp-sassプラグインのページに掲載されているBasic Usageは次のコードになります。タスク名とその内容は次の通りです。
sass | SASSのコンパイル |
---|---|
sass:watch | SASSコンパイルの監視(自動化) |
コードはGulp3までは一般的だったという task() 関数が使用されています。前回学んだ記述方法とは異なりますが、まずはこの通りに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(gulp.dest('./css'));
});
gulp.task('sass:watch', function () {
gulp.watch('./sass/**/*.scss', ['sass']);
});
Gulpのタスクを実行
プロジェクトフォルダでgulpコマンドを実行します。タスク名はsassです。
gulp sass
[16:02:39] Using gulpfile c:\inetpub\wwwroot\my-project\gulpfile.js
[16:02:39] Starting 'sass'...
[16:02:39] Finished 'sass' after 88 ms
タスクが正常終了したみたいですのでcssフォルダにcssファイルが出来ているか確認してみます。cssフォルダ内にstyle.cssファイルが作成されていました。内容も問題ないようです。SASSのコンパイルは成功です。
.hoge p {
font-weight: bold; }
h1 {
color: #333; }
SASSコンパイルの自動化
プロジェクトフォルダでgulpコマンドを実行します。タスク名はsass:watchです。
gulp sass:watch
c:\inetpub\wwwroot\my-project>gulp sass:watch
[16:22:48] Using gulpfile c:\inetpub\wwwroot\my-project\gulpfile.js
[16:22:48] Starting 'sass:watch'...
[16:22:48] 'sass:watch' errored after 9.55 ms
[16:22:48] Error: watching ./sass/**/*.scss: watch task has to be a function (op
tionally generated by using gulp.parallel or gulp.series)
at Gulp.watch (c:\inetpub\wwwroot\my-project\node_modules\gulp\index.js:31:1
1)
at c:\inetpub\wwwroot\my-project\gulpfile.js:15:8
at taskWrapper (c:\inetpub\wwwroot\my-project\node_modules\undertaker\lib\se
t-task.js:13:15)
at bound (domain.js:402:14)
at runBound (domain.js:415:12)
at asyncRunner (c:\inetpub\wwwroot\my-project\node_modules\async-done\index.
js:55:18)
at process._tickCallback (internal/process/next_tick.js:61:11)
実行エラーが出ました😟
gulp.parallel or gulp.series を使いなさい。と怒られているようです。Gulp3と4の非互換なのでしょうか、Gulp初心者にはこういう時の対処法が分からず困ります。調べたところ次のように修正すればよさそうです。
・・(省略)・・
gulp.task('sass:watch', function () {
//gulp.watch('./sass/**/*.scss', ['sass']); // Gulp3
gulp.watch('./sass/**/*.scss', gulp.series('sass'));
});
再びgulpコマンドを実行します。タスク名はsass:watchです。
gulp sass:watch
[16:46:14] Using gulpfile c:\inetpub\wwwroot\my-project\gulpfile.js
[16:46:14] Starting 'sass:watch'...
今度は成功のようです、タスクが実行中(監視中)になったようです。
では早速scssファイルを変更して保存してみましょう。
// サンプルSASS
・・(省略)・・
$fontColor: #ccc; // ← #333 から変更
・・(省略)・・
h1 {
color: #ccc; }
おおっ!リアルタイムにcssファイルが変換されていることが確認できます!繰り返し変更してもしっかりと追いついてきてくれています。
もちろんSASSの記述を間違えているとエラー内容を教えてくれます。
Error in plugin "sass"
Message:
sass\style.scss
Error: Undefined variable: "$gege".
on line 12 of sass/style.scss
>> backgroundcolor: $gege;
-------------------^
監視中のタスクを終了したい場合は「Ctrl + C」で確認が出てくるので「Y」と応えます。
[16:46:14] Starting 'sass:watch'...
[16:46:33] Starting 'sass'...
[16:46:33] Finished 'sass' after 77 ms
[16:46:43] Starting 'sass'...
[16:46:43] Finished 'sass' after 21 ms
[16:56:59] Starting 'sass'...
[16:56:59] Finished 'sass' after 17 ms
^CTerminate batch job (Y/N)? y
おめでとうございます!当初の目的である「SASSのコンパイル手作業を自動化するぞ」が達成できました😃
消化不良なのは実践で使ったコードはGulp3までは一般的だったという task() 関数が使用されていること。前回学んだGulp4から推奨しているエクスポートしてパブリックタスクにして..が全く活かせていません。今後も参考にしたGulp3コードがGulp4では動かない場面に遭遇しそうなので、次回はコードの書き直し方を調べておきたいと思います。