Skip to content

Commit 2c35a66

Browse files
committed
refactor: use compiler-sfc 3.3 genDefaultAs option to avoid rewriteDefault
1 parent 199f0cb commit 2c35a66

File tree

3 files changed

+53
-23
lines changed

3 files changed

+53
-23
lines changed

Diff for: packages/plugin-vue/src/main.ts

+24-21
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ import {
1212
getPrevDescriptor,
1313
setSrcDescriptor,
1414
} from './utils/descriptorCache'
15-
import { isUseInlineTemplate, resolveScript } from './script'
15+
import {
16+
canInlineMain,
17+
isUseInlineTemplate,
18+
resolveScript,
19+
scriptIdentifier,
20+
} from './script'
1621
import { transformTemplateInMain } from './template'
1722
import { isEqualBlock, isOnlyTemplateChanged } from './handleHotUpdate'
1823
import { createRollupError } from './utils/error'
@@ -303,33 +308,31 @@ async function genScriptCode(
303308
code: string
304309
map: RawSourceMap | undefined
305310
}> {
306-
let scriptCode = `const _sfc_main = {}`
311+
let scriptCode = `const ${scriptIdentifier} = {}`
307312
let map: RawSourceMap | undefined
308313

309314
const script = resolveScript(descriptor, options, ssr)
310315
if (script) {
311316
// If the script is js/ts and has no external src, it can be directly placed
312317
// in the main module.
313-
if (
314-
(!script.lang || (script.lang === 'ts' && options.devServer)) &&
315-
!script.src
316-
) {
317-
const userPlugins = options.script?.babelParserPlugins || []
318-
const defaultPlugins =
319-
script.lang === 'ts'
320-
? userPlugins.includes('decorators')
321-
? (['typescript'] as const)
322-
: (['typescript', 'decorators-legacy'] as const)
323-
: []
324-
const as = '_sfc_main'
325-
if (options.compiler.rewriteDefaultAST && script.scriptAst && script.s) {
326-
options.compiler.rewriteDefaultAST(script.scriptAst, script.s, as)
327-
scriptCode = script.s.toString()
318+
if (canInlineMain(descriptor, options)) {
319+
if (!options.compiler.version) {
320+
// if compiler-sfc exposes no version, it's < 3.3 and doesn't support
321+
// genDefaultAs option.
322+
const userPlugins = options.script?.babelParserPlugins || []
323+
const defaultPlugins =
324+
script.lang === 'ts'
325+
? userPlugins.includes('decorators')
326+
? (['typescript'] as const)
327+
: (['typescript', 'decorators-legacy'] as const)
328+
: []
329+
scriptCode = options.compiler.rewriteDefault(
330+
script.content,
331+
scriptIdentifier,
332+
[...defaultPlugins, ...userPlugins],
333+
)
328334
} else {
329-
scriptCode = options.compiler.rewriteDefault(script.content, as, [
330-
...defaultPlugins,
331-
...userPlugins,
332-
])
335+
scriptCode = script.content
333336
}
334337
map = script.map
335338
} else {

Diff for: packages/plugin-vue/src/script.ts

+24
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ export function isUseInlineTemplate(
3131
return isProd && !!descriptor.scriptSetup && !descriptor.template?.src
3232
}
3333

34+
export const scriptIdentifier = `_sfc_main`
35+
3436
export function resolveScript(
3537
descriptor: SFCDescriptor,
3638
options: ResolvedOptions,
@@ -56,8 +58,30 @@ export function resolveScript(
5658
reactivityTransform: options.reactivityTransform !== false,
5759
templateOptions: resolveTemplateCompilerOptions(descriptor, options, ssr),
5860
sourceMap: options.sourceMap,
61+
genDefaultAs: canInlineMain(descriptor, options)
62+
? scriptIdentifier
63+
: undefined,
5964
})
6065

6166
cacheToUse.set(descriptor, resolved)
6267
return resolved
6368
}
69+
70+
// If the script is js/ts and has no external src, it can be directly placed
71+
// in the main module. Skip for build
72+
export function canInlineMain(
73+
descriptor: SFCDescriptor,
74+
options: ResolvedOptions,
75+
): boolean {
76+
if (!options.devServer) {
77+
return false
78+
}
79+
if (descriptor.script?.src || descriptor.scriptSetup?.src) {
80+
return false
81+
}
82+
const lang = descriptor.script?.lang || descriptor.scriptSetup?.lang
83+
if (lang && lang !== 'ts') {
84+
return false
85+
}
86+
return true
87+
}

Diff for: packages/plugin-vue/src/template.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@ import { getResolvedScript } from './script'
1111
import { createRollupError } from './utils/error'
1212
import type { ResolvedOptions } from '.'
1313

14-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
14+
1515
export async function transformTemplateAsModule(
1616
code: string,
1717
descriptor: SFCDescriptor,
1818
options: ResolvedOptions,
1919
pluginContext: TransformPluginContext,
2020
ssr: boolean,
21-
) {
21+
): Promise<{
22+
code: string
23+
map: any
24+
}> {
2225
const result = compile(code, descriptor, options, pluginContext, ssr)
2326

2427
let returnCode = result.code

0 commit comments

Comments
 (0)