2
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Vue CLI3にて、vue-svg-loaderとfile-loaderを共存させる。

Last updated at Posted at 2019-06-29

経緯

久々の投稿。
今までfontawesome使ってたけど
デザイナーさんがsvgでアイコンくれたので、vue-svg-loader使ってsvgをコンポーネント化して扱ってみようと思った。
で、調べる。
ほうほう、vue.config.jsにchainWebpackで

module.exports = {
  chainWebpack: (config) => {
    const svgRule = config.module.rule('svg');

    svgRule.uses.clear();

    svgRule
      .use('vue-svg-loader')
      .loader('vue-svg-loader');
  },
};

を追記すれば良いのか。https://vue-svg-loader.js.org/#vue-cli
分かる分かる。意味わかる。おっしゃ。やってみるわ。
がしかし、、既存のコードで読み込めないsvgが出て来ました。今まで読めてたやつが。。。

こんなやつ。scssファイル上のchecked擬似クラスでsvgを読んでる箇所。

input[type=radio] {
  ・・・・
  &:checked {
    background-image: url(/・・・/xxxx.svg);
  }
}

これ書いたん俺?? まーいーや。とりあえず置いといて、、
↑のradioもvue-svg-loaderで認識されるように、修正するか。
いや、それって本末転倒よな、うっざ。どないしよ。。
とりあえずvue-cli3の元々のwebpackの設定とか見てみよ。そして落ち着こ。

##原因を探す
これやな。
./node_modules/@vue/cli-service/lib/config/base.js

 webpackConfig.module
   .rule('svg')
   .test(/\.(svg)(\?.*)?$/)
   .use('file-loader')
   .loader('file-loader')
   .options({
     name: genAssetSubPath('img')
   })

なるほどー、今までsvgはfile-loaderで認識させてたのが、
vue.config.jsで追記した

svgRule.uses.clear();

でリセットされてるのかー、なるほど。じゃ、どないしよ。。。
既存の設定は活かしつつ、vue-svg-loaderも使う方法はないもんか????調べよ。

あったー

faqのところ
https://vue-svg-loader.js.org/faq.html#how-to-use-both-inline-and-external-svgs

webpackとVue CLIとnuxtで分けてあった。

しかしwebpackの設定でoneOfってのがあるのか、
しらなんだ。なるほどー、これ使うと両方のloaderを使えるのか、
よし、vue.config.jsを書き換えよう。
##俺の場合はこうした。

module.exports = {
  chainWebpack: (config) => {
    const svgRule = config.module.rule('svg');
    svgRule.uses.clear();
    svgRule
      .oneOf('external')
      .resourceQuery(/external/)
      .use('file-loader')
      .loader('file-loader')
      .end()
      .end()
      .oneOf('inline')
      .use('vue-svg-loader')
      .loader('vue-svg-loader');
  },
  ・・・・

つまりsvgファイルにexternalクエリがあるものはfile-loaderを使用し、
それ以外はvue-svg-loaderを使用する。

なので、checkedの擬似クラスで読み込んでいるsvgファイルにexternalという名前のクエリをつけた

background-image: url(・・・.svg?external);

これで既存のコードで読み込まれているsvgファイルはそのまま使用出来て、
新しいsvgファイルをvue-svg-loader使ってコンポーネント化出来ました。
まぁexternalという名前じゃなくてもええんやろけど。

とりあえずはこれでいく。
よし、これでいこ。

2
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?