Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@vue/reactivity-transform

vuejs4.1mMIT3.3.13TypeScript support: included

@vue/reactivity-transform

vue

readme

@vue/reactivity-transform

⚠️ This is experimental and the proposal has been dropped. The feature is now marked as deprecated and will be removed from Vue core in 3.4.

See reason for deprecation here.

Basic Rules

  • Ref-creating APIs have $-prefixed versions that create reactive variables instead. They also do not need to be explicitly imported. These include:
    • ref
    • computed
    • shallowRef
    • customRef
    • toRef
  • $() can be used to destructure an object into reactive variables, or turn existing refs into reactive variables
  • $$() to "escape" the transform, which allows access to underlying refs
import { watchEffect } from 'vue'

// bind ref as a variable
let count = $ref(0)

watchEffect(() => {
  // no need for .value
  console.log(count)
})

// assignments are reactive
count++

// get the actual ref
console.log($$(count)) // { value: 1 }

Macros can be optionally imported to make it more explicit:

// not necessary, but also works
import { $, $ref } from 'vue/macros'

let count = $ref(0)
const { x, y } = $(useMouse())

Global Types

To enable types for the macros globally, include the following in a .d.ts file:

/// <reference types="vue/macros-global" />

API

This package is the lower-level transform that can be used standalone. Higher-level tooling (e.g. @vitejs/plugin-vue and vue-loader) will provide integration via options.

shouldTransform

Can be used to do a cheap check to determine whether full transform should be performed.

import { shouldTransform } from '@vue/reactivity-transform'

shouldTransform(`let a = ref(0)`) // false
shouldTransform(`let a = $ref(0)`) // true

transform

import { transform } from '@vue/reactivity-transform'

const src = `let a = $ref(0); a++`
const {
  code, // import { ref as _ref } from 'vue'; let a = (ref(0)); a.value++"
  map
} = transform(src, {
  filename: 'foo.ts',
  sourceMap: true,

  // @babel/parser plugins to enable.
  // 'typescript' and 'jsx' will be auto-inferred from filename if provided,
  // so in most cases explicit parserPlugins are not necessary
  parserPlugins: [
    /* ... */
  ]
})

Options

interface RefTransformOptions {
  filename?: string
  sourceMap?: boolean // default: false
  parserPlugins?: ParserPlugin[]
  importHelpersFrom?: string // default: "vue"
}

transformAST

Transform with an existing Babel AST + MagicString instance. This is used internally by @vue/compiler-sfc to avoid double parse/transform cost.

import { transformAST } from '@vue/reactivity-transform'
import { parse } from '@babel/parser'
import MagicString from 'magic-string'

const src = `let a = $ref(0); a++`
const ast = parse(src, { sourceType: 'module' })
const s = new MagicString(src)

const {
  rootRefs, // ['a']
  importedHelpers // ['ref']
} = transformAST(ast, s)

console.log(s.toString()) // let a = _ref(0); a.value++

changelog

3.5.13 (2024-11-15)

