GulpでSass(.scss)をコンパイルしたらDeprecation Warning: The legacy JS API is deprecated and …という警告が出るので対処
前回の更新で、Gulp v5.0.0の関連記事をアップしたところ、思いの外アクセスが多く、「Gulpなんて、オワコンかな…。誰も使っていないかも…」と思っていた私にとって「意外と使っている人いるんだ」という驚きと、お仲間がいることに嬉しささえ感じました。
HTMLのコーディングするくらいであれば、「Sassコンパイル」「画像圧縮」「Javascriptの結合」で事足りるし、Viteも興味あるけども機能が多すぎる(オーバースペック)??で、Gulpに長年お世話になっておりました。
…が、それに水を差すようなできごとが。。。
The legacy JS API is deprecated の警告
最近になって、Gulpを走らせコンパイルすると、以下のような非推奨の警告メッセージが表示されるようになりました。
Deprecation Warning: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0.
More info: https://sass-lang.com/d/legacy-js-api
調べると、以下のようなことらしいです。
この警告メッセージは、Dart Sass が現在使用している「レガシー(旧式)」なJavaScript API(プログラムが提供するインターフェース)が非推奨(Deprecated)であり、Dart Sass 2.0.0 で削除される予定であることを示しています。
もろもろ調べて、パッケージも最新にし、Dart Sassにも移行したわけですが…、どうしても上記の警告メッセージが消えない…!!
…ということで、黙ってもらうことにしました😂
gulpfile.mjs
「gulp-sass」の公式ドキュメントを読んだところ、オプションがsass.sync()
で書けるようですので、そこに警告メッセージを出さない設定を以下のように変更したところ(ハイライトした33〜38行目)、警告メッセージは出なくなりました。
import gulp from 'gulp'; // gulpをインポート
const { series, parallel, src, dest, watch } = gulp; // series, parallel, src, dest, watchがそのまま使えるように
// sass 関連インポート ---------------------------------------------
import * as dartSass from 'sass'; // sassというモジュールをdartSassという名前でインポート
import gulpSass from 'gulp-sass'; // SassファイルをCSSにコンパイルするためのプラグイン
const sass = gulpSass(dartSass); // gulp-sassの関数にsassコンパイラを渡して定数sassを定義
import sassGlob from 'gulp-sass-glob-use-forward' // 複数のSassファイルを一括でインポートできるプラグイン(変更)
import plumber from 'gulp-plumber'; // エラー時、gulpを停止させず、エラーメッセージを表示するプラグイン
import notify from 'gulp-notify'; // エラーをデスクトップ通知
import sourcemaps from 'gulp-sourcemaps'; // ソースマップを作ってくれるプラグイン
// postcss 関連インポート ---------------------------------------------
import postcss from 'gulp-postcss'; // CSSを出力
import autoprefixer from 'autoprefixer'; // 自動でベンダープレフィックスを付ける
// 参照元パス
const srcPath = {
css: './src/sass/**/*.scss',
};
// 出力先パス
const destPath = {
css: './dest/css',
};
// Sassコンパイル
const dartSassCompiler = (done) => {
src(srcPath.css) // コンパイルするSassファイルを指定
.pipe(plumber({errorHandler: notify.onError("Error: <%= error.message %>")})) // エラーになってもgulp自体の停止せず、エラーメッセージを表示
.pipe(sourcemaps.init()) // ソースマップを初期化
.pipe(sassGlob()) // 複数のSassファイルをまとめて一括でインポート
.pipe(
sass.sync({
silenceDeprecations: ['legacy-js-api'], // 警告メッセージを出さない
outputStyle: 'expanded'
}).on('error', sass.logError)
)
.pipe(postcss([autoprefixer()])) // 自動でベンダープレフィックスを付ける
.pipe(sourcemaps.write('./')) // ソースマップを出力する
.pipe(dest(destPath.css)); // 出力先ディレクトリを指定
done(); //done()でタスク完了
};
export { dartSassCompiler };
// ファイル監視
const watchFiles = (done) => {
watch(srcPath.css, dartSassCompiler); // scssファイルの監視 & sassコンパイル
done(); //done()でタスク完了
};
// npx gulpというコマンドで実行
export default series(dartSassCompiler, watchFiles);
それにしても、Gulpの情報は少なくなりましたね…。
The legacy JS API is deprecated…の警告メッセージの件は、Viteの対処法を書いているページにはいっぱい出会ったものの、Gulpについては見つけられませんでした。
なので、どちらも公式ドキュメントの情報からです。
- gulp-sass
-
https://www.npmjs.com/package/gulp-sass
「gulp-sass」の公式ドキュメント。
- Breaking Change: Legacy JS API
-
https://sass-lang.com/documentation/breaking-changes/legacy-js-api/
警告メッセージ内のリンク(対処法)。
ただ、「gulp-sass」がいつこの問題に対応するかも不明なので、私自身は新しい案件に関してはnpm-scriptsで代替していっております。(面倒くさかった…😢)
取り急ぎ、「Gulpは使いたい。でも非推奨の警告メッセージは黙らせたい人」向けの記事になりました。
「gulp-sass」の今後について(追記)
根本的な解決には至っていないこの記事を書いた後、下記ページを見つけました。(※2024年11月13日)
Migrate to use the new Sass JS API by default #846
その中のChangelog.mdを見ると、「gulp-sass」は次期バージョンアップ(v6)で、デフォルトで新しい Sass JS APIを使用するように変更予定で、準備が進められているようでした。
良かったーーー!🙌
**Change**
Migrate to use the [new Sass JS API](https://sass-lang.com/documentation/js-api/modules#compile) internally by default
*変更**
デフォルトで [新しい Sass JS API](https://sass-lang.com/documentation/js-api/modules#compile) を内部的に使用するように移行します