gulp-sass を使っていて、ある日突然こんな警告が表示されたことはありませんか?
Terminal
Deprecation Warning: import sass from 'sass' is deprecated.
Please use import * as sass from 'sass' instead.
Deprecation Warning [legacy-js-api]: The legacy JS API is deprecated
and will be removed in Dart Sass 2.0.0.
この警告は Dart Sass の API 仕様変更に伴うもので、gulp-sass の古いバージョンを使い続けている場合に発生します。放置するとビルドが失敗する可能性があるため、早めの対処が必要です。
この記事では、エラーの原因から gulp-sass のアップグレード方法、gulpfile.js の修正例、さらに PostCSS連携や代替ツールへの移行まで、実務で必要な知識を網羅的に解説します。
エラーの原因:Dart Sass の API 変更
このエラーが表示される原因は、主に2つあります。
1. Legacy JS API の非推奨化
Dart Sass 1.x 系では、従来の render() / renderSync() による Legacy API が使われていました。しかし、Dart Sass チームはこの API を非推奨(deprecated)とし、新しい Modern API(compile() / compileAsync())への移行を推奨しています。
| 項目 |
Legacy API(旧) |
Modern API(新) |
| インポート方法 |
import sass from 'sass' |
import * as sass from 'sass' |
| コンパイル関数 |
sass.render() / renderSync() |
sass.compile() / compileAsync() |
| パフォーマンス |
低速(互換レイヤー経由) |
高速(ネイティブ) |
| 将来性 |
Dart Sass 2.0 で削除予定 |
長期サポート |
2. gulp-sass のバージョンが古い
gulp-sass v5 以前では、内部的に Legacy API を使用しています。そのため Dart Sass 1.79.0 以降と組み合わせると、非推奨警告が表示されます。
警告が出る組み合わせ
gulp-sass v5 以前 + sass(Dart Sass)1.79.0 以降
gulpfile.js で sass(require('sass')) の形式を使用
node-sass から sass(Dart Sass)に移行した直後
現在のバージョンを確認する
まず、使用中のパッケージのバージョンを確認しましょう。
Terminal
# gulp-sass のバージョン確認
npm list gulp-sass
# sass(Dart Sass)のバージョン確認
npm list sass
# すべての関連パッケージを一覧表示
npm list gulp gulp-sass sass
実行結果の例
project@1.0.0
├── gulp@4.0.2
├── gulp-sass@5.1.0 ← v5(Legacy API を使用)
└── sass@1.83.0 ← 1.79以降(非推奨警告あり)
gulp-sass が v5 以前で、sass が 1.79.0 以降の場合、この警告が発生します。
解決方法1:gulp-sass v6 にアップグレード(推奨)
最も確実な解決方法は、gulp-sass を v6 以降にアップグレードすることです。v6 からは Modern API がデフォルトで使用されます。
手順1:パッケージのアップグレード
Terminal
# gulp-sass と sass を最新版にアップグレード
npm install gulp-sass@latest sass@latest --save-dev
# インストール後にバージョン確認
npm list gulp-sass sass
手順2:gulpfile.js の修正
gulp-sass v6 では、コンパイラの指定方法が変更されています。
Before(v5 以前の書き方)
gulpfile.js(修正前)
const gulp = require('gulp');
const sass = require('gulp-sass')(require('sass'));
gulp.task('sass', function() {
return gulp.src('./src/scss/**/*.scss')
.pipe(sass().on('error', sass.logError))
.pipe(gulp.dest('./dist/css'));
});
After(v6 以降の書き方)
gulpfile.js(修正後)
const gulp = require('gulp');
const gulpSass = require('gulp-sass');
const sassCompiler = require('sass');
// コンパイラを明示的に指定
const sass = gulpSass(sassCompiler);
gulp.task('sass', function() {
return gulp.src('./src/scss/**/*.scss')
.pipe(sass({
api: 'modern-compiler' // Modern API を使用
}).on('error', sass.logError))
.pipe(gulp.dest('./dist/css'));
});
ポイント:api: 'modern-compiler' を指定することで、Modern API が使用され、非推奨警告が解消されます。api: 'modern' も使用可能ですが、modern-compiler の方がパフォーマンスに優れています。
ES Modules(ESM)で書く場合
package.json に "type": "module" を指定している場合や、gulpfile.mjs を使っている場合の書き方です。
gulpfile.mjs(ESM版)
import gulp from 'gulp';
import gulpSass from 'gulp-sass';
import * as sassCompiler from 'sass';
const sass = gulpSass(sassCompiler);
export function styles() {
return gulp.src('./src/scss/**/*.scss')
.pipe(sass({
api: 'modern-compiler'
}).on('error', sass.logError))
.pipe(gulp.dest('./dist/css'));
}
注意:ESM では import sass from 'sass' ではなく import * as sassCompiler from 'sass' と書く必要があります。デフォルトエクスポートが存在しないためです。
解決方法2:sass オプションで Modern API を指定(v5のまま対処)
gulp-sass v5 のまま対処したい場合は、sassOptions で Legacy API の非推奨警告を抑制できます。ただし、これは一時的な回避策であり、本質的な解決にはなりません。
gulpfile.js(v5での一時対処)
const gulp = require('gulp');
const sass = require('gulp-sass')(require('sass'));
gulp.task('sass', function() {
return gulp.src('./src/scss/**/*.scss')
.pipe(sass({
silenceDeprecations: ['legacy-js-api'] // 警告を抑制
}).on('error', sass.logError))
.pipe(gulp.dest('./dist/css'));
});
注意:silenceDeprecations はあくまで警告の非表示です。Dart Sass 2.0 で Legacy API が完全に削除されると、この方法は動作しなくなります。早めに v6 へのアップグレードを検討してください。
sass(Dart Sass)と node-sass の違い
gulp-sass で使えるコンパイラは、大きく分けて2種類あります。
| 項目 |
sass(Dart Sass) |
node-sass |
| パッケージ名 |
sass |
node-sass |
| 実装言語 |
Dart(JavaScriptにコンパイル) |
C++(LibSass のバインディング) |
| メンテナンス |
活発に開発中 |
非推奨・メンテナンス終了 |
| 新機能対応 |
最新のSass仕様を即座にサポート |
新機能の追加なし |
| インストール |
純粋なnpmパッケージ(ネイティブビルド不要) |
ネイティブバイナリが必要(Node.jsバージョンに依存) |
| 速度 |
十分高速(v1.70+で大幅改善) |
かつては高速だった |
node-sass から sass への移行
node-sass は公式に非推奨(deprecated)です
- LibSass(node-sassの内部エンジン)もメンテナンス終了済みです
- 新しいSass機能(
@use, @forward, モジュールシステムなど)は sass でのみ使えます
- まだ
node-sass を使っている場合は、速やかに sass に移行しましょう
node-sass から sass への移行手順
Terminal
# node-sass をアンインストール
npm uninstall node-sass
# sass(Dart Sass)をインストール
npm install sass --save-dev
# gulp-sass も最新版に
npm install gulp-sass@latest --save-dev
gulp-sass の設定オプション詳細
gulp-sass v6 で使用できる主なオプションを紹介します。
| オプション |
説明 |
デフォルト値 |
api |
使用するAPI('modern-compiler' / 'modern' / 'legacy') |
'modern-compiler' |
style |
出力スタイル('expanded' / 'compressed') |
'expanded' |
sourceMap |
SourceMapの生成 |
false |
sourceMapIncludeSources |
SourceMapにソースを埋め込む |
false |
loadPaths |
@use / @import の検索パス |
[] |
quietDeps |
依存ファイルの警告を抑制 |
false |
verbose |
詳細なログ出力 |
false |
出力スタイルの違い
expanded(デフォルト)
.container {
display: flex;
justify-content: center;
align-items: center;
}
compressed(本番向け)
.container{display:flex;justify-content:center;align-items:center}
SourceMap の設定
SourceMap を有効にすると、ブラウザのDevToolsで元の .scss ファイルを参照でき、デバッグが容易になります。
gulpfile.js(SourceMap設定)
const gulp = require('gulp');
const gulpSass = require('gulp-sass');
const sassCompiler = require('sass');
const sourcemaps = require('gulp-sourcemaps');
const sass = gulpSass(sassCompiler);
// 開発環境:SourceMap あり + expanded
gulp.task('sass:dev', function() {
return gulp.src('./src/scss/**/*.scss')
.pipe(sourcemaps.init())
.pipe(sass({
api: 'modern-compiler',
sourceMap: true,
sourceMapIncludeSources: true
}).on('error', sass.logError))
.pipe(sourcemaps.write('./maps'))
.pipe(gulp.dest('./dist/css'));
});
// 本番環境:SourceMap なし + compressed
gulp.task('sass:prod', function() {
return gulp.src('./src/scss/**/*.scss')
.pipe(sass({
api: 'modern-compiler',
style: 'compressed'
}).on('error', sass.logError))
.pipe(gulp.dest('./dist/css'));
});
ポイント:開発時は SourceMap + expanded で読みやすいCSSを出力し、本番では compressed で最小化するのがベストプラクティスです。
エラーハンドリングの追加
Sassのコンパイルエラーが発生したときに、gulp.watch が停止しないよう、エラーハンドリングを適切に設定しましょう。
gulpfile.js(エラーハンドリング)
const gulp = require('gulp');
const gulpSass = require('gulp-sass');
const sassCompiler = require('sass');
const notify = require('gulp-notify');
const plumber = require('gulp-plumber');
const sass = gulpSass(sassCompiler);
// エラーハンドラー
const errorHandler = notify.onError({
title: 'Sass Compile Error',
message: 'Error: <%= error.message %>'
});
gulp.task('sass', function() {
return gulp.src('./src/scss/**/*.scss')
.pipe(plumber({ errorHandler }))
.pipe(sass({
api: 'modern-compiler'
}))
.pipe(gulp.dest('./dist/css'));
});
// ファイル監視
gulp.task('watch', function() {
gulp.watch('./src/scss/**/*.scss', gulp.series('sass'));
});
エラーハンドリングのメリット
gulp-plumber:エラー発生時にストリームを中断せず、watchタスクの停止を防止
gulp-notify:デスクトップ通知でエラーを即座に把握
- 開発中のSCSS構文エラーで毎回
gulp watch を再起動する手間がなくなります
gulp-sass + PostCSS(autoprefixer)の連携
実務では Sass のコンパイル後に autoprefixer でベンダープレフィックスを自動付与するのが一般的です。
Terminal(必要なパッケージ)
npm install gulp-postcss autoprefixer cssnano --save-dev
gulpfile.js(Sass + PostCSS 完全版)
const gulp = require('gulp');
const gulpSass = require('gulp-sass');
const sassCompiler = require('sass');
const postcss = require('gulp-postcss');
const autoprefixer = require('autoprefixer');
const cssnano = require('cssnano');
const sourcemaps = require('gulp-sourcemaps');
const gulpIf = require('gulp-if');
const sass = gulpSass(sassCompiler);
const isProd = process.env.NODE_ENV === 'production';
// PostCSS プラグイン
const postcssPlugins = [
autoprefixer(), // ベンダープレフィックス自動付与
...(isProd ? [cssnano()]:[]) // 本番のみ CSS 圧縮
];
gulp.task('styles', function() {
return gulp.src('./src/scss/**/*.scss')
.pipe(gulpIf(!isProd, sourcemaps.init()))
.pipe(sass({
api: 'modern-compiler'
}).on('error', sass.logError))
.pipe(postcss(postcssPlugins))
.pipe(gulpIf(!isProd, sourcemaps.write('./maps')))
.pipe(gulp.dest('./dist/css'));
});
gulp.task('watch', function() {
gulp.watch('./src/scss/**/*.scss', gulp.series('styles'));
});
gulp.task('default', gulp.series('styles', 'watch'));
.browserslistrc の設定
autoprefixer の対象ブラウザは .browserslistrc ファイルで指定します。
.browserslistrc
# 最新2バージョン + シェア1%以上 + サポート中
last 2 versions
> 1%
not dead
代替ツール(Vite, Webpack)への移行検討
gulp は長年フロントエンド開発で使われてきましたが、近年は Vite や Webpack への移行が進んでいます。
| ツール |
Sass対応 |
特徴 |
おすすめ場面 |
| gulp + gulp-sass |
プラグインで対応 |
タスクランナー、柔軟なパイプライン |
既存プロジェクトの保守 |
| Vite |
ビルトイン対応 |
高速HMR、ゼロコンフィグ |
新規プロジェクト、SPA / SSR |
| Webpack |
sass-loader で対応 |
エコシステムが豊富、バンドル最適化 |
大規模アプリケーション |
| Parcel |
自動検出で対応 |
設定ファイル不要 |
小規模・学習用プロジェクト |
Vite での Sass 使用例
Vite では sass パッケージをインストールするだけで、設定不要で Sass を使えます。
Terminal
# Vite プロジェクト作成
npm create vite@latest my-project
# sass をインストールするだけでOK
npm install sass --save-dev
vite.config.js
import { defineConfig } from 'vite';
export default defineConfig({
css: {
preprocessorOptions: {
scss: {
api: 'modern-compiler', // Modern API を使用
additionalData: '@use "src/styles/variables" as *;'
}
}
}
});
ポイント:新規プロジェクトでは Vite の採用をおすすめします。HMR(Hot Module Replacement)が非常に高速で、設定もシンプルです。既存の gulp プロジェクトは無理に移行せず、まず gulp-sass v6 へのアップグレードで対応しましょう。
よくあるエラーと対処法
Error: Cannot find module ‘sass’
sass パッケージがインストールされていない場合に発生します。
Terminal(対処法)
# sass をインストール
npm install sass --save-dev
# node_modules を再構築する場合
rm -rf node_modules package-lock.json
npm install
Error: Node Sass does not yet support your current environment
node-sass が現在の Node.js バージョンと互換性がない場合に発生します。
Terminal(対処法)
# node-sass を削除して sass に置き換え
npm uninstall node-sass
npm install sass --save-dev
ReferenceError: primordials is not defined
Node.js 12 以降で古い gulp 3.x を使用している場合に発生します。
Terminal(対処法)
# gulp を v4 にアップグレード
npm install gulp@4 --save-dev
Error: ‘outputStyle’ is not a valid option for the modern API
Modern API では outputStyle の代わりに style を使います。
修正例
// NG: Legacy API のオプション名
sass({ outputStyle: 'compressed' })
// OK: Modern API のオプション名
sass({ style: 'compressed' })
Error: ‘includePaths’ is not a valid option for the modern API
同様に、includePaths は loadPaths に変更されました。
修正例
// NG: Legacy API のオプション名
sass({ includePaths: ['node_modules'] })
// OK: Modern API のオプション名
sass({ loadPaths: ['node_modules'] })
Legacy API → Modern API のオプション対応表
| Legacy API(旧) |
Modern API(新) |
備考 |
outputStyle |
style |
'expanded' / 'compressed' |
includePaths |
loadPaths |
@use / @import の検索パス |
indentedSyntax |
自動判定 |
拡張子 .sass で自動認識 |
sourceMap(boolean) |
sourceMap(boolean) |
同じ名前だが挙動が微妙に異なる |
render() / renderSync() |
compile() / compileAsync() |
関数名の変更 |
実践的な gulpfile.js テンプレート
最後に、ここまでの内容をすべて盛り込んだ、実務で使えるテンプレートを紹介します。
gulpfile.js(実践テンプレート)
const gulp = require('gulp');
const gulpSass = require('gulp-sass');
const sassCompiler = require('sass');
const postcss = require('gulp-postcss');
const autoprefixer = require('autoprefixer');
const cssnano = require('cssnano');
const sourcemaps = require('gulp-sourcemaps');
const plumber = require('gulp-plumber');
const notify = require('gulp-notify');
const sass = gulpSass(sassCompiler);
// パス設定
const paths = {
src: './src/scss/**/*.scss',
dest: './dist/css'
};
// 開発用タスク
function stylesDev() {
return gulp.src(paths.src)
.pipe(plumber({ errorHandler: notify.onError('Sass Error: <%= error.message %>') }))
.pipe(sourcemaps.init())
.pipe(sass({
api: 'modern-compiler',
sourceMap: true,
sourceMapIncludeSources: true
}).on('error', sass.logError))
.pipe(postcss([autoprefixer()]))
.pipe(sourcemaps.write('./maps'))
.pipe(gulp.dest(paths.dest));
}
// 本番用タスク
function stylesProd() {
return gulp.src(paths.src)
.pipe(sass({
api: 'modern-compiler',
style: 'compressed'
}).on('error', sass.logError))
.pipe(postcss([autoprefixer(), cssnano()]))
.pipe(gulp.dest(paths.dest));
}
// ファイル監視
function watchFiles() {
gulp.watch(paths.src, stylesDev);
}
// タスク登録
exports.dev = gulp.series(stylesDev, watchFiles);
exports.build = stylesProd;
exports.default = exports.dev;
package.json のスクリプト例
{
"scripts": {
"dev": "gulp dev",
"build": "gulp build"
}
}
まとめ
| 対処法 |
方法 |
推奨度 |
| gulp-sass v6 にアップグレード |
npm install gulp-sass@latest + api: 'modern-compiler' |
最も推奨 |
| silenceDeprecations で警告抑制 |
silenceDeprecations: ['legacy-js-api'] |
一時的な回避策 |
| Vite / Webpack に移行 |
ビルドツール自体を刷新 |
新規プロジェクト向け |
import sass from 'sass' is deprecated の警告は、Dart Sass の Legacy API 非推奨化が原因です。最も確実な解決方法は gulp-sass v6 へのアップグレードと api: 'modern-compiler' の指定です。
Dart Sass 2.0 で Legacy API は完全に削除される予定のため、できるだけ早めにModern API への移行を完了しておきましょう。