From 1b2bd8021c8020dbc333e95d4bd3a7462256dc68 Mon Sep 17 00:00:00 2001 From: TrickyPi <530257315@qq.com> Date: Sat, 25 Jun 2022 17:08:16 +0800 Subject: [PATCH] fix(vite): update css if config changed --- packages/vite/src/modes/global/dev.ts | 41 +++++++++++++++++++++------ 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/packages/vite/src/modes/global/dev.ts b/packages/vite/src/modes/global/dev.ts index 3536661479..ebd4aa61e8 100644 --- a/packages/vite/src/modes/global/dev.ts +++ b/packages/vite/src/modes/global/dev.ts @@ -1,6 +1,7 @@ -import type { Plugin, ViteDevServer, ResolvedConfig as ViteResolvedConfig } from 'vite' +import type { Plugin, Update, ViteDevServer, ResolvedConfig as ViteResolvedConfig } from 'vite' import type { UnocssPluginContext } from '@unocss/core' -import { LAYER_MARK_ALL, getPath, resolveId, resolveLayer } from '../../integration' +import { cssIdRE } from '@unocss/core' +import { LAYER_MARK_ALL, RESOLVED_ID_RE, getPath, resolveId, resolveLayer } from '../../integration' const WARN_TIMEOUT = 20000 const WS_EVENT_PREFIX = 'unocss:hmr' @@ -11,6 +12,7 @@ export function GlobalModeDevPlugin({ uno, tokens, onInvalidate, extract, filter const tasks: Promise[] = [] const entries = new Set() + const cssModules = new Set() let invalidateTimer: any let lastUpdate = Date.now() @@ -18,6 +20,13 @@ export function GlobalModeDevPlugin({ uno, tokens, onInvalidate, extract, filter let resolved = false let resolvedWarnTimer: any + function getCssLikeFiles() { + return [ + ...entries.keys(), + ...cssModules.keys(), + ] + } + function configResolved(config: ViteResolvedConfig) { base = config.base || '' if (base === '/') @@ -27,8 +36,9 @@ export function GlobalModeDevPlugin({ uno, tokens, onInvalidate, extract, filter } function invalidate(timer = 10) { + const ids = getCssLikeFiles() for (const server of servers) { - for (const id of entries) { + for (const id of ids) { const mod = server.moduleGraph.getModuleById(id) if (!mod) continue @@ -41,15 +51,25 @@ export function GlobalModeDevPlugin({ uno, tokens, onInvalidate, extract, filter function sendUpdate() { lastUpdate = Date.now() + const ids = getCssLikeFiles() for (const server of servers) { server.ws.send({ type: 'update', - updates: Array.from(entries).map(i => ({ - acceptedPath: i, - path: i, - timestamp: lastUpdate, - type: 'js-update', - })), + updates: Array.from(ids).reduce((prev: Update[], id) => { + const mod = server.moduleGraph.getModuleById(id) + if (mod) { + const { url: assetPath } = mod + prev.push( + { + acceptedPath: assetPath, + path: assetPath, + timestamp: lastUpdate, + type: 'js-update', + }, + ) + } + return prev + }, []), }) } } @@ -111,6 +131,9 @@ export function GlobalModeDevPlugin({ uno, tokens, onInvalidate, extract, filter } }, async load(id) { + if (!RESOLVED_ID_RE.test(id) && cssIdRE.test(id)) + cssModules.add(id) + const layer = resolveLayer(getPath(id)) if (!layer) return null