@@ -4,7 +4,11 @@ const qs = require('querystring')
44const plugin = require ( './plugin' )
55const selectBlock = require ( './select' )
66const loaderUtils = require ( 'loader-utils' )
7- const { attrsToQuery } = require ( './codegen/utils' )
7+ const {
8+ attrsToQuery,
9+ testWebpack5,
10+ genMatchResource
11+ } = require ( './codegen/utils' )
812const genStylesCode = require ( './codegen/styleInjection' )
913const { genHotReloadCode } = require ( './codegen/hotReload' )
1014const genCustomBlocksCode = require ( './codegen/customBlocks' )
@@ -38,14 +42,16 @@ module.exports = function (source) {
3842 sourceMap,
3943 rootContext,
4044 resourcePath,
41- resourceQuery = ''
45+ resourceQuery : _resourceQuery = '' ,
46+ _compiler
4247 } = loaderContext
43-
44- const rawQuery = resourceQuery . slice ( 1 )
45- const inheritQuery = `&${ rawQuery } `
48+ const isWebpack5 = testWebpack5 ( _compiler )
49+ const rawQuery = _resourceQuery . slice ( 1 )
50+ const resourceQuery = rawQuery ? `&${ rawQuery } ` : ''
4651 const incomingQuery = qs . parse ( rawQuery )
4752 const options = loaderUtils . getOptions ( loaderContext ) || { }
48-
53+ const enableInlineMatchResource =
54+ isWebpack5 && Boolean ( options . experimentalInlineMatchResource )
4955 const isServer = target === 'node'
5056 const isShadow = ! ! options . shadowMode
5157 const isProduction =
@@ -111,29 +117,47 @@ module.exports = function (source) {
111117 // let isTS = false
112118 const { script, scriptSetup } = descriptor
113119 if ( script || scriptSetup ) {
114- // const lang = script? .lang || scriptSetup? .lang
120+ const lang = script . lang || ( scriptSetup && scriptSetup . lang )
115121 // isTS = !!(lang && /tsx?/.test(lang))
122+ const externalQuery =
123+ script && ! scriptSetup && script . src ? `&external` : ``
116124 const src = ( script && ! scriptSetup && script . src ) || resourcePath
117125 const attrsQuery = attrsToQuery ( ( scriptSetup || script ) . attrs , 'js' )
118- const query = `?vue&type=script${ attrsQuery } ${ inheritQuery } `
119- const request = stringifyRequest ( src + query )
126+ const query = `?vue&type=script${ attrsQuery } ${ resourceQuery } ${ externalQuery } `
127+
128+ let scriptRequest
129+ if ( enableInlineMatchResource ) {
130+ scriptRequest = stringifyRequest (
131+ genMatchResource ( loaderContext , src , query , lang || 'js' )
132+ )
133+ } else {
134+ scriptRequest = stringifyRequest ( src + query )
135+ }
120136 scriptImport =
121- `import script from ${ request } \n` + `export * from ${ request } ` // support named exports
137+ `import script from ${ scriptRequest } \n` + `export * from ${ scriptRequest } ` // support named exports
122138 }
123139
124140 // template
125141 let templateImport = `var render, staticRenderFns`
126142 let templateRequest
127143 if ( descriptor . template ) {
128144 const src = descriptor . template . src || resourcePath
145+ const externalQuery = descriptor . template . src ? `&external` : ``
129146 const idQuery = `&id=${ id } `
130147 const scopedQuery = hasScoped ? `&scoped=true` : ``
131148 const attrsQuery = attrsToQuery ( descriptor . template . attrs )
132149 // const tsQuery =
133150 // options.enableTsInTemplate !== false && isTS ? `&ts=true` : ``
134- const query = `?vue&type=template${ idQuery } ${ scopedQuery } ${ attrsQuery } ${ inheritQuery } `
135- const request = ( templateRequest = stringifyRequest ( src + query ) )
136- templateImport = `import { render, staticRenderFns } from ${ request } `
151+ const query = `?vue&type=template${ idQuery } ${ scopedQuery } ${ attrsQuery } ${ resourceQuery } ${ externalQuery } `
152+ if ( enableInlineMatchResource ) {
153+ templateRequest = stringifyRequest (
154+ // TypeScript syntax in template expressions is not supported in Vue 2, so the lang is always 'js'
155+ genMatchResource ( loaderContext , src , query , 'js' )
156+ )
157+ } else {
158+ templateRequest = stringifyRequest ( src + query )
159+ }
160+ templateImport = `import { render, staticRenderFns } from ${ templateRequest } `
137161 }
138162
139163 // styles
@@ -147,7 +171,8 @@ module.exports = function (source) {
147171 stringifyRequest ,
148172 needsHotReload ,
149173 isServer || isShadow , // needs explicit injection?
150- isProduction
174+ isProduction ,
175+ enableInlineMatchResource
151176 )
152177 }
153178
@@ -173,10 +198,12 @@ var component = normalizer(
173198
174199 if ( descriptor . customBlocks && descriptor . customBlocks . length ) {
175200 code += genCustomBlocksCode (
201+ loaderContext ,
176202 descriptor . customBlocks ,
177203 resourcePath ,
178204 resourceQuery ,
179- stringifyRequest
205+ stringifyRequest ,
206+ enableInlineMatchResource
180207 )
181208 }
182209
0 commit comments