Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vite 側でテンプレート HTML を生成する #10894

Open
acid-chicken opened this issue May 25, 2023 · 34 comments
Open

Vite 側でテンプレート HTML を生成する #10894

acid-chicken opened this issue May 25, 2023 · 34 comments
Labels
✨Feature This adds/improves/enhances a feature

Comments

@acid-chicken
Copy link
Member

acid-chicken commented May 25, 2023

Summary

@acid-chicken acid-chicken added the ✨Feature This adds/improves/enhances a feature label May 25, 2023
@EbiseLutica
Copy link
Contributor

メタタグのSSRはどう埋め込む方針かしら

@tamaina
Copy link
Contributor

tamaina commented Jul 31, 2023

https://ja.vitejs.dev/guide/ssr.html これ?

@tamaina
Copy link
Contributor

tamaina commented Jul 31, 2023

メタタグのSSRは出来なさそうなのでpugは残るな

@acid-chicken
Copy link
Member Author

実際の細かな手法については色々手探りで吟味することになると思うけど、メタタグについてはなんとかなる予定

@tamaina
Copy link
Contributor

tamaina commented Jul 31, 2023

(htmlタグの中身全部描画すればいいのか)

@acid-chicken
Copy link
Member Author

Vite に HTML の生成を任せると、そのページに必要なバンドルを載せられる構造基盤ができるので、そこからメタタグの注入であったり、(最初に目指すべき目標の範疇外だが)コンポーネントを SSR 可能にしてサーバー側で HTML を焼けるようにできる。どのみちスタート地点としてここを通るだろうという話。

@acid-chicken
Copy link
Member Author

実際に SSR することを見越すならば Vue を Node.js 上で動かす構造などが予想される

@acid-chicken
Copy link
Member Author

https://ja.vuejs.org/guide/scaling-up/ssr.html から読み始めていただくとイメージ掴みやすいかも

@tamaina
Copy link
Contributor

tamaina commented Jul 31, 2023

(htmlタグの中身全部描画すればいいのか)

流石にこれは無理そうだったけど対応しないかしら

@tamaina
Copy link
Contributor

tamaina commented Jul 31, 2023

あ、できるかも

@tamaina
Copy link
Contributor

tamaina commented Jul 31, 2023

