Liferay 6.1.20:最小化和捆绑主题Javascript

时间:2014-06-05 22:00:05

标签: liferay liferay-6 liferay-theme

有没有办法将Liferay的内置javascript最小化和捆绑功能应用到我主题中包含的javascript中?我在portal-ext.properties中有javascript.fast.load=true,而Liferay的javascript正在捆绑&amp;在everything.jsp中按预期缩小。此外,通过portlet的liferay-portal.xml文件包含的所有portlet javascript都按预期缩小。但是,我有很多javascript文件包含在我的主题中,因为它们被用在每个页面上,我希望它们最小化并捆绑到everything.jsp以及所有Liferay门户网站javascript。我已经尝试了this question建议的方法,但我认为这只适用于钩子,因为MinifyFilter会查找文件以缩小和缩小。在门户网站应用程序的上下文中捆绑,即<TOMCAT>/webapps/ROOT。有没有办法可以在不同的Web应用程序(本例中为主题)中指定文件路径作为javascript.bundle.dir参数?换句话说,像javascript.bundle.dir[javascript.jquery.files]=/<theme-path>/js之类的东西。我尝试了javascript.bundle.idsjavascript.bundle.dependencies等许多变体和组合,但无济于事。我知道我可以通过将javascript放在钩子中或将其放在portlet中并将其嵌入到主题中来解决问题,但我真的很想将javascript保留在主题中。有没有合理的方法来实现这个目标?

2 个答案:

答案 0 :(得分:2)

使用缩小和捆绑的Liferay javascript来包含主题中的javascript文件似乎不是一个好方法。虽然您可以在包含文件的portal-ext.properties中定义javascript包,但您无法按照所需的方式对依赖项进行排序,以便仅使用配置使所有内容正常工作。您可以配置&#34;所有内容&#34;捆绑依赖于您的自定义捆绑,但这不是很有用。如果您可以将Liferay配置为使用自定义捆绑包作为新的&#34;所有内容,那将会更有用。捆绑并告诉Liferay你的捆绑包依赖于Liferay&#34;所有&#34;束。但是,包含的实际包ID在Liferay的top_js.jspf文件中是硬编码的。因此,让一切工作的唯一方法是覆盖Liferay的javascript.everything.files定义,以包含Liferay的文件和您的自定义JavaScript。这似乎不是一个非常好的解决方案,因为它篡改了Liferay的包含javascript的列表,当你需要升级Liferay时肯定会很痛苦。正如Olaf建议的那样,您可以自己缩小和捆绑js,并将其包含在portal_normal模板中。这是一个非常合理的解决方案,我通常会推荐。不幸的是,我的客户要求将所有文件捆绑在一个文件中,我们不允许修改构建过程。

钩子解决方法

有一个使用钩子的解决方法我不一定推荐,但它确实实现了将所有javascript最小化并与Liferay的javascript捆绑在一起的目标。基本过程是将javascript从主题移动到一个钩子,在portal-ext.properties中配置一个包含所有文件的新包,然后为top_js.jspf创建一个包含新包而不是硬包的jsp挂钩已编码的javascript.everything.filesjavascript.barebones.files个捆绑包。步骤是:

  • 将您的javascript文件移动到钩子项目中并将它们放在html / js下。这将导致 要复制到门户网站下的javascript目录的文件 网络应用,即<TOMCAT_HOME>/ROOT/html/js。这就是Liferay MinifyFilter查找javascript文件以缩小和缩小束。

  • 在引用的portal-ext.properties中定义一个javascript包 您需要包含在捆绑包中的所有javascript文件 由MinifyFilter创建。您的portal-ext.properties文件应该是 看起来像这样:

    minifier.enabled=true
    javascript.fast.load=true
    
    javascript.my.js.files =\  
    jquery.1.11.1,\
    my-js-lib.js,\
    my-other-js-lib.js
    
    javascript.bundle.ids=\
        javascript.barebone.files,\
        javascript.everything.files,\
        javascript.my.js.files  
    
    javascript.bundle.dir[javascript.my.js.files]=/html/js
    
    # our bundle depends on all the files in the "everything" bundle
    javascript.bundle.dependencies[javascript.my.js.files]=javascript.everything.files
    
  • top_js.jspf创建JSP挂钩。这个文件在 <TOMCAT_HOME>/ROOT/html/common/themes。它是包含的文件 无论是用户还是barebones.jsp或者everything.jsp 经过身份验证(如果用户通过身份验证,则会获得 everything.jsp否则包含barebones.jsp)。更换 引用javascript.everything.files和/或 javascript.barebones.files捆绑了对您的新内容的引用 根据您的要求捆绑。例如,如果你只想 当用户通过身份验证时,请包含您的javascript 替换对javascript.everything.files的引用。 具体而言,您进行了以下更改:

这一行:

