今年も Salesforce では、一足早い春を Spring ’20 リリースと共に迎えました。

プレリリース期間中のデベロッパーエバンジェリスト達は、素晴らしい最新の機能を活かしたサンプルアプリケーションの作成に大忙しでした。今回は、Github 上の最新のソースコードで、どのような変更はあったのかをご紹介しましょう。

サンプリギャラリーとは?

サンプリギャラリーでは、Salesforce のローコードやプロコードといった開発者向けの機能を確認できるサンプルアプリをまとめて紹介しています。
サンプルアプリはそれぞれ、モバイルアプリ、外部向けウェブアプリケーション、インテグレーションなど、他のアプリや機能と連携する想定で Salesforce プラットフォーム上に実装されています。
これらのサンプルアプリは、レポジトリーへのリンクと一緒にサンプリギャラリーのランディングページで確認できます。



LWC プロパティはデフォルトでリアクティブとなる

Spring ’20 リリースでは、 Lightning Web Components のコア・フレームワークに、デフォルトですべてのプロパティをリアクティブとして扱い、明示的なデコレーターの記述を必要としない機能が追加されましました。
これまでは、LWC で DOM のリフレッシュをトリガーするには @track を使っていましたが、今後は必要なくなります。

LWC Recipes の todoList コンポーネントのコードから、LWC の書き方がどう変わったのか確認してみましよう。

今までは、filteredTodos リストプロパティを @track で修飾する必要がありました。

「すべてのプロパティはリアクティブ」という新しい仕様では、このように記述する必要はないはずです。
しかし、例外があることにもご注意ください。

リスト内の要素やオブジェクト型のプロパティの変更を監視するには、これまで通り @track デコレータを記述する必要があります。つまり、それらのプロパティへの変更操作をトリガーとして DOM をリフレッシュさせるには、 これで通り @track で修飾されている必要があるということです。

Javascript のリストやオブジェクトの操作とその挙動の理解は簡単とは言えません。
そこでサンプルアプリの実装では、オブジェクトやリスト内の要素への変更操作を行う代わりに、常にプロパティへの再代入を行うという手法に統一しています。
これにより、上の filteredTodos の例でも @track を記述する必要がなくなりました。

filterTodos() 関数では、高階関数である Array.prototype.filter() を使って _todo リストから優先すべき todo のみを取得しています。
filter 関数は常に新しいインスタンスを返すのため、this.filteredTodos にも常に新しい参照が代入されることになり、結果として暗黙的なリアクティブプロパティとしての機能を利用できます。

しかし、すべての高階関数が新しいインスタンスを返すわけではありません。Array.prototype.sort() などはリスト内の要素を操作します。
そのような場合は、明示的にリストのコピーを作成し代入を行う事、 @track を記述せずに DOM のリフレッシュを実現することをおすすめします。

さらに詳しいリアクティブデータの取り扱いについては、LWC open source project のドキュメントをご参照ください。

デスクトップとモバイルの Lightning ページ

Spring ’20 のリリース以前、Lightning ページをモバイルで表示するのは容易なことではありませんでした。
これからは、デスクトップやモバイルで表示できる Lightning ページを作成できます。
標準で利用できるテンプレートが用意されていますが、独自のテンプレートを作成することもできるにようになりました。

独自の Lightning ページテンプレートについては、Dreamhouse app でご確認頂けます。

カスタムページレイアウトは Aura で作成します。上のマークアップでは、テンプレートがデスクトップ用のレイアウトで表示するかモバイル用のレイアウトで表示するかを、ブラウザによって提供される情報を元に判断しているのがわかります。

今回、コンポーネントが Small フォームファクターでも動作するように再設計しています。
コンポーネント自体をレスポンシブに対応させるのはもちろんですが、そのコンポーネントが何のフォームファクターをサポートしているかを決定するためにメタデータファイルへの修正も必要でした。

最後に、いくつかのレコード詳細ページの設定を変更しモバイルに対応させることで、モバイルでもデスクトップでも表示できるページの完成です。

Experience Bundle

コミュニティでの開発に携わっている開発者の皆様に朗報です。コミュニティ Experience Bundle の登場でアプリケーション・ライフサイクルの管理が大幅に改善します。
これは、コミュニティを構築、設定、カスタマイズ、検証、バージョン管理するためのメタデータをのまとまりです。しかも .site ファイルのようなバイナリではなく、JSON 形式です。

今後は、Scratch Org でのコミュニティの作成やテストを Salesforce CLI でも可能になります。
これまでクローズパイロットでのみ提供されていた Experience Bundle の機能が正式リリースとなるのに合わせて、ロック解除済みパッケージやいくつかの機能を新しくサポートしています。
e-bikes サンプルアプリでは実際にこれらの機能をご確認頂けます。

既存のコミュニティから Experience Bundle フォーマットへ移行するために必要な作業は組織によって異なります。
移行が必要な場合、組織とコミィニティへどの程度のインパクトがあるか十分に調査する時間を確保してください。

Experience Bundle の機能についてさらに詳しく知りたい場合は、コミュニティ開発者ガイド、または Metadata API 開発者ガイドをご確認ください。

SOQL SECURITY_ENFORCED クエリ

Apex に新しい機能が追加されました。安全なデータアクセス以上に嬉しいものはありませんね。
未だ beta 中の機能も複数ある中、SOQL の WITH SECURITY_ENFORCED 句は Apex コードに組み込めるようになりました。
こちらがサンプルになります。

WITH SECURITY_ENFORCED 句によって、オブジェクトと項目セキュリティを Apex SOQL クエリに簡単に適用できます。
この機能を有効に利用するにはいくつかのルールがあるため、実装にあたってはドキュメントの参照をおすすめします。

デフォルト値を渡して新規レコード作成ページを開く

これまで Salesforce 開発者はあの手この手を駆使して複雑な URL ハックを試してきました。もうその必要はありません。

Aura と LWC の両方を含む Lightning では、デフォルト値を渡して新規レコード作成ページを開く事ができるようになりました。

LWC Recipes アプリで確認頂けます。

ちなみに、現在 sfdx-lwc-jest は lightning/pageReferenceUtils モジュールをサポートしていません。そのため、現状として一時的にテストはダミーとなっていますが、今後更新していく予定です。

ページ遷移時に、PageReference の state にデフォルト値を設定し、lightning/pageReferenceUtils を使って適切にデフォルト値のエンコードとデコードを行います。Aura では、<lightning:pageReferenceUtils/> コンポーネントを利用できます。

最後に

Salesforce のリリースは年に 3 回訪れる誕生日みたいですね!気になる新機能は見つかりましたか?是非 Spring ’20 の新機能をサンプルギャラリーで確認してみてくださいね。

(原文/参考: Sample Gallery Updates for Spring ’20)

Get the latest Salesforce Developer blog posts and podcast episodes via Slack or RSS.

Add to Slack Subscribe to RSS