Nuxt.jsでEmojiをfaviconに設定する
適当なサイトを作るとき、サイト自体のレイアウトやインタラクションはコンポーネントライブラリやCSSフレームワークがあって開発者一人でも割と迷いなく作業を進められたりする。
最近自分はVueを触ることが多いので、前者だと vuetify、後者だと、tailwindcssを使ったりしている。
折角公開するなら、主要なmetaタグは一通り設定しておきたいと思い、最終的にどうするか迷うのがfaviconだったりする。
何も指定しないよりは、適当なEmojiを指定しておいたほうが見た目が映えるだろうとうのがことの発端。
faviconにはSVGが使える
faviconを用意するとき、適当な.png画像を.icoに機械的に変換していたが、Chromeだと80以降ではsvg画像をfaviconとして指定できるらしい。
faviconにEmojiを指定する
「favicon emoji」とかでググると以下のツイートが出てくる。
このツイートがそのまんま答えで、faviconにSVGを指定できることを利用してインラインのSVGにEmojiを埋め込むことで、faviconにEmojiを表示させることができるとのこと。
Now that all modern browsers support SVG favicons, here's how to turn any emoji into a favicon.svg:
— Lea Verou (@LeaVerou) March 22, 2020
<svg xmlns="https://t.co/TJalgdayix" viewBox="0 0 100 100">
<text y=".9em" font-size="90">💩</text>
</svg>
Useful for quick apps when you can't be bothered to design a favicon! pic.twitter.com/S2F8IQXaZU
Nuxt.jsのfaviconを固定でEmojiにする
NuxtはSSRの場合、文字列結合で、SPAの場合 vue-meta
を使って、head内のmetaタグを構築するようになっている。
どちらにせよ、nuxtConfigのhead内にmetaタグやlinkタグに関する設定を記述してあげれば良い。今回のfaviconの設定も例にもれず、head.link
に書けば良い。
この例では、共通の設定になっているが、ページごとに指定したい場合には同様に、pageの head
に設定すればよさそう。
create-nuxt-app
で作成した直後のプロジェクトでは以下のようになっているはず
const nuxtConfig: NuxtConfig = { head: { // 略 link: [ { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' } ] }, // 略 }
それを、こんな感じで使いたいEmojiを含むSVGをインラインで指定する
const nuxtConfig: NuxtConfig = { head: { // 略 link: [ { rel: 'icon', type: 'image/x-icon', href: 'data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🎉</text></svg>' } ] }, // 略 }
Nuxt.jsのfaviconを動的にEmojiにする
runtimeで切り替えるのもページからmetaの操作がきでれば特に特別なことはない。
以下に例のgistを貼った。この例では、 composition-apiを使っていて、useMetaでmetaの操作をしている。