v2.4.0 Kill la Kill
"Fear is freedom! Subjugation is liberation! Contradiction is truth!"
Features
-
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 thev-on
listeners registered in the parent scope (without the.native
modifier). These are essentially aliases of$vnode.data.attrs
and$vnode.data.on
, but are reactive.
Combining these allows us to simplify a component like this down into this:
<div> <input v-bind="$attrs" v-on="$listeners"> </div>
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 simplerconst Foo = () => import('./Foo.vue')
syntax when declaring async components with the changes introduced in vue-loader@13.0.0. (0cd6ef3) -
support
.sync
modifier forv-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 thewatch
component option:{ handler: () => {}, deep: true }
(#5645) (5aac170) -
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
, ...) inv-bind
object syntax (#5881) (d33c125) - fix slot resolved incorrect with abstract component (#5888) (213f136)