Bug Fixes

  • compiler-core: handle v-memo + v-for with functional key (#12014) (99009ee), closes #12013
  • compiler-dom: properly stringify template string style (#12392) (2d78539), closes #12391
  • custom-element: avoid triggering mutationObserver when relecting props (352bc88), closes #12214 #12215
  • deps: update dependency postcss to ^8.4.48 (#12356) (b5ff930)
  • hydration: the component vnode's el should be updated when a mismatch occurs. (#12255) (a20a4cb), closes #12253
  • reactivty: avoid unnecessary watcher effect removal from inactive scope (2193284), closes #5783 #5806
  • reactivity: release nested effects/scopes on effect scope stop (#12373) (bee2f5e), closes #12370
  • runtime-dom: set css vars before user onMounted hooks (2d5c5e2), closes #11533
  • runtime-dom: set css vars on update to handle child forcing reflow in onMount (#11561) (c4312f9)
  • ssr: avoid updating subtree of async component if it is resolved (#12363) (da7ad5e), closes #12362
  • ssr: ensure v-text updates correctly with custom directives in SSR output (#12311) (1f75d4e), closes #12309
  • ssr: handle initial selected state for select with v-model + v-for option (#12399) (4f8d807), closes #12395
  • teleport: handle deferred teleport update before mounted (#12168) (8bff142), closes #12161
  • templateRef: set ref on cached async component which wrapped in KeepAlive (#12290) (983eb50), closes #4999 #5004
  • test: update snapshot (#12169) (828d4a4)
  • Transition: fix transition memory leak edge case (#12182) (660132d), closes #12181
  • transition: reflow before leave-active class after leave-from (#12288) (4b479db), closes #2593
  • types: defineEmits w/ interface declaration (#12343) (1022eab), closes #8457
  • v-once: setting hasOnce to current block only when in v-once (#12374) (37300fc), closes #12371

Performance Improvements

  • reactivity: do not track inner key __v_skip` (#11690) (d637bd6)
  • runtime-core: use feature flag for call to resolveMergedOptions (#12163) (1755ac0)

3.5.12 (2024-10-11)

Bug Fixes

Performance Improvements

  • reactivity: avoid unnecessary recursion in removeSub (#12135) (ec917cf)

3.5.11 (2024-10-03)

Bug Fixes

  • compiler-sfc: do not skip TSSatisfiesExpression when transforming props destructure (#12062) (2328b05), closes #12061
  • reactivity: prevent overwriting next property during batch processing (#12075) (d3f5e6e), closes #12072
  • scheduler: job ordering when the post queue is flushing (#12090) (577edca)
  • types: correctly infer TypeProps when it is any (#12073) (57315ab), closes #12058
  • types: should not intersect PublicProps with Props (#12077) (6f85894)
  • types: infer the first generic type of Ref correctly (#12094) (c97bb84)

3.5.10 (2024-09-27)

Bug Fixes

  • custom-element: properly set kebab-case props on Vue custom elements (ea3efa0), closes #12030 #12032
  • reactivity: fix nested batch edge case (93c95dd)
  • reactivity: only clear notified flags for computed in first batch iteration (aa9ef23), closes #12045
  • types/ref: handle nested refs in UnwrapRef (#12049) (e2c19c2), closes #12044

3.5.9 (2024-09-26)

Bug Fixes

3.5.8 (2024-09-22)

Bug Fixes

  • reactivity: do not remove dep from depsMap when cleaning up deps of computed (#11995) (0267a58)

3.5.7 (2024-09-20)

Bug Fixes

Performance Improvements

  • hydration: avoid observer if element is in viewport (#11639) (e075dfa)

3.5.6 (2024-09-16)

Bug Fixes

  • compile-dom: should be able to stringify mathML (#11891) (85c138c)
  • compiler-sfc: preserve old behavior when using withDefaults with desutructure (8492c3c), closes #11930
  • reactivity: avoid exponential perf cost and reduce call stack depth for deeply chained computeds (#11944) (c74bb8c), closes #11928
  • reactivity: rely on dirty check only when computed has deps (#11931) (aa5dafd), closes #11929
  • watch: once option should be ignored by watchEffect (#11884) (49fa673)
  • watch: unwatch should be callable during SSR (#11925) (2d6adf7), closes #11924

3.5.5 (2024-09-13)

Bug Fixes

  • compiler-core: fix handling of delimiterOpen in VPre (#11915) (706d4ac), closes #11913
  • compiler-dom: fix stringify static edge for partially eligible chunks in cached parent (1d99d61), closes #11879 #11890
  • compiler-dom: should ignore leading newline in <textarea> per spec (3c4bf76)
  • compiler-sfc: nested css supports atrule and comment (#11899) (0e7bc71), closes #11896
  • custom-element: handle nested customElement mount w/ shadowRoot false (#11861) (f2d8019), closes #11851 #11871
  • hmr: reload async child wrapped in Suspense + KeepAlive (#11907) (10a2c60), closes #11868
  • hydration: fix mismatch of leading newline in <textarea> and <pre> (a5f3c2e), closes #11873 #11874
  • reactivity: properly clean up deps, fix memory leak (8ea5d6d), closes #11901
  • runtime-core: properly update async component nested in KeepAlive (#11917) (7fe6c79), closes #11916
  • TransitionGroup: not warn unkeyed text children with whitespece preserve (#11888) (7571f20), closes #11885

3.5.4 (2024-09-10)

Bug Fixes

  • compiler-sfc: correct scoped injection for nesting selector (#11854) (b1de75e), closes #10567
  • reactivity: fix markRaw error on already marked object (#11864) (67d6596), closes #11862
  • Revert "fix: Revert "fix(reactivity): self-referencing computed should refresh"" (e596378)
  • runtime-core: handle shallow reactive arrays in renderList correctly (#11870) (ced59ab), closes #11869
  • types: correctly infer TypeEmits with both tuple and function syntax (#11840) (dad6738), closes #11836

Performance Improvements

  • reactivity: trigger deps directly instead of storing in an array first (#11695) (f80d447)

3.5.3 (2024-09-06)

Bug Fixes

  • hydration: check __asyncHydrate presence for vue3-lazy-hydration compat (#11825) (8e6c337), closes #11793
  • Revert "fix(reactivity): self-referencing computed should refresh" (35c760f)
  • ssr: respect app.config.warnHandler during ssr (bf3d9a2), closes #11830
  • Transition: handle KeepAlive child unmount in Transition out-in mode (#11833) (6b7901d), closes #11775
  • useId: make generated IDs selector compatible (babfb4c), closes #11828

3.5.2 (2024-09-05)

Bug Fixes

Features

  • compiler-core: parse modifiers as expression to provide location data (#11819) (3f13203)

3.5.1 (2024-09-04)

Bug Fixes

  • build: improve built-in components treeshakability (4eee630)
  • reactivity: handle non-array arguments in reactive concat method (#11794) (475977a), closes #11792
  • Transition: avoid applying transition hooks on comment vnode (#11788) (51912f8), closes #11782
  • types: avoid using intersection type in Readonly<...> to fix JSDoc emit (#11799) (7518bc1)
  • useTemplateRef: fix readonly warning when useTemplateRef has same variable name as template ref (bc63df0), closes #11795 #11802 #11804

3.5.0 (2024-09-03)

Aggregated Features List for 3.5 (alpha to stable)

Reactivity

  • reactivity: Refactor reactivity system to use version counting and doubly-linked list tracking (#10397) (05eb4e0)
  • reactivity: Optimize array tracking (#9511) (70196a4)
  • compiler-sfc: enable reactive props destructure by default (d2dac0e)
  • reactivity: onEffectCleanup API (2cc5615), closes #10173
  • reactivity: add failSilently argument for onScopeDispose (9a936aa)
  • reactivity/watch: base watch, getCurrentWatcher, and onWatcherCleanup (#9927) (205e5b5)
  • reactivity/watch: add pause/resume for ReactiveEffect, EffectScope, and WatchHandle (#9651) (267093c)
  • watch: support passing number to deep option to control the watch depth (#9572) (22f7d96)
  • types: export MultiWatchSources type (#9563) (998dca5)
  • types: allow computed getter and setter types to be unrelated (#11472) (a01675e), closes #7271

SSR

  • runtime-core: useId() and app.config.idPrefix (#11404) (73ef156)
  • hydration: lazy hydration strategies for async components (#11458) (d14a11c)
  • hydration: support suppressing hydration mismatch via data-allow-mismatch (94fb2b8)

Custom Element

  • custom-element: useHost() helper (775103a)
  • custom-element: useShadowRoot() helper (5a1a89b), closes #6113 #8195
  • custom-element: expose this.$host in Options API (1ef8f46)
  • custom-element: inject child components styles to custom element shadow root (#11517) (56c76a8), closes #4662 #7941 #7942
  • custom-element: support configurable app instance in defineCustomElement (6758c3c), closes #4356 #4635
  • custom-element: support css :host selector by applying css vars on host element (#8830) (03a9ea2), closes #8826
  • custom-element: support emit with options (e181bff), closes #7605
  • custom-element: support expose on customElement (#6256) (af838c1), closes #5540
  • custom-element: support nonce option for injected style tags (bb4a02a), closes #6530
  • custom-element: support passing custom-element-specific options via 2nd argument of defineCustomElement (60a88a2)
  • custom-element: support shadowRoot: false in defineCustomElement() (37d2ce5), closes #4314 #4404

Teleport

Misc

  • runtime-core: useTemplateRef() (3ba70e4)
  • runtime-core: add app.onUnmount() for registering cleanup functions (#4619) (582a3a3), closes #4516
  • runtime-core: add app.config.throwUnhandledErrorInProduction (f476b7f), closes #7876
  • runtime-dom: Trusted Types compatibility (#10844) (6d4eb94)
  • compiler-core: support Symbol global in template expressions (#9069) (a501a85)
  • types: export more emit related types (#11017) (189573d)
  • types: add loading prop to iframe (#11767) (d86fe0e)

Internals

  • reactivity: store value cache on CustomRefs impls (#11539) (e044b6e)
  • types: provide internal options for directly using user types in language tools (#10801) (75c8cf6)
  • types: provide internal options for using refs type in language tools (#11492) (5ffd1a8)

Bug Fixes

  • compiler-sfc: fix import usage check for kebab-case same name shorthand binding (0f7c0e5), closes #11745 #11754
  • cssVars: correctly escape double quotes in SSR (#11784) (7b5b6e0), closes #11779
  • deps: update dependency postcss to ^8.4.44 (#11774) (cb843e0)
  • hydration: escape css var name to avoid mismatch (#11739) (ca12e77), closes #11735
  • hydration: handle text nodes with 0 during hydration (#11772) (c756da2), closes #11771
  • reactivity: correctly handle method calls on user-extended arrays (#11760) (9817c80), closes #11759
  • runtime-dom: avoid unnecessary prop patch for checkbox (#11657) (c3ce9fe), closes #11647
  • runtime-dom: prevent unnecessary DOM update from v-model (#11656) (b1be9bd), closes #11647
  • server-renderer: Fix call to serverPrefetch in server renderer with an async setup (#10893) (6039e25)
  • server-renderer: render className during SSR (#11722) (52cdb0f)
  • types/defineModel: allow getter and setter types to be unrelated (#11699) (fe07f70), closes #11697

3.5.0-rc.1 (2024-08-29)

Bug Fixes

  • compiler-sfc: skip circular tsconfig project reference (#11680) (9c4c2e5), closes #11382
  • custom-element: handle keys set on custom elements (#11655) (f1d1831), closes #11641
  • deps: update dependency monaco-editor to ^0.51.0 (#11713) (434f8a9)
  • keep-alive: reset keep alive flag when the component is removed from include (#11718) (29c321b), closes #11717
  • reactivity: avoid infinite recursion when mutating ref wrapped in reactive (313e4bf), closes #11696
  • reactivity: ensure watcher with once: true are properly removed from effect scope (#11665) (fbc0c42)
  • runtime-dom: setting innerHTML when patching props should go through trusted types (d875de5)
  • types: GlobalDirective / GlobalComponents should not be records (42e8df6)

3.5.0-beta.3 (2024-08-20)

Bug Fixes

Features

  • reactivity: base watch, getCurrentWatcher, and onWatcherCleanup (#9927) (205e5b5)

Performance Improvements

  • runtime-core: use apply to avoid spreading. (#5985) (bb6babc)

3.5.0-beta.2 (2024-08-15)

Bug Fixes

  • build: revert entities to 4.5 to avoid runtime resolution errors (e9e0815), closes #11603
  • compiler-core: use ast-based check for function expressions when possible (5861229), closes #11615
  • compiler-sfc: fix prefixIdentifier default value (3d6f015)
  • compiler-sfc: handle keyof operator with index object (#11581) (fe00815)
  • custom-element: keep instance.isCE for backwards compat (e19fc27)
  • deps: update dependency postcss to ^8.4.41 (#11585) (4c4e12a)
  • keep-alive: ensure include/exclude regexp work with global flag (#11595) (3653bc0)
  • reactivity: ensure extended method arguments are not lost (#11574) (4085def), closes #11570
  • reactivity: sync watch should be executed correctly (#11589) (3bda3e8), closes #11577
  • types/computed: ensure type safety for WritableComputedRef (#11608) (5cf5a16)
  • types: add fallback stub for DOM types when DOM lib is absent (#11598) (fee6697)

Features

  • deprecated: remove deprecated parseExpressions option (#11597) (4e7d5db)

3.5.0-beta.1 (2024-08-08)

Bug Fixes

  • custom-element: delay mounting of custom elements with async parent (37ccb9b), closes #8127 #9341 #9351 #9351
  • custom-element: delete prop on attribute removal (506c4c5), closes #11276
  • custom-element: ignore scoped id (7f2c505)
  • custom-element: reflect prop default value on custom element (63689ed), closes #9006 #10537
  • custom-element: support early-set domProps for async custom elements (a07e7bf), closes #11081 #11082
  • types/custome-element: defineCustomElement props inference with array emits (#11384) (e94b01b), closes #11353
  • types: allow using InjectionKey as valid property key (321d807), closes #5089

Features

  • custom-element: expose this.$host in Options API (1ef8f46)
  • custom-element: inject child components styles to custom element shadow root (#11517) (56c76a8), closes #4662 #7941 #7942
  • custom-element: support configurable app instance in defineCustomElement (6758c3c), closes #4356 #4635
  • custom-element: support css :host selector by applying css vars on host element (#8830) (03a9ea2), closes #8826
  • custom-element: support emit with options (e181bff), closes #7605
  • custom-element: support for expose on customElement (#6256) (af838c1), closes #5540
  • custom-element: support nonce option for injected style tags (bb4a02a), closes #6530
  • custom-element: support passing custom-element-specific options via 2nd argument of defineCustomElement (60a88a2)
  • custom-element: support shadowRoot: false in defineCustomElement() (37d2ce5), closes #4314 #4404
  • custom-element: useHost() helper (775103a)
  • custom-element: useShadowRoot() helper (5a1a89b), closes #6113 #8195
  • hydration: allow fine tuning of lazy hydration strategy triggers (#11530) (261c8b1)
  • reactivity/watch: add pause/resume for ReactiveEffect, EffectScope, and WatchHandle (#9651) (267093c)
  • reactivity: store value cache on CustomRefs impls (#11539) (e044b6e)
  • runtime-dom: Trusted Types compatibility (#10844) (6d4eb94)
  • support specifying allowed keys via generic argument in useTemplateRef() (1fbfa69)
  • types: allow computed getter and setter types to be unrelated (#11472) (a01675e), closes #7271
  • types: export MultiWatchSources type (#9563) (998dca5)
  • types: provide internal options for using refs type in language tools (#11492) (5ffd1a8)
  • watch: support passing number to deep option to control the watch depth (#9572) (22f7d96)

3.5.0-alpha.5 (2024-07-31)

Features

  • hydration: support suppressing hydration mismatch via data-allow-mismatch (94fb2b8)
  • lazy hydration strategies for async components (#11458) (d14a11c)

3.5.0-alpha.4 (2024-07-24)

Bug Fixes

  • suspense/hydration: fix hydration timing of async component inside suspense (1b8e197), closes #6638
  • useId: properly mark async boundary for already resolved async component (cd28172)

3.5.0-alpha.3 (2024-07-19)

Bug Fixes

  • build: enable SSR branches in esm-browser builds (b14cd9a)
  • compiler-core: change node hoisting to caching per instance (#11067) (cd0ea0d), closes #5256 #9219 #10959
  • compiler-sfc: should properly walk desutructured props when reactive destructure is not enabled (0fd6193), closes #11325
  • types: respect props with default on instance type when using __typeProps (96e4738)

Features

3.5.0-alpha.2 (2024-05-04)

Bug Fixes

  • types: fix app.component() typing with inline defineComponent (908f70a), closes #10843
  • types: fix compat with generated types that rely on CreateComponentPublicInstance (c146186), closes #10842
  • types: props in defineOptions type should be optional (124c4ca), closes #10841

Features

  • runtime-core: add app.onUnmount() for registering cleanup functions (#4619) (582a3a3), closes #4516

3.5.0-alpha.1 (2024-04-29)

Bug Fixes

  • reactivity: fix call sequence of ontrigger in effect (#10501) (28841fe)

Features

  • compiler-sfc: enable reactive props destructure by default (d2dac0e)
  • reactivity: onEffectCleanup API (2cc5615), closes #10173
  • reactivity: add failSilently argument for onScopeDispose (9a936aa)
  • transition: support directly nesting Teleport inside Transition (#6548) (0e6e3c7), closes #5836
  • types: provide internal options for directly using user types in language tools (#10801) (75c8cf6)

Performance Improvements

Previous Changelogs

3.4.x (2023-10-28 - 2024-08-15)

See 3.4 changelog

3.3.x (2023-02-05 - 2023-12-29)

See 3.3 changelog

3.2.x (2021-07-16 - 2023-02-02)

See 3.2 changelog

3.1.x (2021-05-08 - 2021-07-16)

See 3.1 changelog

3.0.x (2019-12-20 - 2021-04-01)

See 3.0 changelog