From 262be6733c65bb9ba981b553c0d8d158c86685c3 Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 27 Sep 2019 22:49:20 -0400 Subject: [PATCH] wip(compiler): tweak codegen, avoid duplicated asset resolution, improve formatting --- packages/compiler-core/src/codegen.ts | 16 +++++++++++++--- packages/compiler-core/src/transform.ts | 6 +++--- .../src/transforms/transformElement.ts | 4 ++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/compiler-core/src/codegen.ts b/packages/compiler-core/src/codegen.ts index a2700bbf..dbdc9efb 100644 --- a/packages/compiler-core/src/codegen.ts +++ b/packages/compiler-core/src/codegen.ts @@ -296,7 +296,13 @@ function genNodeListAsArray( nodes: (string | CodegenNode | ChildNode[])[], context: CodegenContext ) { - const multilines = nodes.length > 1 + const multilines = + nodes.length > 1 || + ((!__BROWSER__ || __DEV__) && + nodes.some( + n => + isArray(n) || (!isString(n) && n.type !== NodeTypes.SIMPLE_EXPRESSION) + )) context.push(`[`) multilines && context.indent() genNodeList(nodes, context, multilines) @@ -552,7 +558,10 @@ function genCallExpression( function genObjectExpression(node: ObjectExpression, context: CodegenContext) { const { push, indent, deindent, newline, resetMapping } = context const { properties } = node - const multilines = properties.length > 1 + const multilines = + properties.length > 1 || + ((!__BROWSER__ || __DEV__) && + properties.some(p => p.value.type !== NodeTypes.SIMPLE_EXPRESSION)) push(multilines ? `{` : `{ `) multilines && indent() for (let i = 0; i < properties.length; i++) { @@ -570,7 +579,8 @@ function genObjectExpression(node: ObjectExpression, context: CodegenContext) { } } multilines && deindent() - push(multilines ? `}` : ` }`) + const lastChar = context.code[context.code.length - 1] + push(multilines || /[\])}]/.test(lastChar) ? `}` : ` }`) } function genArrayExpression(node: ArrayExpression, context: CodegenContext) { diff --git a/packages/compiler-core/src/transform.ts b/packages/compiler-core/src/transform.ts index d5a45776..bf5fdf91 100644 --- a/packages/compiler-core/src/transform.ts +++ b/packages/compiler-core/src/transform.ts @@ -54,7 +54,7 @@ export interface TransformOptions { export interface TransformContext extends Required { root: RootNode imports: Set - statements: string[] + statements: Set hoists: JSChildNode[] identifiers: { [name: string]: number | undefined } parent: ParentNode @@ -81,7 +81,7 @@ function createTransformContext( const context: TransformContext = { root, imports: new Set(), - statements: [], + statements: new Set(), hoists: [], identifiers: {}, prefixIdentifiers, @@ -153,7 +153,7 @@ export function transform(root: RootNode, options: TransformOptions) { const context = createTransformContext(root, options) traverseChildren(root, context) root.imports = [...context.imports] - root.statements = context.statements + root.statements = [...context.statements] root.hoists = context.hoists } diff --git a/packages/compiler-core/src/transforms/transformElement.ts b/packages/compiler-core/src/transforms/transformElement.ts index afbd64b2..dab39b43 100644 --- a/packages/compiler-core/src/transforms/transformElement.ts +++ b/packages/compiler-core/src/transforms/transformElement.ts @@ -46,7 +46,7 @@ export const transformElement: NodeTransform = (node, context) => { if (isComponent) { componentIdentifier = `_component_${toValidId(node.tag)}` - context.statements.push( + context.statements.add( `const ${componentIdentifier} = ${context.helper( RESOLVE_COMPONENT )}(${JSON.stringify(node.tag)})` @@ -294,7 +294,7 @@ function createDirectiveArgs( ): ArrayExpression { // inject statement for resolving directive const dirIdentifier = `_directive_${toValidId(dir.name)}` - context.statements.push( + context.statements.add( `const ${dirIdentifier} = ${context.helper( RESOLVE_DIRECTIVE )}(${JSON.stringify(dir.name)})`