diff --git a/packages/compiler-core/src/transform.ts b/packages/compiler-core/src/transform.ts index 2a23efcb5..87daf363e 100644 --- a/packages/compiler-core/src/transform.ts +++ b/packages/compiler-core/src/transform.ts @@ -89,7 +89,7 @@ export interface TransformContext components: Set directives: Set hoists: (JSChildNode | null)[] - imports: Set + imports: ImportItem[] temps: number cached: number identifiers: { [name: string]: number | undefined } @@ -163,7 +163,7 @@ export function createTransformContext( components: new Set(), directives: new Set(), hoists: [], - imports: new Set(), + imports: [], constantCache: new Map(), temps: 0, cached: 0, @@ -293,7 +293,7 @@ export function transform(root: RootNode, options: TransformOptions) { root.helpers = [...context.helpers] root.components = [...context.components] root.directives = [...context.directives] - root.imports = [...context.imports] + root.imports = context.imports root.hoists = context.hoists root.temps = context.temps root.cached = context.cached diff --git a/packages/compiler-sfc/src/templateTransformAssetUrl.ts b/packages/compiler-sfc/src/templateTransformAssetUrl.ts index 64cd22f08..c65a47c22 100644 --- a/packages/compiler-sfc/src/templateTransformAssetUrl.ts +++ b/packages/compiler-sfc/src/templateTransformAssetUrl.ts @@ -153,19 +153,18 @@ function getImportsExpressionExp( context: TransformContext ): ExpressionNode { if (path) { - const importsArray = Array.from(context.imports) - const existing = importsArray.find(i => i.path === path) + const existing = context.imports.find(i => i.path === path) if (existing) { return existing.exp as ExpressionNode } - const name = `_imports_${importsArray.length}` + const name = `_imports_${context.imports.length}` const exp = createSimpleExpression( name, false, loc, ConstantTypes.CAN_HOIST ) - context.imports.add({ exp, path }) + context.imports.push({ exp, path }) if (hash && path) { return context.hoist( createSimpleExpression( diff --git a/packages/compiler-sfc/src/templateTransformSrcset.ts b/packages/compiler-sfc/src/templateTransformSrcset.ts index 0018c4794..ae7ad5500 100644 --- a/packages/compiler-sfc/src/templateTransformSrcset.ts +++ b/packages/compiler-sfc/src/templateTransformSrcset.ts @@ -99,8 +99,7 @@ export const transformSrcset: NodeTransform = ( const { path } = parseUrl(url) let exp: SimpleExpressionNode if (path) { - const importsArray = Array.from(context.imports) - const existingImportsIndex = importsArray.findIndex( + const existingImportsIndex = context.imports.findIndex( i => i.path === path ) if (existingImportsIndex > -1) { @@ -112,12 +111,12 @@ export const transformSrcset: NodeTransform = ( ) } else { exp = createSimpleExpression( - `_imports_${importsArray.length}`, + `_imports_${context.imports.length}`, false, attr.loc, ConstantTypes.CAN_HOIST ) - context.imports.add({ exp, path }) + context.imports.push({ exp, path }) } compoundExpression.children.push(exp) } diff --git a/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts b/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts index c2cf509c5..5acf8000b 100644 --- a/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts +++ b/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts @@ -289,14 +289,16 @@ function subTransform( childContext.identifiers = { ...parentContext.identifiers } // traverse traverseNode(childRoot, childContext) - // merge helpers/components/directives/imports into parent context - ;(['helpers', 'components', 'directives', 'imports'] as const).forEach( - key => { - childContext[key].forEach((value: any) => { - ;(parentContext[key] as any).add(value) - }) - } - ) + // merge helpers/components/directives into parent context + ;(['helpers', 'components', 'directives'] as const).forEach(key => { + childContext[key].forEach((value: any) => { + ;(parentContext[key] as any).add(value) + }) + }) + // imports/hoists are not merged because: + // - imports are only used for asset urls and should be consistent between + // node/client branches + // - hoists are not enabled for the client branch here } function clone(v: any): any {