Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | 24x 4x 1x 1x 1x 1x 1x 1x 1x 4x 4x 2x 2x | import { isBlobUrl } from './isBlobUrl' import { isDataUrl } from './isDataUrl' import { isUrl } from './isUrl' import { loadResource, LoadResourceUrlType } from './loadResource' const cache: Record<string, HTMLStyleElement> = Object.create(null) export interface LoadCssResult { /** * 样式元素。 */ el: HTMLStyleElement /** * 销毁函数。 */ destroy: () => void } /** * 加载 CSS 样式,支持链接和内容。 * * @param urlOrContent 链接或内容 * @example * ```typescript * loadCss('https://foo.bar/global.css') * loadCss(`body { font-size: 20px; }`) * ``` */ export function loadCss(urlOrContent: string): Promise<LoadCssResult> { return (urlOrContent in cache ? Promise.resolve(cache[urlOrContent]) : isUrl(urlOrContent) || isDataUrl(urlOrContent) || isBlobUrl(urlOrContent) ? loadResource({ type: LoadResourceUrlType.css, path: urlOrContent, }).then<HTMLStyleElement>(res => res[0] as any) : new Promise<HTMLStyleElement>(resolve => { const el = document.createElement('style') el.setAttribute('type', 'text/css') if ('textContent' in el) { el.textContent = urlOrContent } else E{ // @ts-ignore el.styleSheet.cssText = urlOrContent } document.getElementsByTagName('head')[0].appendChild(el) resolve(el) }) ).then<LoadCssResult>(el => { cache[urlOrContent] = el return { el: el, destroy: () => { delete cache[urlOrContent] el.parentNode!.removeChild(el) }, } }) } |