OmniFaces – Das Schweizer Taschenmesser für JSF-Entwickler

Wer sich ein bisschen bei Google nach JSF-Tipps umsieht, wird schnell auf stackoverflow stossen, wo der Autor [highlight2]balusc[/highlight2] schon lange eine Koryphäe ist.

Seit einem halben Jahr stellt er eine eigene JSF-Bibliothek zum Download zur Verfügung, die man durchaus als Schweizer Taschenmesser für JSF-Entwickler bezeichnen könnte: OmniFaces.

OmniFaces ist keine Komponenten-Bibliothek wie PrimeFaces oder RichFaces, sondern ist eine Sammlung von kleinen bis grossen Helferlein, die einem das Leben als JSF-Entwickler deutlich erleichtern.

Der Grund warum ich es in unserem Projekt eingeführt habe, ist der [highlight1]Combined Resource Handler[/highlight1], der JSF endlich ein (fast) vernünftiges Resource-Rendering beibringt.

Wer sich mit Web-Performance auseinandersetzt, wird seit Jahren die immer gleichen Empfehlungen finden: pro Seite genau eine CSS-Datei so früh wie möglich im Header einbinden und genau eine Javascript-Datei möglichst ganz am Ende des HTML-Body einbinden (mit Ausnahme von Ressourcen von einem CDN). Beides ist mit JSF nicht möglich, wenn man Komponenten-Bibliotheken wie PrimeFaces, etc. pp. einsetzt. Der Grund ist, dass JSF 2.0 zwar mittlerweile einen eigenen Resource-Handler hat, aber dieser nur 2 Modi kennt, wie die Ressourcen einer Komponente gerendert werden: im HTML-Kopf in der Reihenfolge wie sie im Code definiert sind oder an der Stelle wo sie im Code definiert sind.

Der Combined Resource Handler von OmniFaces ersetzt den Original JSF Resource Handler und rendert die Resourcen, die normalerweise als Einzel-Ressourcen im HTML-Kopf ausgegeben werden sollen, zusammengefasst als jeweils eine CSS-Datei und eine Javascript-Datei. Beide Dateien bleiben zwar weiterhin im Kopf und werden nicht im Body-Ende gerendert (das würde wegen dem zweiten Modus, dass Ressourcen direkt im Code ausgegeben werden auch gar nicht gehen) aber bei uns hat das schon dazu geführt, dass auf komplexen Seiten statt 4 PrimeFaces-Ressourcen + der Standard-JSF-Javascript-Bibliothek nur noch 1 Javascript-Datei ausgegeben wurde. Genauso bei den Primefaces-CSS-Dateien. search multiple domain names

Wenn man jetzt noch dafür sorgt, dass die eigenen Ressourcen immer am Ende vom HTML-Body stehen, hat man eine (fast) perfekte Ladeperformance von externen Ressourcen erreicht.

Neben dem Combined Resource Handler bietet OmniFaces aber noch eine ganze Menge anderer Funktionen, z.B. ein [highlight1]HTML5-Renderkit[/highlight1] oder diverse Validatoren, um mehrere Felder gemeinsam zu validieren. Eine Übersicht findet man im OmniFaces Showcase

2 thoughts on “OmniFaces – Das Schweizer Taschenmesser für JSF-Entwickler

  1. Hi,

    Es ist nicht immer sinnvoll alle JS und CSS Dateien zu einer großen JS / CSS Datei zusammenzumergen. Laden kleiner Dateien geht machmal schneller, weil sie parallel geladen werden und die Verbindung zu einem Host nicht blockieren. Lesen Sie bitte “Why not just concat?” hier http://msdn.microsoft.com/en-us/magazine/ff943568.aspx

    Außerdem Mergen kleiner Dateien zu einer großen sollte nicht zur Laufzeit (Performance!), sondern zur Projekt-Kompilierzeit erfolgen. Ich habe dafür ein Maven Plugin http://code.google.com/p/primefaces-extensions/wiki/GettingStartedClosureCompiler geschrieben. Es gibt auch andere ähnliche Plugins. Viel Spaß noch :-).

    1. Für den Grossteil der Websites ist die Strategie alles per concat in einer Datei auszuliefern tatsächlich besser. Ihmo. Einfach weil die meisten Entwickler sich sowieso nicht drum kümmern wollen und in Summe gewinnt man einfach viel mehr wenn immer alles zusammenkopiert wird, als dass man verliert (was es natürlich geben kann, keine Frage).

      Leider ist es ausserdem so, dass man bei den JSF-Bibliotheken einfach keine Wahl hat, weil ALLE Ressourcen IMMER einzeln ausgeliefert werden, egal ob das Sinn macht oder nicht. Man kann deshalb auch nicht zur Kompilierzeit die JSF-Ressourcen zusammenfassen, weil das bzw. die Frameworks das gar nicht unterstützen. Mit Omnifaces hat man aber die Wahl es zur Laufzeit zu machen.

      Um eigene Ressourcen zur Kompilierzeit zusammenzufassen, verwende ich wro4j http://code.google.com/p/wro4j/

Leave a Reply

Your email address will not be published. Required fields are marked *

*