瀏覽代碼

fix(sfc): avoid auto name inference leading to unwanted recursion

fix #5965
fix #6027
fix #6029
Evan You 3 年之前
父節點
當前提交
9734b31c31

+ 1 - 1
packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap

@@ -2,7 +2,7 @@
 
 exports[`SFC analyze <script> bindings auto name inference basic 1`] = `
 "export default {
-  name: 'FooBar',
+  __name: 'FooBar',
   setup(__props, { expose }) {
   expose();
 const a = 1

+ 1 - 1
packages/compiler-sfc/__tests__/compileScript.spec.ts

@@ -1650,7 +1650,7 @@ describe('SFC analyze <script> bindings', () => {
         }
       )
       expect(content).toMatch(`export default {
-  name: 'FooBar'`)
+  __name: 'FooBar'`)
       assertCode(content)
     })
 

+ 1 - 1
packages/compiler-sfc/src/compileScript.ts

@@ -1463,7 +1463,7 @@ export function compileScript(
   if (!hasDefaultExportName && filename && filename !== DEFAULT_FILENAME) {
     const match = filename.match(/([^/\\]+)\.\w+$/)
     if (match) {
-      runtimeOptions += `\n  name: '${match[1]}',`
+      runtimeOptions += `\n  __name: '${match[1]}',`
     }
   }
   if (hasInlinedSsrRenderFn) {

+ 8 - 3
packages/runtime-core/src/component.ts

@@ -106,6 +106,10 @@ export interface ComponentInternalOptions {
    * This one should be exposed so that devtools can make use of it
    */
   __file?: string
+  /**
+   * name inferred from filename
+   */
+  __name?: string
 }
 
 export interface FunctionalComponent<P = {}, E extends EmitsOptions = {}>
@@ -949,11 +953,12 @@ const classify = (str: string): string =>
   str.replace(classifyRE, c => c.toUpperCase()).replace(/[-_]/g, '')
 
 export function getComponentName(
-  Component: ConcreteComponent
-): string | undefined {
+  Component: ConcreteComponent,
+  includeInferred = true
+): string | false | undefined {
   return isFunction(Component)
     ? Component.displayName || Component.name
-    : Component.name
+    : Component.name || (includeInferred && Component.__name)
 }
 
 /* istanbul ignore next */

+ 4 - 1
packages/runtime-core/src/helpers/resolveAssets.ts

@@ -86,7 +86,10 @@ function resolveAsset(
 
     // explicit self name has highest priority
     if (type === COMPONENTS) {
-      const selfName = getComponentName(Component)
+      const selfName = getComponentName(
+        Component,
+        false /* do not include inferred name to avoid breaking existing code */
+      )
       if (
         selfName &&
         (selfName === name ||