one
Version:
One is a new React Framework that makes Vite serve both native and web.
97 lines (96 loc) • 3.88 kB
JavaScript
import { useEffect, useRef } from "react";
import { getURL } from "../getURL";
import { preloadRoute } from "../router/router";
const PREFETCH_MODE = process.env.ONE_LINK_PREFETCH || "intent";
function PreloadLinks() {
if (typeof window > "u" || !import.meta.env.PROD || PREFETCH_MODE === "false")
return null;
const cleanupRef = useRef(null);
return useEffect(() => {
const url = getURL(), getHrefFromTarget = (target) => {
if (!(target instanceof HTMLElement)) return null;
const anchor = target instanceof HTMLAnchorElement ? target : target.closest("a");
if (!(anchor instanceof HTMLAnchorElement)) return null;
const href = anchor.getAttribute("href");
return href && (href[0] === "/" || href.startsWith(url)) ? href.replace(url, "") : null;
};
if (PREFETCH_MODE === "hover") {
const controller = new AbortController();
return document.addEventListener(
"mouseover",
(e) => {
const href = getHrefFromTarget(e.target);
href && preloadRoute(href);
},
{ passive: !0, signal: controller.signal }
), () => controller.abort();
}
if (PREFETCH_MODE === "viewport")
return import("../link/prefetchViewport").then(
({ startPrefetchViewport, observePrefetchViewport }) => {
startPrefetchViewport(preloadRoute);
const cleanups = [], seen = /* @__PURE__ */ new WeakSet(), observeLinks = () => {
document.querySelectorAll(
'a[href^="/"], a[href^="' + url + '"]'
).forEach((link) => {
if (seen.has(link)) return;
seen.add(link);
const href = link.getAttribute("href");
href && cleanups.push(
observePrefetchViewport(link, href.replace(url, ""))
);
});
};
observeLinks();
let timeout;
const observer = new MutationObserver(() => {
clearTimeout(timeout), timeout = setTimeout(observeLinks, 100);
});
observer.observe(document.body, { childList: !0, subtree: !0 }), cleanupRef.current = () => {
clearTimeout(timeout), cleanups.forEach((c) => c()), observer.disconnect();
};
}
), () => cleanupRef.current?.();
if (PREFETCH_MODE === "intent") {
const controller = new AbortController();
return import("../link/prefetchIntent").then(
({ startPrefetchIntent, observePrefetchIntent }) => {
startPrefetchIntent(preloadRoute);
const cleanups = [], seen = /* @__PURE__ */ new WeakSet(), observeLinks = () => {
document.querySelectorAll(
'a[href^="/"], a[href^="' + url + '"]'
).forEach((link) => {
if (seen.has(link)) return;
seen.add(link);
const href = link.getAttribute("href");
href && cleanups.push(
observePrefetchIntent(link, href.replace(url, ""))
);
});
};
observeLinks();
let timeout;
const observer = new MutationObserver(() => {
clearTimeout(timeout), timeout = setTimeout(observeLinks, 100);
});
observer.observe(document.body, { childList: !0, subtree: !0 }), cleanupRef.current = () => {
clearTimeout(timeout), cleanups.forEach((c) => c()), observer.disconnect();
}, document.addEventListener(
"mouseover",
(e) => {
const href = getHrefFromTarget(e.target);
href && preloadRoute(href);
},
{ passive: !0, signal: controller.signal }
);
}
), () => {
controller.abort(), cleanupRef.current?.();
};
}
}, []), null;
}
export {
PreloadLinks
};
//# sourceMappingURL=PreloadLinks.js.map