]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-ssr): avoid duplicated asset imports merged from component slot client...
authorEvan You <yyx990803@gmail.com>
Mon, 15 Feb 2021 17:12:45 +0000 (12:12 -0500)
committerEvan You <yyx990803@gmail.com>
Mon, 15 Feb 2021 17:12:50 +0000 (12:12 -0500)
fix vitejs/vite#2034

packages/compiler-core/src/transform.ts
packages/compiler-sfc/src/templateTransformAssetUrl.ts
packages/compiler-sfc/src/templateTransformSrcset.ts
packages/compiler-ssr/src/transforms/ssrTransformComponent.ts

index 2a23efcb52eed373cd3f475007463b3603e5861a..87daf363eb43d9d273f2ebd8bb5d7d8c0e8f1a30 100644 (file)
@@ -89,7 +89,7 @@ export interface TransformContext
   components: Set<string>
   directives: Set<string>
   hoists: (JSChildNode | null)[]
-  imports: Set<ImportItem>
+  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
index 64cd22f08d138a9e33b96e76aabf16a20625fc90..c65a47c22775ff20577e9bc5f18650e472e40a2e 100644 (file)
@@ -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(
index 0018c4794f48f0d96727dee379975e4795a796f6..ae7ad55005e4d9adf6633e2b2bde521b4aaa7024 100644 (file)
@@ -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)
               }
index c2cf509c5783996f3ee41d9ef021d1f223faa73f..5acf8000b17a0de36c0691a9c58fac18acc4f547 100644 (file)
@@ -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 {