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

fix #5965
fix #6027
fix #6029
This commit is contained in:
Evan You 2022-06-06 17:36:47 +08:00
parent 11e17a1a29
commit 9734b31c31
5 changed files with 15 additions and 7 deletions

View File

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

View File

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

View File

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

View File

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

View File

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