Adam Laycock
2025-11-27 87f7f4804ef4e3e2eba908109953724c5e411c87
Prevent double-loading of afterDOMReady scripts (#2213)

Co-authored-by: Adam <adam@canny.io>
3 files modified
13 ■■■■ changed files
quartz/components/renderPage.tsx 2 ●●● patch | view | raw | blame | history
quartz/components/scripts/spa.inline.ts 4 ●●●● patch | view | raw | blame | history
quartz/util/resources.tsx 7 ●●●●● patch | view | raw | blame | history
quartz/components/renderPage.tsx
@@ -294,7 +294,7 @@
      </body>
      {pageResources.js
        .filter((resource) => resource.loadTime === "afterDOMReady")
        .map((res) => JSResourceToScriptElement(res))}
        .map((res) => JSResourceToScriptElement(res, true))}
    </html>
  )
quartz/components/scripts/spa.inline.ts
@@ -115,9 +115,9 @@
  }
  // now, patch head, re-executing scripts
  const elementsToRemove = document.head.querySelectorAll(":not([spa-preserve])")
  const elementsToRemove = document.head.querySelectorAll(":not([data-persist])")
  elementsToRemove.forEach((el) => el.remove())
  const elementsToAdd = html.head.querySelectorAll(":not([spa-preserve])")
  const elementsToAdd = html.head.querySelectorAll(":not([data-persist])")
  elementsToAdd.forEach((el) => document.head.appendChild(el))
  // delay setting the url until now
quartz/util/resources.tsx
@@ -26,9 +26,10 @@
export function JSResourceToScriptElement(resource: JSResource, preserve?: boolean): JSX.Element {
  const scriptType = resource.moduleType ?? "application/javascript"
  const spaPreserve = preserve ?? resource.spaPreserve
  if (resource.contentType === "external") {
    return (
      <script key={resource.src} src={resource.src} type={scriptType} spa-preserve={spaPreserve} />
      <script key={resource.src} src={resource.src} type={scriptType} data-persist={spaPreserve} />
    )
  } else {
    const content = resource.script
@@ -36,7 +37,7 @@
      <script
        key={randomUUID()}
        type={scriptType}
        spa-preserve={spaPreserve}
        data-persist={spaPreserve}
        dangerouslySetInnerHTML={{ __html: content }}
      ></script>
    )
@@ -54,7 +55,7 @@
        href={resource.content}
        rel="stylesheet"
        type="text/css"
        spa-preserve={spaPreserve}
        data-persist={spaPreserve}
      />
    )
  }