経緯
DHHが「オタクくん見てる〜? 今からうちのレポジトリからTypeScriptを剥しま〜す」と宣言したことにより、Web開発者界隈でTypeScriptの是非自体の話になり騒ぎになった*1*2。
その後、野次馬がたくさん集ってきてrevertプルリクエストを立てる人やTypeScript公式リポジトリから全ソースコードを消すプルリクエストを出す*3ようなキッズムーブをする人も出てきた
実際の変更
8617行のTypeScriptがJavaScript化された。(Sloc 便利)
❯ scc src/ ─────────────────────────────────────────────────────────────────────────────── Language Files Lines Blanks Comments Code Complexity ─────────────────────────────────────────────────────────────────────────────── TypeScript 81 10934 2048 269 8617 986 HTML 65 1891 138 2 1751 0 JavaScript 3 170 17 23 130 29 CSS 2 6 0 0 6 0 SVG 1 1 0 0 1 0 TypeScript Typings 1 13 2 1 10 1 ─────────────────────────────────────────────────────────────────────────────── Total 153 13015 2205 295 10515 1016
❯ scc src/ ─────────────────────────────────────────────────────────────────────────────── Language Files Lines Blanks Comments Code Complexity ─────────────────────────────────────────────────────────────────────────────── JavaScript 81 10434 1983 272 8179 752 HTML 65 1891 138 2 1751 0 CSS 2 6 0 0 6 0 SVG 1 1 0 0 1 0 ─────────────────────────────────────────────────────────────────────────────── Total 149 12332 2121 274 9937 752
典型的な変更は型注釈の削除。これを全ファイルに渡って行っている。
- respondsToEventTarget(target: EventTarget | null) { + respondsToEventTarget(target) { const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null return element && element.closest("turbo-frame, html") == this.element }
Turboとは何か
TurboはRailsのviewでSPAを書くための仕組みです。https://turbo.build/とは別。
厳密には「サーバーサイドHTMLテンプレートベースでSPAを書くための仕組み」でRails以外にも適用できるのでGitHubのorgが独立して開発されている。
背景
「静的型付け言語と動的型付け言語はどちらが良いのか」という議論は今までにも各所で行なわれてきた。TypeScriptは静的型付け言語でJavaScriptやRubyは動的型付け言語に分類される。
DHHは(Ruby on Railsの作者だから当然)動的型付け言語の信仰者で、TypeScriptを好んでなくて利点を認めつつもあまり熱心ではないと普段から公言していた。
Rails誕生からの十数年を経て近年は型推論で静的型付けの記述量が軽減されたり、IDEや言語サーバーが賢くなったり、世間のプロジェクトが大規模複雑化してきたりしてもその部分はブレていないようだ。
なのでTurboのレポジトリがTypeScriptだったのも「ライブラリはTypeScriptにするメリットがあるんだろうな」ぐらいに自分は感じていた。
実際、37signalsが作成するRailsアプリケーションのサンプルコードはいつもデフォルトJavaScriptで、彼等のプロダクトのコードもそうなんだろうと思う。
彼にとってTypeScriptが本来なくても充分に機能する複雑な抽象レイヤーという認識だったのかもしれませんね。
あと直接TypeScript書いてたコミッタの人は2021年のCEOブチ切れ事件の時にやめてる
誰に影響があるのか
Turboのコントリビューター
RailsのviewでSPAを書いていてTurbo本体にコントリビュートしたい時にJavaScriptコードで変更をしないといけなくなる人。
一方、RailsのviewでSPAを書いているアプリケーション開発l=Turboユーザー当事者はviewテンプレートと向きあったりwebpackやesbuildを通じたアセット管理をしているだけで、Turboのインターフェイスをコードから直接呼び出すようなことはない。
なのでTurboの中身がJavaScriptになったことでアプリケーション側ではひき続きTypeScriptで書くことができる(と言ってもTurboを使っている時に主に書くのはHTMLとRubyだが)
そもそもRailsのviewを使う機会が近年のチーム開発では減ってきていてそれを指して「Railsはオワコン」とか言われていたりする。
Rails以外でTurboを使えるようにしたい人
Turboを別のフレームワークに提供するためにプラグインを書いて、その時に@hotwired/turboの型定義を参考にする人。
自分の知っている中ではLaravel版があるけど彼等もJavaScriptで書いてる。
Railsエコシステム周りでTypeScriptやっていきたい人
37signals系のライブラリがTypeScriptを剥すのは既定路線で今から覆らなさそうなので、StimulusなどのRailsでかつフロント関係あるやつが全部JS化されて生きづらくなりそう。