2013-12-11 4 views
1

Primefaces 4.0 генерирует много накладных расходов во время загрузки страницы, как видно из PageSpeed ​​Insights:Primefaces Javascript Defer разборе

**605.3KiB of JavaScript is parsed during initial page load. Defer parsing JavaScript to reduce blocking of page rendering.** 
http://localhost:8888/.../primefaces.js.xhtml?... (219.5KiB) 
http://localhost:8888/.../jquery-plugins.js.xhtml?... (191.8KiB) 
http://localhost:8888/.../jquery.js.xhtml?... (95.3KiB) 
http://localhost:8888/.../tooltip.js.xhtml?... (34.5KiB) 
http://localhost:8888/.../jsf.js.xhtml?... (25.4KiB) 
http://localhost:8888/.../primefaces-extensions.js.xhtml?... (19.7KiB) 
http://localhost:8888/.../watermark.js.xhtml?... (4.7KiB) 
http://localhost:8888/.../hotkey.js.xhtml?... (1.2KiB) 

Любая идея, как это третья сторона Javascript может быть установлен файлы находиться в нижней части секции тела вместо этого использовать или использовать параметры отсрочки/асинхронизации? В этом случае загрузчики Javascript не помогают, поскольку они поступают из JSF-рендерера. Также я попытался создать Listener для PreRenderView (Best way for JSF to defer parsing of JavaScript?), но это не сработало. Любые другие варианты, которые могли бы решить эту проблему? Спасибо за вашу помощь!

ответ

1

Я получил перемещение скриптов для работы с followind сниппета:

public class ScriptValidateListener implements SystemEventListener { 

    @Override 
    public void processEvent(SystemEvent event) throws AbortProcessingException { 
     UIViewRoot root = (UIViewRoot) event.getSource(); 
     FacesContext ctx = FacesContext.getCurrentInstance(); 
     List<UIComponent> resources = root.getComponentResources(ctx, "HEAD"); 
     for (UIComponent r : resources) { 
      String name = (String) r.getAttributes().get("name"); 
      if (name == null) { 
       continue; 
      } 

      if (name.contains(".js")) { 
       root.removeComponentResource(ctx, r, "HEAD"); 
       root.addComponentResource(ctx, r, "BODY"); 
      } 
     } 
    } 

    @Override 
    public boolean isListenerForSource(Object source) { 
     return (source instanceof UIViewRoot); 
    } 
} 

Это перемещает все JavaScripts от головы до конца тела. Но. Существует такая проблема с Primefaces, что обработанные компоненты будут пытаться получить доступ к функциям jQuery ($.) Или PrimeFaces javascript, и это нарушит всю функциональность ajax на странице. Уместно, мне нужно будет решить, что из сценариев двигаться и что не двигаться. Кроме того, часть от слушателя мне нужно было определить следующее для faces-config.xml, чтобы оно работало:

<application> 
    <system-event-listener> 
     <system-event-listener-class>com.example.listener.ScriptValidateListener</system-event-listener-class> 
     <system-event-class>javax.faces.event.PreRenderViewEvent</system-event-class> 
    </system-event-listener> 
</application> 

 Смежные вопросы

  • Нет связанных вопросов^_^