問題
-
javascript.barebone.filesとjavascript.everything.filesの使用法は、Liferayのバージョン間で何が違うのでしょうか?
環境
- Liferay DXP 7.0+
解決
-
Javascriptファイルのインポート
Liferay 7.0
Liferay 7.0ではjavascript.barebone.filesとjavascript.everything.filesというportal.propertiesが存在し、/html/common/themes/top_js.jspで自動的にロードされるJavaScriptファイルをリストアップします。
この2つのリストに追加できるカスタムJSファイルは、Webアプリの“/html/js”フォルダに配置されている必要があります。
認証されていないユーザーは通常、利用可能なすべてのJavaScriptを利用しないため、パフォーマンス上の理由から2つのファイルリストが存在します。その名の通り、bareboneリストは、ほとんどの場合に必要なJavaScriptファイルの最低限のリストです。everythingリストには、bareboneリストに記載されていない他のすべてのファイルが含まれています。
ファイルのリストは、さらにパフォーマンスを向上させるために、everything.jspまたはbarebone.jspにマージされ、パックされます。これはjavascript.fast.loadポータルプロパティによって制御されます。top_js.jspでどのように実装されているか見てみましょう。<c:choose> <c:when test="<%= themeDisplay.isThemeJsFastLoad() %>"> <c:choose> <c:when test="<%= themeDisplay.isThemeJsBarebone() %>"> <script src="<%= HtmlUtil.escape(PortalUtil.getStaticResourceURL(request, themeDisplay.getCDNDynamicResourcesHost() + themeDisplay.getPathJavaScript() + "/barebone.jsp", "minifierBundleId=javascript.barebone.files", jsLastModified)) %>" type="text/javascript"></script> </c:when> <c:otherwise> <script src="<%= HtmlUtil.escape(PortalUtil.getStaticResourceURL(request, themeDisplay.getCDNDynamicResourcesHost() + themeDisplay.getPathJavaScript() + "/everything.jsp", "minifierBundleId=javascript.everything.files", jsLastModified)) %>" type="text/javascript"></script> </c:otherwise> </c:choose> </c:when> <c:otherwise> <% String path = themeDisplay.getCDNHost().concat(themeDisplay.getPathJavaScript()); String[] javaScriptFiles = null; if (themeDisplay.isThemeJsBarebone()) { javaScriptFiles = JavaScriptBundleUtil.getFileNames(PropsKeys.JAVASCRIPT_BAREBONE_FILES); } else { javaScriptFiles = JavaScriptBundleUtil.getFileNames(PropsKeys.JAVASCRIPT_EVERYTHING_FILES); } for (String javaScriptFile : javaScriptFiles) { %> <script data-senna-track="permanent" src="<%= HtmlUtil.escape(PortalUtil.getStaticResourceURL(request, path + "/" + javaScriptFile, "minifierType=", jsLastModified)) %>" type="text/javascript"></script> <% } %> </c:otherwise> </c:choose> -
themeDisplay.isThemeJsFastLoad()の場合、barebone.jspまたはeverything.jspが読み込まれ、そうでなければjavascript.barebone.filesまたはjavascript.everything.filesにリストされている JS ファイルが代わりに読み込まれます。 -
themeDisplay.isThemeJsBarebone()の場合、barebone.jspまたはjavascript.barebone.filesに記載されているがJSファイルが読み込まれ、そうでなければeverything.jspまたはjavascript.everything.filesにリストされているJSファイルが代わりに読み込まれます。 -
themeDisplay.isThemeJsFastLoad()の値は、javascript.fast.loadポータルプロパティがデフォルトで true になっていることで制御できますが、ここではthemeDisplay.isThemeJsBarebone()の値を確認してみましょう:themeJsBareboneの値は、ServicePreActionクラスに設定されています。boolean themeJsBarebone = PropsValues.JAVASCRIPT_BAREBONE_ENABLED;
if (themeJsBarebone && (signedIn || PropsValues.JAVASCRIPT_SINGLE_PAGE_APPLICATION_ENABLED)) {
themeJsBarebone = false;
}ThemeJsBarebone値は、デフォルトで true である
javascript.barebone.enabledポータルプロパティによって設定されます。PropsValues.JAVASCRIPT_SINGLE_PAGE_APPLICATION_ENABLEDは、javascript.single.page.application.enabledポータルプロパティによって設定されます。これもデフォルトで true です。
ロジックに基づいて、PropsValues.JAVASCRIPT_SINGLE_PAGE_APPLICATION_ENABLEDの場合、bareboneはロードされません。それ以外の場合、bareboneにサインインしていない場合はロードされます。そのため、デフォルトでは (
javascript.single.page.application.enabled=true,javascript.fast.load=true) ではeverything.jspがロードされjavascript.barebone.filesとjavascript.everything.filesの両方にリストされているファイルをマージしてパックしているため、JSファイルをbareboneとeverythingに分散させてもパフォーマンスの向上は見込めません。 -
Liferay 7.1+
Liferay 7.1から、
javascript.barebone.filesとjavascript.everything.filesプロパティは、BNDヘッダーを使ってOSGi経由で設定できるため、非推奨となりました。 これらのプロパティは将来のリリースで削除される予定です。
7.1 から、この機能はLiferay-JS-Resources-Top-Head-AuthenticatedおよびLiferay-JS-Resources-Top-Headbnd プロパティでポータル プロパティと同様に扱うことができます。
ユーザーが認証されていない場合は、Liferay-JS-Resources-Top-Headにリストされているファイルが読み込まれ、ユーザーが認証されている場合は、 にリストされているファイルが読み込まれます。そうすると、Liferay-JS-Resources-Top-HeadとLiferay-JS-Resources-Top-Head-Authenticatedの両方にファイルが読み込まれます。また、7.0と同様に、
javascript.single.page.application.enabled=trueでポータルを使用している場合、認証済みユーザーと非認証ユーザーの違いはありませんが、いずれの場合もすべての js ファイルが読み込まれます。そのため、デフォルトではすべてのJSファイルが読み込まれるので、
Liferay-JS-Resources-Top-Head-AuthenticatedとLiferay-JS-Resources-Top-Headのファイルを区別する必要はありません。 -
my-top-head-extender.zip と com.liferay.my.top.head.extender.jar ファイルを添付しました。
ポートレットでは、jsファイルを追加し、bnd.bndファイルにLiferay-JS-Resources-Top-Head-AuthenticatedとLiferay-JS-Resources-Top-Headを設定しました。
Javascriptファイルを動的に読み込む
Javascriptファイルをロードするには、Top JS Dynamic Includeという方法もあります。このソリューションでは、テーマのヘッドに追加のJavaScriptファイルを動的に、top_js.jspfの上にインクルードすることができます。例として、ポートレットのソースの com.liferay.dynamic.include.jar と my-custom-dynamic-include.zip を添付しました。