Vue.jsでFaviconを動的に変更する
はじめに
個人開発している「オンライン・コワーキングスペース - Sushi Work」で、Faviconを動的に変更する機能を追加しました。
機能追加するに至った背景に関しては、noteに書きました。
Zennでは、対応方法について書きます。
Faviconを作成する
まず、Faviconの作成です。自作はできないので、絵文字をFaviconにすることにしました。
そこで便利なのが、favicon.ioというサイトです。既に絵文字がFaviconになっているので、それをダウンロードして使うだけです。.ico
拡張子のファイルだけ使用します。
絵文字は、Twitterが作成しているTwemojiが使用されています。Twemojiは、CC-BY4.0のライセンスなので、使用する場合は、自分のサイトにクレジット表記とリンクを貼る必要があります。
Sushi WorkのAboutページにクレジット表記を追加しています。
Faviconを動的に変更する
ここからVue.js2系が前提の話になります。
Faviconをpublicフォルダに追加
public/favicons/alarm_clock.ico
public/favicons/bell.ico
public/favicons/default.ico
public/favicons/japanese_tea.ico
フォルダ構成に特に決まりはないですが、faviconが複数あるので、faviconsフォルダを新規追加し、そこにファイルを入れました。
index.htmlでFaviconを表示
<link
rel="icon"
type="image/x-icon"
href="<%= BASE_URL %>favicons/default.ico"
/>
Faviconを扱うJSモジュールを作成
export default {
// faviconをdefaultに変更する
updateDefault: function() {
updateFavicon("default.ico");
},
// faviconをAlarmClockに変更する
updateAlarmClock: function() {
updateFavicon("alarm_clock.ico");
},
// faviconをbellに変更する
updateBell: function() {
updateFavicon("bell.ico");
},
// faviconをJapaneseTeaに変更する
updateJapaneseTea: function() {
updateFavicon("japanese_tea.ico");
},
};
function updateFavicon(fileName) {
const link = document.querySelector("link[rel*='icon']");
link.href = process.env.BASE_URL + "favicons/" + fileName;
}
日付処理などView関連(Vueだとtemplate関連?)の処理は、src/helpers/
以下に配置して、どのVueコンポーネントからでも使えるようにしています。
Vueコンポーネントから、faviconHelperを使う
<script>
import faviconHelper from "@/helpers/faviconHelper";
export default {
methods: {
startTimer: function() {
// Faviconを時計に変更
faviconHelper.updateAlarmClock();
},
},
}
</script>
注意点
Safariでは、Faviconが動的に変更できませんでした。Firefox、Chromeでは動作することを確認しました。
終わりに
Sushi Workのように通知が重要になるサービスでは、Faviconの動的変更は、ユーザーへ適切に情報を伝えるのに役に立ちます。
早速、もっとFaviconを目立つようにして欲しいという要望もいただいているので、今後さらに良くしていけたらと思っています。
Discussion