Skip to content

TypeError: this.getOptions is not a function の解決方法

問題

Webpack を使用したプロジェクト(特に Vue CLI 4 など)で CSS プリプロセッサ(Sass/SCSS、Less)を利用している際に、次のエラーが発生することがあります:

Syntax Error: TypeError: this.getOptions is not a function

このエラーはビルドプロセス中に発生し、通常は次のようなスタックトレースを伴います:

@ ./node_modules/vue-style-loader??ref--8-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!./node_modules/vue-loader-v16/dist/stylePostLoader.js!./node_modules/postcss-loader/src??ref--8-oneOf-1-2!./node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader-v16/dist??ref--0-1!./src/App.vue?vue&type=style&index=0&id=7ba5bd90&lang=scss 4:14-419 14:3-18:5 15:22-427

原因

このエラーの主な原因は、ローダーのバージョン互換性の問題です。特に:

  • sass-loader v11.0.0 以降と less-loader v8.0.0 以降は Webpack 5 以降を必要とします
  • Vue CLI 4 や古いプロジェクトでは Webpack 4 が使用されている場合が多く、互換性の問題が発生します
  • 各種ローダー(css-loaderstyle-loaderpostcss-loaderなど)もWebpackのメジャーバージョンに依存しています

解決方法

方法1: ローダーのバージョンダウングレード(推奨)

もっとも確実な解決方法は、使用しているローダーをWebpack 4と互換性のあるバージョンにダウングレードすることです。

bash
# Sassを使用する場合
npm install -D sass-loader@^10 sass

# Lessを使用する場合  
npm install -D less-loader@^7 less
bash
# Sassを使用する場合
yarn add -D sass-loader@^10 sass

# Lessを使用する場合
yarn add -D less-loader@^7 less

方法2: 他の互換性のあるローダーバージョン

場合によっては、他のローダーも調整が必要です:

json
{
  "devDependencies": {
    "css-loader": "^5.1.1",
    "style-loader": "^2.0.0",
    "postcss-loader": "^4.2.0",
    "sass-loader": "^10.1.1",
    "sass": "^1.32.6",
    "webpack": "^4.46.0"
  }
}

WARNING

複数のローダーを調整する場合は、必ず互換性のあるバージョンの組み合わせを選択してください。各ローダーのドキュメントでWebpack 4対応バージョンを確認しましょう。

方法3: 完全な再インストール

パッケージのインストール状態が不安定な場合、node_modulesを完全に削除して再インストールすると解決することがあります:

bash
# node_modulesとpackage-lock.jsonを削除
rm -rf node_modules package-lock.json

# 再インストール
npm install

方法4: node-sassからdart-sassへの移行

node-sassで問題が発生する場合、よりメンテナンスが活発なdart-sassに移行することも有効です:

bash
npm uninstall node-sass
npm install sass sass-loader@^10
bash
yarn remove node-sass
yarn add sass sass-loader@^10

根本的な解決:Webpack 5へのアップグレード

長期的な解決策として、プロジェクトをWebpack 5にアップグレードすることも検討してください。ただし、これは大規模な変更を伴う可能性があるため、十分なテストが必要です。

Vueプロジェクトの場合:

  • Vue CLI 5はWebpack 5を採用しています
  • 既存のVue CLI 4プロジェクトをアップグレードする場合は、公式マイグレーションガイドを参照してください

バージョン互換性一覧

ローダーWebpack 4対応バージョンWebpack 5対応バージョン
sass-loader^10.x^11.x
less-loader^7.x^8.x
css-loader^5.x^6.x
style-loader^2.x^3.x
postcss-loader^4.x^5.x

まとめ

TypeError: this.getOptions is not a function エラーは、主にローダーとWebpackのバージョン不一致によって発生します。現在Webpack 4を使用している場合は、ローダーを互換性のあるバージョンにダウングレードすることで解決できます。

TIP

プロジェクトのpackage.jsonでローダーのバージョンを固定し、予期しないアップグレードを防ぐことをおすすめします(例:"sass-loader": "10.1.1")。

このエラーに遭遇した場合、まず使用しているWebpackのバージョンを確認し、それに合ったローダーバージョンを選択することでスムーズに問題を解決できるでしょう。