You probably don't need a single-page app | Hacker News

via You probably don't need a single-page app | Hacker News

自分も手元に SPA の悪口を書いた draft があるのだが、世間での hate が高まっているところに加えて言うこともないかなと思う。

なお自分は不満は開発者としてではなくユーザとしてのものである。すなわち世のウェブ製品や内製のツールが SPA になったとたん URL が壊れるなど激しくゴミ化する現象が観測され、気に入らないという話。出来の悪いコードというのはいつの世にもあるのだけれど、内製ツールという観点だとダメージの現れ方が厳しいと思う。

この話は長々書いても悪口にしかならないのでやめとこう。

それよりは、出来の悪い SPA はなぜ生まれるのかを考えて見る方がいい気がする。個人的には Web というプラットホームが十分な基盤を提供してないせいだと思う。JS フレームワークの未熟さみたいのはそのうち解決するだろうから。

SPA は、伝統的なウェブにあった URL 単位の "画面" という単位が希薄になりがちである。その昔, URL はユーザにとっては文脈を特定するコンパクトな表現であり、同時にウェブアプリにとっては serving というわかりやすい抽象化の単位であった。つまり URL のわかりやすさはユーザにとっても開発者にとってもある程度有り難みがあった。

ところが SPA になると開発者にとっての URL は単なる負担になる。画面という抽象化の単位に自動的に URL がつかなくなるから。なのでサボって腐ることが増える。ウェブやブラウザという patform は、ウェブプログラマに良い URL をデザインする incentive を用意しないといけない。そうしないとサボられてしまう。

素人の意見としては TurboLinks みたいのをもうちょっと洗練させて標準にすればよいのではないかと思う。つまり、JS のコードやある種のサイトグローバルなデータはインメモリに残しつつ、ページ単位のデータを新しい URL のもとに取得しなおす。ある意味では JS フレームワークの router みたいなもんだが、それを何らかの形でブラウザが提供し、それは JS だけだと実現できない何らかの有り難みがあるとよい。

完全に口から出まかせを続けると、そのためには API から serve される JSON が一級市民にならないといけない。もっというと "JSON のレンダリング" みたいな概念が一級市民として必要に思える。20 年くらい前は XSLT がそれだったわけで、XSLT は概ね失敗したのでたぶん普通にやると失敗するからもっとうまくやらねばならず、自明でないデザイン上の難さがある。Service Worker からもう三歩くらい進めばなんとかならない?だめ?

URL がぶっこわれていてリンクも scrape もできない dashboard  や CRUD UI は心底うんざり。そういうのを作ったやつが悪いのは確かだが、ウェブがしゃきっとしないから治安が悪くなったのも事実だと思うのだよね。


Android だと Activity がプラットホーム提供の画面単位の抽象化単位として機能している。Activity をすっとばした SPA 的アプローチも一瞬流行りかけたが、今のところ主流にはなっていない。React Native にやられてしまうかもしれないけれど。

ウェブも Android も React にやられかけているというのは興味深い現象であることよ。