From 6c6fe2c0cd89ce513503b1f85e0ddb696fd81e54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=90=E6=97=B6=E6=A9=99?= <1163675107@qq.com> Date: Tue, 27 Sep 2022 17:18:29 +0800 Subject: [PATCH] fix(compiler-dom): remove v-bind boolean attribute with literal false value when stringifying (#6635) fix #6617 --- .../transforms/stringifyStatic.spec.ts | 23 +++++++++++++++++++ .../src/transforms/stringifyStatic.ts | 10 +++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/compiler-dom/__tests__/transforms/stringifyStatic.spec.ts b/packages/compiler-dom/__tests__/transforms/stringifyStatic.spec.ts index c737071a827..bedec9fc00a 100644 --- a/packages/compiler-dom/__tests__/transforms/stringifyStatic.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/stringifyStatic.spec.ts @@ -410,6 +410,29 @@ describe('stringify static html', () => { }) }) + // #6617 + test('should remove boolean attribute for `false`', () => { + const { ast } = compileWithStringify( + `${repeat( + `
`, + StringifyThresholds.NODE_COUNT + )}` + ) + expect(ast.hoists[0]).toMatchObject({ + type: NodeTypes.JS_CALL_EXPRESSION, + callee: CREATE_STATIC, + arguments: [ + JSON.stringify( + `${repeat( + `
`, + StringifyThresholds.NODE_COUNT + )}` + ), + '21' + ] + }) + }) + test('should stringify svg', () => { const svg = `` const repeated = `` diff --git a/packages/compiler-dom/src/transforms/stringifyStatic.ts b/packages/compiler-dom/src/transforms/stringifyStatic.ts index a268d86cd07..d3f58bdb9da 100644 --- a/packages/compiler-dom/src/transforms/stringifyStatic.ts +++ b/packages/compiler-dom/src/transforms/stringifyStatic.ts @@ -28,7 +28,8 @@ import { normalizeStyle, stringifyStyle, makeMap, - isKnownSvgAttr + isKnownSvgAttr, + isBooleanAttr } from '@vue/shared' import { DOMNamespaces } from '../parserOptions' @@ -298,6 +299,13 @@ function stringifyElement( }="__VUE_EXP_START__${exp.content}__VUE_EXP_END__"` continue } + // #6568 + if ( + isBooleanAttr((p.arg as SimpleExpressionNode).content) && + exp.content === 'false' + ) { + continue + } // constant v-bind, e.g. :foo="1" let evaluated = evaluateConstant(exp) if (evaluated != null) {