{"id":2754,"date":"2017-08-23T07:51:05","date_gmt":"2017-08-23T07:51:05","guid":{"rendered":"https:\/\/anexia.com\/blog\/de\/?p=2754"},"modified":"2022-04-19T09:22:20","modified_gmt":"2022-04-19T07:22:20","slug":"mit-pjax-die-webseiten-performance-steigern","status":"publish","type":"post","link":"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/","title":{"rendered":"Mit PJAX die Webseiten-Performance steigern"},"content":{"rendered":"<p>Viele von euch werden sich als Erstes vermutlich folgende Frage stellen: PJAX? Sollte das nicht eher AJAX hei\u00dfen?<\/p>\n<p>Die Antwort hierauf lautet klar Nein &#8211; bei PJAX handelt es sich um eine speziellere Art der Datenorganisation, basierend auf AJAX.<br \/>\nWas es aber konkret damit auf sich hat, und was euch diese Technik in der Praxis wirklich bringt, m\u00f6chte ich euch hier zeigen. Daf\u00fcr sind allerdings zumindest durchschnittliche Kenntnisse in Javascript bzw. <a href=\"https:\/\/jquery.com\/\">jQuery<\/a>\u00a0erforderlich! Wenn ihr jedoch nicht so viel Erfahrung mit jQuery haben solltet: kein Problem &#8211;\u00a0weiter unten\u00a0gibt&#8217;s ein fertiges Beispiel, welches ihr als Ausgangsbasis f\u00fcr euer eigenes Projekt nutzen k\u00f6nnt.<\/p>\n<p>&nbsp;<\/p>\n<h2>PJAX im allt\u00e4glichen Leben<\/h2>\n<p>Wenn du beispielsweise Facebook, Twitter oder auch LinkedIn verwendest, ist dir sicher schon einmal aufgefallen, dass du zwar alle m\u00f6glichen Links und Buttons anklicken kannst, sich die Website dabei aber nie komplett neu l\u00e4dt. Wenn dir das bewusst ist, dann hast du bereits begriffen, worum es bei der PJAX-Technik eigentlich geht &#8211; dem Austauschen und Nachladen von Inhalten innerhalb bestimmter definierter Bereiche einer Website. Das bedeutet, dass die Website beim ersten Zugriff einmalig komplett geladen wird. Wenn dann irgendwo geklickt wird, wird lediglich der Inhalt mit jenem der eigentlichen Zielseite ausgetauscht, und so nebenbei \u00e4ndert sich auf die URL in der Browser-Zeile.<\/p>\n<p>Der Vorteil liegt nun darin, dass einzelne Seiten einer Website dadurch wesentlich schneller geladen werden k\u00f6nnen, da nicht permanent alle (zum Teil externen) Ressourcen jedes Mal aufs Neue nachgeladen werden m\u00fcssen. F\u00fcr den User selbst wirkt das Ganze dadurch wesentlich ruhiger und auch fl\u00fcssiger, zumal durch das wegfallende Nachladen und den damit verbundenen Neuaufbau der Seite das entstehende Flackern komplett wegf\u00e4llt.<\/p>\n<p>&nbsp;<\/p>\n<h2>PJAX in die Website\u00a0integrieren<\/h2>\n<p>Die Integration der PJAX-Technik gestaltet sich verh\u00e4ltnism\u00e4\u00dfig einfach. Es lassen sich damit auch \u00e4ltere Websites aufr\u00fcsten. Alles was daf\u00fcr notwendig ist, wird mit wenigen Javascript bzw. <a href=\"https:\/\/jquery.com\/\">jQuery<\/a>-Funktionen gel\u00f6st.<\/p>\n<p>&nbsp;<\/p>\n<h2>Schritt 1: Events delegaten<\/h2>\n<p>Event-Listener auf Javascript-Basis funktionieren normalerweise so, dass diese eine Funktion bzw. ein Verhaltensmuster definieren, welches bestimmt, was bei einem bestimmten Ausl\u00f6ser (z.B. ein Klick) mit dem betreffenden Element (z.B. ein Button) geschehen soll. Diese Funktion wird f\u00fcr gew\u00f6hnlich direkt an das jeweilige Element gebunden. Dies geschieht, indem der Browser bei einem Seitenaufruf alle Elemente der Reihe nach rendert, und wenn er damit fertig ist, die notwendigen Event-Listener an diese bindet.<\/p>\n<p>Da bei PJAX (oder teilweise auch bei AJAX) Elemente neu geladen, und dadurch \u00fcberschrieben werden, werden in diesem Fall auch alle Event-Listener (vom alten Element) ebenfalls \u00fcberschrieben. Der Browser selbst f\u00fchrt aber keine erneute Initialisierung dieser neuen Elemente durch. Daher sind die alten Event-Listener bei nachgeladenen Elementen wirkungslos.<\/p>\n<p>Wir m\u00fcssen also daf\u00fcr sorgen, dass die betreffenden Elemente wissen, dass es durchaus einen (oder auch mehrere) Event-Listener gibt. Dazu sollte dieser aber nicht direkt an das Element geh\u00e4ngt, sondern au\u00dferhalb von diesem platziert werden. Diesen Vorgang bezeichnet man als &#8222;delegaten&#8220;.<\/p>\n<p>Um euch dies in der Praxis zu zeigen, hier mal ein Beispiel f\u00fcr einen regul\u00e4ren jQuery-Event-Listener (wird bei einem Klick ausgel\u00f6st):<\/p>\n<pre class=\"lang:js decode:true\">$(\"#my_button\").click(function(){\r\n\talert('Click event triggered!');\r\n});<\/pre>\n<p>Wie man hier sieht, wird zuerst das betreffende Element (&#8222;<em>#my_button<\/em>&#8222;) ausgew\u00e4hlt, und dann auf dieses ein Klick-Event-Listner gelegt.<\/p>\n<p>Bei einem delegateten Listener sieht dies nun ein wenig anders aus:<\/p>\n<pre class=\"lang:js decode:true\">$(\"body\").delegate(\"#my_button\", \"click\", function(){\r\n\talert('Click event triggered!');\r\n});<\/pre>\n<p>In diesem Fall w\u00e4hlen wir als erstes statt dem Ziel-Element (&#8222;<em>#my_button<\/em>&#8222;) ein beliebiges anderes aus, welches sich garantiert nicht \u00e4ndern wird (hier &#8222;<em>body<\/em>&#8222;). Diesem sagen wir nun, dass es einen Event f\u00fcr ein anderes Element &#8222;halten&#8220; wird.<\/p>\n<p>Innerhalb der <a href=\"http:\/\/api.jquery.com\/delegate\/\"><strong>delegate()<\/strong><\/a>-Funktion geben wir nun an, welches Ziel-Element wir damit gerne ansprechen m\u00f6chten (&#8222;<em>#my_button<\/em>&#8222;) und auf welchen Ausl\u00f6ser es reagieren soll (hier: &#8222;<em>click<\/em>&#8222;).<\/p>\n<p>Das bringt uns in der Praxis jenen Vorteil, dass wir Elemente beliebig austauschen und ersetzen k\u00f6nnen und die Event-Listener dennoch funktionieren, da sich diese ganz wo anders befinden.<\/p>\n<p>&nbsp;<\/p>\n<h2>Schritt 2: Verlinkungen \u00fcber Javascript umleiten<\/h2>\n<p>W\u00fcrde man auf der Website einen Link anklicken, w\u00fcrde der Browser diesen ganz normal laden, indem er einen kompletten Reload der Website (wenn es interner Link ist) durchf\u00fchrt.<\/p>\n<p>Aber der Sinn von PJAX ist ja, genau dieses Verhalten zu unterbinden, und Inhalte dynamisch auszutauschen bzw. bei Bedarf nachzuladen.<\/p>\n<p>Dazu legen wir auf den Link einen Klick-Event-Listener, welcher das Standardverhalten blockiert, sodass wir nun unseren eigenen Link-Handler definieren k\u00f6nnen:<\/p>\n<pre class=\"lang:js decode:true \">$('body').delegate('a', 'click', function (e) {\r\n\t\/\/ prevent default behaviour of the link\r\n\te.preventDefault();\r\n\r\n\t\/\/ TODO: handle custom link behaviour\r\n});<\/pre>\n<p>Das Problem an diesem Event-Listener ist aber, dass dieser ALLE Links blockieren w\u00fcrde, aber unser eigener Link-Handler nur die internen Verlinkungen behandeln soll.<\/p>\n<p>Ich hab euch daf\u00fcr mal folgenden Event-Handler vorbereitet:<\/p>\n<pre class=\"lang:js decode:true \">$('body').delegate('a', 'click', function (e) {\r\n    var link = e.currentTarget;\r\n    var isError = false;\r\n\r\n    \/\/ Middle click, cmd click, and ctrl click should open links in a new tab as normal.\r\n    if (e.which &gt; 1 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {\r\n        isError = true;\r\n    }\r\n\r\n    \/\/ Ignore cross origin links\r\n    if (location.protocol !== link.protocol || location.hostname !== link.hostname) {\r\n        isError = true;\r\n    }\r\n\r\n    \/\/ Ignore case when a hash is being tacked on the current URL\r\n    if (link.href.indexOf('#') &gt; -1 &amp;&amp; stripHash(link) == stripHash(location)) {\r\n        isError = true;\r\n    }\r\n\r\n    \/\/ Ignore event with default prevented\r\n    if (e.isDefaultPrevented()) {\r\n        isError = true;\r\n    }\r\n\r\n    \/\/ Check if link target is \"_blank\"\r\n    if ($(this).attr('target') == '_blank') {\r\n        isError = true;\r\n    }\r\n\r\n\r\n    \/\/ Perform link click\r\n    if (!$(this).hasClass('dropdown-toggle') &amp;&amp;\r\n        !$(this).data('toggle') &amp;&amp;\r\n        !isError) {\r\n\r\n        \/\/ We define the DOM element \"main\" as primary container for our replaced content\r\n        var targetSelector = 'main';\r\n        var $target = $(targetSelector);\r\n        var href = $(this).attr('href');\r\n\r\n        e.stopPropagation();\r\n        e.preventDefault();\r\n\r\n        if (!$target.length) {\r\n            \/\/ target element does not exist\r\n            return;\r\n        }\r\n\r\n        $.get(href, function (data, status) {\r\n            if (status === 'success') {\r\n                var parser = new DOMParser();\r\n                var $data = $(parser.parseFromString(data, 'text\/html'));\r\n                var $newTarget = $data.find(targetSelector);\r\n                var newTargetHtml = $newTarget.html();\r\n\r\n                \/\/ Set HTML content from response\r\n                $target.html( newTargetHtml );\r\n            }\r\n            else {\r\n                alert(\"Unexpected response code: \" + status);\r\n            }\r\n        });\r\n    }\r\n});<\/pre>\n<p>Als Erstes wird Schritt f\u00fcr Schritt \u00fcberpr\u00fcft, ob der betreffende Link von unserem Klick-Handler behandelt werden soll oder nicht.<\/p>\n<p>F\u00fcr den positiven Fall wird nun festgelegt, welcher Bereich gegen den neuen ausgetauscht werden soll &#8211; in diesem Fall w\u00e4re es der <strong>&lt;main\/&gt;<\/strong>-Block innerhalb des<a href=\"https:\/\/anexia.com\/de\/softwareentwicklung\/webentwicklung\/htmlcss-entwicklung\/\"> HTML<\/a>-Bodys (definiert in der Variable <em>targetSelector<\/em>).<\/p>\n<p>Anschlie\u00dfend kann die eigentliche URL des Links via AJAX geladen werden (mittels <a href=\"http:\/\/api.jquery.com\/jQuery.get\/\"><strong>$.get()<\/strong><\/a>).<\/p>\n<p>Wenn die URL nun via AJAX geladen werden konnte, sagen wir jQuery explizit, dass die Antwort unter Nutzung des <strong>DOMParser()<\/strong> als HTML interpretiert werden soll.<\/p>\n<p>In diesem geparsten HTML suchen wir nun unseren gew\u00fcnschten Block (in diesem Fall <strong>&lt;main\/&gt;<\/strong> mittels der Variable\u00a0<em>targetSelector<\/em> von oben), und ersetzen diesen Block im alten HTML dann gegen den neuen, indem wir mittels der <a href=\"http:\/\/api.jquery.com\/html\/\"><strong>html()<\/strong><\/a>-Funktion einfach dessen Inhalt mit jenem von unserem geparsten und gefilterten HTML \u00fcberschreiben.<\/p>\n<p>&nbsp;<\/p>\n<h2>Schritt 3: Formulare im Hintergrund versenden<\/h2>\n<p>Das gleiche Verhalten wie bei den Links \u00fcbertragen wir nun auch auf Formulare.<\/p>\n<p>Der einzige Unterschied hierbei ist jener, dass wir beim Absenden des Formulars im Prinzip nur einen kleinen Teilbereich ersetzen m\u00fcssen.<\/p>\n<p>Am einfachsten ist es hier einen Container um das eigentliche Formular herum zu legen.<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;div id=\"my-form-container\"&gt;\r\n    &lt;form action=\"\" method=\"POST\" data-refresh-target=\"#my-form-container\"&gt;\r\n            &lt;input type=\"text\" name=\"demo\"&gt;\r\n            \r\n            &lt;button type=\"submit\"&gt;Send message&lt;\/button&gt;\r\n    &lt;\/form&gt;\r\n&lt;\/div&gt;<\/pre>\n<p>Beim Formular selbst legen wir nun mit Hilfe eines Data-Attributs (hier als &#8222;data-refresh-target&#8220; bezeichnet) fest, in welchen Container wir die Antwort nach dem Absenden gerne laden m\u00f6chten.<\/p>\n<p>Nun aber zu unserem Submit-Handler:<\/p>\n<pre class=\"lang:js decode:true \">$('body').delegate('form', 'submit', function (e) {\r\n    var $this = $(this);\r\n    var targetSelector = $this.data('refresh-target');\r\n    var $target = $(targetSelector);\r\n\r\n    if (!$target.length) {\r\n        \/\/ target element does not exist\r\n        return;\r\n    }\r\n\r\n    e.stopPropagation();\r\n    e.preventDefault();\r\n\r\n\r\n    var rqMethod = 'GET';\r\n    var attrRqMethod = $(this).attr('method');\r\n    var url = $this.attr('action');\r\n\r\n    if (attrRqMethod) {\r\n        rqMethod = attrRqMethod;\r\n    }\r\n\r\n    $.ajax({\r\n        \/\/mimeType: 'text\/html; charset=utf-8', \/\/ ! Need set mimeType only when run from local file\r\n        url: url,\r\n        data: $(this).serialize(),\r\n        type: rqMethod,\r\n        cache: false,\r\n        success: function (data, status, XHR) {\r\n\r\n            \/\/ Set HTML content from response\r\n            $target.html( data );\r\n\r\n        },\r\n        dataType: 'html'\r\n    });\r\n});<\/pre>\n<p>Innerhalb von diesem lesen wir nun mittels der <a href=\"http:\/\/api.jquery.com\/data\/\"><strong>data()<\/strong><\/a>-Funktion den Ziel-Container aus (\u00fcber das Data-Attribut &#8222;<em>refresh-target<\/em>&#8222;, welches wir zuvor bereits am Form-Element festgelegt haben), in welchen wir die Antwort sp\u00e4ter hineinladen m\u00f6chten.<\/p>\n<p>Als n\u00e4chstes pr\u00fcfen wir, ob das betreffende Formular via GET oder via POST versendet werden soll. Wir bekommen diese Information direkt vom Form-Element anhand des Attributs &#8222;<em>method<\/em>&#8222;.<br \/>\nIst dieses beispielsweise nicht definiert, wird ein Formular immer via GET versendet.<\/p>\n<p>Damit auch der Inhalt der Formular-Felder \u00fcbergeben wird, serialisieren wir diese mittels der <a href=\"http:\/\/api.jquery.com\/serialize\/\"><strong>serialize()<\/strong><\/a>-Funktion und \u00fcbergeben dies als Parameter &#8222;<em>data<\/em>&#8220; der <a href=\"http:\/\/api.jquery.com\/jQuery.ajax\/\"><strong>ajax()<\/strong><\/a>-Funktion.<\/p>\n<p>Anstatt der <a href=\"http:\/\/api.jquery.com\/jQuery.ajax\/\"><strong>ajax()<\/strong><\/a>-Funktion k\u00f6nnte man ebenso gut mit <a href=\"http:\/\/api.jquery.com\/jQuery.get\/\"><strong>$.get()<\/strong><\/a> oder <a href=\"http:\/\/api.jquery.com\/jQuery.post\/\"><strong>$.post()<\/strong><\/a> arbeiten. Der Vorteil bei Ersterem liegt darin, dass wir den Request-Typ (GET oder POST) direkt \u00fcber ein einzelnes Attribut (&#8222;<em>type<\/em>&#8222;) steuern k\u00f6nnen.<\/p>\n<p>Gleich wie beim Link-Handler von oben ersetzen wir nun einfach den Inhalt vom alten Container durch das zur\u00fcckgelieferte HTML.<br \/>\nWir gehen bei diesem Beispiel davon aus, dass als Antwort nur jenes HTML zur\u00fcckkommt, welches 1:1 in den Container eingef\u00fcgt wird, also ohne das restliche Layout rundherum.<\/p>\n<p>&nbsp;<\/p>\n<h2>Vollst\u00e4ndiges Beispiel (Demo)<\/h2>\n<p>Damit w\u00e4ren wir nun mit allen erforderlichen Ma\u00dfnahmen f\u00fcr das asynchrone Datenhandling durch.<\/p>\n<p>Da das Ganze aber am Anfang doch etwas kompliziert ist, hab ich euch ein kleines Beispiel (basierend auf dem CodeIgniter-Framework) zusammengestellt:<\/p>\n<p style=\"text-align: center;\"><strong><a href=\"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2017\/07\/codeigniter-async-demo_mwu.zip\">Demo herunterladen<\/a><\/strong><\/p>\n<p>Kopiert das Ganze auf einen Webserver (z.B. XAMPP, LAMP, etc.) und schon k\u00f6nnt ihr euch ein bisschen durch den Dummy durchklicken.<\/p>\n<p>Die Scripts in\u00a0 diesem Beispiel sind zum Teil bereits etwas erweitert &#8211; beispielsweise gibt es hier einen Fading-Effekt beim Ersetzen des Inhalts, damit das Ganze noch ruhiger wirkt.<\/p>\n<p>Keine Sorge &#8211; es ist alles durchgehend kommentiert. Ihr solltet euch da also ohne gro\u00dfe Probleme zurechtfinden k\u00f6nnen.<\/p>\n<p>&nbsp;<\/p>\n<h2>Fazit<\/h2>\n<p>PJAX dient in erster Linie dazu, das Erlebnis f\u00fcr den Besucher angenehmer zu gestalten, indem dieser nicht von permanenten Seiten-Reloads abgelenkt wird.<\/p>\n<p>Aufgrund der Tatsache, dass auch externe Ressourcen nur einmal initial geladen werden m\u00fcssen, f\u00e4llt dies bei weiteren Interaktionen weg, was sich in weiterer Folge positiv auf die Ladezeit und damit verbunden auf die Performance generell auswirkt.<\/p>\n<p>Man kann die PJAX-Technik \u00fcbrigens noch weiter ausreizen, indem man beispielsweise als Header-Variable oder zus\u00e4tzliche GET-\/POST-Variable mitsendet, ob man das Layout rund um das eigentliche HTML haben m\u00f6chte oder nicht.<br \/>\nServerseitig k\u00f6nnte man dann in weiterer Folge dynamisch entscheiden, ob man das gesamte Markup rendert, oder eben nur einen Teilbereich davon.<\/p>\n<p>Im oberen Beispiel hab ich euch das bereits auf eine stark vereinfachte Art und Weise gezeigt &#8211; normale Links laden jeweils das gesamte Markup inkl. Layout, bei den Formularen hingegen wirklich nur das betreffende HTML.<\/p>\n<p>Es gibt zahlreiche M\u00f6glichkeiten, wie man die Performance einer Website steigern kann &#8211; dies hier ist aber nur eine von vielen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit PJAX die Webseiten-Performance steigern &#8211; wie zeigt euch Manuel in diesem Tutorial.<\/p>\n","protected":false},"author":15,"featured_media":515,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[401,78,14,400,399,398],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Mit PJAX die Webseiten-Performance steigern - ANEXIA Blog<\/title>\n<meta name=\"description\" content=\"Mit PJAX die Webseiten-Performance steigern - wie zeigt euch Manuel in diesem Tutorial.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mit PJAX die Webseiten-Performance steigern - ANEXIA Blog\" \/>\n<meta property=\"og:description\" content=\"Mit PJAX die Webseiten-Performance steigern - wie zeigt euch Manuel in diesem Tutorial.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/\" \/>\n<meta property=\"og:site_name\" content=\"ANEXIA Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/anexiagmbh\/\" \/>\n<meta property=\"article:published_time\" content=\"2017-08-23T07:51:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-04-19T07:22:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2015\/01\/Manuel-Wutte_anexia-blau_web.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"1067\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Manuel Wutte\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_ANEXIA\" \/>\n<meta name=\"twitter:site\" content=\"@_ANEXIA\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Manuel Wutte\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"9\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/\",\"url\":\"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/\",\"name\":\"Mit PJAX die Webseiten-Performance steigern - ANEXIA Blog\",\"isPartOf\":{\"@id\":\"https:\/\/anexia.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2015\/01\/Manuel-Wutte_anexia-blau_web.jpg\",\"datePublished\":\"2017-08-23T07:51:05+00:00\",\"dateModified\":\"2022-04-19T07:22:20+00:00\",\"author\":{\"@id\":\"https:\/\/anexia.com\/blog\/#\/schema\/person\/926f6b9e5aeed88b145cf86d87fd09de\"},\"description\":\"Mit PJAX die Webseiten-Performance steigern - wie zeigt euch Manuel in diesem Tutorial.\",\"breadcrumb\":{\"@id\":\"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/#primaryimage\",\"url\":\"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2015\/01\/Manuel-Wutte_anexia-blau_web.jpg\",\"contentUrl\":\"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2015\/01\/Manuel-Wutte_anexia-blau_web.jpg\",\"width\":1600,\"height\":1067},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/anexia.com\/blog\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mit PJAX die Webseiten-Performance steigern\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/anexia.com\/blog\/#website\",\"url\":\"https:\/\/anexia.com\/blog\/\",\"name\":\"ANEXIA Blog\",\"description\":\"[:de] ANEXIA Blog - Technischen Themen, Anexia News und Insights [:]\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/anexia.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/anexia.com\/blog\/#\/schema\/person\/926f6b9e5aeed88b145cf86d87fd09de\",\"name\":\"Manuel Wutte\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/anexia.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9528a61f48f4294cd5f7cd8a4141bd55?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9528a61f48f4294cd5f7cd8a4141bd55?s=96&d=mm&r=g\",\"caption\":\"Manuel Wutte\"},\"url\":\"https:\/\/anexia.com\/blog\/author\/mwu\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Mit PJAX die Webseiten-Performance steigern - ANEXIA Blog","description":"Mit PJAX die Webseiten-Performance steigern - wie zeigt euch Manuel in diesem Tutorial.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/","og_locale":"de_DE","og_type":"article","og_title":"Mit PJAX die Webseiten-Performance steigern - ANEXIA Blog","og_description":"Mit PJAX die Webseiten-Performance steigern - wie zeigt euch Manuel in diesem Tutorial.","og_url":"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/","og_site_name":"ANEXIA Blog","article_publisher":"https:\/\/www.facebook.com\/anexiagmbh\/","article_published_time":"2017-08-23T07:51:05+00:00","article_modified_time":"2022-04-19T07:22:20+00:00","og_image":[{"width":1600,"height":1067,"url":"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2015\/01\/Manuel-Wutte_anexia-blau_web.jpg","type":"image\/jpeg"}],"author":"Manuel Wutte","twitter_card":"summary_large_image","twitter_creator":"@_ANEXIA","twitter_site":"@_ANEXIA","twitter_misc":{"Verfasst von":"Manuel Wutte","Gesch\u00e4tzte Lesezeit":"9\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/","url":"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/","name":"Mit PJAX die Webseiten-Performance steigern - ANEXIA Blog","isPartOf":{"@id":"https:\/\/anexia.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/#primaryimage"},"image":{"@id":"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/#primaryimage"},"thumbnailUrl":"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2015\/01\/Manuel-Wutte_anexia-blau_web.jpg","datePublished":"2017-08-23T07:51:05+00:00","dateModified":"2022-04-19T07:22:20+00:00","author":{"@id":"https:\/\/anexia.com\/blog\/#\/schema\/person\/926f6b9e5aeed88b145cf86d87fd09de"},"description":"Mit PJAX die Webseiten-Performance steigern - wie zeigt euch Manuel in diesem Tutorial.","breadcrumb":{"@id":"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/#primaryimage","url":"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2015\/01\/Manuel-Wutte_anexia-blau_web.jpg","contentUrl":"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2015\/01\/Manuel-Wutte_anexia-blau_web.jpg","width":1600,"height":1067},{"@type":"BreadcrumbList","@id":"https:\/\/anexia.com\/blog\/de\/mit-pjax-die-webseiten-performance-steigern\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/anexia.com\/blog\/de\/"},{"@type":"ListItem","position":2,"name":"Mit PJAX die Webseiten-Performance steigern"}]},{"@type":"WebSite","@id":"https:\/\/anexia.com\/blog\/#website","url":"https:\/\/anexia.com\/blog\/","name":"ANEXIA Blog","description":"[:de] ANEXIA Blog - Technischen Themen, Anexia News und Insights [:]","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/anexia.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de"},{"@type":"Person","@id":"https:\/\/anexia.com\/blog\/#\/schema\/person\/926f6b9e5aeed88b145cf86d87fd09de","name":"Manuel Wutte","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/anexia.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/9528a61f48f4294cd5f7cd8a4141bd55?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9528a61f48f4294cd5f7cd8a4141bd55?s=96&d=mm&r=g","caption":"Manuel Wutte"},"url":"https:\/\/anexia.com\/blog\/author\/mwu\/"}]}},"lang":"de","translations":{"de":2754,"en":6783},"amp_enabled":true,"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/posts\/2754"}],"collection":[{"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/comments?post=2754"}],"version-history":[{"count":43,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/posts\/2754\/revisions"}],"predecessor-version":[{"id":6785,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/posts\/2754\/revisions\/6785"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/media\/515"}],"wp:attachment":[{"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/media?parent=2754"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/categories?post=2754"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/tags?post=2754"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}