LoginSignup
5
5

More than 5 years have passed since last update.

Riot.js にSVGをloaderで喰わせる方法

Last updated at Posted at 2016-07-08

良い感じのloaderがなかった

Reactで組んでいたときは何も考えずに react-svg-loader を使ってたんだけど、Riot.jsでも同じ事をしたくて、npmで探したんだけど良きものが無かった。小一時間悩んだけど、解決したのでメモ書き。loaderのお話なのでもちろんwebpackです。あとbabel。

結論 svg-inline-loader を使った

webpack.configにこの svg-inline-loader 追加して、こう指定してやればエスケープされていないSVGが入る。かんたんね。

raw-svg-logo.tag
import svg from 'logo.svg'

<raw-svg-logo>
  this.root.innerHTML = svg
</raw-svg-logo>

React でいう dangerouslySetInnerHTML

これに相当するディレクティブがRiot.jsにはないんだけれども、公式では以下の方法が解説されていて、要するにこれと同じ扱いがSVGでも出来たという訳です。

Riotのテンプレート変数は、HTML形式を含まないテキストのみ表示可能です。しかし、そのためのカスタムタグを作成することはできます。例えば、このようなタグを定義しておけば、他のタグの中から利用することができます。

raw.tag
<raw>
  <span></span>
  this.root.innerHTML = opts.content
</raw>
my-tag.tag
<my-tag>
  <p>Here is some raw content: <raw content="{ html }"/> </p>
  this.html = 'Hello, <strong>world!</strong>'
</my-tag>

余談だけど、上の指定だとコンソールでソース見た時に、タグ要素に文字列がガッツリ入っていて、見た目が悪い。少量のテキストならあまり気にならないけど、ブログの記事とかをぶっこみたい場合はかなり辛い。そんな時は以下の様にObjectで優しく包み込んであげれば問題ない。

raw.tag
<raw>
  <span></span>
  this.root.innerHTML = opts.content.html
</raw>
my-tag.tag
<my-tag>
  <p>Here is some raw content: <raw content="{ content }"/> </p>
  this.content = { html: 'Hello, <strong>world!</strong>' }
</my-tag>
5
5
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
5
5