AEM Developerの皆さん、こんにちは、大和の蒲生です。
突然ですが、クイズです!
下記のClientlibsがあったとします。 各Clientlibsフォルダのプロパティ設定値は下記です。
/ale - allowProxy Boolean = true - categories String[] = brewery.ale - dependencies String[] = brewery.lagar, brewery.pilsner
/lagar - allowProxy Boolean = true - categories String[] = brewery.lagar
/pilsner - allowProxy Boolean = true - categories String[] = brewery.pilsner - embed String[] = brewery.stout
/stout - allowProxy Boolean = true - categories String[] = brewery.stout
下記のようなHTMLの場合、
<sly data-sly-use.clientlib="/libs/granite/sightly/templates/clientlib.html"> <sly data-sly-call="${clientlib.css @ categories='brewery.ale'}"/> </sly>
JSPであれば、
<ui:includeClientLib categories="brewery.ale" />
下記A~Eうち、どれがレンダリング結果として出力されるでしょうか?
A
<link rel="stylesheet" href="/etc.clientlibs/brewery/clientlibs/ale.css" type="text/css">
B
<link rel="stylesheet" href="/etc.clientlibs/brewery/clientlibs/ale.css" type="text/css"> <link rel="stylesheet" href="/etc.clientlibs/brewery/clientlibs/lagar.css" type="text/css"> <link rel="stylesheet" href="/etc.clientlibs/brewery/clientlibs/pilsner.css" type="text/css">
C
<link rel="stylesheet" href="/etc.clientlibs/brewery/clientlibs/lagar.css" type="text/css"> <link rel="stylesheet" href="/etc.clientlibs/brewery/clientlibs/stout.css" type="text/css"> <link rel="stylesheet" href="/etc.clientlibs/brewery/clientlibs/pilsner.css" type="text/css"> <link rel="stylesheet" href="/etc.clientlibs/brewery/clientlibs/ale.css" type="text/css">
D
<link rel="stylesheet" href="/etc.clientlibs/brewery/clientlibs/lagar.css" type="text/css"> <link rel="stylesheet" href="/etc.clientlibs/brewery/clientlibs/pilsner.css" type="text/css"> <link rel="stylesheet" href="/etc.clientlibs/brewery/clientlibs/ale.css" type="text/css">
E
<link rel="stylesheet" href="/apps/brewery/clientlibs/lagar.css" type="text/css"> <link rel="stylesheet" href="/apps/brewery/clientlibs/pilsner.css" type="text/css"> <link rel="stylesheet" href="/apps/brewery/clientlibs/ale.css" type="text/css">
答えは、、、、、ブログの一番最後にあります
というわけで、今回のテーマはクライアントライブラリのembed
とdependencies
のコンセプトについて、違いがよくわからなくて、難しいと感じていたので調べた内容を、ちょっと詳しくまとめていこうかなと思います。
奥深いクライアントライブラリの重要なコンセプトについてより知識を深めるためのキッカケになればうれしいです。
クライアントライブラリベーシック
クライアントライブラリとは
AEMの特徴の一つであるクライアントライブラリですが(Client LibraryとかClientlibsと呼びますが)、この機能によってクライアントサイドのライブラリフォルダを整理・管理することが可能です。
整理できるアセットはCSS・JS・画像・フォントなどです。
クライアントサイドのコードをレポジトリに格納でき、categories
に分類することで、いつどのコードがクライアントサイドで読み込まれるべきか操作することができます。
クライアントライブラリ設定プロパティ
ここで、クライアントライブラリの設定について詳しく見ていきたいと思います。
1.categories
categories
は設定したクライアントライブラリがどのカテゴリーに属するかを示す識別子です。categories
はJSやCSSのカテゴリーを設定し、複数の値が設定可能です。1つのライブラリフォルダは1つ以上のcategories
に属することができます。
2. dependencies
クライアントライブラリが依存する、他のクライアントライブラリのcategories
一覧で、依存しているクライアントライブラリのcategories
名を値として持ちます。
brewery.ale
のファイルがbrewery.lagar
に依存している場合、brewery.ale
のdependencies
の値にbrewery.lagar
が入っていないといけないです。
3. embed
他のクライアントライブラリに内包される場合に設定します。brewer.pilsner
にbrewer.stout
のファイルが埋め込まれている場合、出力HTMLはbrewer.pilsner
のみですが読み込まれているファイルはbrewer.pilsner
とbrewer.stout
が連結されたファイルになります。
4. allowProxy
/apps配下のクライアントライブラリーをproxyサーブレットを経由しての呼び出しを許可するプロパティです。
オーサーインスタンス上だと/apps配下もアクセスが可能ですが、パブリッシュインスタンスに公開してしまうと、/apps配下は404が返ってきてしまいますよね。そこで、このallowProxy Boolean = true
プロパティをクライアントライブラリに追加することで、scrのパスが/apps
から/etc.clientlibs/
配下に代わり、etc/を介したアクセスが可能になります。
embed
とdependencies
の違いは?
dependencies
の関係はあくまでも独立したライブラリどうしの関係
dependencies
の場合依存関係のあるファイルごとにインクルードとリクエストがされます。
下記の図のような依存関係がある場合、
HTML出力はこうなります。
<link rel="stylesheet" href="/etc.clientlibs/myproject/clientlibs/c.css" type="text/css"> <link rel="stylesheet" href="/etc.clientlibs/myproject/clientlibs/b.css" type="text/css"> <link rel="stylesheet" href="/etc.clientlibs/myproject/clientlibs/a.css" type="text/css"> <link rel="stylesheet" href="/etc.clientlibs/myproject/clientlibs/all.css" type="text/css">
embed
はその名の通り埋め込まれる
dependencies
とは異なり、embed
した場合、embed
されたクライアントライブラリは内包されて呼び出されるんですね。
そのため下記の埋め込み関係の場合、
HTML出力は下記になります。
<link rel="stylesheet" href="/etc.clientlibs/myproject/clientlibs/all.css" type="text/css">
dependencies
とembed
ミックススタイル
では、dependencies
とembed
が下記のように混ざり合ってる場合、HTML出力はどうなるでしょうか。
<link rel="stylesheet" href="/etc.clientlibs/myproject/clientlibs/c.css" type="text/css"> <link rel="stylesheet" href="/etc.clientlibs/myproject/clientlibs/all.css" type="text/css">
はい、もうお分かりですね。
依存関係のある、clientlibs.c
と他のクライアントライブラリをembed
しているclientlibs.all
がHTML出力されます。
便利ツールたち
1. Dumplibs
https://[ホスト名]:[ポート番号]/libs/granite/ui/content/dumplibs.html
AEMにOOTBで入っているツールですが、categories
を入力することでライブラリのdependencies
の検証も可能です。一貫性のないdependencies
とembed
設定を指摘してくれます。
他にも、categories
を入力することで、全クライアントライブラリのパスを確認することができます。
2. Client Library Optimizer - ACS AEM Tools
このACS AEM ToolsのClient Library Optimizer(https://adobe-consulting-services.github.io/acs-aem-tools/features/clientlibs-optimizer/index.html)を利用すると、効率的なembed構造が分かっちゃいます。なんと便利なツールがあるんですね。
これを使えば初期に構成したクライアントライブラリの構成が変わった場合などに、dependencies
とembed
の最新で最適な構成がわかっちゃいます!これでCSSやJSが追加・削除された場合も、すべてのClientlibsを確認しなくても、Clientlibsの最適化ができます。
参考
AEM Client Libraries explained by example
A deep dive into AEM Clientlibs...
Client Libraries Interview Questions
AEM Clientlibs: Difference between Dependencies and Embed
クイズの答えはD
です!皆さん当たりましたかね?
D
以外の選択肢の間違っている箇所に少し解説を入れると、
選択肢A: brewery.ale
のdependencies
が無視されてしまっているので、不正解。
選択肢B: 読み込み順番が間違っているので、不正解。
選択肢C: brewery.pilsner
のembed
が無視されてしまっているので、不正解。
選択肢E: すべてのクライアントライブラリのallowProxy Boolean = true
が無視されてしまっているので不正解。
ここまで読んでいただいてありがとうございました。またお会いする日まで~! Happy Coding