用 JSF 延迟加载 JavaScript 库(Richfaces、Primefaces、自己的东西)以加快页面加载的最佳方法是什么?
正如 Google PageSpeed 插件所说,建议在网站完全加载时解析 JavaScript。实现此目的的一种方法是将 JavaScript 加载放在<body>
标记的末尾。另一种方法是将“defer”属性放入标记中,正如我所见<script>
,这不能用 JSF 的标记来完成。<h:outputScript>
那么,你会怎么做呢?
用 JSF 延迟加载 JavaScript 库(Richfaces、Primefaces、自己的东西)以加快页面加载的最佳方法是什么?
正如 Google PageSpeed 插件所说,建议在网站完全加载时解析 JavaScript。实现此目的的一种方法是将 JavaScript 加载放在<body>
标记的末尾。另一种方法是将“defer”属性放入标记中,正如我所见<script>
,这不能用 JSF 的标记来完成。<h:outputScript>
那么,你会怎么做呢?
使用<h:outputScript target="body">
. 然后它将在<h:body>
. 它即默认为视图中的“当前”位置(另一个target
值是head
它将使脚本以 结束<h:head>
,即使脚本在 中的某处指定<h:body>
)。
<h:outputScript name="js/foo.js" target="body" />
如果您也想将此应用于 3rd 方脚本,则需要创建一个自定义SystemEventListener
挂钩,PreRenderViewEvent
在UIViewRoot#getComponentResources()
和UIViewRoot#addComponentResource()
.
不知道这是否重要(您可以称其为解决方法),
但是您始终可以在外部 xhtml 页面中包含一些 js 文件,这些文件将包含在您的主页中,ui:include
这些文件将由 js/jquery 包装<h:panelGroup id="externalPageWrapper" render="#{myBean.renderExternalPage}"
并且几乎没有 js/jquery 的帮助,您可以.click()
在一些隐藏h:commandButton
的内容上执行,f:ajax
这将更renderExternalPage
改为 true 并呈现externalPageWrapper
这将加载该 xhtml 页面以及其中包含的所有 js 文件...