【gulp-sass】import sass from ‘sass’ is deprecated エラーの原因と解決方法

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 APIcompile() / 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.jssass(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-sassv6 以降にアップグレードすることです。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 は長年フロントエンド開発で使われてきましたが、近年は ViteWebpack への移行が進んでいます。

ツール 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

同様に、includePathsloadPaths に変更されました。

修正例
// 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 への移行を完了しておきましょう。