diff --git a/package.json b/package.json index 62dcb91d42d..6e54566de9e 100644 --- a/package.json +++ b/package.json @@ -98,8 +98,8 @@ "pug": "^3.0.3", "puppeteer": "~24.16.2", "rimraf": "^6.0.1", - "rollup": "^4.46.4", - "rollup-plugin-dts": "^6.2.3", + "rollup": "4.45.1", + "rollup-plugin-dts": "6.2.1", "rollup-plugin-esbuild": "^6.2.1", "rollup-plugin-polyfill-node": "^0.13.0", "semver": "^7.7.2", diff --git a/packages/compiler-core/src/ast.ts b/packages/compiler-core/src/ast.ts index bae13372a98..4b3d16579c6 100644 --- a/packages/compiler-core/src/ast.ts +++ b/packages/compiler-core/src/ast.ts @@ -163,6 +163,7 @@ export interface ComponentNode extends BaseElementNode { | MemoExpression // when cached by v-memo | undefined ssrCodegenNode?: CallExpression + needAnchor?: boolean } export interface SlotOutletNode extends BaseElementNode { @@ -172,12 +173,14 @@ export interface SlotOutletNode extends BaseElementNode { | CacheExpression // when cached by v-once | undefined ssrCodegenNode?: CallExpression + needAnchor?: boolean } export interface TemplateNode extends BaseElementNode { tagType: ElementTypes.TEMPLATE // TemplateNode is a container type that always gets compiled away codegenNode: undefined + needAnchor?: boolean } export interface TextNode extends Node { @@ -287,6 +290,7 @@ export interface IfNode extends Node { type: NodeTypes.IF branches: IfBranchNode[] codegenNode?: IfConditionalExpression | CacheExpression //
+ needAnchor?: boolean } export interface IfBranchNode extends Node { @@ -306,6 +310,7 @@ export interface ForNode extends Node { parseResult: ForParseResult children: TemplateChildNode[] codegenNode?: ForCodegenNode + needAnchor?: boolean } export interface ForParseResult { diff --git a/packages/compiler-core/src/codegen.ts b/packages/compiler-core/src/codegen.ts index 99020bcf1ae..468acd7f2bc 100644 --- a/packages/compiler-core/src/codegen.ts +++ b/packages/compiler-core/src/codegen.ts @@ -136,6 +136,7 @@ export interface CodegenContext | 'inline' | 'vaporRuntimeModuleName' | 'expressionPlugins' + | 'vapor' > { source: string code: string diff --git a/packages/compiler-core/src/options.ts b/packages/compiler-core/src/options.ts index 9983071609e..03a32e0113c 100644 --- a/packages/compiler-core/src/options.ts +++ b/packages/compiler-core/src/options.ts @@ -220,6 +220,11 @@ interface SharedTransformCodegenOptions { * @default 'template.vue.html' */ filename?: string + + /** + * Indicates vapor component + */ + vapor?: boolean } export interface TransformOptions diff --git a/packages/compiler-core/src/transform.ts b/packages/compiler-core/src/transform.ts index 10121fb5d5c..11077df6252 100644 --- a/packages/compiler-core/src/transform.ts +++ b/packages/compiler-core/src/transform.ts @@ -146,6 +146,7 @@ export function createTransformContext( slotted = true, ssr = false, inSSR = false, + vapor = false, ssrCssVars = ``, bindingMetadata = EMPTY_OBJ, inline = false, @@ -173,6 +174,7 @@ export function createTransformContext( slotted, ssr, inSSR, + vapor, ssrCssVars, bindingMetadata, inline, diff --git a/packages/compiler-core/src/transforms/vSlot.ts b/packages/compiler-core/src/transforms/vSlot.ts index 43296dcc9b6..da29d0de897 100644 --- a/packages/compiler-core/src/transforms/vSlot.ts +++ b/packages/compiler-core/src/transforms/vSlot.ts @@ -100,6 +100,7 @@ export type SlotFnBuilder = ( vFor: DirectiveNode | undefined, slotChildren: TemplateChildNode[], loc: SourceLocation, + parent: ElementNode, ) => FunctionExpression const buildClientSlotFn: SlotFnBuilder = (props, _vForExp, children, loc) => @@ -147,7 +148,7 @@ export function buildSlots( slotsProperties.push( createObjectProperty( arg || createSimpleExpression('default', true), - buildSlotFn(exp, undefined, children, loc), + buildSlotFn(exp, undefined, children, loc, node), ), ) } @@ -200,7 +201,13 @@ export function buildSlots( } const vFor = findDir(slotElement, 'for') - const slotFunction = buildSlotFn(slotProps, vFor, slotChildren, slotLoc) + const slotFunction = buildSlotFn( + slotProps, + vFor, + slotChildren, + slotLoc, + slotElement, + ) // check if this slot is conditional (v-if/v-for) let vIf: DirectiveNode | undefined @@ -304,7 +311,7 @@ export function buildSlots( props: ExpressionNode | undefined, children: TemplateChildNode[], ) => { - const fn = buildSlotFn(props, undefined, children, loc) + const fn = buildSlotFn(props, undefined, children, loc, node) if (__COMPAT__ && context.compatConfig) { fn.isNonScopedSlot = true } diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 36ac6547709..fe413753548 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -1021,6 +1021,11 @@ export function compileScript( : '' // wrap setup code with function. if (ctx.isTS) { + // in SSR, always use defineComponent, so __vapor flag is required + if (ssr && vapor) { + runtimeOptions += `\n __vapor: true,` + } + // for TS, make sure the exported type is still valid type with // correct props information // we have to use object spread for types to be merged properly diff --git a/packages/compiler-sfc/src/compileTemplate.ts b/packages/compiler-sfc/src/compileTemplate.ts index 29d1853d2d6..1d832388fe1 100644 --- a/packages/compiler-sfc/src/compileTemplate.ts +++ b/packages/compiler-sfc/src/compileTemplate.ts @@ -253,6 +253,7 @@ function doCompileTemplate({ slotted, sourceMap: true, ...compilerOptions, + vapor, hmr: !isProd, nodeTransforms: nodeTransforms.concat( compilerOptions.nodeTransforms || [], diff --git a/packages/compiler-ssr/__tests__/ssrVIf.spec.ts b/packages/compiler-ssr/__tests__/ssrVIf.spec.ts index b544adadcf3..7867a4b5fb5 100644 --- a/packages/compiler-ssr/__tests__/ssrVIf.spec.ts +++ b/packages/compiler-ssr/__tests__/ssrVIf.spec.ts @@ -82,15 +82,15 @@ describe('ssr: v-if', () => { test('