ゆずかまたまうどん

技術, PCゲームレビュー, PCゲームトラブルシュート

vue-loader, sass-loaderを通してnode-sass-asset-functionsを利用する【Vue】

概要

vue-loader, sass-loaderを通してnode-sass-asset-functionsを利用する方法です

node-sass-asset-functions

www.npmjs.com

compassで提供されていたimage-urlimage-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を導入できます