源文件超过50行,已替换为不超过50行的伪代码。辅助函数为逻辑抽象,不直接执行。
1const preloadedUrls = new Set();23async function preloadAndImport(importModule, dependencies) {4 const cssTasks = [];5 const nonce = readPageNonce();67 for (const url of dependencies) {8 if (preloadedUrls.has(url) || hasResourceLink(url)) continue;9 preloadedUrls.add(url);1011 const isCss = url.endsWith(".css");12 const link = createLink({13 href: url,14 rel: isCss ? "stylesheet" : "modulepreload",15 nonce16 });17 if (isCss) cssTasks.push(waitForLoad(link));18 document.head.append(link);19 }2021 // CSS完成后导入组件;JS预载链接不单独等待load。22 for (const result of await Promise.allSettled(cssTasks)) {23 if (result.status === "rejected") {24 dispatchPreloadError(result.reason);25 }26 }27 try {28 return await importModule();29 } catch (error) {30 dispatchPreloadError(error);31 }32}已确认说明
- Vite helper生成modulepreload和stylesheet,去重URL并继承CSP nonce;失败发vite:preloadError。
- 按需资源加载保留CSP nonce
- 按需资源加载保留CSP nonce