由于客户端库路径到页面的映射似乎是特定于应用程序的,因此您需要实现一种方法来检测页面类型和所需的客户端库。
您可以使用 clientlib 类别为每种页面类型组装正确的位(查看https://docs.adobe.com/docs/en/aem/6-3/develop/the-basics/clientlibs.html以及如何clientlib 包含在/libs/granite/sightly/templates
) 中实现。
此外,如果使用 AEM 6.3,请考虑使用可编辑模板并在模板级别设置客户端库。
如果您已经使用了 clientlib 类别并且只想重写 clientlib include 的输出,您可以创建自己的帮助程序来提取 URL:
package apps.test;
import javax.script.Bindings;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.sling.scripting.sightly.pojo.Use;
import libs.granite.sightly.templates.ClientLibUseObject;
public class Test implements Use {
ClientLibUseObject obj = null;
Pattern pattern = Pattern.compile("(?:href|src)=\"(.*?)\"");
List<String> srcs = null;
public void init(Bindings bindings) {
obj = (ClientLibUseObject) bindings.get("clientLibUseObject");
}
public List<String> getSrcs() {
if (srcs == null && obj != null) {
srcs = new ArrayList<>();
String tmp = obj.include();
Matcher matcher = pattern.matcher(tmp);
while (matcher.find()) {
srcs.add(matcher.group(1));
}
}
return srcs;
}
}
然后在你的脚本中调用它:
<link data-sly-use.clientLibUseObject="${'libs.granite.sightly.templates.ClientLibUseObject' @ categories='jquery,jquery-ui', mode='all'}"
data-sly-use.rewriter="${'Test' @ clientLibUseObject=clientLibUseObject}"
data-sly-repeat="${rewriter.srcs}"
rel="preload" href="${item}"/>