{"id":15722,"date":"2026-09-06T11:03:03","date_gmt":"2026-09-06T09:03:03","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/script-loading-execution-order-analyzer\/"},"modified":"2026-09-06T11:03:03","modified_gmt":"2026-09-06T09:03:03","slug":"script-loading-execution-order-analyzer","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/script-loading-execution-order-analyzer\/","title":{"rendered":"Skript-Ladeanalyse: was ein Skript sieht, wenn es l\u00e4uft"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Ein Skript ohne defer und ohne async h\u00e4lt den Parser genau dort an, wo es steht. Es sieht damit, was im Dokument vor ihm steht, und nichts danach. Diese Stelle l\u00e4sst sich am rohen HTML messen, und mit ihr die Menge an Auszeichnung, die beim Ausf\u00fchren noch fehlt.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"sk-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Seitenadresse<\/label><br \/>\n        <input id=\"sk-url\" type=\"text\" value=\"https:\/\/www.heise.de\/\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace;\">\n    <\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">Die Seite wird einmal von diesem Server geholt und als Text gelesen. Gespeichert wird nur der Abruf, f\u00fcr die Stundengrenze.<\/p>\n<p>    <button id=\"sk-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Skripte analysieren<\/button><\/p>\n<div id=\"sk-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Acht Abfragen je Stunde, h\u00f6chstens 3 MB je Dokument, private Adressbereiche werden abgelehnt. Gerendert wird nichts, ausgef\u00fchrt wird kein Skript.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Ein Skript ohne defer und ohne async h\u00e4lt den Parser genau dort an, wo es steht. Es sieht damit, was im Dokument vor ihm steht, und nichts danach. Diese Stelle l\u00e4sst sich am rohen HTML messen, und mit ihr die Menge an Auszeichnung, die beim Ausf\u00fchren noch fehlt.\",\"label_url\":\"Seitenadresse\",\"datenschutz\":\"Die Seite wird einmal von diesem Server geholt und als Text gelesen. Gespeichert wird nur der Abruf, f\u00fcr die Stundengrenze.\",\"knopf\":\"Skripte analysieren\",\"grenze\":\"Acht Abfragen je Stunde, h\u00f6chstens 3 MB je Dokument, private Adressbereiche werden abgelehnt. Gerendert wird nichts, ausgef\u00fchrt wird kein Skript.\",\"laeuft\":\"Dokument wird geholt und die Skript-Tags gelesen \u2026\",\"urteil_gut\":\"Nichts steht im Weg\",\"urteil_warnung\":\"Einen Blick wert\",\"urteil_kritisch\":\"Braucht Aufmerksamkeit\",\"zusammenfassung\":\"{gesamt} Skript-Tags in einem Dokument von {bytes}, davon halten {blockierend} den Parser an.\",\"h_klassen\":\"Nach Klassen\",\"h_sicht\":\"Wo der Parser zuletzt stehen bleibt\",\"h_skripte\":\"Skripte in Dokumentreihenfolge\",\"h_befunde\":\"Befunde\",\"spalte_klasse\":\"Klasse\",\"spalte_anzahl\":\"Anzahl\",\"spalte_bedeutung\":\"Was das hei\u00dft\",\"spalte_nr\":\"Nr.\",\"spalte_ort\":\"Ort\",\"spalte_stelle\":\"Stelle\",\"spalte_quelle\":\"Quelle\",\"klasse_blockierend\":\"blockierend\",\"klasse_module\":\"module\",\"klasse_defer\":\"defer\",\"klasse_async\":\"async\",\"klasse_daten\":\"Daten\",\"klasse_hilfe_blockierend\":\"H\u00e4lt den Parser an und l\u00e4uft sofort.\",\"klasse_hilfe_module\":\"L\u00e4dt nebenher, l\u00e4uft nach dem Parsen, in Reihenfolge.\",\"klasse_hilfe_defer\":\"L\u00e4dt nebenher, l\u00e4uft nach dem Parsen, in Reihenfolge.\",\"klasse_hilfe_async\":\"L\u00e4dt nebenher und l\u00e4uft, sobald es da ist \u2014 die Reihenfolge bleibt offen.\",\"klasse_hilfe_daten\":\"JSON-LD und andere Typen, die gar kein Code sind.\",\"ort_kopf\":\"Kopf\",\"ort_koerper\":\"K\u00f6rper\",\"eingebettet\":\"eingebettet\",\"sicht_kopf\":\"Das letzte blockierende Skript steht bei {anteil} % des Dokuments\",\"sicht_text\":\"In diesem Moment sind noch {fehlend} Auszeichnung ungelesen, das Skript sieht davon nichts. Quelle: {quelle}.\",\"sicht_keins\":\"Kein Skript h\u00e4lt den Parser an. Alles ist defer, module oder async.\",\"balken_legende\":\"Der Balken zeigt, wie viel vom Dokument gelesen ist, wenn das letzte blockierende Skript l\u00e4uft.\",\"zeile_adresse\":\"Adresse\",\"zeile_status\":\"Status\",\"zeile_groesse\":\"Dokumentgr\u00f6\u00dfe\",\"zeile_preconnect\":\"preconnect-Hinweise\",\"zeile_preload\":\"preload-Hinweise\",\"zeile_dauer\":\"Dauer\",\"zeile_limit\":\"Abfragen in dieser Stunde \u00fcbrig\",\"keine_befunde\":\"Keine Befunde.\",\"stufe_hoch\":\"Hoch\",\"stufe_mittel\":\"Mittel\",\"stufe_niedrig\":\"Niedrig\",\"stufe_info\":\"Hinweis\",\"stufe_gut\":\"Gut\",\"befund_kein_html\":\"Die Antwort ist kein HTML || Der Inhaltstyp ist {typ}, damit gibt es nichts, woraus sich Skript-Tags lesen lie\u00dfen.\",\"befund_gekappt\":\"Das Dokument wurde abgeschnitten || Gelesen wurden nur die ersten {bytes} Bytes; Skript-Tags danach fehlen in dieser Auswertung.\",\"befund_weitergeleitet\":\"{spruenge} Weiterleitungen || Gelesen wurde das Dokument unter {endurl}.\",\"befund_zu_viele_skripte\":\"{gesamt} Skript-Tags || Die Tabelle f\u00fchrt die ersten {gezeigt} auf; die Z\u00e4hlung umfasst alle.\",\"befund_blockierend_im_kopf\":\"{anzahl} blockierende Skripte im Kopf || Das erste ist {erstes}. Jedes davon verz\u00f6gert die erste Anzeige, weil der Parser bis dahin kein sichtbares Element erreicht.\",\"befund_blockierend_fremd\":\"Blockierendes Skript von einem fremden Host || {anzahl} davon, von {hosts}. Ein Umweg \u00fcber eine fremde Verbindung, und der Parser wartet darauf \u2014 der eine Fall, in dem ein langsamer Dritter die Seite anh\u00e4lt statt blo\u00df sp\u00e4t zu laden.\",\"befund_vor_der_formatvorlage\":\"{anzahl} blockierende Skripte vor der ersten Formatvorlage || Die Stelle wirkt harmlos, aber ein Skript, das vor der Vorlage l\u00e4uft, misst ein Layout, das noch nicht gestaltet ist.\",\"befund_document_write\":\"document.write wird verwendet || In {anzahl} Skripten. Browser \u00fcbergehen es in Skripten, die w\u00e4hrend des Parsens eingef\u00fcgt wurden, und es war der klassische Grund daf\u00fcr, dass eine Seite sich selbst noch einmal von vorn aufbaut.\",\"befund_doppelt_eingebunden\":\"Dieselbe Quelle steht mehrfach darin || {anzahl} Mal, etwa {adressen}. Der zweite Abruf kommt aus dem Zwischenspeicher, das Skript l\u00e4uft aber zweimal.\",\"befund_grosses_inline\":\"Gro\u00dfes eingebettetes Skript || {anzahl} davon, das gr\u00f6\u00dfte {bytes} Bytes. Eingebetteter Code l\u00e4sst sich nicht getrennt zwischenspeichern und kommt mit jeder Seite erneut mit.\",\"befund_fremd_ohne_integrity\":\"{anzahl} fremde Skripte ohne integrity-Attribut || Ohne dieses Attribut wird nicht gepr\u00fcft, ob die ausgelieferte Datei die erwartete ist.\",\"befund_async_und_defer\":\"async und defer nebeneinander || {async} mit async, {defer} mit defer. Beides l\u00e4dt nebenher, aber nur defer h\u00e4lt die Reihenfolge \u2014 gemischt wird die Abfolge schwer nachvollziehbar.\",\"befund_nichts_blockiert\":\"Kein Skript h\u00e4lt den Parser an\",\"befund_sicht_haelfte\":\"Der Parser bleibt vor der H\u00e4lfte stehen || Bei {anteil} % des Dokuments, mit {fehlend} Bytes, die noch kommen. Ein Skript an dieser Stelle sieht weniger als die halbe Seite.\",\"befund_kein_preconnect\":\"Kein preconnect f\u00fcr die fremden Hosts || Ein blockierendes Skript von einem fremden Host braucht DNS, TCP und TLS, bevor es \u00fcberhaupt zu laden beginnt.\",\"fehler_adresse\":\"Diese Adresse l\u00e4sst sich nicht verwenden.\",\"fehler_netz\":\"Der Server war nicht erreichbar.\",\"fehler_antwort\":\"Die Antwort war nicht lesbar.\",\"fehler_captcha\":\"Die Spam-Pr\u00fcfung ist fehlgeschlagen. Ein Neuladen hilft meistens.\",\"fehler_kein_token\":\"Die Spam-Pr\u00fcfung hat kein Merkmal geliefert.\",\"fehler_zu_viele\":\"Stundengrenze von {limit} Abfragen erreicht.\",\"fehler_zaehler\":\"Der Z\u00e4hler steht nicht zur Verf\u00fcgung.\",\"fehler_pruefdienst\":\"Die Spam-Pr\u00fcfung steht nicht zur Verf\u00fcgung.\",\"fehler_aufbau\":\"Das Werkzeug ist falsch eingerichtet.\",\"fehler_methode\":\"Falsche Anfrageart.\",\"fehler_eingabe\":\"Die Eingabe war nicht lesbar.\",\"fehler_unbekannt\":\"Etwas ist schiefgegangen.\",\"grund_leer\":\"Es wurde keine Adresse angegeben.\",\"grund_zu_lang\":\"Die Adresse ist zu lang.\",\"grund_schema\":\"Nur http und https funktionieren.\",\"grund_unlesbar\":\"Die Adresse lie\u00df sich nicht zerlegen.\",\"grund_benutzerinfo\":\"Adressen mit Benutzernamen werden abgelehnt.\",\"grund_gesperrter_bereich\":\"Diese Adresse zeigt in ein privates Netz.\",\"grund_kein_punkt\":\"Ein Hostname braucht einen Punkt.\",\"grund_hostform\":\"N\u00f6tig ist ein Domainname, keine IP-Adresse.\",\"grund_port\":\"Dieser Port ist nicht zugelassen.\",\"grund_kein_dns\":\"Der Name l\u00f6st nicht auf.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-skripte.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];\n    var KLASSEN = ['blockierend', 'module', 'defer', 'async', 'daten'];<\/p>\n<p>    function liste(w) { return Array.isArray(w) ? w : []; }\n    function zahl(w) { return (typeof w === 'number' && isFinite(w)) ? w : null; }\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_0-9]+)\\}\/g, function (m, k) {\n            return (daten && daten[k] !== undefined && daten[k] !== null) ? String(daten[k]) : m;\n        });\n    }\n    function kb(bytes) { if (bytes === null) { return '-'; } if (bytes < 1024) { return bytes + ' B'; } return (Math.round(bytes \/ 102.4) \/ 10) + ' KB'; }\n\n    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: String(a.fehler), grund: a.grund || null, limit: zahl(a.limit) }; }\n        var befunde = liste(a.befunde).map(function (f) {\n            return { key: String(f.key || ''), stufe: STUFEN.indexOf(f.stufe) === -1 ? 'info' : f.stufe, daten: (f.daten &#038;&#038; typeof f.daten === 'object') ? f.daten : {} };\n        });\n        var gruppen = {};\n        STUFEN.forEach(function (s) { gruppen[s] = befunde.filter(function (f) { return f.stufe === s; }); });\n        var z = (a.zaehlung &#038;&#038; typeof a.zaehlung === 'object') ? a.zaehlung : {};\n        var zaehlung = {};\n        KLASSEN.forEach(function (k) { zaehlung[k] = zahl(z[k]) || 0; });\n        var h = (a.hinweise &#038;&#038; typeof a.hinweise === 'object') ? a.hinweise : {};\n        var s = (a.sicht &#038;&#038; typeof a.sicht === 'object') ? a.sicht : null;\n        return {\n            fehler: null,\n            url: a.url ? String(a.url) : '', endurl: a.endurl ? String(a.endurl) : '',\n            status: zahl(a.status), typ: a.typ ? String(a.typ) : '', bytes: zahl(a.bytes),\n            urteil: (a.urteil === 'gut' || a.urteil === 'warnung' || a.urteil === 'kritisch') ? a.urteil : 'kritisch',\n            zaehlung: zaehlung, gesamt: zahl(a.gesamt) || 0,\n            skripte: liste(a.skripte).map(function (x) {\n                x = x || {};\n                return {\n                    nr: zahl(x.nr) || 0,\n                    klasse: KLASSEN.indexOf(x.klasse) === -1 ? 'daten' : x.klasse,\n                    src: x.src ? String(x.src) : '', host: x.host ? String(x.host) : '',\n                    fremd: !!x.fremd, imKopf: !!x.im_kopf, anteil: zahl(x.anteil) || 0,\n                    rumpf: zahl(x.rumpf) || 0, integrity: !!x.integrity,\n                    vorVorlage: !!x.vor_vorlage, schreibt: !!x.schreibt\n                };\n            }),\n            hinweise: { preload: zahl(h.preload) || 0, preconnect: zahl(h.preconnect) || 0,\n                modulepreload: zahl(h.modulepreload) || 0, dnsPrefetch: zahl(h['dns-prefetch']) || 0 },\n            sicht: s ? { anteil: zahl(s.anteil) || 0, fehlend: zahl(s.fehlend) || 0,\n                src: s.src ? String(s.src) : null, imKopf: !!s.im_kopf } : null,\n            befunde: befunde, stufengruppen: gruppen,\n            dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }\n\n    function skriptLaden() {\n        return new Promise(function (auf) {\n            if (window.grecaptcha) { auf(true); return; }\n            var s = document.createElement('script');\n            s.src = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + SITEKEY;\n            s.onload = function () { auf(true); }; s.onerror = function () { auf(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { auf(!!window.grecaptcha); }, 8000);\n        });\n    }\n    function tokenHolen() {\n        return skriptLaden().then(function (da) {\n            if (!da || !window.grecaptcha || !window.grecaptcha.ready) { return null; }\n            return new Promise(function (auf) {\n                var fertig = false;\n                function einmal(w) { if (!fertig) { fertig = true; auf(w); } }\n                setTimeout(function () { einmal(null); }, 12000);\n                try {\n                    window.grecaptcha.ready(function () {\n                        if (fertig) { return; }\n                        if (!window.grecaptcha.execute) { einmal(null); return; }\n                        window.grecaptcha.execute(SITEKEY, { action: 'skripte' }).then(function (t) { einmal(t || null); }, function () { einmal(null); });\n                    });\n                } catch (e) { einmal(null); }\n            });\n        }, function () { return null; });\n    }\n    function abfragen(url) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ url: url, token: token || '' }) })\n                .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n        });\n    }\n\n    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.SK = { bewerten: bewerten, darstellen: null, text: text, kb: kb,\n        ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, KLASSEN: KLASSEN, T: T };\n\n    var btn = document.getElementById('sk-btn');\n    var out = document.getElementById('sk-ausgabe');\n    if (!btn || !out) { return; }\n\n    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined &#038;&#038; txt !== null) { e.textContent = txt; } return e; }\n    function wert(id) { var e = document.getElementById(id); return e ? e.value : ''; }\n    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 22px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 14px 16px; margin: 0 0 10px;';\n    var GUT = ' color: #7ee787;', WARN = ' color: #ffa94d;', ROT = ' color: #ff7b72;', GRAU = ' color: #8a8a99;';\n    var FARBEN = { hoch: '#ff7b72', mittel: '#ffa94d', niedrig: '#e3b341', info: '#8a8a99', gut: '#7ee787' };\n    var URTEIL = { gut: GUT, warnung: WARN, kritisch: ROT };\n    var KLASSE_FARBE = { blockierend: ROT, module: GUT, defer: GUT, async: WARN, daten: GRAU };\n    function gitter(sp) { return el('div', 'display: grid; grid-template-columns: ' + sp + '; gap: 0 18px; align-items: baseline;'); }\n    function paar(g, n, w, stil) { g.appendChild(el('div', ZELLE, n)); g.appendChild(el('div', ZELLE_WERT + (stil || ''), w)); }\n\n    function darstellen(b, ziel) {\n        ziel.innerHTML = '';\n        if (b.fehler) {\n            var txt = T['fehler_' + b.fehler] || T.fehler_unbekannt;\n            if (b.grund &#038;&#038; T['grund_' + b.grund]) { txt = txt + ' ' + T['grund_' + b.grund]; }\n            if (b.limit !== null) { txt = txt.replace('{limit}', String(b.limit)); }\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', txt));\n            return;\n        }\n\n        ziel.appendChild(el('div', 'font-size: 1.05rem; font-weight: 700; margin: 0 0 6px;' + URTEIL[b.urteil], T['urteil_' + b.urteil]));\n        ziel.appendChild(el('p', ZELLE + ' margin: 0 0 12px;', text('zusammenfassung', { gesamt: b.gesamt, blockierend: b.zaehlung.blockierend, bytes: kb(b.bytes) })));\n\n        \/\/ --- Zaehlung je Klasse\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_klassen));\n        var gk = gitter('auto auto auto');\n        [T.spalte_klasse, T.spalte_anzahl, T.spalte_bedeutung].forEach(function (s) {\n            gk.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee);', s));\n        });\n        KLASSEN.forEach(function (k) {\n            gk.appendChild(el('div', ZELLE_WERT + KLASSE_FARBE[k], T['klasse_' + k]));\n            gk.appendChild(el('div', ZELLE_WERT, String(b.zaehlung[k])));\n            gk.appendChild(el('div', ZELLE, T['klasse_hilfe_' + k]));\n        });\n        ziel.appendChild(gk);\n\n        \/\/ --- Der Kern: wo der Parser zuletzt stehen bleibt\n        if (b.sicht) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_sicht));\n            var kasten = el('div', KASTEN + ' border-left: 3px solid ' + (b.sicht.anteil < 50 ? FARBEN.mittel : FARBEN.info) + ';');\n            kasten.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;',\n                text('sicht_kopf', { anteil: b.sicht.anteil })));\n            kasten.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;',\n                text('sicht_text', { fehlend: kb(b.sicht.fehlend), quelle: b.sicht.src || T.eingebettet })));\n            ziel.appendChild(kasten);\n            \/\/ Ein Balken macht die Stelle sichtbar.\n            var bahn = el('div', 'height: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 5px; overflow: hidden; margin: 4px 0 2px;');\n            bahn.appendChild(el('div', 'height: 100%; width: ' + Math.max(1, Math.min(100, b.sicht.anteil)) + '%; background: ' + (b.sicht.anteil < 50 ? FARBEN.mittel : FARBEN.gut) + ';'));\n            ziel.appendChild(bahn);\n            ziel.appendChild(el('p', ZELLE + GRAU + ' margin: 0 0 6px;', T.balken_legende));\n        } else {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_sicht));\n            ziel.appendChild(el('p', ZELLE + GUT + ' margin: 0;', T.sicht_keins));\n        }\n\n        \/\/ --- Die Skripte in Dokumentreihenfolge\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_skripte));\n        var huelle = el('div', 'overflow-x: auto;');\n        var gs = gitter('auto auto auto auto auto');\n        [T.spalte_nr, T.spalte_klasse, T.spalte_ort, T.spalte_stelle, T.spalte_quelle].forEach(function (s) {\n            gs.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee); white-space: nowrap;', s));\n        });\n        b.skripte.forEach(function (s) {\n            gs.appendChild(el('div', ZELLE_WERT + GRAU, String(s.nr)));\n            gs.appendChild(el('div', ZELLE_WERT + KLASSE_FARBE[s.klasse] + ' white-space: nowrap;', T['klasse_' + s.klasse]));\n            gs.appendChild(el('div', ZELLE_WERT + GRAU + ' white-space: nowrap;', s.imKopf ? T.ort_kopf : T.ort_koerper));\n            gs.appendChild(el('div', ZELLE_WERT + GRAU + ' white-space: nowrap;', s.anteil + ' %'));\n            var q = s.src === '' ? (T.eingebettet + ' (' + kb(s.rumpf) + ')') : s.src;\n            gs.appendChild(el('div', ZELLE_WERT + (s.fremd ? WARN : ''), q));\n        });\n        huelle.appendChild(gs);\n        ziel.appendChild(huelle);\n\n        \/\/ --- Abruf und Ladehinweise\n        var ga = gitter('auto auto');\n        paar(ga, T.zeile_adresse, b.endurl || b.url, GRAU);\n        paar(ga, T.zeile_status, b.status === null ? '-' : String(b.status), b.status === 200 ? GUT : WARN);\n        paar(ga, T.zeile_groesse, kb(b.bytes), GRAU);\n        paar(ga, T.zeile_preconnect, String(b.hinweise.preconnect), GRAU);\n        paar(ga, T.zeile_preload, String(b.hinweise.preload), GRAU);\n        if (b.dauer !== null) { paar(ga, T.zeile_dauer, b.dauer + ' ms', GRAU); }\n        if (b.limitRest !== null) { paar(ga, T.zeile_limit, String(b.limitRest), GRAU); }\n        ziel.appendChild(ga);\n\n        \/\/ --- Befunde\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        var irgendwas = false;\n        STUFEN.forEach(function (s) {\n            var gr = b.stufengruppen[s];\n            if (!gr.length) { return; }\n            irgendwas = true;\n            ziel.appendChild(el('div', 'font-weight: 700; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.5px; margin: 14px 0 6px; color: ' + FARBEN[s] + ';', T['stufe_' + s] + ' (' + gr.length + ')'));\n            gr.forEach(function (f) {\n                var k = el('div', KASTEN + ' border-left: 3px solid ' + FARBEN[s] + ';');\n                var d = {};\n                Object.keys(f.daten).forEach(function (n) {\n                    var w = f.daten[n];\n                    d[n] = Array.isArray(w) ? w.join(', ') : w;\n                });\n                var t = text('befund_' + f.key, d) || f.key;\n                var teile = t.split(' || ');\n                k.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;', teile[0]));\n                if (teile[1]) { k.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;', teile[1])); }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }\n    }\n    window.LW_TEST.SK.darstellen = darstellen;\n\n    var laeuft = false;\n    btn.addEventListener('click', function () {\n        if (laeuft) { return; }\n        laeuft = true; btn.disabled = true;\n        out.innerHTML = '';\n        out.appendChild(el('p', ZELLE + GRAU + ' margin: 0;', T.laeuft));\n        abfragen(wert('sk-url')).then(function (a) { darstellen(bewerten(a), out); laeuft = false; btn.disabled = false; },\n            function () { darstellen(bewerten({ fehler: 'netz' }), out); laeuft = false; btn.disabled = false; });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Liest jedes Skript-Tag einer Seite in Dokumentreihenfolge, sortiert sie nach blockierend, defer, async, module und Daten und misst die eine Zahl, an der die Sicht eines blockierenden Skripts h\u00e4ngt: wie weit im Dokument es steht und wie viele Bytes Auszeichnung in diesem Moment noch ungelesen sind. Gerendert wird nichts.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9283,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92759,92292,92071],"class_list":["post-15722","page","type-page","status-publish","hentry","tag-web-development-de","tag-web-performance-de","tag-web-security-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Skript-Ladeanalyse: was ein Skript sieht, wenn es l\u00e4uft - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/script-loading-execution-order-analyzer\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Skript-Ladeanalyse: was ein Skript sieht, wenn es l\u00e4uft - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Liest jedes Skript-Tag einer Seite in Dokumentreihenfolge, sortiert sie nach blockierend, defer, async, module und Daten und misst die eine Zahl, an der die Sicht eines blockierenden Skripts h\u00e4ngt: wie weit im Dokument es steht und wie viele Bytes Auszeichnung in diesem Moment noch ungelesen sind. Gerendert wird nichts.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/script-loading-execution-order-analyzer\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/script-loading-execution-order-analyzer\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/script-loading-execution-order-analyzer\\\/\",\"name\":\"Skript-Ladeanalyse: was ein Skript sieht, wenn es l\u00e4uft - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-06T09:03:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/script-loading-execution-order-analyzer\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/script-loading-execution-order-analyzer\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/script-loading-execution-order-analyzer\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-2\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Skript-Ladeanalyse: was ein Skript sieht, wenn es l\u00e4uft\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Skript-Ladeanalyse: was ein Skript sieht, wenn es l\u00e4uft - Lukas Wojcik - Blog","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:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/script-loading-execution-order-analyzer\/","og_locale":"en_US","og_type":"article","og_title":"Skript-Ladeanalyse: was ein Skript sieht, wenn es l\u00e4uft - Lukas Wojcik - Blog","og_description":"Liest jedes Skript-Tag einer Seite in Dokumentreihenfolge, sortiert sie nach blockierend, defer, async, module und Daten und misst die eine Zahl, an der die Sicht eines blockierenden Skripts h\u00e4ngt: wie weit im Dokument es steht und wie viele Bytes Auszeichnung in diesem Moment noch ungelesen sind. Gerendert wird nichts.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/script-loading-execution-order-analyzer\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/script-loading-execution-order-analyzer\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/script-loading-execution-order-analyzer\/","name":"Skript-Ladeanalyse: was ein Skript sieht, wenn es l\u00e4uft - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-06T09:03:03+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/script-loading-execution-order-analyzer\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/script-loading-execution-order-analyzer\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/script-loading-execution-order-analyzer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-2\/"},{"@type":"ListItem","position":3,"name":"Skript-Ladeanalyse: was ein Skript sieht, wenn es l\u00e4uft"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=15722"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15722\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9283"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=15722"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}