Skip to content

Commit ad591c3

Browse files
committed
Merge branch 'main' into alien-signals
2 parents 2d832a4 + c4312f9 commit ad591c3

File tree

33 files changed

+503
-248
lines changed

33 files changed

+503
-248
lines changed

.github/renovate.json5

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
{
22
$schema: 'https://docs.renovatebot.com/renovate-schema.json',
3-
extends: ['config:base', 'schedule:weekly', 'group:allNonMajor'],
3+
extends: ['config:recommended', 'schedule:weekly', 'group:allNonMajor'],
44
labels: ['dependencies'],
55
ignorePaths: ['**/__tests__/**'],
66
rangeStrategy: 'bump',
77
packageRules: [
88
{
9-
depTypeList: ['peerDependencies'],
9+
matchDepTypes: ['peerDependencies'],
1010
enabled: false,
1111
},
1212
{
1313
groupName: 'test',
14-
matchPackageNames: ['vitest', 'jsdom', 'puppeteer'],
15-
matchPackagePrefixes: ['@vitest'],
14+
matchPackageNames: ['vitest', 'jsdom', 'puppeteer', '@vitest{/,}**'],
1615
},
1716
{
1817
groupName: 'playground',
@@ -23,18 +22,28 @@
2322
},
2423
{
2524
groupName: 'compiler',
26-
matchPackageNames: ['magic-string'],
27-
matchPackagePrefixes: ['@babel', 'postcss'],
25+
matchPackageNames: ['magic-string', '@babel{/,}**', 'postcss{/,}**'],
2826
},
2927
{
3028
groupName: 'build',
31-
matchPackageNames: ['vite', '@swc/core'],
32-
matchPackagePrefixes: ['rollup', 'esbuild', '@rollup', '@vitejs'],
29+
matchPackageNames: [
30+
'vite',
31+
'@swc/core',
32+
'rollup{/,}**',
33+
'esbuild{/,}**',
34+
'@rollup{/,}**',
35+
'@vitejs{/,}**',
36+
],
3337
},
3438
{
3539
groupName: 'lint',
36-
matchPackageNames: ['simple-git-hooks', 'lint-staged'],
37-
matchPackagePrefixes: ['typescript-eslint', 'eslint', 'prettier'],
40+
matchPackageNames: [
41+
'simple-git-hooks',
42+
'lint-staged',
43+
'typescript-eslint{/,}**',
44+
'eslint{/,}**',
45+
'prettier{/,}**',
46+
],
3847
},
3948
],
4049
ignoreDeps: [

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@
1313
},
1414
"[json]": {
1515
"editor.defaultFormatter": "esbenp.prettier-vscode"
16-
}
16+
},
17+
"editor.formatOnSave": true
1718
}

.well-known/funding-manifest-urls

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
https://vuejs.org/funding.json

package.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@
2222
"test-dts": "run-s build-dts test-dts-only",
2323
"test-dts-only": "tsc -p packages-private/dts-built-test/tsconfig.json && tsc -p ./packages-private/dts-test/tsconfig.test.json",
2424
"test-coverage": "vitest run --project unit --coverage",
25-
"test-bench": "vitest bench",
25+
"prebench": "node scripts/build.js -pf esm-browser reactivity",
26+
"prebench-compare": "node scripts/build.js -pf esm-browser reactivity",
27+
"bench": "vitest bench --project=unit --outputJson=temp/bench.json",
28+
"bench-compare": "vitest bench --project=unit --compare=temp/bench.json",
2629
"release": "node scripts/release.js",
2730
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
2831
"dev-esm": "node scripts/dev.js -if esm-bundler-runtime",
@@ -66,7 +69,7 @@
6669
"@rollup/plugin-json": "^6.1.0",
6770
"@rollup/plugin-node-resolve": "^15.3.0",
6871
"@rollup/plugin-replace": "5.0.4",
69-
"@swc/core": "^1.7.42",
72+
"@swc/core": "^1.9.1",
7073
"@types/hash-sum": "^1.0.2",
7174
"@types/node": "^22.8.7",
7275
"@types/semver": "^7.5.8",
@@ -94,7 +97,7 @@
9497
"pug": "^3.0.3",
9598
"puppeteer": "~23.3.0",
9699
"rimraf": "^6.0.1",
97-
"rollup": "^4.24.3",
100+
"rollup": "^4.25.0",
98101
"rollup-plugin-dts": "^6.1.1",
99102
"rollup-plugin-esbuild": "^6.1.1",
100103
"rollup-plugin-polyfill-node": "^0.13.0",

