言語ごとにバンドルを生成する
Summary
https://github.com/misskey-dev/misskey/pull/14448#issuecomment-2298779498
Purpose
https://github.com/misskey-dev/misskey/pull/14448#issuecomment-2298779498
Do you want to implement this feature yourself?
- [ ] Yes, I will implement this by myself and send a pull request
(ビルド時間すごそう)
それぞれ独立だと思うので並列でやればある程度解消しそう
- 工夫すれば共通部分のビルドは一回だけで済むようにできる可能性がある
- マルチコアを活用してビルドできればそこまでビルド時間は伸びなさそう
- production build時だけそのようにすれば開発体験への影響は抑えられそう
- productionについてもユーザー側でビルドしなくても良いようにする(dockerであれば既にそうなっている)
バージョンアップ時など、言語リソースの更新が必要となった場合にリソースを取り直す仕組みも必要そうです (json単独でfetchしてたけど、今度はフロントエンド全体になる…?)
言語データをプレーンなJavaScriptオブジェクトにするだけにするのならJSONにしてパースさせたほうがパフォーマンスがいいらしい
https://www.youtube.com/watch?v=ff4fgQxPaO0
バージョンアップ時など、言語リソースの更新が必要となった場合にリソースを取り直す仕組みも必要そうです (json単独でfetchしてたけど、今度はフロントエンド全体になる…?)
バンドルに含まれるのでそういう仕組みは不要になる(それが目的)
ViteでVueのテキスト部分をハードコードする感じに書き換えながらバンドルするみたいな感じだと思ってたけど
工夫すれば共通部分のビルドは一回だけで済むようにできる可能性がある
だからそういうわけでもないのか(工夫のしようなさそう)
ViteでVueのテキスト部分をハードコードする感じに書き換えながらバンドルするみたいな感じだと思ってたけど
i18nはVueに限ったことではないからなぁ
(工夫のしようなさそう)
rollupをいじくりまわせば不可能ではない気がする
Vite/rollupでビルドしてから(ないしは1つのファイルのビルドで言語ごとのファイルを生やす感じで)テキストを置き換えたバージョンを作るとかなのかしら. (マルチスレッドとか言ってるからビルド作業する前に一旦全部のファイルのテキストを置き換えるみたいな感じを想像してた
v-forとかの中で i18n.ts._permissions[permission] みたいな呼び方してる場合どうするのか気になる
<template>
<div v-for="permission in permissions">{{ i18n.ts._permissions[permission] }}</div>
</template>
<script setup lang="ts">
import { permissions } from 'misskey-js';
import { i18n } from '@/i18n.js';
</script>
それはインライン化は無理だわね
それはインライン化は無理だわね
こういうのに出会ったらどっちにしろ言語jsonみたいなものを呼び出す必要があるということ?
それはインライン化は無理だわね
こういうのに出会ったらどっちにしろ言語jsonみたいなものを呼び出す必要があるということ?
まあこの構造になっている部分を全面的に改修してなくすというのもあるけど(いけるか?)
それはインライン化は無理だわね
こういうのに出会ったらどっちにしろ言語jsonみたいなものを呼び出す必要があるということ?
そう
インライン化(事前コンパイル)は副次的な効果であって主目的ではない
Viteが高速化してきた(し今後より高速化していく可能性は高い)から仮にビルドが今より遅くなったとしてもそこまで致命的ではなさそう
極力i18n.tsへの参照をインライン展開して、インライン展開できなかったとこだけを残してjsにバンドルするようにすれば結果的に翻訳データがcode-splittingされたことになり、翻訳データが必要になるまで読み込まれなくなり無駄が減るメリットもある (https://github.com/misskey-dev/misskey/issues/14453#issuecomment-2306068001 のような動的なi18nへの参照は廃止)
インライン展開は後々やるとしてとりあえず言語ごとにバンドルを生成したい
viteで複数のバンドルを生成する方法の情報がない webpackだと簡単にできたんだけど
5年前のものだけどある程度実装の参考になりそう https://www.npmjs.com/package/@nicholasperetti/rollup-plugin-i18n
ヌァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァンンンンオオオオンンオンオンオンオンンンンンンンンン゛ン゛!!!!!!!!!!!!!!!!
焦眉の急
やる必要がある
?locale=とかで実装ってできるのかなぁって今ちょっと考えて(実装施行)いる。
?lang= で別ファイルとして扱うこと自体はできそうでした。ビルド時間が 600s に伸びたので、(上の議論にもあったように)いい感じに並列化する必要性はありそうでした。
https://github.com/anatawa12/misskey/tree/188b08b19b59e2ae9aadb708604286c023d99741 https://github.com/anatawa12/misskey/tree/per-locale-bundle
WIPですがPRにしました #16369