Visual Studio CodeでGulpを実行してTypeScriptとSASSをコンパイルする方法
この記事では、Visual Studio Code でGulpを実行してTypeScriptとSASSをコンパイルし、ブラウザでプレビューする方法を記載します。
-
- Gulpとは?
- 環境
- フォルダ構成
- 手順
- Appendix
- 問題発生時の対処法
- エラー「Error in plugin “gulp-sass”」が発生する
- エラー「Error: Cannot find module ‘XXX’」が発生する
- エラー「Error: Invalid dest() folder argument. Please specify a non-empty string or a function.」
- エラー「Did you forget to signal async completion?」
- エラー「Error: watching ./dist/**/*.html: watch task has to be a function (optionally generated by using gulp.parallel or gulp.series)」
- エラー「AssertionError [ERR_ASSERTION]: Task function must be specified」
- エクスプローラーの右クリックメニューに[Codeで開く]が表示されない
- Appendix
Gulpとは?
Gulpはタスクランナーです。タスクランナーはあらかじめタスクを定義しておくことで、以下のような機能を自動実行することができます。
- SassやTypeScriptのコンパイル
- トランスパイル
- 静的解析(Lint)
- コードの圧縮(Minify)、難読化
- ライブプレビュー
- など
環境
- Visual Studio Code
- Node.js
フォルダ構成
フォルダ構成は以下のような構成を想定しています。
project
├─dist
│ ├─css
│ └─js
└─src
├─scss
└─ts
srcフォルダはSassやTypeScriptのソースコードを格納します。これらをGulpでビルド(コンパイル)して、Sassからcssを、TypeScriptからJavaScriptを生成していきます。
手順
任意の場所にエクスプローラーでproject
フォルダを作成するproject
フォルダを作成します。Visual Studio Codeで
エクスプローラーでproject
フォルダを開くproject
フォルダを右クリックし、[Codeで開く]を選択します。プロジェクトを初期化する
Visual Studio Codeでターミナルを開き(Ctrl+Shift+@)、以下のコマンドを実行します。npm init -y
npm init
を実行するとpackage.jsonとpackage-lock.jsonが作られます。npm init
のようにオプションなしで実行すると、対話モードになってプロジェクト名など入力を促されます。ここでは、対話モードでの入力が面倒なので、-y
をつけてデフォルトの情報でpackage.jsonを作成します。Gulpをインストールする
以下のコマンドを実行してGulpをインストールします。npm i gulp -D
-D
は開発環境でのみインストールするパッケージで指定します。Gulpは基本的にコンパイルなどのビルドタスクの実行に必要なだけで、デプロイ先では不要なので-D
を指定します。
反対に実行時つまりデプロイ先で必要なパッケージのインストールの場合は、-D
はつけません。gulpの関連プラグインをインストールする
Gulpは実行するタスクに応じて必要な関連プラグインをインストールすることで動作します。ここでは、Sass->CSSとTypeScript->JavaScriptへのコンパイル、ライブプレビューを実行したいので、以下のコマンドを実行します。
Gulpのプラグインについては、本記事の最後に一覧を記載しています。そちらを参照して必要なプラグインをインストールしてください。npm i gulp-notify -D npm i gulp-plumber -D npm i gulp-sass -D npm i sass -D npm i gulp-autoprefixer -D npm i gulp-uglify -D npm i browser-sync -D
また、npm install
を実行するとnmpはpackage.jsonにインストールしたパッケージを記録します。これによりnmp install
を実行することで、開発(または実行)に必要なパッケージをインストールできます。gulpfile.jsを作成する
projectフォルダ直下に以下の内容でgulpfile.js
を作成します。gulpfile.jsには実行したいタスクの定義を記載します。// モジュールの読み込み var gulp = require('gulp'); var notify = require("gulp-notify"); var plumber = require("gulp-plumber"); var sass = require('gulp-sass')(require('sass')); var typescript = require('gulp-typescript'); var autoprefixer = require('gulp-autoprefixer'); var uglify = require('gulp-uglify'); var browserSync = require("browser-sync"); // パスの設定 var paths = { 'html' : './dist/', 'css' : './dist/css/', 'js' : './dist/js/', 'ts' : './src/ts/', 'scss' : './src/scss/', } // Sass -> CSS var sassOptions = { outputStyle: 'compressed' } gulp.task('sass', () => { return gulp.src(paths.scss + '**/*.scss') .pipe(plumber({ errorHandler: notify.onError("Error: <%= error.message %>") })) .pipe(sass(sassOptions)) .pipe(gulp.dest(path.css)); }); // TypeScript -> JavaScript -> Minify gulp.task('ts', () => { return gulp.src(paths.ts + '**/*.ts') .pipe(plumber()) .pipe(typescript()) .pipe(uglify()) .pipe(gulp.dest(paths.js)); }); // browser-sync gulp.task('browser-sync', () => { browserSync({ server: { baseDir: paths.html } }); gulp.watch(paths.html + "**/*.html", gulp.task('reload')); gulp.watch(paths.css + "**/*.css", gulp.task('reload')); gulp.watch(paths.js + "**/*.js", gulp.task('reload')); }); gulp.task('reload', () => { browserSync.reload(); }); // watch gulp.task('watch', function () { gulp.watch(paths.scss + '**/*.scss', gulp.task('scss')); gulp.watch(paths.ts + '**/*.ts', gulp.task('ts')); }); gulp.task('default', gulp.series(gulp.parallel('browser-sync', 'watch'), function(){ }));
ソースコードを編集する
project\src\ts
フォルダにTypeScript、project\src\scss
フォルダにSassのソースコードを作成します。ここではテストのために以下のようなソースを作成します。Gulpを実行する
実行するgulpfile.jsに記載したタスクが実行されます。エラーなく完了すれば、distフォルダにコンパイルされたファイルが出力されます。npx gulp
完了
Appendix
よく使うGulpプラグイン
よく使うGulpプラグインを記載します。
プラグイン | 概要 |
---|---|
gulp-notify | Gulpのエラーを通知する |
gulp-plumber | Gulpのエラーが発生してもプロセス終了せずに続行する |
gulp-sass | Sassを使えるようにする |
sass | Sassコンパイラ |
gulp-autoprefixer | CSSに自動でプレフィックスを入れる |
gulp-uglify | JavaScriptを圧縮/難読化する |
browser-sync | ライブプレビューをする |
問題発生時の対処法
Gulpを使っているといろいろなエラーが発生します。ここでは、これまでに遭遇したエラーの解消方法を紹介します。
エラー「Error in plugin “gulp-sass”」が発生する
Error in plugin "gulp-sass"
Message:
gulp-sass 5 does not have a default Sass compiler; please set one yourself.
Both the `sass` and `node-sass` packages are permitted.
For example, in your gulpfile:
var sass = require('gulp-sass')(require('sass'));
Sassコンパイラがインストールされていないことが原因です。gulp-sass 5
ではデフォルトのSassコンパイラを持っていないため、sass
モジュールを別途インストールする必要があります。下記コマンドを実行してインストールすると解決します。
npm install sass -D
エラー「Error: Cannot find module ‘XXX’」が発生する
Error: Cannot find module 'sass'
モジュールがインストールされていないことが原因です。上記ではsass
モジュールがインストールされていないため、以下のコマンドを入力してsass
モジュールをインストールすることで解決します。
npm install sass -D
エラー「Error: Invalid dest() folder argument. Please specify a non-empty string or a function.」
dest()で指定しているパスが間違っています。
エラー「Did you forget to signal async completion?」
このメッセージが表示されても、出力ファイルは問題なく生成されていますが、Gulpタスクの完了を示す「Finished ‘ts’ after 2.1 s」が表示されません。
これは、gulp.task()のコールバック関数が結果を返していないことが原因です。下記では、コールバック関数でreturnしていません。そのため、タスクの完了を検知できていないためと考えられます。
gulp.task('ts', function () {
gulp.src(paths.ts + '**/*.ts')
.pipe(typescript())
.pipe(plumber())
.pipe(uglify())
.pipe(gulp.dest(paths.js));
});
↓ returnで結果を返すようにすると解決します。
gulp.task('ts', () => {
return gulp.src(paths.ts + '**/*.ts')
.pipe(typescript())
.pipe(plumber())
.pipe(uglify())
.pipe(gulp.dest(paths.js));
});
エラー「Error: watching ./dist/**/*.html: watch task has to be a function (optionally generated by using gulp.parallel or gulp.series)」
Gulp3からGulp4になった際に、gulp.watch()の引数の指定方法が変わりました。
gulp.watch(paths.ts + '**/*.ts', ['ts']);
↓ 以下に変更すると解消します。
gulp.watch(paths.ts + '**/*.ts', gulp.task('ts'));
エラー「AssertionError [ERR_ASSERTION]: Task function must be specified」
Gulp3 -> Gulp4でgulp.taskの引数の指定方法が変更になったことが原因です。
gulp.task('default', ['browser-sync', 'watch']);
↓
gulp.task('default', gulp.series(gulp.parallel('browser-sync', 'watch'), function(){
}));
エクスプローラーの右クリックメニューに[Codeで開く]が表示されない
本題からそれますが、エクスプローラーの右クリックメニューに[Codeで開く]が表示されない場合は、Visual Studio Codeを更新インストールを実行します。(インストール前にアンインストールは不要です)
インストーラーの以下の画面で2つのチェックボックスをオンにしてインストールすれば[Codeで開く]が表示されるようになります。
- エクスプローラーのファイルコンテキストメニューに[Codeで開く]アクションを追加する
- エクスプローラーのディレクトリコンテキストメニューに[Codeで開く]アクションを追加する
Appendix
Gulpプラグインのブラックリスト
使ってはいけないプラグインの一覧です。インストール前に確認しましょう。
最後まで読んでいただきありがとうございます。
また読んでくださいませ。
そんじゃーね。