vue-loader, sass-loaderを通してnode-sass-asset-functionsを利用する【Vue】
概要
vue-loader, sass-loaderを通してnode-sass-asset-functionsを利用する方法です
node-sass-asset-functions
compassで提供されていたimage-url
やimage-width
といった関数をnode-sassで利用できるようにするためのモジュールです
sass-loaderでnode-sass-asset-functionsを利用する
sass-loaderのREADMEのとおり options -> sassOptions -> functions に指定すれば利用できます
rules: [ { use: 'sass-loader', options: { sassOptions: { functions: require('node-sass-asset-functions') } } } ]
vue-loader v14までの落とし穴
vue-loaderを通して利用するとなるとvueのoptions -> loaders -> scssに先ほどと同じようなローダーの設定を書けば動くはず…なんですがv14では実は動きません
rules: [ { use: 'vue-loader', options: { loaders: { scss: [ { use: 'vue-style-loader' }, { use: 'css-loader' }, { use: 'sass-loader', options: { sassOptions: { functions: require('node-sass-asset-functions') // これだと動かない } } } ] } } } ]
vue-loaderのoptionsで設定したローダーのoptionsはシリアライズ可能なものでなければいけないからです
You can also use object or array syntax (note the options must be serializable):
参考: Options Reference · vue-loader
vue-laoder v15の落とし穴
v15になるとローダーの設定方法が変わり、vue-loaderのoptionsに書いていたのがmodule -> rulesの直下に書いたものが使われるようになり、シリアライズ不可能だったものもoptionsで渡せるようになります
v15 also allows using non-serializable options for loaders, which was not possible in previous versions.
参考: Migrating from v14 | Vue Loader
のはずが、実はwebpack v3だとうまくFunctionが渡りません 😇
(詳しい理由は調べきれてませんがresourceQueryを見る限りではv14のときと同じようにFunctionだけ空Object扱いになります)
ですので、vue-loader v15, webpack v4を使うことで晴れてnode-sass-asset-functionsを導入できます