From 8093643b0eb2d1d916748f7edc57685233236946 Mon Sep 17 00:00:00 2001 From: cexbrayat Date: Wed, 31 Mar 2021 18:38:49 +0200 Subject: [PATCH] feat(compiler-sfc): ignore empty blocks The current implementation ignores ``. This results in unnecessary code generated for a component when these blocks are actually empty. This commit filters such nodes int he SFC compiler, resulting in less code generated. --- packages/compiler-sfc/__tests__/parse.spec.ts | 5 +++++ packages/compiler-sfc/src/parse.ts | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/compiler-sfc/__tests__/parse.spec.ts b/packages/compiler-sfc/__tests__/parse.spec.ts index 2c640853b1a..04ea257fe1c 100644 --- a/packages/compiler-sfc/__tests__/parse.spec.ts +++ b/packages/compiler-sfc/__tests__/parse.spec.ts @@ -119,8 +119,13 @@ h1 { color: red } test('should ignore other nodes with no content', () => { expect(parse(``).descriptor.script).toBe(null) expect(parse(``).descriptor.styles.length).toBe(0) expect(parse(``).descriptor.customBlocks.length).toBe(0) + expect( + parse(` \n\t `).descriptor.customBlocks.length + ).toBe(0) }) test('handle empty nodes with src attribute', () => { diff --git a/packages/compiler-sfc/src/parse.ts b/packages/compiler-sfc/src/parse.ts index df7059c1f60..bbff18f2200 100644 --- a/packages/compiler-sfc/src/parse.ts +++ b/packages/compiler-sfc/src/parse.ts @@ -143,7 +143,8 @@ export function parse( if (node.type !== NodeTypes.ELEMENT) { return } - if (!node.children.length && !hasSrc(node) && node.tag !== 'template') { + // we only want to keep the nodes that are not empty (when the tag is not a template) + if (node.tag !== 'template' && isEmpty(node) && !hasSrc(node)) { return } switch (node.tag) { @@ -374,3 +375,15 @@ function hasSrc(node: ElementNode) { return p.name === 'src' }) } + +/** + * Returns true if the node has no children + * once the empty text nodes (trimmed content) have been filtered out. + */ +function isEmpty(node: ElementNode) { + return ( + node.children.filter( + child => child.type !== NodeTypes.TEXT || child.content.trim() !== '' + ).length === 0 + ) +}