perf: Move Scripts to Head and Defer

This commit is contained in:
Lorenz Leutgeb
2026-05-02 19:05:41 +02:00
parent 34b9209509
commit cd875ccdd0
8 changed files with 94 additions and 80 deletions
+3 -20
View File
@@ -21,24 +21,7 @@
</span>
</blockquote>
<script defer src="{{ '/assets/js/latest-release.js' | relative_url }}"></script>
<script>
const release = document.getElementById('release');
fetch("https://files.radicle.dev/releases/latest/radicle.json")
.then(res => res.json())
.then(data => {
if (data.timestamp === "{{ site.data.releases.radicle.timestamp }}") {
console.info("Release data is up to date.")
return;
}
const version = data.version;
const commit = data.commit;
const release = document.getElementById("release");
const releaseInfo = document.getElementById("release-info");
releaseInfo.innerText = `Radicle ${version}`;
document.getElementById("release-commit").innerText = commit;
document.getElementById("release-timestamp").innerText = `(${new Date(data.timestamp * 1000).toISOString()})`;
});
</script>
document.addEventListener('DOMContentLoaded', () => updateLatestRelease("{{ site.data.releases.radicle.timestamp }}"));
</script>
+5 -16
View File
@@ -2,13 +2,17 @@
<html>
<head>
{% include meta.html %}
<link rel="stylesheet" type="text/css" href="{{ "/assets/css/page.css" | relative_url }}"/>
<link rel="stylesheet" type="text/css" href="{{ '/assets/css/page.css' | relative_url }}"/>
<meta rel="me" href="{{ '@radicle@toot.radicle.xyz' | fedi_to_https }}" /><!-- old account -->
<meta rel="me" href="{{ site.fedi | fedi_to_https }}" />
<link rel="alternate" type="application/rss+xml" title="RSS Feed for the Radicle Website" href="/feed.xml" />
{% for url in page.preconnect %}
<link rel="preconnect" href="{{ url }}" />
{% endfor %}
{% for script in page.scripts %}
<script defer src="{{ script | prepend: '/assets/js/' | append: '.js' | relative_url }}"></script>
{% endfor %}
<script defer src="{{ 'toggle-theme' | prepend: '/assets/js/' | append: '.js' | relative_url }}"></script>
</head>
<body>
<img class="desktop" width="160" height="160" id="ribbon" src="/assets/images/ribbon.svg" usemap="#ribbon-map"/>
@@ -37,20 +41,5 @@
{{ content }}
</main>
{% include fixed.html %}
<script src="{{ "/assets/js/toggle-theme.js" | relative_url }}"></script>
<script>
const copyButton = document.getElementById("install");
const copyResult = document.getElementById("install-copy");
const textToCopy = document.getElementById("install-command").innerText;
copyButton.addEventListener("click", async function () {
try {
await navigator.clipboard.writeText(textToCopy);
copyResult.innerText = "copied";
} catch (err) {
console.error("Failed to copy text: ", err);
}
});
</script>
</body>
</html>
+4 -1
View File
@@ -6,6 +6,10 @@
{% for url in page.preconnect %}
<link rel="preconnect" href="{{ url }}" />
{% endfor %}
{% for script in page.scripts %}
<script defer src="{{ script | prepend: '/assets/js/' | append: '.js' | relative_url }}"></script>
{% endfor %}
<script defer src="{{ 'toggle-theme' | prepend: '/assets/js/' | append: '.js' | relative_url }}"></script>
</head>
<body class="{{ page.variant }}">
{% include header.html %}
@@ -13,6 +17,5 @@
{{ content }}
</main>
{% include fixed.html %}
<script src="{{ "/assets/js/toggle-theme.js" | relative_url }}"></script>
</body>
</html>
+8 -43
View File
@@ -6,6 +6,8 @@ binary: ["unknown-linux-musl", "apple-darwin"]
arch: ["x86_64", "aarch64"]
preconnect:
- https://files.radicle.dev
scripts:
- download
---
This is Radicle's <strong class="highlight">download</strong> page,
which references various ways of downloading Radicle to your machine.
@@ -170,46 +172,9 @@ This will place binaries in `~/.radicle/bin` and manuals in `~/.radicle/man`,
and overwrite any existing Radicle binaries.
<script>
{% for release in site.releases %}
getRelease("{{ release.name }}", "{{ release.base }}", "{{ release.id }}", "{{ site.data.releases[release.id].timestamp }}");
{% endfor %}
function getRelease(name, urlBase, releaseId, knownTimestamp) {
const releases = document.getElementById(`${releaseId}-releases`);
fetch(`${urlBase}/${releaseId}.json`)
.then(res => res.json())
.then(data => {
if (data.timestamp === knownTimestamp) {
console.info(`Release data for ${name} is up to date.`)
return;
}
const version = data.version;
const commit = data.commit;
const release = document.getElementById(`${releaseId}-release-header`);
const releaseName = document.getElementById(`${releaseId}-release-name`);
const releaseInfo = document.getElementById(`${releaseId}-release-info`);
document.querySelectorAll(`#${releaseId}-releases [data-release-binary]`).forEach((row) => {
const arch = row.dataset.releaseArch;
const binary = row.dataset.releaseBinary;
const archive = `${releaseId}-${version}-${arch}-${binary}.tar.xz`;
const url = `${urlBase}/${archive}`;
row.querySelector(".release-arch").innerText = arch;
row.querySelector(".release-url").innerText = archive;
row.querySelector(".release-sig").innerText = ".sig";
row.querySelector(".release-checksum").innerText = ".sha256";
row.querySelector(".release-url").href = url;
row.querySelector(".release-sig").href = `${url}.sig`;
row.querySelector(".release-checksum").href = `${url}.sha256`;
});
release.classList.remove("loading");
releaseName.innerText = `${name} ${version}`;
releaseInfo.innerHTML = `Built from commit <code>${commit}</code> on ${new Date(data.timestamp * 1000).toISOString()}.`;
});
}
</script>
document.addEventListener('DOMContentLoaded', () => {
{% for release in site.releases %}
getRelease("{{ release.name }}", "{{ release.base }}", "{{ release.id }}", "{{ site.data.releases[release.id].timestamp }}");
{% endfor %}
});
</script>
+12
View File
@@ -0,0 +1,12 @@
const copyButton = document.getElementById("install");
const copyResult = document.getElementById("install-copy");
const textToCopy = document.getElementById("install-command").innerText;
copyButton.addEventListener("click", async function () {
try {
await navigator.clipboard.writeText(textToCopy);
copyResult.innerText = "copied";
} catch (err) {
console.error("Failed to copy text: ", err);
}
});
+38
View File
@@ -0,0 +1,38 @@
function getRelease(name, urlBase, releaseId, knownTimestamp) {
const releases = document.getElementById(`${releaseId}-releases`);
fetch(`${urlBase}/${releaseId}.json`)
.then(res => res.json())
.then(data => {
if (data.timestamp === knownTimestamp) {
console.info(`Release data for ${name} is up to date.`)
return;
}
const version = data.version;
const commit = data.commit;
const release = document.getElementById(`${releaseId}-release-header`);
const releaseName = document.getElementById(`${releaseId}-release-name`);
const releaseInfo = document.getElementById(`${releaseId}-release-info`);
document.querySelectorAll(`#${releaseId}-releases [data-release-binary]`).forEach((row) => {
const arch = row.dataset.releaseArch;
const binary = row.dataset.releaseBinary;
const archive = `${releaseId}-${version}-${arch}-${binary}.tar.xz`;
const url = `${urlBase}/${archive}`;
row.querySelector(".release-arch").innerText = arch;
row.querySelector(".release-url").innerText = archive;
row.querySelector(".release-sig").innerText = ".sig";
row.querySelector(".release-checksum").innerText = ".sha256";
row.querySelector(".release-url").href = url;
row.querySelector(".release-sig").href = `${url}.sig`;
row.querySelector(".release-checksum").href = `${url}.sha256`;
});
release.classList.remove("loading");
releaseName.innerText = `${name} ${version}`;
releaseInfo.innerHTML = `Built from commit <code>${commit}</code> on ${new Date(data.timestamp * 1000).toISOString()}.`;
});
}
+21
View File
@@ -0,0 +1,21 @@
async function updateLatestRelease(knownTimestamp) {
const release = document.getElementById('release');
fetch("https://files.radicle.dev/releases/latest/radicle.json")
.then(res => res.json())
.then(data => {
if (data.timestamp === knownTimestamp) {
console.info("Release data is up to date.")
return;
}
const version = data.version;
const commit = data.commit;
const release = document.getElementById("release");
const releaseInfo = document.getElementById("release-info");
releaseInfo.innerText = `Radicle ${version}`;
document.getElementById("release-commit").innerText = commit;
document.getElementById("release-timestamp").innerText = `(${new Date(data.timestamp * 1000).toISOString()})`;
});
}
+3
View File
@@ -3,6 +3,9 @@ title: "Radicle: the sovereign forge"
layout: index
preconnect:
- https://files.radicle.dev
scripts:
- copy
- latest-release
---
# Synopsis