From d60a57542bbf5d28ecf68fb493e0e93fbd36d27d Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 10 Jan 2024 13:58:33 +0800 Subject: [PATCH 1/5] build: add copyright and license banner close #10054 --- LICENSE | 2 +- rollup.config.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 15f1f7e7a49..8fd17290c81 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018-present, Yuxi (Evan) You +Copyright (c) 2018-present, Yuxi (Evan) You and Vue contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/rollup.config.js b/rollup.config.js index 29fd844b960..b6a098fa69e 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -131,6 +131,12 @@ function createConfig(format, output, plugins = []) { (isGlobalBuild || isBrowserESMBuild || isBundlerESMBuild) && !packageOptions.enableNonBrowserBranches + output.banner = `/** +* ${pkg.name} v${masterVersion} +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/` + output.exports = isCompatPackage ? 'auto' : 'named' if (isNodeBuild) { output.esModule = true From 972facee0d892a1b6d9d4ad1da5da9306ed45c3f Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 10 Jan 2024 14:14:47 +0800 Subject: [PATCH 2/5] fix(hydration): improve attr hydration mismatch check for boolean attrs close #10057 close #10060 --- .../runtime-core/__tests__/hydration.spec.ts | 15 +++++++++++ packages/runtime-core/src/hydration.ts | 25 +++++++++---------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/runtime-core/__tests__/hydration.spec.ts b/packages/runtime-core/__tests__/hydration.spec.ts index 0d7df43f6aa..cd0c61982b8 100644 --- a/packages/runtime-core/__tests__/hydration.spec.ts +++ b/packages/runtime-core/__tests__/hydration.spec.ts @@ -1489,5 +1489,20 @@ describe('SSR hydration', () => { mountWithHydration(`
`, () => h('div', { id: 'foo' })) expect(`Hydration attribute mismatch`).toHaveBeenWarnedTimes(2) }) + + test('boolean attr handling', () => { + mountWithHydration(``, () => h('input', { readonly: false })) + expect(`Hydration attribute mismatch`).not.toHaveBeenWarned() + + mountWithHydration(``, () => + h('input', { readonly: true }), + ) + expect(`Hydration attribute mismatch`).not.toHaveBeenWarned() + + mountWithHydration(``, () => + h('input', { readonly: true }), + ) + expect(`Hydration attribute mismatch`).not.toHaveBeenWarned() + }) }) }) diff --git a/packages/runtime-core/src/hydration.ts b/packages/runtime-core/src/hydration.ts index e3bd4217287..532fecc8125 100644 --- a/packages/runtime-core/src/hydration.ts +++ b/packages/runtime-core/src/hydration.ts @@ -754,19 +754,18 @@ function propHasMismatch( (el instanceof SVGElement && isKnownSvgAttr(key)) || (el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) ) { - // #10000 some attrs such as textarea.value can't be get by `hasAttribute` - actual = el.hasAttribute(key) - ? el.getAttribute(key) - : key in el - ? el[key as keyof typeof el] - : '' - expected = isBooleanAttr(key) - ? includeBooleanAttr(clientValue) - ? '' - : false - : clientValue == null - ? '' - : String(clientValue) + if (isBooleanAttr(key)) { + actual = el.hasAttribute(key) + expected = includeBooleanAttr(clientValue) + } else { + // #10000 some attrs such as textarea.value can't be get by `hasAttribute` + actual = el.hasAttribute(key) + ? el.getAttribute(key) + : key in el + ? el[key as keyof typeof el] + : '' + expected = clientValue == null ? '' : String(clientValue) + } if (actual !== expected) { mismatchType = `attribute` mismatchKey = key From 70ad4caad7d19938f8ccf1ede3228a81254dd4bf Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 10 Jan 2024 21:03:20 +0800 Subject: [PATCH 3/5] fix(suspense): fix more suspense patch before resolve edge cases close #10017 --- .../runtime-core/__tests__/components/Suspense.spec.ts | 4 ++-- packages/runtime-core/src/componentRenderUtils.ts | 1 - packages/runtime-core/src/components/Suspense.ts | 9 ++++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/runtime-core/__tests__/components/Suspense.spec.ts b/packages/runtime-core/__tests__/components/Suspense.spec.ts index 203937aa526..7c3f8ff8b3d 100644 --- a/packages/runtime-core/__tests__/components/Suspense.spec.ts +++ b/packages/runtime-core/__tests__/components/Suspense.spec.ts @@ -1692,7 +1692,7 @@ describe('Suspense', () => { expect(serializeInner(root)).toBe(`
sync
`) }) - // #6416 follow up + // #6416 follow up / #10017 test('Suspense patched during HOC async component re-mount', async () => { const key = ref('k') const data = ref('data') @@ -1713,7 +1713,7 @@ describe('Suspense', () => { const App = { render() { return h(Suspense, null, { - default: h(Comp, { data: data.value }), + default: h(Comp, { k: key.value, data: data.value }), }) }, } diff --git a/packages/runtime-core/src/componentRenderUtils.ts b/packages/runtime-core/src/componentRenderUtils.ts index e07a31ee202..4cb29180e25 100644 --- a/packages/runtime-core/src/componentRenderUtils.ts +++ b/packages/runtime-core/src/componentRenderUtils.ts @@ -428,7 +428,6 @@ export function updateHOCHostEl( { vnode, parent }: ComponentInternalInstance, el: typeof vnode.el, // HostNode ) { - if (!el) return while (parent) { const root = parent.subTree if (root.suspense && root.suspense.activeBranch === vnode) { diff --git a/packages/runtime-core/src/components/Suspense.ts b/packages/runtime-core/src/components/Suspense.ts index 8d6ee16410a..ac023ae60cd 100644 --- a/packages/runtime-core/src/components/Suspense.ts +++ b/packages/runtime-core/src/components/Suspense.ts @@ -864,7 +864,14 @@ export function queueEffectWithSuspense( function setActiveBranch(suspense: SuspenseBoundary, branch: VNode) { suspense.activeBranch = branch const { vnode, parentComponent } = suspense - const el = (vnode.el = branch.el) + let el = branch.el + // if branch has no el after patch, it's a HOC wrapping async components + // drill and locate the placeholder comment node + while (!el && branch.component) { + branch = branch.component.subTree + el = branch.el + } + vnode.el = el // in case suspense is the root node of a component, // recursively update the HOC el if (parentComponent && parentComponent.subTree === vnode) { From 5af398729168481c3bee741b4f36fa4f375e0f4a Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 11 Jan 2024 00:47:28 +0800 Subject: [PATCH 4/5] fix(hydration): fix class and style hydration mismatch message close #10067 --- packages/runtime-core/src/hydration.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/runtime-core/src/hydration.ts b/packages/runtime-core/src/hydration.ts index 532fecc8125..8f095f6167f 100644 --- a/packages/runtime-core/src/hydration.ts +++ b/packages/runtime-core/src/hydration.ts @@ -725,29 +725,29 @@ function propHasMismatch( if (key === 'class') { // classes might be in different order, but that doesn't affect cascade // so we just need to check if the class lists contain the same classes. - actual = toClassSet(el.getAttribute('class') || '') - expected = toClassSet(normalizeClass(clientValue)) - if (!isSetEqual(actual, expected)) { + actual = el.getAttribute('class') + expected = normalizeClass(clientValue) + if (!isSetEqual(toClassSet(actual || ''), toClassSet(expected))) { mismatchType = mismatchKey = `class` } } else if (key === 'style') { // style might be in different order, but that doesn't affect cascade - actual = toStyleMap(el.getAttribute('style') || '') - expected = toStyleMap( - isString(clientValue) - ? clientValue - : stringifyStyle(normalizeStyle(clientValue)), - ) + actual = el.getAttribute('style') + expected = isString(clientValue) + ? clientValue + : stringifyStyle(normalizeStyle(clientValue)) + const actualMap = toStyleMap(actual) + const expectedMap = toStyleMap(expected) // If `v-show=false`, `display: 'none'` should be added to expected if (vnode.dirs) { for (const { dir, value } of vnode.dirs) { // @ts-expect-error only vShow has this internal name if (dir.name === 'show' && !value) { - expected.set('display', 'none') + expectedMap.set('display', 'none') } } } - if (!isMapEqual(actual, expected)) { + if (!isMapEqual(actualMap, expectedMap)) { mismatchType = mismatchKey = 'style' } } else if ( From 8d656ce88df12ea3706acf25db16efb58282d1e8 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 11 Jan 2024 01:03:51 +0800 Subject: [PATCH 5/5] release: v3.4.8 --- CHANGELOG.md | 11 +++++++++++ package.json | 2 +- packages/compiler-core/package.json | 2 +- packages/compiler-dom/package.json | 2 +- packages/compiler-sfc/package.json | 2 +- packages/compiler-ssr/package.json | 2 +- packages/reactivity/package.json | 2 +- packages/runtime-core/package.json | 2 +- packages/runtime-dom/package.json | 2 +- packages/server-renderer/package.json | 2 +- packages/shared/package.json | 2 +- packages/vue-compat/package.json | 2 +- packages/vue/package.json | 2 +- 13 files changed, 23 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e85904fca9c..ba455123e78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +## [3.4.8](https://github.com/vuejs/core/compare/v3.4.7...v3.4.8) (2024-01-10) + + +### Bug Fixes + +* **hydration:** fix class and style hydration mismatch message ([5af3987](https://github.com/vuejs/core/commit/5af398729168481c3bee741b4f36fa4f375e0f4a)), closes [#10067](https://github.com/vuejs/core/issues/10067) +* **hydration:** improve attr hydration mismatch check for boolean attrs ([972face](https://github.com/vuejs/core/commit/972facee0d892a1b6d9d4ad1da5da9306ed45c3f)), closes [#10057](https://github.com/vuejs/core/issues/10057) [#10060](https://github.com/vuejs/core/issues/10060) +* **suspense:** fix more suspense patch before resolve edge cases ([70ad4ca](https://github.com/vuejs/core/commit/70ad4caad7d19938f8ccf1ede3228a81254dd4bf)), closes [#10017](https://github.com/vuejs/core/issues/10017) + + + ## [3.4.7](https://github.com/vuejs/core/compare/v3.4.6...v3.4.7) (2024-01-09) diff --git a/package.json b/package.json index 69eb337e88a..5b2ff985720 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "3.4.7", + "version": "3.4.8", "packageManager": "pnpm@8.14.0", "type": "module", "scripts": { diff --git a/packages/compiler-core/package.json b/packages/compiler-core/package.json index 4e3258df0de..a5ff635918f 100644 --- a/packages/compiler-core/package.json +++ b/packages/compiler-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-core", - "version": "3.4.7", + "version": "3.4.8", "description": "@vue/compiler-core", "main": "index.js", "module": "dist/compiler-core.esm-bundler.js", diff --git a/packages/compiler-dom/package.json b/packages/compiler-dom/package.json index 4bbdeebaa34..2e7206e14e1 100644 --- a/packages/compiler-dom/package.json +++ b/packages/compiler-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-dom", - "version": "3.4.7", + "version": "3.4.8", "description": "@vue/compiler-dom", "main": "index.js", "module": "dist/compiler-dom.esm-bundler.js", diff --git a/packages/compiler-sfc/package.json b/packages/compiler-sfc/package.json index d3ba667b35e..21eda5a62cf 100644 --- a/packages/compiler-sfc/package.json +++ b/packages/compiler-sfc/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-sfc", - "version": "3.4.7", + "version": "3.4.8", "description": "@vue/compiler-sfc", "main": "dist/compiler-sfc.cjs.js", "module": "dist/compiler-sfc.esm-browser.js", diff --git a/packages/compiler-ssr/package.json b/packages/compiler-ssr/package.json index a62926ddde7..0c9c67bcb15 100644 --- a/packages/compiler-ssr/package.json +++ b/packages/compiler-ssr/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-ssr", - "version": "3.4.7", + "version": "3.4.8", "description": "@vue/compiler-ssr", "main": "dist/compiler-ssr.cjs.js", "types": "dist/compiler-ssr.d.ts", diff --git a/packages/reactivity/package.json b/packages/reactivity/package.json index cf08ca51e88..2f53964baf7 100644 --- a/packages/reactivity/package.json +++ b/packages/reactivity/package.json @@ -1,6 +1,6 @@ { "name": "@vue/reactivity", - "version": "3.4.7", + "version": "3.4.8", "description": "@vue/reactivity", "main": "index.js", "module": "dist/reactivity.esm-bundler.js", diff --git a/packages/runtime-core/package.json b/packages/runtime-core/package.json index 95aa91e1116..588adc20448 100644 --- a/packages/runtime-core/package.json +++ b/packages/runtime-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-core", - "version": "3.4.7", + "version": "3.4.8", "description": "@vue/runtime-core", "main": "index.js", "module": "dist/runtime-core.esm-bundler.js", diff --git a/packages/runtime-dom/package.json b/packages/runtime-dom/package.json index 6c48c06dbe2..f786057f38e 100644 --- a/packages/runtime-dom/package.json +++ b/packages/runtime-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-dom", - "version": "3.4.7", + "version": "3.4.8", "description": "@vue/runtime-dom", "main": "index.js", "module": "dist/runtime-dom.esm-bundler.js", diff --git a/packages/server-renderer/package.json b/packages/server-renderer/package.json index 7003cd48240..48e2458a553 100644 --- a/packages/server-renderer/package.json +++ b/packages/server-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/server-renderer", - "version": "3.4.7", + "version": "3.4.8", "description": "@vue/server-renderer", "main": "index.js", "module": "dist/server-renderer.esm-bundler.js", diff --git a/packages/shared/package.json b/packages/shared/package.json index 8b6a42e5c95..0e19df2c95d 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@vue/shared", - "version": "3.4.7", + "version": "3.4.8", "description": "internal utils shared across @vue packages", "main": "index.js", "module": "dist/shared.esm-bundler.js", diff --git a/packages/vue-compat/package.json b/packages/vue-compat/package.json index e2368f9f304..4aa8e9d73ca 100644 --- a/packages/vue-compat/package.json +++ b/packages/vue-compat/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compat", - "version": "3.4.7", + "version": "3.4.8", "description": "Vue 3 compatibility build for Vue 2", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js", diff --git a/packages/vue/package.json b/packages/vue/package.json index 48a6a07bdc8..597c4acac95 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "vue", - "version": "3.4.7", + "version": "3.4.8", "description": "The progressive JavaScript framework for building modern web UI.", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js",