omochi / swift-react

Scratch React implementation on Swift for Wasm
MIT License
29 stars 0 forks source link

JavaScript層のクロス化の検討 #5

Closed omochi closed 8 months ago

omochi commented 8 months ago

wasm on browserターゲットにおいて使うライブラリにしたいが、 xcode on mac環境でもテストなどは実行したい

JavaScriptKitはmacでコンパイルできるが実行できない https://discord.com/channels/291054398077927425/383442648012423179/1223317659693744289

このあたりの設計の検討

参考: Tokamakは VStack などのシンボルがターゲットによって 全く異なる同名のシンボルに切り替わる。 if canImportでそれを切り替えている。 例えばApple環境では SwiftUI.VStack になる。

このように、同名の別物で切り替える方法と、 抽象化層を陽に実装する方法がある

実際、ワンビルドでクロスターゲットに動かすことはないので、 wasm向けに使いやすいシンプルな構造にしつつクロス対応にしたいので、 そうすると同様な方針がいいだろう。

DOMインターフェースが露出するのはrefやイベントハンドラだが、 ここの型をどうするかの問題はある DOMレイヤーはデカすぎて型付けしきれないし、 構造としてはReact層より下でまず対応するべきだろう

とすると、いったんそこはこのライブラリでは面倒を見ないことにして、 JSValue として通すのが便利そう つまりこのライブラリのインターフェースは JSValue になる

さてmacでは問題が起きるので、 つまるところ必要なのはmac向けのJSKitのshimだ

React層自体も JSValue に見えるDOMインターフェースに対して実装するべきで、 shimは最低限それを対応すれば良い

・・・やっぱりJSValueをラップするDOM層は内部では持っておくか。 で、ユーザー界面でそれを剥がすのがよさそう。

また、実装の作業上は、 JSKitをmacでも使いたい。 shimの実装が正しいか型チェックを両方通したいため。 これは SwiftPM に手を入れてdefineなどをしてスイッチ化しておいて、 開発中に制御できるようにするのがいいだろう。

omochi commented 8 months ago

なんかできてきた

JavaScriptKitMock: JavaScriptKit とソース互換なモジュール JavaScriptKitShim: importの切り替え点 WebMock: JavaScriptKitMock 上に構築されたDOM APIもどき

omochi commented 8 months ago

SRTDOM (旧 DOMModule) を全て JavaScriptKitShim 上で動かすように差し替えて、テストが通った。 まだ試してないけど、これが本物のブラウザ+ JavaScriptKit でも動くはず・・・