{"id":15721,"date":"2026-09-06T11:02:58","date_gmt":"2026-09-06T09:02:58","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/script-loading-execution-order-analyzer\/"},"modified":"2026-09-06T11:02:58","modified_gmt":"2026-09-06T09:02:58","slug":"script-loading-execution-order-analyzer","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/script-loading-execution-order-analyzer\/","title":{"rendered":"Script Loading and Execution Order Analyzer: what a script sees when it runs"},"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;\">A script without defer and without async stops the parser exactly where it stands. It therefore sees what comes before it in the document and nothing after it. That position is measurable in the raw HTML, and with it the amount of markup that is still missing when the script runs.<\/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;\">Page address<\/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;\">The page is fetched once from this server and read as text. Only the request is stored, for the hourly limit.<\/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;\">Analyse scripts<\/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;\">Eight queries per hour, at most 3 MB per document, private address ranges are refused. Nothing is rendered and no script is executed.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"A script without defer and without async stops the parser exactly where it stands. It therefore sees what comes before it in the document and nothing after it. That position is measurable in the raw HTML, and with it the amount of markup that is still missing when the script runs.\",\"label_url\":\"Page address\",\"datenschutz\":\"The page is fetched once from this server and read as text. Only the request is stored, for the hourly limit.\",\"knopf\":\"Analyse scripts\",\"grenze\":\"Eight queries per hour, at most 3 MB per document, private address ranges are refused. Nothing is rendered and no script is executed.\",\"laeuft\":\"Fetching the document and reading the script tags \u2026\",\"urteil_gut\":\"Nothing stands in the way\",\"urteil_warnung\":\"Worth a look\",\"urteil_kritisch\":\"Needs attention\",\"zusammenfassung\":\"{gesamt} script tags in a document of {bytes}, {blockierend} of them stop the parser.\",\"h_klassen\":\"By class\",\"h_sicht\":\"Where the parser stops last\",\"h_skripte\":\"Scripts in document order\",\"h_befunde\":\"Findings\",\"spalte_klasse\":\"Class\",\"spalte_anzahl\":\"Count\",\"spalte_bedeutung\":\"What it means\",\"spalte_nr\":\"No.\",\"spalte_ort\":\"Place\",\"spalte_stelle\":\"Position\",\"spalte_quelle\":\"Source\",\"klasse_blockierend\":\"blocking\",\"klasse_module\":\"module\",\"klasse_defer\":\"defer\",\"klasse_async\":\"async\",\"klasse_daten\":\"data\",\"klasse_hilfe_blockierend\":\"Stops the parser and runs immediately.\",\"klasse_hilfe_module\":\"Loads alongside, runs after parsing, in order.\",\"klasse_hilfe_defer\":\"Loads alongside, runs after parsing, in order.\",\"klasse_hilfe_async\":\"Loads alongside and runs as soon as it arrives \u2014 the order is open.\",\"klasse_hilfe_daten\":\"JSON-LD and other types that are not code at all.\",\"ort_kopf\":\"head\",\"ort_koerper\":\"body\",\"eingebettet\":\"inline\",\"sicht_kopf\":\"The last blocking script sits at {anteil} % of the document\",\"sicht_text\":\"At that moment {fehlend} of markup is still unparsed, so the script cannot see any of it. Source: {quelle}.\",\"sicht_keins\":\"No script stops the parser. Everything is deferred, a module or async.\",\"balken_legende\":\"The bar shows how much of the document is parsed when the last blocking script runs.\",\"zeile_adresse\":\"Address\",\"zeile_status\":\"Status\",\"zeile_groesse\":\"Document size\",\"zeile_preconnect\":\"preconnect hints\",\"zeile_preload\":\"preload hints\",\"zeile_dauer\":\"Duration\",\"zeile_limit\":\"Queries left this hour\",\"keine_befunde\":\"No findings.\",\"stufe_hoch\":\"High\",\"stufe_mittel\":\"Medium\",\"stufe_niedrig\":\"Low\",\"stufe_info\":\"Note\",\"stufe_gut\":\"Good\",\"befund_kein_html\":\"The answer is not HTML || Content type is {typ}, so there is nothing to read script tags from.\",\"befund_gekappt\":\"The document was cut off || Only the first {bytes} bytes were read; script tags after that are missing from this analysis.\",\"befund_weitergeleitet\":\"Redirected {spruenge} times || The document was read at {endurl}.\",\"befund_zu_viele_skripte\":\"{gesamt} script tags || The table lists the first {gezeigt}; the counts cover all of them.\",\"befund_blockierend_im_kopf\":\"{anzahl} blocking scripts in the head || The first one is {erstes}. Every one of them delays the first paint, because the parser reaches no visible element until they are done.\",\"befund_blockierend_fremd\":\"Blocking script from another host || {anzahl} of them, from {hosts}. A cross-origin round trip, and the parser waits for it \u2014 the one case where a slow third party stops the page rather than just loading late.\",\"befund_vor_der_formatvorlage\":\"{anzahl} blocking scripts before the first stylesheet || Their position looks harmless, but a script that runs before the stylesheet arrives measures a layout that has not been styled yet.\",\"befund_document_write\":\"document.write is used || {anzahl} scripts contain it. Browsers ignore it in scripts injected during parsing, and it has been the classic cause of a page rebuilding itself from scratch.\",\"befund_doppelt_eingebunden\":\"The same source is included more than once || {anzahl} times, for instance {adressen}. The second request is served from cache, but the script runs twice.\",\"befund_grosses_inline\":\"Large inline script || {anzahl} of them, the largest {bytes} bytes. Inline code cannot be cached separately and is downloaded again with every page.\",\"befund_fremd_ohne_integrity\":\"{anzahl} third-party scripts without an integrity attribute || Without it there is no check that the delivered file is the expected one.\",\"befund_async_und_defer\":\"async and defer side by side || {async} async and {defer} deferred. Both load alongside, but only defer keeps the order \u2014 mixing them makes the sequence hard to reason about.\",\"befund_nichts_blockiert\":\"No script stops the parser\",\"befund_sicht_haelfte\":\"The parser stops before the halfway point || At {anteil} % of the document, with {fehlend} bytes still to come. A script running there sees less than half the page.\",\"befund_kein_preconnect\":\"No preconnect for the third-party hosts || A blocking script from another host needs DNS, TCP and TLS before it can even start loading.\",\"fehler_adresse\":\"That address cannot be used.\",\"fehler_netz\":\"The server could not be reached.\",\"fehler_antwort\":\"The answer was not readable.\",\"fehler_captcha\":\"The spam check failed. A reload usually helps.\",\"fehler_kein_token\":\"The spam check did not produce a token.\",\"fehler_zu_viele\":\"Hourly limit of {limit} queries reached.\",\"fehler_zaehler\":\"The counter is unavailable.\",\"fehler_pruefdienst\":\"The spam check is unavailable.\",\"fehler_aufbau\":\"The tool is misconfigured.\",\"fehler_methode\":\"Wrong request method.\",\"fehler_eingabe\":\"The input was not readable.\",\"fehler_unbekannt\":\"Something went wrong.\",\"grund_leer\":\"No address was given.\",\"grund_zu_lang\":\"The address is too long.\",\"grund_schema\":\"Only http and https work.\",\"grund_unlesbar\":\"The address could not be parsed.\",\"grund_benutzerinfo\":\"Addresses with a user name are refused.\",\"grund_gesperrter_bereich\":\"That address points into a private network.\",\"grund_kein_punkt\":\"A host name needs a dot.\",\"grund_hostform\":\"A domain name is required, not an IP address.\",\"grund_port\":\"That port is not allowed.\",\"grund_kein_dns\":\"The name does not resolve.\"};<\/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>Reads every script tag of a page in document order, sorts them into blocking, defer, async, module and data, and measures the one number that decides how much a blocking script can see: how far into the document it sits, and how many bytes of markup are still unparsed at that moment. Nothing is rendered.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92757,91315,91115],"class_list":["post-15721","page","type-page","status-publish","hentry","tag-web-development","tag-web-performance","tag-web-security"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Script Loading and Execution Order Analyzer: what a script sees when it runs - 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\/en\/toolbox\/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=\"Script Loading and Execution Order Analyzer: what a script sees when it runs - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Reads every script tag of a page in document order, sorts them into blocking, defer, async, module and data, and measures the one number that decides how much a blocking script can see: how far into the document it sits, and how many bytes of markup are still unparsed at that moment. Nothing is rendered.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/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\\\/en\\\/toolbox\\\/script-loading-execution-order-analyzer\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/script-loading-execution-order-analyzer\\\/\",\"name\":\"Script Loading and Execution Order Analyzer: what a script sees when it runs - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-06T09:02:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/script-loading-execution-order-analyzer\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/script-loading-execution-order-analyzer\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/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\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Script Loading and Execution Order Analyzer: what a script sees when it runs\"}]},{\"@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":"Script Loading and Execution Order Analyzer: what a script sees when it runs - 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\/en\/toolbox\/script-loading-execution-order-analyzer\/","og_locale":"en_US","og_type":"article","og_title":"Script Loading and Execution Order Analyzer: what a script sees when it runs - Lukas Wojcik - Blog","og_description":"Reads every script tag of a page in document order, sorts them into blocking, defer, async, module and data, and measures the one number that decides how much a blocking script can see: how far into the document it sits, and how many bytes of markup are still unparsed at that moment. Nothing is rendered.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/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\/en\/toolbox\/script-loading-execution-order-analyzer\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/script-loading-execution-order-analyzer\/","name":"Script Loading and Execution Order Analyzer: what a script sees when it runs - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-06T09:02:58+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/script-loading-execution-order-analyzer\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/script-loading-execution-order-analyzer\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/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\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"Script Loading and Execution Order Analyzer: what a script sees when it runs"}]},{"@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\/15721","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=15721"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15721\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=15721"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}