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

Package detail

@vue/compiler-sfc

vuejs35.5mMIT3.5.13TypeScript support: included

@vue/compiler-sfc

vue

readme

@vue/compiler-sfc

Lower level utilities for compiling Vue Single File Components

Note: as of 3.2.13+, this package is included as a dependency of the main vue package and can be accessed as vue/compiler-sfc. This means you no longer need to explicitly install this package and ensure its version match that of vue's. Just use the main vue/compiler-sfc deep import instead.

This package contains lower level utilities that you can use if you are writing a plugin / transform for a bundler or module system that compiles Vue Single File Components (SFCs) into JavaScript. It is used in vue-loader and @vitejs/plugin-vue.

API

The API is intentionally low-level due to the various considerations when integrating Vue SFCs in a build system:

  • Separate hot-module replacement (HMR) for script, template and styles

    • template updates should not reset component state
    • style updates should be performed without component re-render
  • Leveraging the tool's plugin system for pre-processor handling. e.g. <style lang="scss"> should be processed by the corresponding webpack loader.

  • In some cases, transformers of each block in an SFC do not share the same execution context. For example, when used with thread-loader or other parallelized configurations, the template sub-loader in vue-loader may not have access to the full SFC and its descriptor.

The general idea is to generate a facade module that imports the individual blocks of the component. The trick is the module imports itself with different query strings so that the build system can handle each request as "virtual" modules:

                                  +--------------------+
                                  |                    |
                                  |  script transform  |
                           +----->+                    |
                           |      +--------------------+
                           |
+--------------------+     |      +--------------------+
|                    |     |      |                    |
|  facade transform  +----------->+ template transform |
|                    |     |      |                    |
+--------------------+     |      +--------------------+
                           |
                           |      +--------------------+
                           +----->+                    |
                                  |  style transform   |
                                  |                    |
                                  +--------------------+

Where the facade module looks like this:

// main script
import script from '/project/foo.vue?vue&type=script'
// template compiled to render function
import { render } from '/project/foo.vue?vue&type=template&id=xxxxxx'
// css
import '/project/foo.vue?vue&type=style&index=0&id=xxxxxx'

// attach render function to script
script.render = render

// attach additional metadata
// some of these should be dev only
script.__file = 'example.vue'
script.__scopeId = 'xxxxxx'

// additional tooling-specific HMR handling code
// using __VUE_HMR_API__ global

export default script

High Level Workflow

  1. In facade transform, parse the source into descriptor with the parse API and generate the above facade module code based on the descriptor;

  2. In script transform, use compileScript to process the script. This handles features like <script setup> and CSS variable injection. Alternatively, this can be done directly in the facade module (with the code inlined instead of imported), but it will require rewriting export default to a temp variable (a rewriteDefault convenience API is provided for this purpose) so additional options can be attached to the exported object.

  3. In template transform, use compileTemplate to compile the raw template into render function code.

  4. In style transform, use compileStyle to compile raw CSS to handle <style scoped>, <style module> and CSS variable injection.

Options needed for these APIs can be passed via the query string.

For detailed API references and options, check out the source type definitions. For actual usage of these APIs, check out @vitejs/plugin-vue or vue-loader.

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
  • reactiivty: 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