Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ruby.wasm + unloosenでChrome拡張機能を作ってみた

Kaito Chika
May 19, 2023
1.3k

ruby.wasm + unloosenでChrome拡張機能を作ってみた

Kaito Chika

May 19, 2023
Tweet

Transcript

  1. © ZOZO, Inc. 株式会社ZOZO
 ブランドソリューション開発本部 バックエンド部 WEARバックエンド
 近 海斗
 •

    2021年4月(株)ZOZOに新卒入社
 ◦ 新卒3年目
 ◦ RubyKaigiは今年で2回目の参加
 ◦ 先月はRailsConfにも参加
 ◦ TwitterID: @Ver3Alt
 
 2
  2. © ZOZO, Inc. https://wear.jp/
 3 • ファッションコーディネートアプリ
 • 1,600万ダウンロード突破、コーディネート投稿総数は1,300万件以上 (2023年3月末時点)


    • ピックアップタグから最新のトレンドをチェック
 • コーディネート着用アイテムを公式サイトで購入可能
 • WEAR公認の人気ユーザーをWEARISTAと認定。モデル・タレント・デザ イナー・インフルエンサーといった各界著名人も参加

  3. © ZOZO, Inc. 今回取り上げるセッション
 • Develop chrome extension with ruby.wasm

    (Day1)
 ◦ ruby.wasm を使った Chrome 拡張機能用の ruby フレームワーク紹介
 ◦ ruby.wasm で簡単に Chrome 拡張機能が作れる
 ◦ フレームワーク名:unloosen
 
 6
  4. © ZOZO, Inc. unloosenのメリット
 • Simple Syntax
 ◦ フレームワークの TopLevel

    に document や alert のエイリアスを読み込んでいるので、それらが簡単 に利用可能
 
 
 
 • Live Reload
 ◦ コードの変更があった際に拡張機能の再読み込みしなくてもよくなった
 • Chrome 拡張機能の実装に必要なファイルの管理が少なくなる
 7
  5. © ZOZO, Inc. 
 • manifest.json という chrome 拡張機能用の設定ファイルで unloosen-ruby-loader

    という起動用スクリプトを指定(スクリ プトは npm install 可能)
 • そのスクリプトにて ruby.wasm と unloosen 本体などを読み 込み
 • あとは、app.rb に作りたい機能を実装していくだけで、 unloosen がいい感じに読み込んで ruby.wasm にて実行さ れる
 
 
 unloosenの仕組み
 8 ref: https://github.com/aaaa777/unloosen
  6. © ZOZO, Inc. 
 • unloosen を使えば、app.rb に処理を記述するだけで ruby にて

    Chrome 拡張機能が作 れる!すごい!
 • ruby.wasm あんまり詳しくないけど、 unloosen を使えば動くものが作れそう!
 
 
 つまり・・・
 9
  7. © ZOZO, Inc. 目次
 1. unloosen のダウンロード
 2. 各種設定ファイルの追加
 3.

    HTML の記述と app.rb の実装
 4. Chrome にアップロード
 5. 完成 🎉
 13
  8. © ZOZO, Inc. 1. unloosen のダウンロード
 2. 各種設定ファイルの追加
 3. HTML

    の記述と app.rb の実装
 4. Chrome にアップロード
 5. 完成 🎉
 目次
 14
  9. © ZOZO, Inc. 1. unloosen のダウンロード
 • unloosen は npm

    パッケージにあるので、以下のように package.json を書いて npm install すればダウンロード可能です
 
 15
  10. © ZOZO, Inc. 目次
 1. unloosen のダウンロード
 2. 各種設定ファイルの追加
 3.

    HTML の記述と app.rb の実装
 4. Chrome にアップロード
 5. 完成 🎉
 17
  11. © ZOZO, Inc. 2. 各種設定ファイルの追加(manifest.json)
 • manifest.json
 ◦ chrome 拡張機能用の設定ファ

    イル
 ◦ content_scripts に unloosen-ruby-loader を渡して います
 ◦ 見辛いと思いますが、本題では ないので割愛...
 18
  12. © ZOZO, Inc. 目次
 1. unloosen のダウンロード
 2. 各種設定ファイルの追加
 3.

    HTML の記述と app.rb の実装
 4. Chrome にアップロード
 5. 完成 🎉
 20
  13. © ZOZO, Inc. 3. app.rbの実装
 次に本題の app.rb を書いていきます。実装する機能としては以下
 • popup.htmlの入力値を受け取り、Chrome

    の local storage に保存する機能
 ◦ content_script 側(ページが読み込まれた時に実行される)
 ▪ local storage の初期化
 ◦ popup 側(popup が開かれた時に実行される)
 ▪ popup が開かれたとき、既に local storage に値がある場合、それを取得してテキストエリアに表示
 ▪ save ボタンが押されたら、local storage にメモを保存する
 23
  14. © ZOZO, Inc. • app.rb
 ◦ unloosen では、content_script, popup を以下のように記述します


    シンプルかつ分かりやすくていいですね
 3. app.rbの実装
 24
  15. © ZOZO, Inc. • 問題のコードは以下
 ◦ ruby 的な感覚で local storage

    メソッドにキーワード引数を渡したところ、早速エラーに
 ◦ どうやら hash はそのまま js メソッドには渡せないらしい
 3. app.rbの実装
 26
  16. © ZOZO, Inc. • ググったところ、右のような形で js object に 変換して渡してあげればいけるとのことで、 Utils

    クラスに変換メソッドを生やし、それを 呼び出すことで解決
 • content_scripts 側の実装は一旦これにて完 了
 3. app.rbの実装
 27 ref: https://qiita.com/tomoasleep/items/3feef6898e849af3600a
  17. © ZOZO, Inc. 3. app.rbの実装
 popup 側の実装(1)
 • 次に、popup 側の実装になります


    • local storage に値があるか確認し、あった場合 は取り出してメモ欄に描写する処理
 ◦ js の undefined は ruby 側だと null という JS::Object に変換される
 ◦ JS::Object は false 判定にならないので注意 が必要
 
 28
  18. © ZOZO, Inc. 3. app.rbの実装
 popup 側の実装(2)
 • popup.html のメモエリアに書いた文字列を

    local storage に保存する処理
 ◦ この辺りはエラーなども起きず、すんなり実 装できました
 
 ここまで来ると js を書いているのか ruby を書いて いるのかわからなくなってきます
 
 29
  19. © ZOZO, Inc. • 完成 🎉
 4. 完成
 31 サンプルコード:

    https://github.com/Alt70155/test-chrome-extension
  20. © ZOZO, Inc. 感想
 良かったところ
 • ruby で js のようなコードを書くという体験がかなり新鮮で面白かった


    • ruby で簡単に Chrome 拡張機能が作れるというのがまず凄い
 • ruby.wasm の入り口としても良さそう
 • (今回はあまり使いこなせなかったが)他にもできることは多そうなので、ドキュメントなどが整備された らもっと色々できそう
 32
  21. © ZOZO, Inc. 課題感
 • エラーが起きたときの原因調査がかなり難しかった
 ◦ null を表す JS::Object

    の挙動や Hash 周り、chrome.runtime.onMessage のエラー、popup で JS.eval が使えない、など・・・
 ◦ ruby.wasm もあまり情報が多くないので、ちょっと外れたことをしようとするとハマる
 ▪ Hash が使えないから js object に変換して回避するなど、裏側の知識がないと難しい
 • js だとこう書くけど ruby だとどうなるんだ、というのがちょくちょくある
 • 標準 gem 以外の便利な gem が使えたらもっと色々できそう
 感想
 33