LWCにおけるレコード取得方法の比較

By | August 3, 2023

前書き

以下の四つを簡単に比較する。

  • LDS基本コンポーネント
  • LDS WireAdapter
  • Apex – wireでの呼び出し
  • Apex – imperativeな呼び出し

LDS(Lightning Data Service)基本コンポーネント

lightning-record-*-formなどを利用するパターン。

pros

  • セキュリティ(UI API):ユーザインターフェース APIを内部的に利用するため、RLS・OLS(inc. FLS)が自動適用される
  • キャッシング(LDS):クライアントサイドのLDSキャッシュの利用により、別コンポーネントが同一レコードにアクセスする際のパフォーマンスが向上

cons

  • 扱えるレコード数(LDS Cmp):基本的に1レコードしか扱えない
  • 柔軟性の欠如(LDS Cmp, UI API):クエリ・ロジック・UIのカスタマイズが必要な場合、別の手段を検討する必要がある

LDS WireAdapter

@wire(getRecord, recordId: string, fields: string[]})
propertyOrFunction
などを利用するパターン。ユーザインターフェース APIをcalloutした結果が、JSのプロパティor 関数にプロビジョニングされる。

pros

  • セキュリティ(UI API):ユーザインターフェース APIを内部的に利用するため、RLS・OLS(inc. FLS)が自動適用される
  • キャッシング(LDS):クライアントサイドのLDSキャッシュの利用により、別コンポーネントが同一レコードにアクセスする際のパフォーマンスが向上
  • 自動再評価(Wire):AdapterConfigとして指定したrecordIdやfieldsに変更があった場合、自動でwire adapterが再評価され、結果がプロパティ/関数にプロビジョニングされる。
  • 一定の柔軟性(Wire):LDS基本コンポーネントと異なり、UIカスタマイズやビジネスロジックのカスタマイズが可能

cons

  • 実行制御の欠如(Wire):@wireデコレータは「connectedCallbackの直前」と「AdapterConfigで指定したプロパティの変更時」に無条件で実行される。そのため、それ以外のタイミングで実行したい場合や評価実行の条件をしたい場合、@wireデコレータとは異なる手段を検討する必要がある
  • サポートオブジェクト(UI API):ユーザインターフェース API でサポートされていないオブジェクト(Todo・行動など)を扱う場合、@wireデコレータとは異なる手段を検討する必要がある
  • 柔軟性の不足(UI API):ユーザインターフェースAPIでサポートされていない操作・複雑なクエリ文・トランザクション操作など@wireデコレータやwireAdapter/LDS関数では対応できない操作がある

Apex – Wireでの呼び出し

@wire(apexMethodName, { apexMethodParams })
propertyOrFunction;
を利用するパターン。Apexをcallした結果が、JSのプロパティor 関数にプロビジョニングされる。

pros

  • 柔軟性(Apex):複雑なクエリやロジックへの対応が可能
  • 自動再評価(Wire):AdapterConfigとして指定したrecordIdやfieldsに変更があった場合、自動でApexが再評価され、結果がプロパティ/関数にプロビジョニングされる。
  • サポートオブジェクト(no UI API):ユーザインターフェース API でサポートされていないオブジェクト(Todo・行動など)を扱うことができる

cons

  • セキュリティの管理(no LDS):OLS(inc. FLS)のチェックが必要な場合、カスタマイズ開発が必要
  • 実行制御の欠如(Wire):@wireデコレータは「connectedCallbackの直前」と「AdapterConfigで指定したプロパティの変更時」に無条件で実行される。そのため、それ以外のタイミングで実行したい場合や評価実行の条件をしたい場合、@wireデコレータとは異なる手段を検討する必要がある

Apex – Imperativeな呼び出し

Apexの呼び出しをwireに依存させず、プログラミング内で明示的に呼び出すパターン(補足:「命令的(imperative)」という言葉はまさにApexメソッドの呼び出しが実装者にとってcontrollableなものであることを意味しており、wireにおいてApexの呼び出しは完全にSF側のwire serviceに任され、実装者の命令の配下にはない)

pros

  • 柔軟性(Apex):複雑なクエリやロジックへの対応が可能
  • 実行制御(no Wire):ConnectedCallback/renderedCallback/(ApexをJSメソッドで包んだ上での)任意のタイミングでの呼び出し
  • サポートオブジェクト(no UI API):ユーザインターフェース API でサポートされていないオブジェクト(Todo・行動など)を扱うことができる

cons

  • 実装コスト(no Wire, no UI API):自由度が高い分、諸々こちらで面倒を見る必要がある