packages-private/sfc-playground/src/download/template/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"vue": "^3.4.0"
1212
},
1313
"devDependencies": {
14-
"@vitejs/plugin-vue": "^5.1.4",
14+
"@vitejs/plugin-vue": "^5.1.5",
1515
"vite": "^5.4.10"
1616
}
1717
}

packages/compiler-core/__tests__/transforms/__snapshots__/vMemo.spec.ts.snap

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,23 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

3+
exports[`compiler: v-memo transform > element v-for key expression prefixing + v-memo 1`] = `
4+
"import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, isMemoSame as _isMemoSame, withMemo as _withMemo } from "vue"
5+
6+
export function render(_ctx, _cache) {
7+
return (_openBlock(), _createElementBlock("div", null, [
8+
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.tableData, (data, __, ___, _cached) => {
9+
const _memo = (_ctx.getLetter(data))
10+
if (_cached && _cached.key === _ctx.getId(data) && _isMemoSame(_cached, _memo)) return _cached
11+
const _item = (_openBlock(), _createElementBlock("span", {
12+
key: _ctx.getId(data)
13+
}))
14+
_item.memo = _memo
15+
return _item
16+
}, _cache, 0), 128 /* KEYED_FRAGMENT */))
17+
]))
18+
}"
19+
`;
20+
321
exports[`compiler: v-memo transform > on component 1`] = `
422
"import { resolveComponent as _resolveComponent, createVNode as _createVNode, withMemo as _withMemo, openBlock as _openBlock, createElementBlock as _createElementBlock } from "vue"
523

packages/compiler-core/__tests__/transforms/__snapshots__/vOnce.spec.ts.snap

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ return function render(_ctx, _cache) {
88
const { setBlockTracking: _setBlockTracking, createElementVNode: _createElementVNode } = _Vue
99
1010
return _cache[0] || (
11-
_setBlockTracking(-1),
11+
_setBlockTracking(-1, true),
1212
(_cache[0] = _createElementVNode("div", { id: foo }, null, 8 /* PROPS */, ["id"])).cacheIndex = 0,
1313
_setBlockTracking(1),
1414
_cache[0]
@@ -28,7 +28,7 @@ return function render(_ctx, _cache) {
2828
2929
return (_openBlock(), _createElementBlock("div", null, [
3030
_cache[0] || (
31-
_setBlockTracking(-1),
31+
_setBlockTracking(-1, true),
3232
(_cache[0] = _createVNode(_component_Comp, { id: foo }, null, 8 /* PROPS */, ["id"])).cacheIndex = 0,
3333
_setBlockTracking(1),
3434
_cache[0]
@@ -47,7 +47,7 @@ return function render(_ctx, _cache) {
4747
4848
return (_openBlock(), _createElementBlock("div", null, [
4949
_cache[0] || (
50-
_setBlockTracking(-1),
50+
_setBlockTracking(-1, true),
5151
(_cache[0] = _createElementVNode("div", { id: foo }, null, 8 /* PROPS */, ["id"])).cacheIndex = 0,
5252
_setBlockTracking(1),
5353
_cache[0]
@@ -66,7 +66,7 @@ return function render(_ctx, _cache) {
6666
6767
return (_openBlock(), _createElementBlock("div", null, [
6868
_cache[0] || (
69-
_setBlockTracking(-1),
69+
_setBlockTracking(-1, true),
7070
(_cache[0] = _renderSlot($slots, "default")).cacheIndex = 0,
7171
_setBlockTracking(1),
7272
_cache[0]
@@ -85,7 +85,7 @@ return function render(_ctx, _cache) {
8585
8686
return (_openBlock(), _createElementBlock("div", null, [
8787
_cache[0] || (
88-
_setBlockTracking(-1),
88+
_setBlockTracking(-1, true),
8989
(_cache[0] = _createElementVNode("div")).cacheIndex = 0,
9090
_setBlockTracking(1),
9191
_cache[0]

packages/compiler-core/__tests__/transforms/vMemo.spec.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,12 @@ describe('compiler: v-memo transform', () => {
5353
),
5454
).toMatchSnapshot()
5555
})
56+
57+
test('element v-for key expression prefixing + v-memo', () => {
58+
expect(
59+
compile(
60+
`<span v-for="data of tableData" :key="getId(data)" v-memo="getLetter(data)"></span>`,
61+
),
62+
).toMatchSnapshot()
63+
})
5664
})

packages/compiler-core/src/ast.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,7 @@ export interface CacheExpression extends Node {
418418
index: number
419419
value: JSChildNode
420420
needPauseTracking: boolean
421+
inVOnce: boolean
421422
needArraySpread: boolean
422423
}
423424

@@ -774,12 +775,14 @@ export function createCacheExpression(
774775
index: number,
775776
value: JSChildNode,
776777
needPauseTracking: boolean = false,
778+
inVOnce: boolean = false,
777779
): CacheExpression {
778780
return {
779781
type: NodeTypes.JS_CACHE_EXPRESSION,
780782
index,
781783
value,
782784
needPauseTracking: needPauseTracking,
785+
inVOnce,
783786
needArraySpread: false,
784787
loc: locStub,
785788
}

packages/compiler-core/src/codegen.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,9 @@ function genCacheExpression(node: CacheExpression, context: CodegenContext) {
10171017
push(`_cache[${node.index}] || (`)
10181018
if (needPauseTracking) {
10191019
indent()
1020-
push(`${helper(SET_BLOCK_TRACKING)}(-1),`)
1020+
push(`${helper(SET_BLOCK_TRACKING)}(-1`)
1021+
if (node.inVOnce) push(`, true`)
1022+
push(`),`)
10211023
newline()
10221024
push(`(`)
10231025
}

packages/compiler-core/src/transform.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ export interface TransformContext
116116
addIdentifiers(exp: ExpressionNode | string): void
117117
removeIdentifiers(exp: ExpressionNode | string): void
118118
hoist(exp: string | JSChildNode | ArrayExpression): SimpleExpressionNode
119-
cache(exp: JSChildNode, isVNode?: boolean): CacheExpression
119+
cache(exp: JSChildNode, isVNode?: boolean, inVOnce?: boolean): CacheExpression
120120
constantCache: WeakMap<TemplateChildNode, ConstantTypes>
121121

122122
// 2.x Compat only
@@ -297,11 +297,12 @@ export function createTransformContext(
297297
identifier.hoisted = exp
298298
return identifier
299299
},
300-
cache(exp, isVNode = false) {
300+
cache(exp, isVNode = false, inVOnce = false) {
301301
const cacheExp = createCacheExpression(
302302
context.cached.length,
303303
exp,
304304
isVNode,
305+
inVOnce,
305306
)
306307
context.cached.push(cacheExp)
307308
return cacheExp

packages/compiler-core/src/transforms/transformExpression.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import {
2424
isStaticPropertyKey,
2525
walkIdentifiers,
2626
} from '../babelUtils'
27-
import { advancePositionWithClone, isSimpleIdentifier } from '../utils'
27+
import { advancePositionWithClone, findDir, isSimpleIdentifier } from '../utils'
2828
import {
2929
genPropsAccessExp,
3030
hasOwn,
@@ -54,6 +54,7 @@ export const transformExpression: NodeTransform = (node, context) => {
5454
)
5555
} else if (node.type === NodeTypes.ELEMENT) {
5656
// handle directives on element
57+
const memo = findDir(node, 'memo')
5758
for (let i = 0; i < node.props.length; i++) {
5859
const dir = node.props[i]
5960
// do not process for v-on & v-for since they are special handled
@@ -65,7 +66,14 @@ export const transformExpression: NodeTransform = (node, context) => {
6566
if (
6667
exp &&
6768
exp.type === NodeTypes.SIMPLE_EXPRESSION &&
68-
!(dir.name === 'on' && arg)
69+
!(dir.name === 'on' && arg) &&
70+
// key has been processed in transformFor(vMemo + vFor)
71+
!(
72+
memo &&
73+
arg &&
74+
arg.type === NodeTypes.SIMPLE_EXPRESSION &&
75+
arg.content === 'key'
76+
)
6977
) {
7078
dir.exp = processExpression(
7179
exp,

packages/compiler-core/src/transforms/vFor.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,27 @@ export const transformFor: NodeTransform = createStructuralDirectiveTransform(
6363
const isTemplate = isTemplateNode(node)
6464
const memo = findDir(node, 'memo')
6565
const keyProp = findProp(node, `key`, false, true)
66-
if (keyProp && keyProp.type === NodeTypes.DIRECTIVE && !keyProp.exp) {
66+
const isDirKey = keyProp && keyProp.type === NodeTypes.DIRECTIVE
67+
if (isDirKey && !keyProp.exp) {
6768
// resolve :key shorthand #10882
6869
transformBindShorthand(keyProp, context)
6970
}
70-
const keyExp =
71+
let keyExp =
7172
keyProp &&
7273
(keyProp.type === NodeTypes.ATTRIBUTE
7374
? keyProp.value
7475
? createSimpleExpression(keyProp.value.content, true)
7576
: undefined
7677
: keyProp.exp)
78+
79+
if (memo && keyExp && isDirKey) {
80+
if (!__BROWSER__) {
81+
keyProp.exp = keyExp = processExpression(
82+
keyExp as SimpleExpressionNode,
83+
context,
84+
)
85+
}
86+
}
7787
const keyProperty =
7888
keyProp && keyExp ? createObjectProperty(`key`, keyExp) : null
7989

packages/compiler-core/src/transforms/vOnce.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ export const transformOnce: NodeTransform = (node, context) => {
1717
context.inVOnce = false
1818
const cur = context.currentNode as ElementNode | IfNode | ForNode
1919
if (cur.codegenNode) {
20-
cur.codegenNode = context.cache(cur.codegenNode, true /* isVNode */)
20+
cur.codegenNode = context.cache(
21+
cur.codegenNode,
22+
true /* isVNode */,
23+
true /* inVOnce */,
24+
)
2125
}
2226
}
2327
}

packages/compiler-sfc/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
"@vue/shared": "workspace:*",
5050
"estree-walker": "catalog:",
5151
"magic-string": "catalog:",
52-
"postcss": "^8.4.47",
52+
"postcss": "^8.4.48",
5353
"source-map-js": "catalog:"
5454
},
5555
"devDependencies": {

packages/reactivity/__benchmarks__/computed.bench.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { bench, describe } from 'vitest'
2-
import { type ComputedRef, type Ref, computed, effect, ref } from '../src'
2+
import type { ComputedRef, Ref } from '../src'
3+
import { computed, effect, ref } from '../dist/reactivity.esm-browser.prod'
4+
5+
declare module '../dist/reactivity.esm-browser.prod' {
6+
function computed(...args: any[]): any
7+
}
38

49
describe('computed', () => {
510
bench('create computed', () => {

packages/reactivity/__benchmarks__/effect.bench.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { bench, describe } from 'vitest'
2-
import { type Ref, effect, ref } from '../src'
2+
import type { Ref } from '../src'
3+
import { effect, ref } from '../dist/reactivity.esm-browser.prod'
34

45
describe('effect', () => {
56
{

packages/reactivity/__benchmarks__/reactiveArray.bench.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { bench } from 'vitest'
2-
import { effect, reactive, shallowReadArray } from '../src'
2+
import {
3+
effect,
4+
reactive,
5+
shallowReadArray,
6+
} from '../dist/reactivity.esm-browser.prod'
37

48
for (let amount = 1e1; amount < 1e4; amount *= 10) {
59
{

packages/reactivity/__benchmarks__/reactiveMap.bench.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { bench } from 'vitest'
2-
import { type ComputedRef, computed, reactive } from '../src'
2+
import type { ComputedRef } from '../src'
3+
import { computed, reactive } from '../dist/reactivity.esm-browser.prod'
34

45
function createMap(obj: Record<string, any>) {
56
const map = new Map()

packages/reactivity/__benchmarks__/reactiveObject.bench.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { bench } from 'vitest'
2-
import { reactive } from '../src'
2+
import { reactive } from '../dist/reactivity.esm-browser.prod'
33

44
bench('create reactive obj', () => {
55
reactive({ a: 1 })

packages/reactivity/__benchmarks__/ref.bench.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { bench, describe } from 'vitest'
2-
import { ref } from '../src/index'
2+
import { ref } from '../dist/reactivity.esm-browser.prod'
33

44
describe('ref', () => {
55
bench('create ref', () => {

0 commit comments

Comments
 (0)