1
/
5

RubyKaigi 2023 参加記 #11 - Load gem from browser (Day 3)

Photo by Ante Hamersmit on Unsplash

こんにちは!WantedlyのEngagementで開発している、エンジニアの渡邉(@eityans)です。

私達は今、長野の松本で開催されている RubyKaigi2023 に参加しています。早いものでもう3日目ですね!現地の状況を皆さんにお伝えしたく、メンバーと共にたくさんブログを書いているので見てください!

本記事では、3日目の講演である、 Load gem from browser の内容を紹介します!

Load gem from browser
WebAssembly is now supported in Ruby 3.2. Now you can run Ruby scripts in the browser. When you run Ruby scripts in the browser, you expect to be able to use many gems available at RubyGems.org. Currently, only the standard gems are available.
https://rubykaigi.org/2023/presentations/ledsun.html#day3

本講演はruby.wasmでサードパーティ製の gem を呼ぶための取り組みに関する話です。発表者はラグザイアの中島 滋 (@ledsun) さんです。

wasm でサードパーティ製gemを使いたい動作するバイナリ形式のコードで、ブラウザ上での実行が可能です。プレゼンテーションの始めで、@ledsun さんはパズルゲーム "Wordle" を解くためのアプリケーションを紹介していました。発表後に久しぶりに Wordle で遊んでしまいました。

https://wordle-search.onrender.com/

wasm でサードパーティ製 gem を使いたい

次に、@ledsun さんは wasm で Ruby の gem を利用する方法について話しました。現時点で、 Ruby の標準 gem は問題なく利用することができます。しかし、サードパーティ製の gem は現状では利用できません。その理由は、ruby.wasm のファイルシステムには読み取り専用の制限があるためです。

この制限を突破するために、@ledsun さんは JavaScript の歴史を参考にしたとのことです。歴史から考えられるアプローチとして、「予め bundle するアプローチ」と、「import-maps のように、実行時に必要な gem を探し出すアプローチ」の選択肢があり、このうち後者の方針を選択したとのことです。その理由として、「スクリプト言語らしさを維持していきたい」や、「バンドリングのチューニングにエンジニアの注意が行ってほしくない」という思いが語られておりました。

require_relative で gem を呼び出す

import-maps の方針でサードパーティ製の gem を呼び出すために、@ledsun さんは wasm で require_relative で gem を呼び出す仕組みを実装している最中であると説明していました。require_relative を使った gem の呼び出しが実現できれば、import-maps 相当のものを用意することでサードパーティ製の gem を呼び出すことができるという算段です。

発表では require_relative の実装の概要と難しさが語られていました。ファイルの読み込みは fetch が使われますが、これは Promise を返すため、それを Ruby で扱うために Fiber を使って実装したとのことです。スタックサイズが小さいという問題から、今呼び出している Ruby ファイルの位置を覚えておかないと行けなかったりと、実装の難易度が伺えました。

発表では、 wasm 上で呼び出す Ruby ファイルから別のRuby ファイルを require_relative を利用して呼び出すデモが紹介されていました。デモを見て、もうすぐ実現できるのでは...?と期待していましたが、いくつか課題が残っているようです。現時点では、require_relative で呼び出した Ruby ファイルから別の Ruby ファイルを require_relative するとうまく動かない問題があるようです。現時点では再帰的な require_relative ができない状況ではありますが、デモを見て、wasm でサードパーティ製 gem を呼び出すための準備が進んでいることを実感し、ワクワクしております。

サードパーティ製の gem が呼べるようになった後の世界

上記のような require_relative の実装が wasm で行われ、import-map のような仕組みができると、サードパーティ製の gem を呼び出すことができます。@ledsunさんはその後の世界のイメージを話してくれました。

まず、UNpkgのような仕組みの gem 版が必要になりそうです。これは、npm リポジトリで公開されているパッケージを CDN で取得する URL を返してくれる仕組みで、これの gem 版を用意することで gem をインストールしなくても様々な gem が使える世界になるだろうと語っていました。

「Ruby のプログラミングをもっと楽しくしていきたい」

発表の最後に、@ledsunさんの思いが語られます。Ruby でのブラウザのプログラミングを、JS と同じぐらい簡単にしていきたいと語っていました。Ruby のプログラミングをもっと楽しくしていき、wasm を通して一人でも多くの人にRuby の楽しさが伝わると良いなと語っていました。

感想

wasm は個人的に気になっている技術です。発表でサードパーティ製の gem が使えるようになるまでの道筋が語られていて、話を聞いていてワクワクしました!早く使えるようになっていじってみたいですね!

Invitation from Wantedly, Inc.
If this story triggered your interest, have a chat with the team?
Wantedly, Inc.'s job postings
2 Likes
2 Likes

Weekly ranking

Show other rankings
Like Eitaro Watanabe's Story
Let Eitaro Watanabe's company know you're interested in their content