@@ -374,20 +374,20 @@ export function cssPlugin(config: ResolvedConfig): Plugin {
374374 const resolveUrl = ( url : string , importer ?: string ) =>
375375 idResolver ( environment , url , importer )
376376
377- const urlReplacer : CssUrlReplacer = async ( url , importer ) => {
377+ const urlResolver : CssUrlResolver = async ( url , importer ) => {
378378 const decodedUrl = decodeURI ( url )
379379 if ( checkPublicFile ( decodedUrl , config ) ) {
380380 if ( encodePublicUrlsInCSS ( config ) ) {
381- return publicFileToBuiltUrl ( decodedUrl , config )
381+ return [ publicFileToBuiltUrl ( decodedUrl , config ) , undefined ]
382382 } else {
383- return joinUrlSegments ( config . base , decodedUrl )
383+ return [ joinUrlSegments ( config . base , decodedUrl ) , undefined ]
384384 }
385385 }
386386 const [ id , fragment ] = decodedUrl . split ( '#' )
387387 let resolved = await resolveUrl ( id , importer )
388388 if ( resolved ) {
389389 if ( fragment ) resolved += '#' + fragment
390- return fileToUrl ( this , resolved )
390+ return [ await fileToUrl ( this , resolved ) , resolved ]
391391 }
392392 if ( config . command === 'build' ) {
393393 const isExternal = config . build . rollupOptions . external
@@ -406,7 +406,7 @@ export function cssPlugin(config: ResolvedConfig): Plugin {
406406 )
407407 }
408408 }
409- return url
409+ return [ url , undefined ]
410410 }
411411
412412 const {
@@ -419,7 +419,7 @@ export function cssPlugin(config: ResolvedConfig): Plugin {
419419 id ,
420420 raw ,
421421 preprocessorWorkerController ! ,
422- urlReplacer ,
422+ urlResolver ,
423423 )
424424 if ( modules ) {
425425 moduleCache . set ( id , modules )
@@ -1059,17 +1059,20 @@ export function cssAnalysisPlugin(config: ResolvedConfig): Plugin {
10591059 // main import to hot update
10601060 const depModules = new Set < string | EnvironmentModuleNode > ( )
10611061 for ( const file of pluginImports ) {
1062- depModules . add (
1063- isCSSRequest ( file )
1064- ? moduleGraph . createFileOnlyEntry ( file )
1065- : await moduleGraph . ensureEntryFromUrl (
1066- await fileToDevUrl (
1067- this . environment ,
1068- file ,
1069- /* skipBase */ true ,
1070- ) ,
1071- ) ,
1072- )
1062+ if ( isCSSRequest ( file ) ) {
1063+ depModules . add ( moduleGraph . createFileOnlyEntry ( file ) )
1064+ } else {
1065+ const url = await fileToDevUrl (
1066+ this . environment ,
1067+ file ,
1068+ /* skipBase */ true ,
1069+ )
1070+ if ( url . startsWith ( 'data:' ) ) {
1071+ depModules . add ( moduleGraph . createFileOnlyEntry ( file ) )
1072+ } else {
1073+ depModules . add ( await moduleGraph . ensureEntryFromUrl ( url ) )
1074+ }
1075+ }
10731076 }
10741077 moduleGraph . updateModuleInfo (
10751078 thisModule ,
@@ -1268,7 +1271,7 @@ async function compileCSS(
12681271 id : string ,
12691272 code : string ,
12701273 workerController : PreprocessorWorkerController ,
1271- urlReplacer ?: CssUrlReplacer ,
1274+ urlResolver ?: CssUrlResolver ,
12721275) : Promise < {
12731276 code : string
12741277 map ?: SourceMapInput
@@ -1278,7 +1281,7 @@ async function compileCSS(
12781281} > {
12791282 const { config } = environment
12801283 if ( config . css . transformer === 'lightningcss' ) {
1281- return compileLightningCSS ( id , code , environment , urlReplacer )
1284+ return compileLightningCSS ( id , code , environment , urlResolver )
12821285 }
12831286
12841287 const { modules : modulesOptions , devSourcemap } = config . css
@@ -1387,10 +1390,11 @@ async function compileCSS(
13871390 )
13881391 }
13891392
1390- if ( urlReplacer ) {
1393+ if ( urlResolver ) {
13911394 postcssPlugins . push (
13921395 UrlRewritePostcssPlugin ( {
1393- replacer : urlReplacer ,
1396+ resolver : urlResolver ,
1397+ deps,
13941398 logger : environment . logger ,
13951399 } ) ,
13961400 )
@@ -1724,6 +1728,12 @@ async function resolvePostcssConfig(
17241728 return result
17251729}
17261730
1731+ type CssUrlResolver = (
1732+ url : string ,
1733+ importer ?: string ,
1734+ ) =>
1735+ | [ url : string , id : string | undefined ]
1736+ | Promise < [ url : string , id : string | undefined ] >
17271737type CssUrlReplacer = (
17281738 url : string ,
17291739 importer ?: string ,
@@ -1740,7 +1750,8 @@ export const importCssRE =
17401750const cssImageSetRE = / (?< = i m a g e - s e t \( ) ( (?: [ \w - ] { 1 , 256 } \( [ ^ ) ] * \) | [ ^ ) ] ) * ) (? = \) ) /
17411751
17421752const UrlRewritePostcssPlugin : PostCSS . PluginCreator < {
1743- replacer : CssUrlReplacer
1753+ resolver : CssUrlResolver
1754+ deps : Set < string >
17441755 logger : Logger
17451756} > = ( opts ) => {
17461757 if ( ! opts ) {
@@ -1764,8 +1775,13 @@ const UrlRewritePostcssPlugin: PostCSS.PluginCreator<{
17641775 const isCssUrl = cssUrlRE . test ( declaration . value )
17651776 const isCssImageSet = cssImageSetRE . test ( declaration . value )
17661777 if ( isCssUrl || isCssImageSet ) {
1767- const replacerForDeclaration = ( rawUrl : string ) => {
1768- return opts . replacer ( rawUrl , importer )
1778+ const replacerForDeclaration = async ( rawUrl : string ) => {
1779+ const [ newUrl , resolvedId ] = await opts . resolver ( rawUrl , importer )
1780+ // only register inlined assets to avoid frequent full refresh (#18979)
1781+ if ( newUrl . startsWith ( 'data:' ) && resolvedId ) {
1782+ opts . deps . add ( resolvedId )
1783+ }
1784+ return newUrl
17691785 }
17701786 if ( isCssUrl && isCssImageSet ) {
17711787 promises . push (
@@ -3173,7 +3189,7 @@ async function compileLightningCSS(
31733189 id : string ,
31743190 src : string ,
31753191 environment : PartialEnvironment ,
3176- urlReplacer ?: CssUrlReplacer ,
3192+ urlResolver ?: CssUrlResolver ,
31773193) : ReturnType < typeof compileCSS > {
31783194 const { config } = environment
31793195 const deps = new Set < string > ( )
@@ -3285,11 +3301,16 @@ async function compileLightningCSS(
32853301 let replaceUrl : string
32863302 if ( skipUrlReplacer ( dep . url ) ) {
32873303 replaceUrl = dep . url
3288- } else if ( urlReplacer ) {
3289- replaceUrl = await urlReplacer (
3304+ } else if ( urlResolver ) {
3305+ const [ newUrl , resolvedId ] = await urlResolver (
32903306 dep . url ,
32913307 dep . loc . filePath . replace ( NULL_BYTE_PLACEHOLDER , '\0' ) ,
32923308 )
3309+ // only register inlined assets to avoid frequent full refresh (#18979)
3310+ if ( newUrl . startsWith ( 'data:' ) && resolvedId ) {
3311+ deps . add ( resolvedId )
3312+ }
3313+ replaceUrl = newUrl
32933314 } else {
32943315 replaceUrl = dep . url
32953316 }
0 commit comments