<script src="<%= HtmlUtil.escape(PortalUtil.getStaticResourceURL(request, themeDisplay.getCDNDynamicResourcesHost() + themeDisplay.getPathJavaScript() + "/everything.jsp", "minifierBundleId=javascript.everything.files", javaScriptLastModified)) %>" type="text/javascript"></script>

更改为:

<script src="<%= HtmlUtil.escape(PortalUtil.getStaticResourceURL(request, themeDisplay.getCDNDynamicResourcesHost() + themeDisplay.getPathJavaScript() + "/everything.jsp", "minifierBundleId=javascript.my.js.files", javaScriptLastModified)) %>" type="text/javascript"></script>

和这一行:

javaScriptFiles = JavaScriptBundleUtil.getFileNames(PropsKeys.JAVASCRIPT_EVERYTHING_FILES);

更改为:

javaScriptFiles = JavaScriptBundleUtil.getFileNames("javascript.my.js.files");

*非Global Hook Caveat *

如果要将javascript和top_js.jspf挂钩放在带有其他挂钩的项目中,并且项目配置为使用非全局jsp挂钩,即<custom-jsp-global>false</custom-jsp-global>解决方案变得更加复杂。这是因为设置<custom-jsp-global>true</custom-jsp-global>会使Liferay重命名您的钩子jsp文件,而不是重命名门户网站的jsp文件。例如,如果将custom-jsp-global设置为true(这是默认设置),那么当我为名为top_js.jspf的页面创建一个钩子时,门户网站会将原始top_js.jspf文件重命名为top_js.portal.jsp我的钩子文件将被用来代替原件。但是,当custom-jsp-global设置为false时,原始文件保持不变,并且jsp钩子文件被重命名为包含钩子名称的内容,如top_js.my-hook.jspf。当您为包含的文件(例如top_js.jspf)创建挂钩时,这是一个问题,因为包含top_js.jspf的文件仍将引用旧文件,而不是名为{{1}的挂钩}。这意味着您还必须为包含钩子的文件创建一个钩子。同样,如果该文件包含在另一个文件中,则必须为该文件挂钩,依此类推,直至到达顶级页面。因此,在尝试为top_js.my-hook.jspf创建挂钩的示例中,我们还必须执行以下操作:

  • top_js.jspf创建一个钩子,并将对top_head.jspf的引用替换为对我们的钩子top_js.jspf的引用。

所以这一行

top_js.my-hook.jspf

变为此

<%@ include file="/html/common/themes/top_js.jspf" %>
  • <%@ include file="/html/common/themes/top_js.my-hook.jspf" %> 文件实际上包含在主题中 top_head.jspf使用在中初始化的Velocity变量 portal_normal.vm位于以下行:

您需要将init.vm分配给主题$top_head_include中的top_head.my-hook.jspf摘要,如下所示:

init_custom.vm

答案 1 :(得分:1)

您的主题可以访问门户生成的所有HTML。虽然您可能需要加载一个额外的文件(无论如何css都会缩小整个主题),您可以轻松地将所有(已经)缩小的js文件添加到主题中,并将它们包含在templates/portal-normal.ftl实现中。

就像在portal-normal.ftl:

中使用此部分一样简单
<head>
  <title>${the_title} - ${company_name}</title>
  <meta content="initial-scale=1.0, width=device-width" name="viewport" />
  ${theme.include(top_head_include)}
  <script src="${javascript_folder}/my-minified-javascript.js"/>
</head>

注意:<script>行以外的所有行都已在默认的ftl文件中。这样你最终会加载两个js文件(准系统或一切,加上你自己的),但这并不算太糟糕。您还可以将缩小添加到主题的构建过程中,这样您就不必手动维护缩小的代码。

我还没有尝试过的另一种选择是检查Liferay的javascript缩小器的使用(例如在webapps/ROOT/html/common/themes/tom_js.jsp中),看看如何利用它来动态缩小文件。


为了完整性原因(也许它可以帮助其他人)我将在这里留下我的第一个答案,你在第一个评论中就不能使用它了:

portal.properties中有一个部分要在portal-ext.properties中重载,标题为:

##
## JavaScript
##

#
# Set a list of JavaScript files that will be loaded automatically in
# /html/common/themes/top_js.jsp.
#
# There are two lists of files specified in the properties
# "javascript.barebone.files" and "javascript.everything.files".
#
# As the name suggests, the barebone list is the minimum list of JavaScript
# files required for most cases. The everything list includes everything
# else not listed in the barebone list.
#
# The two lists of files exist for performance reasons because
# unauthenticated users usually do not utilize all the JavaScript that is
# available. See the property "javascript.barebone.enabled" for more
# information on the logic of when the barebone list is used and when the
# everything list is used and how to customize that logic.
#
# The list of files are also merged and packed for further performance
# improvements. See the property "javascript.fast.load" for more details.
#

e.g。配置javascript.everything.files(默认值低于该注释,为简洁起见,我不在此复制)