ChatWork Mute Room を Chrome Web Store に公開した
2017/09/19 追記: ChatWork の公式機能としてサポートされたため、拡張を削除しました。
ChatWork の不要なルームをミュートする Chrome 拡張を Chrome Web Store に公開しました。
Slack にはチャンネル毎に未読/既読状態を無視するミュート機能がありますが、それと似たようなものです。 3 年前に野良の拡張として作成し配布していました。
- chocoby/chatwork-mute-room-extension: Chrome extension to mute rooms on ChatWork.
- ChatWork の特定ルームの未読数を非表示にする chatwork-mute-room-extension という Chrome Extension を作った - 暇人じゃない
経緯
ChatWork は未読数をブラウザのタイトルに表示するのですが、「ミュートしたルームを考慮した未読数をタイトルバーに表示する」という個人的にも欲しかった Pull Request が送られてきました。
- Support changing document title by ducfilan · Pull Request #2 · chocoby/chatwork-mute-room-extension
このパッチのおかげで、これまではルーム一覧部分の未読数だけの表示を消していたのですが、未読数がブラウザのタイトルにも反映されるようになりました。
驚きだったのは、このパッチを書いてくれたのがベトナムの方だったことです。 ChatWork は日本以外でも使われていることは知っていましたが、この Chrome 拡張の需要があったのには驚きました。
おかげで、久々に Chrome 拡張に対するモチベーションが上昇しました。
手を入れたところ
この Pull Request をマージして、Chrome にインストールする CRX ファイルを作成したのですが、リリースしたとしてアップデートを手動でインストールしないといけないのはやはり面倒だなと感じました。
また、3 年前に作ったものなので Grunt や古いバージョンの jQuery を使用していたので、この機会に整理して Chrome Web Store に公開することにしました。
CoffeeScript をやめて ES2015 で書き直した
ES2015 で書くのにもだいぶ慣れてきたので CoffeeScript から移行しました。
大した機能は使っていないのですが、let
や const
、アロー関数が使えるだけでも楽になります。
ES2015 をサクッと学ぶには Babel のドキュメントが分かりやすいと思います。
Grunt をやめて Webpack を使った
ES2015 をトランスパイルしたり、後述の Vue.js 2.0 を使用するために Webpack + Babel を導入しました。 特に複雑なことはやっていません。
jQuery を使うのをやめた
jQuery で書いたほうが分かりやすい処理はあるものの、Chrome 以外のブラウザを考慮する必要はないので、 jQuery の依存から脱却する練習も兼ねて Vanilla JS (プレーンな JavaScript) で書き直してみました。
以下のサイトで jQuery で書いていた処理を Vanilla JS で書くにはどうすれば良いのかを調べることができます。
ネタページですが、Vanilla JS が他のライブラリに比べて最速だということが分かります。
Vue.js 2.0 を使ってみた
jQuery の依存を解消したものの、ポップアップ部分のイベントハンドリングや読み込み/保存処理を Vanilla JS で書くのは面倒... と思っていたところに Vue.js 2.0 がリリースされたので使ってみました。
- Vue.js 2.0 が来ました! - vue.js
- Rewrite Popup with Vue.js 2.0 · chocoby/chatwork-mute-room-extension@588bf93
Vue.js を配置して DOM をバインドしてサクッと使えれば良いや、と思っていたのですが、Chrome 拡張の場合 Content Security Policy (CSP) の関係でテンプレートのコンパイラが動きませんでした。
そのため Webpack + vue-loader を使用して CSP を回避しテンプレートをコンパイルできる環境を作りました。
.vue
ファイルを作成することに最初は抵抗があったのですが、考えてみれば React も同じだったのですぐに慣れました。
Webpack + Vue.js 2.0 のコードは公式で開発されているプロジェクトが参考になりました。
- vuejs/vue-hackernews-2.0: HackerNews clone built with Vue 2.0, vue-router & vuex, with server-side rendering
- vuejs-templates/webpack: A full-featured Webpack + vue-loader setup with hot reload, linting, testing & css extraction.
README や Releases を英語で書くようにした
README や CHANGELOG を日本語で書いたのですが、英語で書いておいた方が日本国外の方もコントリビュートしやすいかなと思い、英語で書き直してみました。 他のプロダクトも英語で書くように心がけたいです。
まとめ
Chrome Web Store デビューを果たすことができました。
コードに手を入れずに拡張が動いていたことに驚きました。 良いか悪いかは置いておいて、2013 年のリニューアルから UI があまり変わっていない気がします。
今回は JS の構造をほとんど変えておらず、 Content Script の設計が微妙なままなので手を入れていきたいです。
何より日本国外で拡張を使ってもらえて嬉しかったです。