Skip to content
v2.4.0 Kill la Kill
Choose a tag to compare
@yyx990803 yyx990803 released this
· 1421 commits to main since this release

"Fear is freedom! Subjugation is liberation! Contradiction is truth!"


  • Full SSR + async component support in core: SSR now supports rendering async components used anywhere and the client also supports async components during the hydration phase. This means async components / code-splitting now just works during SSR and is no longer limited at the route level. (9cf6646 & 7404091)

  • Easier creation of wrapper components: (6118759)

    • New component option: inheritAttrs. Turns off the default behavior where
      parent scope non-prop bindings are automatically inherited on component root
      as attributes.

    • New instance properties: $attrs & $listeners. $attrs contains the parent-scope attribute bindings that were not recognized as props, and $listeners contains the v-on listeners registered in the parent scope (without the .native modifier). These are essentially aliases of $ and $, but are reactive.

    Combining these allows us to simplify a component like this down into this:

      <input v-bind="$attrs" v-on="$listeners">

    Based on discussion in #5983.

  • v-on: support v-on object syntax with no arguments. This pairs well with the new $listeners instance property when creating higher-order components. Note this syntax does not support modifiers. (11614d6)

  • Now auto-resolves ES module default export when resolving async components. This enables keeping using the simpler const Foo = () => import('./Foo.vue') syntax when declaring async components with the changes introduced in vue-loader@13.0.0. (0cd6ef3)

  • support .sync modifier for v-bind="object" (#5943) (3965e50), closes #5937

  • keep-alive: support Array for include and exclude (#5956) (51c595a)

  • weex: implement "weex.supports" api to support feature detection (#6053) (b1512d8)

  • vm.$watch now also supports using the same object format supported by the watch component option: { handler: () => {}, deep: true } (#5645) (5aac170)

  • types: add types for vue-server-renderer (#5775) (e6de9a5)

  • Vue.config.errorHandler now also captures errors thrown in custom event handlers (#5709) (11b7d5d)

  • add new config option Vue.config.warnHandler for defining a custom callback for runtime warnings. This only works in the development build. (#5883) (9881b40)

  • add comments option to allow preserving comments in template (#5951) (e4da249), closes #5392

Performance Improvements

  • ssr: vue-template-compiler now has two new SSR-specific compile methods that generates SSR-specific render function code by optimizing parts of the template into string concatenation. This improves raw SSR render performance by 2~8x depending on how much of the template can be optimized. Note this will have a much smaller impact on requests per second for a real app because raw render performance is only a small portion of the overall time spent in a request.

    This is enabled by default in vue-loader@>=12 and can be disabled using the optimizeSSR option.

  • remove src directory from npm module, which should reduce download size when installing from npm. (#6072) (e761573)

Bug Fixes

  • check enterToClass/leaveToClass existence before adding it (#5912) (34d8c79)
  • ensure cleanup in watcher.get (#5988) (f6cd44c), closes #5975
  • improve Vue.set/Vue.delete API to support multi type of array index (#5973) (eea0920)
  • multiple merged vnode hooks not invoked properly (91deb4f), closes #6076
  • v-model: should generate component-specific code for tags with "is" attribute (a1d1145), closes #6066
  • prefetch should not have as attribute (#5683) (ebca266)
  • core: add merge strategy for provide option (#6025) (306997e), closes #6008
  • support plugin with multi version vue (#5985) (049f317), closes #5970
  • core: should preserve reactivity-ness of injected objects (8d66691), closes #5913
  • parser: the first newline following pre and textarea tag should be ignored (#6022) (4d68079)
  • ref: refactor function registerRef (#6039) (254d85c), closes #5997
  • ssr: fix bundleRenderer mapped async chunks caching check (#5963) (de42186)
  • ssr: reference error when create $ssrContext for root component (#5981) (5581654), closes #5941
  • transition group should work with dynamic name (#6006) (#6019) (d8d4ca6)
  • v-model: fix input change check for type="number" (0a9aab5), closes #6069
  • v-model: use consistent behavior during IME composition for other text-like input types (fix #5902) (4acc8c8)
  • v-bind object should not override props on scopedSlots (#5995) (458030a)
  • fix out-in transition for async components (#5760) (c3cdfcf)
  • fix memory leak by preventing data.pendingInsert from keeping reference to removed nodes (#5839) (4733408)
  • reduce memory usage by avoiding keeping reference to old vdom tree after patch (#5851) (07a3726)
  • fix XHTML compatibility (#5852) (69f946b)
  • Merge inject option when extending a component (#5827) (080c387)
  • support string index when using Vue.set on Array (#5889) (8a2c514)
  • ignore reserved attributes (is, ref, ...) in v-bind object syntax (#5881) (d33c125)
  • fix slot resolved incorrect with abstract component (#5888) (213f136)