LIFF SDKのプラガブルSDKに実装しているちょっとした型の工夫
こんにちは!LIFF SDKの開発を担当しているodanです。今回のTipsでは、LIFF SDKのプラガブルSDKに実装しているちょっとした型の工夫について紹介します。
プラガブルSDKとは
通常のLIFF SDKはimport liff from "@line/liff"の形でimportします。
このときのliffオブジェクトにはliff.requestFriendshipメソッドやliff.permissionオブジェクトなどが含まれています。これらのメソッドやオブジェクトは必ずしもすべてのLIFFアプリで必要なものではありません。使用されないオブジェクトは余計なバンドルサイズの増加を招いてしまいます。
この問題を解決するのがプラガブルSDKです。プラガブルSDKは必要最小限のメソッドだけを持つliffオブジェクト(以下、LIFF Coreオブジェクト)を提供します。
以下がその使用例です。
必要最小限に含まれないメソッドを使用する例:
プラガブルSDKを使うことで、LIFFアプリのバンドルサイズを削減できます。
LIFF Coreオブジェクトの型の拡張
先ほど紹介した通り、JavaScriptの世界ではLIFF Coreオブジェクトに対してliff.requestFriendshipメソッドを呼び出すとランタイムエラーになります。
この問題を開発者が早期に気付くことができるように、型の世界でもLIFF Coreオブジェクトには必要最小限のメソッドしか定義されていません。
必要最小限の型を拡張するには、各モジュールのパッケージをimportする必要があります。
Declaration Mergingで型を拡張する
さて、パッケージをimportするだけで型エラーが解決するこの仕組みはどう実現されているでしょうか?
TypeScriptにはDeclaration Mergingと呼ばれるテクニックがあり、これを利用しています。簡単に説明すると、同じ名前で定義されたinterfaceの各メンバーはマージされて扱えます。
先ほどのドキュメントでは、以下のサンプルコードが紹介されています。
このテクニックを用いてLIFF Coreオブジェクトの型を拡張しています。実際に@line/liff/request-friendshipの中身を覗いてみましょう。
5行目からのinterfaceの宣言がポイントです。LiffCoreの宣言を書くことで型情報がマージされるようになっています。これによりLIFF Coreオブジェクトを使う場合に、オブジェクトの追加を忘れるというケアレスミスにすぐに気づくことができます。
ちなみにVue.jsのプラグインでも同様の仕組みが採用されています。
まとめ
プラガブルSDKに実装しているちょっとした型の工夫について紹介しました。
Declaration Mergingのおかげで型について安心して利用できるため、バンドルサイズの改善の際にぜひプラガブルSDKをご検討ください。