Global Vue API is changed to use an application instance.
Vue 2
const app = new Vue({ data() { return { message: 'Hello Vue!' } }, template: `<div id="rendered">{{ message }}</div>` }) Vue.component('button-counter', { data: () => ({ count: 0 }), template: '<button @click="count++">Clicked {{ count }} times.</button>' }) Vue.directive('focus', { inserted: (el) => el.focus() }) app.$mount('#app')
Vue 3
const app = createApp({ data() { return { message: 'Hello Vue!' } }, template: `<div id="rendered">{{ message }}</div>` }) app.component('button-counter', { data: () => ({ count: 0 }), template: '<button @click="count++">Clicked {{ count }} times.</button>' }) app.directive('focus', { inserted: (el) => el.focus() }) app.mount('#app')
Vue.extend is removed
Vue 2
const Profile = Vue.extend({ template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>', data() { return { firstName: 'Walter', lastName: 'White', alias: 'Heisenberg', } } }) new Profile().$mount('#mount-point')
Vue 3
const Profile = { template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>', data() { return { firstName: 'Walter', lastName: 'White', alias: 'Heisenberg', } } } Vue.createApp(Profile).mount('#mount-point')
Vue.prototype is replaced by config.globalProperties.
Vue 2
Vue.prototype.$http = () => {}
Vue 3
const app = createApp({}) app.config.globalProperties.$http = () => {}
Global and internal APIs have been restructured with tree-shaking support in mind, so they can now only be accessed as named exports for the ES Modules build.
Vue 2
import Vue from 'vue' Vue.nextTick(() => { // something DOM-related }) // usage in plugins const plugin = { install: Vue => { Vue.nextTick(() => { // ... }) } }
Vue 3
import { nextTick } from 'vue' nextTick(() => // something DOM-related }) // usage in plugins const plugin = { install: app => { Vue.nextTick(() => { // ... }) } }