@@ -14,11 +14,14 @@ import hash from 'hash-sum'
1414import loaderUtils from 'loader-utils'
1515import {
1616 parse ,
17+ compileScript ,
1718 TemplateCompiler ,
1819 CompilerOptions ,
1920 SFCBlock ,
2021 SFCTemplateCompileOptions ,
21- SFCStyleBlock
22+ SFCScriptCompileOptions ,
23+ SFCStyleBlock ,
24+ SFCScriptBlock
2225} from '@vue/compiler-sfc'
2326import { selectBlock } from './select'
2427import { genHotReloadCode } from './hotReload'
@@ -30,6 +33,8 @@ import VueLoaderPlugin from './plugin'
3033export { VueLoaderPlugin }
3134
3235export interface VueLoaderOptions {
36+ // https://babeljs.io/docs/en/next/babel-parser#plugins
37+ babelParserPlugins ?: SFCScriptCompileOptions [ 'babelParserPlugins' ]
3338 transformAssetUrls ?: SFCTemplateCompileOptions [ 'transformAssetUrls' ]
3439 compiler ?: TemplateCompiler | string
3540 compilerOptions ?: CompilerOptions
@@ -121,6 +126,29 @@ export default function loader(
121126 ! ! ( descriptor . script || descriptor . template ) &&
122127 options . hotReload !== false
123128
129+ // script
130+ let script : SFCScriptBlock | undefined
131+ let scriptImport = `const script = {}`
132+ if ( descriptor . script || descriptor . scriptSetup ) {
133+ try {
134+ script = ( descriptor as any ) . scriptCompiled = compileScript ( descriptor , {
135+ babelParserPlugins : options . babelParserPlugins
136+ } )
137+ } catch ( e ) {
138+ loaderContext . emitError ( e )
139+ }
140+ if ( script ) {
141+ const src = script . src || resourcePath
142+ const attrsQuery = attrsToQuery ( script . attrs , 'js' )
143+ const query = `?vue&type=script${ attrsQuery } ${ resourceQuery } `
144+ const scriptRequest = stringifyRequest ( src + query )
145+ scriptImport =
146+ `import script from ${ scriptRequest } \n` +
147+ // support named exports
148+ `export * from ${ scriptRequest } `
149+ }
150+ }
151+
124152 // template
125153 let templateImport = ``
126154 let templateRequest
@@ -129,22 +157,14 @@ export default function loader(
129157 const idQuery = `&id=${ id } `
130158 const scopedQuery = hasScoped ? `&scoped=true` : ``
131159 const attrsQuery = attrsToQuery ( descriptor . template . attrs )
132- const query = `?vue&type=template${ idQuery } ${ scopedQuery } ${ attrsQuery } ${ resourceQuery } `
160+ const bindingsQuery = script
161+ ? `&bindings=${ JSON . stringify ( script . bindings ) } `
162+ : ``
163+ const query = `?vue&type=template${ idQuery } ${ scopedQuery } ${ attrsQuery } ${ bindingsQuery } ${ resourceQuery } `
133164 templateRequest = stringifyRequest ( src + query )
134165 templateImport = `import { render } from ${ templateRequest } `
135166 }
136167
137- // script
138- let scriptImport = `const script = {}`
139- if ( descriptor . script ) {
140- const src = descriptor . script . src || resourcePath
141- const attrsQuery = attrsToQuery ( descriptor . script . attrs , 'js' )
142- const query = `?vue&type=script${ attrsQuery } ${ resourceQuery } `
143- const scriptRequest = stringifyRequest ( src + query )
144- scriptImport =
145- `import script from ${ scriptRequest } \n` + `export * from ${ scriptRequest } ` // support named exports
146- }
147-
148168 // styles
149169 let stylesCode = ``
150170 let hasCSSModules = false
0 commit comments