今天咱们来实例分析一个老哥为Vue添加新功能提的pr。
主要逻辑是,将const定义的变量且通过判断方法isLiteral
判断是否为isAllLiteral
function isLiteral(node: Node): boolean {
switch (node.type) {
case 'UnaryExpression':
return isLiteral(node.argument)
case 'BinaryExpression':
return isLiteral(node.left) && isLiteral(node.right)
case 'ArrayExpression':
return node.elements.every(element => element && isLiteral(element))
case 'ObjectExpression':
return node.properties.every(
prop =>
prop.type === 'ObjectProperty' &&
(isLiteral(prop.key) ||
(!prop.computed && prop.key.type === 'Identifier')) &&
isLiteral(prop.value)
)
case 'SequenceExpression':
case 'TemplateLiteral':
return node.expressions.every(expr => isLiteral(expr))
default:
if (isLiteralType(node)) {
return true
}
return false
}
}
如果满足条件则使用此方法,对源码进行编辑
// hoist literal constants
if (hoistStatic && isAllLiteral) s.move(start, end, 0)