Sass の「The legacy JS API is deprecated」警告が Vite や webpack で消えない
The legacy JS API is deprecated は、Sass が旧 API で呼ばれると出る警告だ。
Vite は 6 以降、webpack は sass-loader 16 以降へ上げれば消える。
公開:
要約
vite build や webpack のビルドで、次の警告が出続ける。
Deprecation Warning [legacy-js-api]: 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-apiSass の JavaScript API には、render() / renderSync() の旧 API と、1.45.0 で入った compile() / compileAsync() などの新 API がある。公式の説明(新しいタブで開く)のとおり、旧 API は 1.45.0 の時点で非推奨とされ、1.79.0 から呼ぶたびに警告が出るようになった。
2.0.0 で削除される予定だ。
自分のコードで呼んでいなくても、Vite や sass-loader が旧 API で Sass を呼んでいれば警告は出る。
解決策
1. Vite は api を切り替えるか 6 以降へ上げる
Vite 5.4 以降の 5 系なら、api で新 API に切り替えられる。
// vite.config.js
export default {
css: {
preprocessorOptions: {
scss: { api: "modern-compiler" }, // .sass ファイルなら sass キーにも同じ指定
},
},
};"modern" でも新 API になる。
5.4 より前の Vite にはこの設定が無いので Vite 自体を上げる。
Vite 6 以降は既定で新 API になる。
2. sass-loader を上げる
npm install -D sass-loader@latest sassoptions に api: "legacy" が書いてあれば外す。
旧 API 用の sassOptions(includePaths や outputStyle)は、新 API の名前(loadPaths や style)に直す。
3. 自作スクリプトは新 API に書き換える
const sass = require("sass");
// 旧 API: sass.renderSync({ file: "src/main.scss", includePaths: ["node_modules"], outputStyle: "compressed" })
const result = sass.compile("src/main.scss", {
loadPaths: ["node_modules"],
style: "compressed",
});
console.log(result.css); // 新 API では文字列(旧 API は Buffer)文字列をコンパイルしていた data オプションの呼び出しは sass.compileString() に置き換える。
非同期の render() は、コールバックではなく Promise を返す compileAsync() / compileStringAsync() に置き換える。
4. 移行までの間だけ止める
sass.renderSync({
file: "src/main.scss",
silenceDeprecations: ["legacy-js-api"],
});Vite 5 系なら、css.preprocessorOptions.scss に silenceDeprecations: ["legacy-js-api"] を入れても警告は止まる。
ただし 2.0.0 では旧 API そのものが無くなるので、ツールを更新するまでのつなぎにとどめる。
よくある原因
- Vite 5 系を使っている: Vite 5 は既定で旧 API を使う。
Vite 6 の移行ガイド(新しいタブで開く)にあるとおり、既定が新 API になったのは Vite 6 からで、Vite 7 では旧 API のサポート自体が削除された。 - sass-loader が古い: webpack の sass-loader が新 API を既定にしたのは 16.0.0 から。
15 以前、または設定でapi: "legacy"を指定していると旧 API で呼ばれる。
17.0.0 では旧 API のサポートが削除された。 - 自作スクリプトの
render(): 独自のビルドスクリプトでsass.render()/sass.renderSync()を直接呼んでいる。 - フレームワークやプラグインが古い: Sass を内部で呼ぶツールが旧 API を使う版のままだと、設定では直せない。