Closed TK11235 closed 2 years ago
多言語翻訳ファイル(ja_jp.yml, ko_kr.yml, etc.)を実行時に動的インポートする機能を追加しました。
ja_jp.yml
ko_kr.yml
bcdice-jsは各ダイスボットを動的インポートする機能を持っていますが、i18n情報については初期ロード時に全ダイスボットのi18n情報を一括で静的インポートする仕様になっています。
この仕様は処理としては問題ないものの、bcdice-jsをwebpack等でバンドルした際に「バンドルサイズが不必要に肥大化する」という課題を生み出します。
例えば、bcdice-jsをwebpackのchunk(jsファイル)として出力した場合、bcdice-js本体のchunkは約4.0MBのjsを生成しますが、その内の約1.5MBはi18nの翻訳文字列データです。 多くの場合、一度に利用するダイスボットは1つのため、1.5MBの翻訳文字列の大部分を不要なデータとして初期ロードしていることになります。
このPRでは、i18n情報を動的インポートすることによって、bcdice-jsをバンドルした際にi18nファイルを個別のchunkとして分割、jsのロードを効率化できるように変更します。
主な変更点は以下の通りです。
lib/i18n/Amadeus.ja_jp.json
i18n_list.json
game_system_list.json
locale
Loader
dynamicImportI18n()
dynamicLoad()
DynamicLoaderやStaticLoaderをそのまま利用する分には互換性に関する影響はない筈です。 テストも問題なくパスします。
DynamicLoader
StaticLoader
しかし、Loaderを継承してカスタムローダーを実装している場合は(若干の)破壊的変更が発生します。 LoaderクラスのdynamicImportI18n()はdynamicImport()の実装に習ってthrow new Error('Not implemented')しているため、Loaderを継承した既存のカスタムローダーは、そのままだとdynamicLoad()実行時にエラーになってしまいます。
dynamicImport()
throw new Error('Not implemented')
後方互換性を考慮する場合、LoaderのdynamicImportI18n()は空実装の方が望ましいかもしれません。
すみません。 コミット内容にミスがありブランチごと作り直したので #53 に再度PRを出しました。
概要
多言語翻訳ファイル(
ja_jp.yml
,ko_kr.yml
, etc.)を実行時に動的インポートする機能を追加しました。目的
bcdice-jsは各ダイスボットを動的インポートする機能を持っていますが、i18n情報については初期ロード時に全ダイスボットのi18n情報を一括で静的インポートする仕様になっています。
この仕様は処理としては問題ないものの、bcdice-jsをwebpack等でバンドルした際に「バンドルサイズが不必要に肥大化する」という課題を生み出します。
例えば、bcdice-jsをwebpackのchunk(jsファイル)として出力した場合、bcdice-js本体のchunkは約4.0MBのjsを生成しますが、その内の約1.5MBはi18nの翻訳文字列データです。 多くの場合、一度に利用するダイスボットは1つのため、1.5MBの翻訳文字列の大部分を不要なデータとして初期ロードしていることになります。
このPRでは、i18n情報を動的インポートすることによって、bcdice-jsをバンドルした際にi18nファイルを個別のchunkとして分割、jsのロードを効率化できるように変更します。
変更内容
主な変更点は以下の通りです。
lib/i18n/Amadeus.ja_jp.json
)i18n_list.json
を生成game_system_list.json
にlocale
キーを追加Loader
クラスにdynamicImportI18n()
を定義Loader
のdynamicLoad()
実行時にダイスボットのi18n情報を動的インポート影響範囲
DynamicLoader
やStaticLoader
をそのまま利用する分には互換性に関する影響はない筈です。 テストも問題なくパスします。しかし、
Loader
を継承してカスタムローダーを実装している場合は(若干の)破壊的変更が発生します。Loader
クラスのdynamicImportI18n()
はdynamicImport()
の実装に習ってthrow new Error('Not implemented')
しているため、Loader
を継承した既存のカスタムローダーは、そのままだとdynamicLoad()
実行時にエラーになってしまいます。後方互換性を考慮する場合、
Loader
のdynamicImportI18n()
は空実装の方が望ましいかもしれません。