bcdice / bcdice-js

BCDice ported package for TypeScript and JavaScript by Opal.
BSD 3-Clause "New" or "Revised" License
22 stars 9 forks source link

i18nの情報を実行時に動的インポートする #53

Closed TK11235 closed 2 years ago

TK11235 commented 2 years ago

概要

多言語翻訳ファイル(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のロードを効率化できるように変更します。

変更内容

主な変更点は以下の通りです。

影響範囲

DynamicLoaderStaticLoaderをそのまま利用する分には互換性に関する影響はない筈です。 テストも問題なくパスします。

しかし、Loaderを継承してカスタムローダーを実装している場合は(若干の)破壊的変更が発生します。 LoaderクラスのdynamicImportI18n()dynamicImport()の実装に習ってthrow new Error('Not implemented')しているため、Loaderを継承した既存のカスタムローダーは、そのままだとdynamicLoad()実行時にエラーになってしまいます。

後方互換性を考慮する場合、LoaderdynamicImportI18n()は空実装の方が望ましいかもしれません。