refactor: use more efficient walk for importUsageCheck

This commit is contained in:
Evan You 2023-11-21 22:10:00 +08:00
parent 37f9d3da8f
commit b59eabdc0d
1 changed files with 47 additions and 46 deletions

View File

@ -5,8 +5,8 @@ import {
SimpleExpressionNode, SimpleExpressionNode,
forAliasRE, forAliasRE,
parserOptions, parserOptions,
transform, walkIdentifiers,
walkIdentifiers TemplateChildNode
} from '@vue/compiler-dom' } from '@vue/compiler-dom'
import { createCache } from '../cache' import { createCache } from '../cache'
import { camelize, capitalize, isBuiltInDirective } from '@vue/shared' import { camelize, capitalize, isBuiltInDirective } from '@vue/shared'
@ -34,10 +34,12 @@ function resolveTemplateUsageCheckString(sfc: SFCDescriptor) {
} }
let code = '' let code = ''
transform(ast, {
nodeTransforms: [ ast!.children.forEach(walk)
node => {
if (node.type === NodeTypes.ELEMENT) { function walk(node: TemplateChildNode) {
switch (node.type) {
case NodeTypes.ELEMENT:
if ( if (
!parserOptions.isNativeTag!(node.tag) && !parserOptions.isNativeTag!(node.tag) &&
!parserOptions.isBuiltInComponent!(node.tag) !parserOptions.isBuiltInComponent!(node.tag)
@ -73,14 +75,13 @@ function resolveTemplateUsageCheckString(sfc: SFCDescriptor) {
code += `,${prop.value.content}` code += `,${prop.value.content}`
} }
} }
} else if (node.type === NodeTypes.INTERPOLATION) { node.children.forEach(walk)
code += `,${processExp( break
(node.content as SimpleExpressionNode).content case NodeTypes.INTERPOLATION:
)}` code += `,${processExp((node.content as SimpleExpressionNode).content)}`
break
} }
} }
]
})
code += ';' code += ';'
templateUsageCheckCache.set(content, code) templateUsageCheckCache.set(content, code)