@@ -20,7 +20,12 @@ import { formatError } from './formatError'
2020import VueLoaderPlugin from './plugin'
2121import { canInlineTemplate } from './resolveScript'
2222import { setDescriptor } from './descriptorCache'
23- import { getOptions , stringifyRequest as _stringifyRequest } from './util'
23+ import {
24+ getOptions ,
25+ stringifyRequest as _stringifyRequest ,
26+ genMatchResource ,
27+ testWebpack5 ,
28+ } from './util'
2429
2530export { VueLoaderPlugin }
2631
@@ -51,6 +56,7 @@ export interface VueLoaderOptions {
5156 exposeFilename ?: boolean
5257 appendExtension ?: boolean
5358 enableTsInTemplate ?: boolean
59+ experimentalInlineMatchResource ?: boolean
5460
5561 isServerBuild ?: boolean
5662}
@@ -90,18 +96,23 @@ export default function loader(
9096 rootContext,
9197 resourcePath,
9298 resourceQuery : _resourceQuery = '' ,
99+ _compiler,
93100 } = loaderContext
94101
102+ const isWebpack5 = testWebpack5 ( _compiler )
95103 const rawQuery = _resourceQuery . slice ( 1 )
96104 const incomingQuery = qs . parse ( rawQuery )
97105 const resourceQuery = rawQuery ? `&${ rawQuery } ` : ''
98106 const options = ( getOptions ( loaderContext ) || { } ) as VueLoaderOptions
107+ const enableInlineMatchResource =
108+ isWebpack5 && Boolean ( options . experimentalInlineMatchResource )
99109
100110 const isServer = options . isServerBuild ?? target === 'node'
101111 const isProduction =
102112 mode === 'production' || process . env . NODE_ENV === 'production'
103113
104114 const filename = resourcePath . replace ( / \? .* $ / , '' )
115+
105116 const { descriptor, errors } = parse ( source , {
106117 filename,
107118 sourceMap,
@@ -167,10 +178,23 @@ export default function loader(
167178 if ( script || scriptSetup ) {
168179 const lang = script ?. lang || scriptSetup ?. lang
169180 isTS = ! ! ( lang && / t s x ? / . test ( lang ) )
181+ const externalQuery = Boolean ( script && ! scriptSetup && script . src )
182+ ? `&external`
183+ : ``
170184 const src = ( script && ! scriptSetup && script . src ) || resourcePath
171185 const attrsQuery = attrsToQuery ( ( scriptSetup || script ) ! . attrs , 'js' )
172- const query = `?vue&type=script${ attrsQuery } ${ resourceQuery } `
173- const scriptRequest = stringifyRequest ( src + query )
186+ const query = `?vue&type=script${ attrsQuery } ${ resourceQuery } ${ externalQuery } `
187+
188+ let scriptRequest : string
189+
190+ if ( enableInlineMatchResource ) {
191+ scriptRequest = stringifyRequest (
192+ genMatchResource ( this , src , query , lang || 'js' )
193+ )
194+ } else {
195+ scriptRequest = stringifyRequest ( src + query )
196+ }
197+
174198 scriptImport =
175199 `import script from ${ scriptRequest } \n` +
176200 // support named exports
@@ -184,13 +208,27 @@ export default function loader(
184208 const useInlineTemplate = canInlineTemplate ( descriptor , isProduction )
185209 if ( descriptor . template && ! useInlineTemplate ) {
186210 const src = descriptor . template . src || resourcePath
211+ const externalQuery = Boolean ( descriptor . template . src ) ? `&external` : ``
187212 const idQuery = `&id=${ id } `
188213 const scopedQuery = hasScoped ? `&scoped=true` : ``
189214 const attrsQuery = attrsToQuery ( descriptor . template . attrs )
190215 const tsQuery =
191216 options . enableTsInTemplate !== false && isTS ? `&ts=true` : ``
192- const query = `?vue&type=template${ idQuery } ${ scopedQuery } ${ tsQuery } ${ attrsQuery } ${ resourceQuery } `
193- templateRequest = stringifyRequest ( src + query )
217+ const query = `?vue&type=template${ idQuery } ${ scopedQuery } ${ tsQuery } ${ attrsQuery } ${ resourceQuery } ${ externalQuery } `
218+
219+ if ( enableInlineMatchResource ) {
220+ templateRequest = stringifyRequest (
221+ genMatchResource (
222+ this ,
223+ src ,
224+ query ,
225+ options . enableTsInTemplate !== false && isTS ? 'ts' : 'js'
226+ )
227+ )
228+ } else {
229+ templateRequest = stringifyRequest ( src + query )
230+ }
231+
194232 templateImport = `import { ${ renderFnName } } from ${ templateRequest } `
195233 propsToAttach . push ( [ renderFnName , renderFnName ] )
196234 }
@@ -205,12 +243,23 @@ export default function loader(
205243 . forEach ( ( style , i ) => {
206244 const src = style . src || resourcePath
207245 const attrsQuery = attrsToQuery ( style . attrs , 'css' )
246+ const lang = String ( style . attrs . lang || 'css' )
208247 // make sure to only pass id when necessary so that we don't inject
209248 // duplicate tags when multiple components import the same css file
210249 const idQuery = ! style . src || style . scoped ? `&id=${ id } ` : ``
211250 const inlineQuery = asCustomElement ? `&inline` : ``
212- const query = `?vue&type=style&index=${ i } ${ idQuery } ${ inlineQuery } ${ attrsQuery } ${ resourceQuery } `
213- const styleRequest = stringifyRequest ( src + query )
251+ const externalQuery = Boolean ( style . src ) ? `&external` : ``
252+ const query = `?vue&type=style&index=${ i } ${ idQuery } ${ inlineQuery } ${ attrsQuery } ${ resourceQuery } ${ externalQuery } `
253+
254+ let styleRequest
255+ if ( enableInlineMatchResource ) {
256+ styleRequest = stringifyRequest (
257+ genMatchResource ( this , src , query , lang )
258+ )
259+ } else {
260+ styleRequest = stringifyRequest ( src + query )
261+ }
262+
214263 if ( style . module ) {
215264 if ( asCustomElement ) {
216265 loaderContext . emitError (
@@ -283,9 +332,27 @@ export default function loader(
283332 const issuerQuery = block . attrs . src
284333 ? `&issuerPath=${ qs . escape ( resourcePath ) } `
285334 : ''
286- const query = `?vue&type=custom&index=${ i } ${ blockTypeQuery } ${ issuerQuery } ${ attrsQuery } ${ resourceQuery } `
335+
336+ const externalQuery = Boolean ( block . attrs . src ) ? `&external` : ``
337+ const query = `?vue&type=custom&index=${ i } ${ blockTypeQuery } ${ issuerQuery } ${ attrsQuery } ${ resourceQuery } ${ externalQuery } `
338+
339+ let customRequest
340+
341+ if ( enableInlineMatchResource ) {
342+ customRequest = stringifyRequest (
343+ genMatchResource (
344+ this ,
345+ src as string ,
346+ query ,
347+ block . attrs . lang as string
348+ )
349+ )
350+ } else {
351+ customRequest = stringifyRequest ( src + query )
352+ }
353+
287354 return (
288- `import block${ i } from ${ stringifyRequest ( src + query ) } \n` +
355+ `import block${ i } from ${ customRequest } \n` +
289356 `if (typeof block${ i } === 'function') block${ i } (script)`
290357 )
291358 } )
0 commit comments