(Viteは大したことしてないのか

@acid-chicken
Copy link
Member Author

  • Vite にはテンプレート HTML すなわちアプリケーションがマウントされるより外側を生成させたい
    • ここからメタタグ程度ならなんとかなる
  • そのテンプレート HTML に対してアプリケーションを SSR すると内側も書けるよね
    • これは色々やることが多いのですぐにはできない

@tamaina
Copy link
Contributor

tamaina commented Jul 31, 2023

https://vscode.dev/github/vitejs/vite-plugin-vue/playground/ssr-vue/server.js あたりを参照するとかなり単純に見えて、htmlタグからvueとして書けるかもしれない

@tamaina
Copy link
Contributor

tamaina commented Jul 31, 2023

(そういえばこんなところにいい感じのモックがあったので明日はこれを改造するか)

https://github.com/misskey-dev/client-build-mock

@tamaina
Copy link
Contributor

tamaina commented Jul 31, 2023

@tamaina
Copy link
Contributor

tamaina commented Aug 1, 2023

  • サーバーではhtmlからレンダーして、クライアントではbody内の普通のマウントポイントにマウントする
  • サーバーではプリロードの計算をするためにアプリのレンダーを2回行う

みたいなヤバい実装で今の所落ち着いている

https://github.com/misskey-dev/client-build-mock/tree/ssr

@fruitriin
Copy link
Contributor

https://github.com/misskey-dev/misskey/compare/develop...fruitriin:feat/launch-standalone-frontend?expand=1

宛先間違えたかも
#9411

途中で飽きたけど一応Frontend単体で動いてます
スクリーンショット 2023-11-19 14 18 48

テーマの取得がうまくかない
言語の取得がうまくいかない
(niraxから値が取得できてない? config.ts が期待通り動いてない?)
など問題は多いですけど
OGP・検索用には前段でbackendにプロクシして返すなどすれば
TitleタグはVueからいじったらそのまま反映されるので
manifest.jsonはどうしようかな……

続きやりたい人いればどうぞ

@fruitriin
Copy link
Contributor

fruitriin#1

進捗してます

スクリーンショット 2023-11-19 20 39 10

@tamaina
Copy link
Contributor

tamaina commented Nov 19, 2023

OGP・検索用には前段でbackendにプロクシして返すなどすれば

ちょっとこの方針は微妙かも…

@acid-chicken
Copy link
Member Author

standalone frontend はそもそも Storybook がそれそのもの(ルーティングの概念がないだけで)

@fruitriin
Copy link
Contributor

検索はともかくogpはJSをパースしないのでSSR的なアプローチが必要

逆に言えば、OGP以外でSSRが必要な要素はブラウザ的にはないとおもうんだけどどの辺が微妙?

@fruitriin
Copy link
Contributor

SPAなアプリケーションをSSRにするのは移植が死ぬほど大変なのでおすすめしない

@tamaina
Copy link
Contributor

tamaina commented Nov 19, 2023

SSRにしたいよね的な雰囲気があったんだけどこのIssueじゃなくて #11428 だったわね

@tamaina
Copy link
Contributor

tamaina commented Nov 19, 2023

どんなに大変な移植でもしゅいろが1週間でやってくれるので問題ない

@tamaina
Copy link
Contributor

tamaina commented Dec 6, 2023

@fruitriin 的にはこのIssueは「本番環境でフロントエンドのコードをバックエンドを介さずに返したい」という解釈になるらしいけど、私はむしろ #11428 も考えながらバックエンド側へViteを結合させていく方針だと思っているんだけど (少なくとも @acid-chicken の意見はそれで間違いなさそう)

@acid-chicken
Copy link
Member Author

Yes

@fruitriin
Copy link
Contributor

Nuxt等のSSRに移行すると、「ユーザーの状態とサーバーの状態を持った状態でレンダリングに至るまでの全てのステートを計算した上で仮想DOMを構築してHTMLをレンダリングする」という処理を「全ユーザーの全リクエストごとに」「サーバーで」行う必要があります。
これはパフォーマンス上サーバー管理人である私個人的には容認したくありません。

SSRしたいという意図は大きく分けて2つあり、一つはOGP用です。こちらはOGPのタグのみが必要であり、HTMLのBODYは必要ありません。
つまりこの要件を満たす最小の実装でも目的を果たすことができます。

もう一つはそれ以外のBODYを保存または解析する必要があるリクエストの応答です。
これは果たしてメインのユースケースでしょうか?
副次的な作用として、サーバーでHTMLが構築された状態でユーザーのデバイスに届ければデバイスでスクリプト実行を待たずにページが表示することができるので、ファーストビューが速いという作用があります。
(一時期これがフロントエンドの未来だ!的な感じで持て囃されましたが、ユーザーのデバイスで処理される部分とサーバー内で処理する部分で分岐させる必要があって運用が辛いか、私が世間から切り離されているかのいずれかだと思います)

飽きた

@tamaina
Copy link
Contributor

tamaina commented Dec 6, 2023

ファーストビューを速くしたいというのは動機として大きかったと記憶している

サーバーの負荷が増大するのは私も懸念するところ

(とはいえViteで受けてバックエンドへプロキシするのもそれはそれでオーバーヘッドが増える懸念があるけど、これは計測が必要そう)

@fruitriin
Copy link
Contributor

Viteでプロクシするアプローチは開発用のもので、Viteのdev serverは本番用ではありません
省きますが前段にnginxかapatchが必要です(urlのrewiteがないとルーティングできません)

@acid-chicken
Copy link
Member Author

Nuxt等のSSRに移行すると、「ユーザーの状態とサーバーの状態を持った状態でレンダリングに至るまでの全てのステートを計算した上で仮想DOMを構築してHTMLをレンダリングする」という処理を「全ユーザーの全リクエストごとに」「サーバーで」行う必要があります。

うーん、少なくとも私が考えているのは

  • 初回レンダーされるルートによって必要なアセットは違う
    • スクリプトやスタイルが nirax で遅延ロードされるよりは先にサーバーサイドで決定しておいてくれたほうが嬉しいし、それってビルド時に決定すれば静的に実現できるよね
  • どうせ <script> とかを事前に決定するんだったらいわゆる OGP 向けのプレースホルダーも置けるよね

程度にしか考えていないし、もし仮にフロントエンドの初回ロードをサーバーサイドに持ってきたとてページ遷移ごとに SSR することを想定したつもりはなく、そのようなことを書いた覚えもない

@acid-chicken
Copy link
Member Author

おそらく動的に持ち込むか静的に持ち込むかで解釈が剥離したんだと思うけど、少なくとも意図している方はタイトルに書いています

@fruitriin
Copy link
Contributor

Storybookでいいじゃんルーティングないけど
という話はルーティングできないと開発がつらくないのですか……?

@fruitriin
Copy link
Contributor

もし仮にフロントエンドの初回ロードをサーバーサイドに持ってきたとてページ遷移ごとに SSR することを想定したつもりはなく、そのようなことを書いた覚えもない

SSRしてページ遷移するときはサーバーに問い合わせるのはAPIだけなので都度SSRされるわけではありませんね

@fruitriin
Copy link
Contributor

いやもうなんでもいいです
好きにして

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨Feature This adds/improves/enhances a feature
Projects
None yet
Development

No branches or pull requests

4 participants