今天咱们来实例分析一个老哥为Vue添加新功能提的pr

    主要逻辑是,将const定义的变量且通过判断方法isLiteral判断是否为isAllLiteral

    1. function isLiteral(node: Node): boolean {
    2. switch (node.type) {
    3. case 'UnaryExpression':
    4. return isLiteral(node.argument)
    5. case 'BinaryExpression':
    6. return isLiteral(node.left) && isLiteral(node.right)
    7. case 'ArrayExpression':
    8. return node.elements.every(element => element && isLiteral(element))
    9. case 'ObjectExpression':
    10. return node.properties.every(
    11. prop =>
    12. prop.type === 'ObjectProperty' &&
    13. (isLiteral(prop.key) ||
    14. (!prop.computed && prop.key.type === 'Identifier')) &&
    15. isLiteral(prop.value)
    16. )
    17. case 'SequenceExpression':
    18. case 'TemplateLiteral':
    19. return node.expressions.every(expr => isLiteral(expr))
    20. default:
    21. if (isLiteralType(node)) {
    22. return true
    23. }
    24. return false
    25. }
    26. }

    如果满足条件则使用此方法,对源码进行编辑

    1. // hoist literal constants
    2. if (hoistStatic && isAllLiteral) s.move(start, end, 0)