UNPKG

vike

Version:

The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.

53 lines (52 loc) 2.42 kB
import '../assertEnvClient.js'; export { removeFoucBuster }; import { assert } from '../../utils/assert.js'; // See also: // - Alternative approach of exactly injecting what Vite injects: // - https://github.com/remix-run/remix/issues/8830#issuecomment-1968368351 // - https://github.com/rakkasjs/rakkasjs/blob/7d75ccc915e93bca04e6bab37dc6abdb68a85e4a/packages/rakkasjs/src/features/pages/middleware.tsx#L701 // - https://github.com/remix-run/remix/issues/8830 function removeFoucBuster() { // In production removeFoucBuster() is expected to be have been removed by tree shaking assert(import.meta.env.DEV); let sleep = 2; setTimeout(runClean, sleep); return; function runClean() { const isCleaned = clean(); if (!isCleaned) { if (sleep < 1000) sleep = 2 * sleep; setTimeout(runClean, sleep); } } } function clean() { const VITE_ID = 'data-vite-dev-id'; const injectedByVite = [...document.querySelectorAll(`style[${VITE_ID}]`)].map((style) => style.getAttribute(VITE_ID)); // ``` // <link rel="stylesheet" type="text/css" href="/renderer/css/index.css?direct"> // <link rel="stylesheet" type="text/css" href="/renderer/Layout.css?direct"> // ``` const suffix = '?direct'; // <link> defined by: // - https://github.com/vikejs/vike/blob/fae90a15d88e5e87ca9fcbb54cf2dc8773d2f229/vike/server/runtime/html/injectAssets/inferHtmlTags.ts#L35 // - https://github.com/vikejs/vike/blob/fae90a15d88e5e87ca9fcbb54cf2dc8773d2f229/vike/server/runtime/renderPageServer/getPageAssets.ts#L68 const injectedByVike = [...document.querySelectorAll(`link[rel="stylesheet"][type="text/css"][href$="${suffix}"]`)]; let isCleaned = true; injectedByVike.forEach((linkVike) => { const href = linkVike.getAttribute('href'); assert(href && href.endsWith(suffix)); let filePathAbsoluteUserRootDir = href.slice(0, -suffix.length); const prefix = '/@fs/'; if (filePathAbsoluteUserRootDir.startsWith(prefix)) filePathAbsoluteUserRootDir = filePathAbsoluteUserRootDir.slice(prefix.length); if (injectedByVite.some((filePathAbsoluteFilesystem) => filePathAbsoluteFilesystem.endsWith(filePathAbsoluteUserRootDir))) { linkVike.remove(); } else { isCleaned = false; } }); return isCleaned; }