Is it time to migrate to Vue 3?

Is it time to migrate to Vue.js 3.x?
VUEDAY 2022
Verona, November 18th, 2022
1
WHO AM I
Denny Biasiolli
Full Stack Developer
(JavaScript, Python, Go)
Front End Developer UX/ UI
Fingerprint Supervision Ltd
Italy, Savigliano (CN)
@dennybiasiolli
denny.biasiolli@gmail.com
www.dennybiasiolli.com
2
Vue.js Version Release date
2.6 February 4, 2019
3.0 September 18, 2020
3.1 June 7, 2021
3.2 August 5, 2021
3.x as new default February 7, 2022
2.7 (maintenance mode) July 1, 2022
2.x End of Life End of 2023
3
SEPTEMBER 18, 2020
VUE 3.0 OFFICIALLY ANNOUNCED
Composition API
<script setup> (experimental)
no IE11 support
https://blog.vuejs.org/posts/vue-3-one-piece.html
4
5
OPTIONS API (VUE 2, VUE 3)
export default {
data() {
return { count: 0 }
},
methods: {
increment() {
this.count++
},
},
}
<template>
<button @click="increment">Count is: {{ count }}</button>
</template>
6
COMPOSITION API IN setup() (VUE 3)
<script>
import { ref } from 'vue'
export default {
setup() {
const count = ref(0)
function increment() {
count.value++
}
return { count, increment }
},
}
<template>
<button @click="increment">Count is: {{ count }}</button>
</template>
7
COMPOSITION API IN setup()
(Vue 2 + @vue/composition-api)
import VueCompositionAPI from '@vue/composition-api'
Vue.use(VueCompositionAPI)
- import { ref, ... } from 'vue'
+ import { ref, ... } from '@vue/composition-api'
8
COMPOSITION API IN setup()
(Vue 2 + @vue/composition-api)
import VueCompositionAPI from '@vue/composition-api'
Vue.use(VueCompositionAPI)
- import { ref, ... } from 'vue'
+ import { ref, ... } from '@vue/composition-api'
BROKEN TESTS
8.1
COMPOSITION API IN setup()
(Vue 2 + @vue/composition-api)
import VueCompositionAPI from '@vue/composition-api'
Vue.use(VueCompositionAPI)
- import { ref, ... } from 'vue'
+ import { ref, ... } from '@vue/composition-api'
BROKEN TESTS
in tests files
Vue.use(VueCompositionAPI)
// or
localVue.use(VueCompositionAPI)
8.2
COMPOSITION API + SCRIPT SETUP (VUE 3)
<script setup>
import { ref } from 'vue'
const count = ref(0)
function increment() {
count.value++
}
</script>
<template>
<button @click="increment">Count is: {{ count }}</button>
</template>
9
FEBRUARY 7, 2022
VUE 3 AS NEW DEFAULT
https://blog.vuejs.org/posts/vue-3-as-the-new-default.html
10
POTENTIAL REQUIRED ACTIONS
NPM dependency versions in package.json
Use "^" to bind to a specific major version
"dependencies": {
- "vue": "latest",
+ "vue": "^2.6.14",
- "vue-router": "*",
+ "vue-router": "^3.5.3",
- "vuex": "latest"
+ "vuex": "^3.6.2"
},
"devDependencies": {
- "vue-loader": "latest",
+ "vue-loader": "^15.9.8",
- "@vue/test-utils": "latest"
+ "@vue/test-utils": "^1.3.0"
}
11
SPOILER ALERT
means 2.x
Starting from July 1, 2022
it auto-updates to Vue 2.7
if you don't use explicit package-lock.json or yarn.lock files
to accept only patch releases
"vue": "^2.6.14"
- "vue": "^2.6.14"
+ "vue": "~2.6.14"
12
JULY 1, 2022
VUE 2.7 "NARUTO" RELEASED
Composition API
<script setup> (partial)
https://blog.vuejs.org/posts/vue-2-7-naruto.html
13
14
VUE 2.7 UPGRADE GUIDE
1. Upgrade local @vue/cli-xxx dependencies
Upgrade to the latest version in your major version range (if applicable)
~4.5.18 for v4
~5.0.6 for v5
npx @vue/cli@latest upgrade
15
VUE 2.7 UPGRADE GUIDE
2. Upgrade vue to ^2.7
You can also remove vue-template-compiler from the dependencies,
it is no longer needed in 2.7.
If you are using @vue/test-utils, you may need to keep it in the dependencies for
now, but this requirement will also be lifted in a new release of test utils.
Always keep vue and vue-template-compiler in sync.
npm install -S vue@~2.7
npm install -D vue-template-compiler@~2.7
16
VUE 2.7 UPGRADE GUIDE
3. Check your package manager lockfile
for version requirements
If not, you will need to remove node_modules and the lockfile and perform a fresh install
to ensure they are bumped to the latest version.
npm ls vue-loader # should be at least ^15.10.0
npm ls vue-demi # should be at least ^0.13.1
17
VUE 2.7 UPGRADE GUIDE
4. Remove @vue/composition-api
and update imports to vue instead
npm uninstall @vue/composition-api
- import VueCompositionAPI from '@vue/composition-api'
- Vue.use(VueCompositionAPI)
- import { ref, ... } from '@vue/composition-api'
+ import { ref, ... } from 'vue'
18
More info about Vue 2.7 upgrade
https://blog.vuejs.org/posts/vue-2-7-naruto.html
19
USING <script setup>
- <script>
+ <script setup>
import { ref } from 'vue'
- export default {
- setup() {
const count = ref(0)
function increment() {
count.value++
}
- return { count, increment }
- },
- }
</script>
20
21
Broken vue-router usage!
npm i -S vue-router@^3.6.5
+ import { useRoute, useRouter } from 'vue-router/composables'
+ const route = useRoute()
+ const router = useRouter()
- this.$route
+ route
- this.$router
+ router
22
Same for vuex $store usage?
Import the store and navigate through it
or migrate to pinia
import store from '@/store';
store.state.propertyName
store.state.moduleName.propertyName
store.getters.getterName
store.getters['moduleName/getterName']
store.commit(/* */)
store.dispatch(/* */)
23
24
WHAT ABOUT TESTS?
25
Broken tests!
console.error
[Vue warn]: Property or method "count" is not defined
on the instance but referenced during render.
Make sure that this property is reactive,
either in the data option, or for class-based components,
by initializing the property.
See: https://v2.vuejs.org/v2/guide/reactivity.html#Declaring-R
console.error
[Vue warn]: Property or method "increment" is not defined
on the instance but referenced during render.
Make sure that this property is reactive,
either in the data option, or for class-based components,
by initializing the property.
See: https://v2.vuejs.org/v2/guide/reactivity.html#Declaring-R
26
Broken tests!
console.error
[Vue warn]: Property or method "count" is not defined
on the instance but referenced during render.
Make sure that this property is reactive,
either in the data option, or for class-based components,
by initializing the property.
See: https://v2.vuejs.org/v2/guide/reactivity.html#Declaring-R
console.error
[Vue warn]: Property or method "increment" is not defined
on the instance but referenced during render.
Make sure that this property is reactive,
either in the data option, or for class-based components,
by initializing the property.
See: https://v2.vuejs.org/v2/guide/reactivity.html#Declaring-R
@vue/vue2-jest 27.x
not working with Vue 2.7
26.1
SEPTEMBER 15, 2022
@vue/vue2-jest 29.1 released
with support for <script setup>
in Vue 2.7...
27
SEPTEMBER 15, 2022
@vue/vue2-jest 29.1 released
with support for <script setup>
in Vue 2.7...
...with Jest 29
27.1
USING JEST DIRECTLY
update jest.config.js
from node_modules
@vue/cli-plugin-unit-jest/presets/default/jest-preset.js
update package.json test script
run tests without vue-cli-service
- "test:unit": "vue-cli-service test:unit",
+ "test:unit": "jest",
npm run test:unit
# or
npx jest
28
UPGRADING JEST TO 29.X
and fix deprecation warnings
npm uninstall @vue/cli-plugin-unit-jest
npm install -D 
jest-environment-jsdom 
jest-serializer-vue 
jest-transform-stub 
jest-watch-typeahead 
@vue/vue2-jest@^29 
babel-jest@^29 
jest@^29
- testURL: 'http://localhost/',
+ testEnvironmentOptions: {
+ url: 'http://localhost/',
+ },
29
Components using <script setup>
are closed by default
Won't work anymore
const spyIncrement = jest.spyOn(wrapper.vm, 'increment')
defineExpose({ increment }) # not working
30
Components using <script setup>
are closed by default
Won't work anymore
const spyIncrement = jest.spyOn(wrapper.vm, 'increment')
defineExpose({ increment }) # not working
Temporary (not suggested) workaround
// FIXME: temporary workaround
- const spyIncrement = jest.spyOn(wrapper.vm, 'increment')
+ const spyIncrement = jest.spyOn(
+ wrapper.vm._setupState, 'increment')
30.1
COMPONENT TESTING
Test what a component does,
not how it does it.
- // FIXME: temporary workaround
- const spyIncrement = jest.spyOn(
- wrapper.vm._setupState, 'increment')
- wrapper.find('button').trigger('click')
- expect(spyIncrement).toHaveBeenCalled()
+ expect(wrapper.find('p').text()).toBe('Count is: 0')
+ await wrapper.find('button').trigger('click')
+ expect(wrapper.find('p').text()).toBe('Count is: 1')
https://vuejs.org/guide/scaling-up/testing.html#component-testing
31
MIGRATION TO VUE 3
https://v3-migration.vuejs.org/
32
MIGRATION TO VUE 3
New Features
Breaking Changes
Recommendations
Migration Build
https://v3-migration.vuejs.org/
33
MIGRATION TO VUE 3
BREAKING CHANGES
While it looks like a lot has changed, a lot of what you know and
love about Vue is still the same; but we wanted to be as thorough
as possible and provide detailed explanations and examples for
every documented change.
https://v3-migration.vuejs.org/breaking-changes/
34
NEW FRAMEWORK-LEVEL RECOMMENDATIONS
New versions of Router, Devtools & test utils
w/ Vue 3 support
Build Toolchain: Vue CLI -> Vite
State Management: Vuex -> Pinia
IDE Support: Vetur -> Volar
...
https://v3-migration.vuejs.org/recommendations.html
35
EASY MIGRATIONS
Devtools
IDE Support: Vetur -> Volar
36
MANDATORY MIGRATIONS
Vue Router
Vuex
Test utils
Third party libraries
(Vuetify, Quasar, ElementUI, etc...)
37
AVOIDABLE MIGRATIONS
Vue CLI -> Vite
Jest -> Vitest
38
MIGRATION BUILD: @vue/compat
build of Vue 3
configurable Vue 2 compatible behavior
runs in Vue 2 mode by default
usage of changed/deprecated features
will emit runtime warnings
https://v3-migration.vuejs.org/migration-build.html
39
KNOWN LIMITATIONS
dependencies that rely on Vue 2 internal APIs
or undocumented behavior.
usage of private properties on VNodes
(Vuetify, Quasar, ElementUI, ...)
IE11 support dropped
Server-side rendering
40
MIGRATION BUILD: EXPECTATIONS
aims to cover only publicly
documented Vue 2 APIs and behavior
if your application is large and
complex, migration will likely be a
challenge even with the migration
build
41
UPGRADE WORKFLOW
1. upgrade tooling if applicable
vue-cli:
custom webpack setup:
upgrade vue-loader to ^16
npx @vue/cli@latest upgrade
42
2. update vue in package.json
"dependencies": {
- "vue": "~2.7",
+ "vue": "^3.2.39",
+ "@vue/compat": "^3.2.39"
...
},
"devDependencies": {
- "vue-template-compiler": "~2.7"
}
npm i -S vue@^3.2 @vue/compat@^3.2 --force
npm uninstall vue-template-compiler --force
43
3.1. alias vue to @vue/compat
Webpack or Vite config on
// vue.config.js
module.exports = {
// ...
chainWebpack: (config) => {
config.resolve.alias.set('vue', '@vue/compat')
// ...
}
}
https://v3-migration.vuejs.org/migration-build.html
44
3.2. enable compat mode via Vue compiler options
Webpack or Vite config on
config.module
.rule('vue')
.use('vue-loader')
.tap((options) => {
return {
...options,
compilerOptions: {
compatConfig: {
MODE: 2
}
}
}
})
https://v3-migration.vuejs.org/migration-build.html
45
4. if using TypeScript, update vue's typing
declare module 'vue' {
import { CompatVue } from '@vue/runtime-dom'
const Vue: CompatVue
export default Vue
export * from '@vue/runtime-dom'
const { configureCompat } = Vue
export { configureCompat }
}
46
5. fix compile-time errors
When compiler warnings are gone, you can set the
compiler to Vue 3 mode
compilerOptions: {
compatConfig: {
MODE: 3
}
}
47
6. Run the app
48
6. Run the app
the app should be able to run
if no limitations mentioned above
focus on fixing your own source code warnings first
49
7. Update <transition> class names
This feature does not have a runtime warning.
Search for `.*-enter` and `.*-leave` CSS class names
- .*-enter
+ .*-enter-from
- .*-leave
+ .*-leave-to
50
8. Update app entry to use new global mounting API
- import Vue from 'vue'
+ import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
- Vue.config.productionTip = false
- new Vue({
+ const app = createApp({
router,
store,
- render: h => h(App)
+ ...App,
- }).$mount('#app')
+ })
+ app.mount('#app')
51
9. Upgrade vuex to v4
npm i -S vuex@^4 --force
https://vuex.vuejs.org/guide/migrating-to-4-0-from-3-x.html
52
9. Upgrade vuex to v4
// src/store/index.js
- import Vue from 'vue'
- import Vuex from 'vuex'
+ import { createStore } from 'vuex'
- Vue.use(Vuex)
- export default new Vuex.Store({
+ export default createStore({
- state: {
- count: 0,
+ state() {
+ return {
+ count: 0,
+ };
},
// ...
53
9. Upgrade vuex to v4
// src/main.js
import store from './store'
const app = createApp({
router,
- store,
...App,
})
+ app.use(store)
54
9. Upgrade vuex to v4
Composition API usage
import { useStore } from 'vuex'
const store = useStore()
55
10. Upgrade vue-router to v4
npm i -S vue-router@^4 --force
https://router.vuejs.org/guide/migration/index.html
56
10. Upgrade vue-router to v4
// src/router/index.js
- import Vue from 'vue'
- import VueRouter from 'vue-router'
+ import { createRouter, createWebHistory } from 'vue-router'
- Vue.use(Vuex)
const routes = [
// ...
]
- const default new VueRouter({
+ export default createRouter({
- mode: 'history',
- base: process.env.BASE_URL,
+ history: createWebHistory(process.env.BASE_URL),
routes
})
57
10. Upgrade vue-router to v4
// src/main.js
import router from './router'
const app = createApp({
- router,
...App,
})
+ app.use(router)
58
10. Upgrade vue-router to v4
Composition API usage
import { useRouter, useRoute } from 'vue-router'
const router = useRouter()
const route = useRoute()
59
11. Pick off individual warnings (if any)
Always refer to the doc.
https://v3-migration.vuejs.org/
60
12. Remove the migration build and switch to Vue 3
when all warnings are fixed.
Note you may not be able to do so if you still have
dependencies that rely on Vue 2 behavior.
npm uninstall @vue/compat --force
61
62
BROKEN TESTS!
Upgrade testing packages
npm uninstall @vue/vue2-jest --force
npm i -D @vue/vue3-jest@^29 --force
npm i -D @vue/test-utils@^2 --force
// jest.config.js
transform: {
- '^.+.vue$': '@vue/vue2-jest',
+ '^.+.vue$': '@vue/vue3-jest',
https://test-utils.vuejs.org/migration/
63
VUE TEST UTILS V2 CHANGES
propsData is now props
no more createLocalVue
mocks and stubs are now in global
findAll().at() removed
use findAll()[]
...
https://test-utils.vuejs.org/migration/
64
SOLVING TEST ERRORS/WARNINGS
Solution
console.warn
[Vue warn]: Avoid app logic that relies
on enumerating keys on a component instance.
The keys will be empty in production mode
to avoid performance overhead.
- expect(wrapper).toMatchSnapshot()
+ expect(wrapper.html()).toMatchSnapshot()
65
SOLVING TEST ERRORS/WARNINGS
Solution
ReferenceError: Vue is not defined
> 1 | import { shallowMount } from '@vue/test-utils';
| ^
// jest.config.js
testEnvironmentOptions: {
customExportConditions: ["node", "node-addons"],
},
https://github.com/vuejs/vue-jest/issues/479#issuecomment-1163421581
https://stackoverflow.com/a/72608494/3963422
66
67
RECAP
Vue 2.6 + @vue/composition-api
Composition API (setup() only)
Vue 2.6 → 2.7
Composition API
<script setup>
Vue 2.x → 3.x
long term support for your codebase
68
THANK YOU!
|
|
migrate-to-vue3 branch
@dennybiasiolli
blog.vuejs.org vuejs.org
v3-migration.vuejs.org
vuex.vuejs.org router.vuejs.org
test-utils.vuejs.org
github.com/dennybiasiolli/vue-migration-2-to-3
www.dennybiasiolli.com
69
1 of 74

Recommended

Vue 2 vs Vue 3.pptx by
Vue 2 vs Vue 3.pptxVue 2 vs Vue 3.pptx
Vue 2 vs Vue 3.pptxAlbiorix Technology
180 views14 slides
introduction to Vue.js 3 by
introduction to Vue.js 3 introduction to Vue.js 3
introduction to Vue.js 3 ArezooKmn
890 views18 slides
React.js - The Dawn of Virtual DOM by
React.js - The Dawn of Virtual DOMReact.js - The Dawn of Virtual DOM
React.js - The Dawn of Virtual DOMJimit Shah
1.4K views25 slides
VueJS: The Simple Revolution by
VueJS: The Simple RevolutionVueJS: The Simple Revolution
VueJS: The Simple RevolutionRafael Casuso Romate
2.8K views36 slides
Vue.js Getting Started by
Vue.js Getting StartedVue.js Getting Started
Vue.js Getting StartedMurat Doğan
1.4K views45 slides
Angular Introduction By Surekha Gadkari by
Angular Introduction By Surekha GadkariAngular Introduction By Surekha Gadkari
Angular Introduction By Surekha GadkariSurekha Gadkari
900 views21 slides

More Related Content

What's hot

Angular 9 by
Angular 9 Angular 9
Angular 9 Raja Vishnu
894 views36 slides
React-JS Component Life-cycle Methods by
React-JS Component Life-cycle MethodsReact-JS Component Life-cycle Methods
React-JS Component Life-cycle MethodsANKUSH CHAVAN
1.7K views19 slides
An introduction to Vue.js by
An introduction to Vue.jsAn introduction to Vue.js
An introduction to Vue.jsPagepro
440 views127 slides
'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko by
'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko
'BUILDING ANGULAR APPS WITH NX' by Anastasia NecheporenkoOdessaJS Conf
403 views13 slides
React dom by
React domReact dom
React domShahriarPriyo
66 views12 slides
An Introduction to Vuejs by
An Introduction to VuejsAn Introduction to Vuejs
An Introduction to VuejsPaddy Lock
4.6K views13 slides

What's hot(20)

React-JS Component Life-cycle Methods by ANKUSH CHAVAN
React-JS Component Life-cycle MethodsReact-JS Component Life-cycle Methods
React-JS Component Life-cycle Methods
ANKUSH CHAVAN1.7K views
An introduction to Vue.js by Pagepro
An introduction to Vue.jsAn introduction to Vue.js
An introduction to Vue.js
Pagepro440 views
'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko by OdessaJS Conf
'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko
'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko
OdessaJS Conf403 views
An Introduction to Vuejs by Paddy Lock
An Introduction to VuejsAn Introduction to Vuejs
An Introduction to Vuejs
Paddy Lock4.6K views
Angular Dependency Injection by Nir Kaufman
Angular Dependency InjectionAngular Dependency Injection
Angular Dependency Injection
Nir Kaufman604 views
webpack 101 slides by mattysmith
webpack 101 slideswebpack 101 slides
webpack 101 slides
mattysmith695 views
Git n git hub by Jiwon Baek
Git n git hubGit n git hub
Git n git hub
Jiwon Baek524 views

Similar to Is it time to migrate to Vue 3?

Is it time to migrate to Vue 3? by
Is it time to migrate to Vue 3?Is it time to migrate to Vue 3?
Is it time to migrate to Vue 3?Denny Biasiolli
137 views75 slides
State manager in Vue.js, from zero to Vuex by
State manager in Vue.js, from zero to VuexState manager in Vue.js, from zero to Vuex
State manager in Vue.js, from zero to VuexCommit University
158 views65 slides
Introducing Vuex in your project by
Introducing Vuex in your projectIntroducing Vuex in your project
Introducing Vuex in your projectDenny Biasiolli
137 views65 slides
Vuex to Pinia, how to migrate an existing app by
Vuex to Pinia, how to migrate an existing appVuex to Pinia, how to migrate an existing app
Vuex to Pinia, how to migrate an existing appDenny Biasiolli
157 views58 slides
Da Vuex a Pinia: come fare la migrazione by
Da Vuex a Pinia: come fare la migrazioneDa Vuex a Pinia: come fare la migrazione
Da Vuex a Pinia: come fare la migrazioneCommit University
136 views59 slides
Vue JS @ MindDoc. The progressive road to online therapy by
Vue JS @ MindDoc. The progressive road to online therapyVue JS @ MindDoc. The progressive road to online therapy
Vue JS @ MindDoc. The progressive road to online therapyDarío Blanco Iturriaga
183 views34 slides

Similar to Is it time to migrate to Vue 3?(20)

State manager in Vue.js, from zero to Vuex by Commit University
State manager in Vue.js, from zero to VuexState manager in Vue.js, from zero to Vuex
State manager in Vue.js, from zero to Vuex
Commit University158 views
Introducing Vuex in your project by Denny Biasiolli
Introducing Vuex in your projectIntroducing Vuex in your project
Introducing Vuex in your project
Denny Biasiolli137 views
Vuex to Pinia, how to migrate an existing app by Denny Biasiolli
Vuex to Pinia, how to migrate an existing appVuex to Pinia, how to migrate an existing app
Vuex to Pinia, how to migrate an existing app
Denny Biasiolli157 views
Da Vuex a Pinia: come fare la migrazione by Commit University
Da Vuex a Pinia: come fare la migrazioneDa Vuex a Pinia: come fare la migrazione
Da Vuex a Pinia: come fare la migrazione
Commit University136 views
Making React Native UI Components with Swift by Ray Deck
Making React Native UI Components with SwiftMaking React Native UI Components with Swift
Making React Native UI Components with Swift
Ray Deck1.1K views
Vue.js part1 by 욱래 김
Vue.js part1Vue.js part1
Vue.js part1
욱래 김530 views
How to Build SPA with Vue Router 2.0 by Takuya Tejima
How to Build SPA with Vue Router 2.0How to Build SPA with Vue Router 2.0
How to Build SPA with Vue Router 2.0
Takuya Tejima18.5K views
How to Build ToDo App with Vue 3 + TypeScript by Katy Slemon
How to Build ToDo App with Vue 3 + TypeScriptHow to Build ToDo App with Vue 3 + TypeScript
How to Build ToDo App with Vue 3 + TypeScript
Katy Slemon407 views
Universal JS Web Applications with React - Luciano Mammino - Codemotion Rome ... by Luciano Mammino
Universal JS Web Applications with React - Luciano Mammino - Codemotion Rome ...Universal JS Web Applications with React - Luciano Mammino - Codemotion Rome ...
Universal JS Web Applications with React - Luciano Mammino - Codemotion Rome ...
Luciano Mammino330 views
Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti... by Codemotion
Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...
Universal JavaScript Web Applications with React - Luciano Mammino - Codemoti...
Codemotion1.1K views
How to Implement Middleware Pipeline in VueJS.pdf by Katy Slemon
How to Implement Middleware Pipeline in VueJS.pdfHow to Implement Middleware Pipeline in VueJS.pdf
How to Implement Middleware Pipeline in VueJS.pdf
Katy Slemon116 views
Using Renderless Components in Vue.js during your software development. by tothepointIT
Using Renderless Components in Vue.js during your software development.Using Renderless Components in Vue.js during your software development.
Using Renderless Components in Vue.js during your software development.
tothepointIT180 views

Recently uploaded

Future of Learning - Khoong Chan Meng by
Future of Learning - Khoong Chan MengFuture of Learning - Khoong Chan Meng
Future of Learning - Khoong Chan MengNUS-ISS
31 views7 slides
Data-centric AI and the convergence of data and model engineering: opportunit... by
Data-centric AI and the convergence of data and model engineering:opportunit...Data-centric AI and the convergence of data and model engineering:opportunit...
Data-centric AI and the convergence of data and model engineering: opportunit...Paolo Missier
29 views40 slides
How to reduce cold starts for Java Serverless applications in AWS at JCON Wor... by
How to reduce cold starts for Java Serverless applications in AWS at JCON Wor...How to reduce cold starts for Java Serverless applications in AWS at JCON Wor...
How to reduce cold starts for Java Serverless applications in AWS at JCON Wor...Vadym Kazulkin
70 views64 slides
PharoJS - Zürich Smalltalk Group Meetup November 2023 by
PharoJS - Zürich Smalltalk Group Meetup November 2023PharoJS - Zürich Smalltalk Group Meetup November 2023
PharoJS - Zürich Smalltalk Group Meetup November 2023Noury Bouraqadi
113 views17 slides
Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu... by
Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu...Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu...
Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu...NUS-ISS
32 views54 slides
DALI Basics Course 2023 by
DALI Basics Course  2023DALI Basics Course  2023
DALI Basics Course 2023Ivory Egg
14 views12 slides

Recently uploaded(20)

Future of Learning - Khoong Chan Meng by NUS-ISS
Future of Learning - Khoong Chan MengFuture of Learning - Khoong Chan Meng
Future of Learning - Khoong Chan Meng
NUS-ISS31 views
Data-centric AI and the convergence of data and model engineering: opportunit... by Paolo Missier
Data-centric AI and the convergence of data and model engineering:opportunit...Data-centric AI and the convergence of data and model engineering:opportunit...
Data-centric AI and the convergence of data and model engineering: opportunit...
Paolo Missier29 views
How to reduce cold starts for Java Serverless applications in AWS at JCON Wor... by Vadym Kazulkin
How to reduce cold starts for Java Serverless applications in AWS at JCON Wor...How to reduce cold starts for Java Serverless applications in AWS at JCON Wor...
How to reduce cold starts for Java Serverless applications in AWS at JCON Wor...
Vadym Kazulkin70 views
PharoJS - Zürich Smalltalk Group Meetup November 2023 by Noury Bouraqadi
PharoJS - Zürich Smalltalk Group Meetup November 2023PharoJS - Zürich Smalltalk Group Meetup November 2023
PharoJS - Zürich Smalltalk Group Meetup November 2023
Noury Bouraqadi113 views
Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu... by NUS-ISS
Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu...Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu...
Architecting CX Measurement Frameworks and Ensuring CX Metrics are fit for Pu...
NUS-ISS32 views
DALI Basics Course 2023 by Ivory Egg
DALI Basics Course  2023DALI Basics Course  2023
DALI Basics Course 2023
Ivory Egg14 views
Spesifikasi Lengkap ASUS Vivobook Go 14 by Dot Semarang
Spesifikasi Lengkap ASUS Vivobook Go 14Spesifikasi Lengkap ASUS Vivobook Go 14
Spesifikasi Lengkap ASUS Vivobook Go 14
Dot Semarang35 views
STPI OctaNE CoE Brochure.pdf by madhurjyapb
STPI OctaNE CoE Brochure.pdfSTPI OctaNE CoE Brochure.pdf
STPI OctaNE CoE Brochure.pdf
madhurjyapb12 views
.conf Go 2023 - Data analysis as a routine by Splunk
.conf Go 2023 - Data analysis as a routine.conf Go 2023 - Data analysis as a routine
.conf Go 2023 - Data analysis as a routine
Splunk90 views
Transcript: The Details of Description Techniques tips and tangents on altern... by BookNet Canada
Transcript: The Details of Description Techniques tips and tangents on altern...Transcript: The Details of Description Techniques tips and tangents on altern...
Transcript: The Details of Description Techniques tips and tangents on altern...
BookNet Canada119 views
Upskilling the Evolving Workforce with Digital Fluency for Tomorrow's Challen... by NUS-ISS
Upskilling the Evolving Workforce with Digital Fluency for Tomorrow's Challen...Upskilling the Evolving Workforce with Digital Fluency for Tomorrow's Challen...
Upskilling the Evolving Workforce with Digital Fluency for Tomorrow's Challen...
NUS-ISS23 views
Igniting Next Level Productivity with AI-Infused Data Integration Workflows by Safe Software
Igniting Next Level Productivity with AI-Infused Data Integration Workflows Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Safe Software91 views
Black and White Modern Science Presentation.pptx by maryamkhalid2916
Black and White Modern Science Presentation.pptxBlack and White Modern Science Presentation.pptx
Black and White Modern Science Presentation.pptx
maryamkhalid291614 views
Attacking IoT Devices from a Web Perspective - Linux Day by Simone Onofri
Attacking IoT Devices from a Web Perspective - Linux Day Attacking IoT Devices from a Web Perspective - Linux Day
Attacking IoT Devices from a Web Perspective - Linux Day
Simone Onofri15 views
Digital Product-Centric Enterprise and Enterprise Architecture - Tan Eng Tsze by NUS-ISS
Digital Product-Centric Enterprise and Enterprise Architecture - Tan Eng TszeDigital Product-Centric Enterprise and Enterprise Architecture - Tan Eng Tsze
Digital Product-Centric Enterprise and Enterprise Architecture - Tan Eng Tsze
NUS-ISS19 views
Business Analyst Series 2023 - Week 3 Session 5 by DianaGray10
Business Analyst Series 2023 -  Week 3 Session 5Business Analyst Series 2023 -  Week 3 Session 5
Business Analyst Series 2023 - Week 3 Session 5
DianaGray10165 views
Empathic Computing: Delivering the Potential of the Metaverse by Mark Billinghurst
Empathic Computing: Delivering  the Potential of the MetaverseEmpathic Computing: Delivering  the Potential of the Metaverse
Empathic Computing: Delivering the Potential of the Metaverse
Mark Billinghurst449 views
Web Dev - 1 PPT.pdf by gdsczhcet
Web Dev - 1 PPT.pdfWeb Dev - 1 PPT.pdf
Web Dev - 1 PPT.pdf
gdsczhcet52 views

Is it time to migrate to Vue 3?

  • 1. Is it time to migrate to Vue.js 3.x? VUEDAY 2022 Verona, November 18th, 2022 1
  • 2. WHO AM I Denny Biasiolli Full Stack Developer (JavaScript, Python, Go) Front End Developer UX/ UI Fingerprint Supervision Ltd Italy, Savigliano (CN) @dennybiasiolli denny.biasiolli@gmail.com www.dennybiasiolli.com 2
  • 3. Vue.js Version Release date 2.6 February 4, 2019 3.0 September 18, 2020 3.1 June 7, 2021 3.2 August 5, 2021 3.x as new default February 7, 2022 2.7 (maintenance mode) July 1, 2022 2.x End of Life End of 2023 3
  • 4. SEPTEMBER 18, 2020 VUE 3.0 OFFICIALLY ANNOUNCED Composition API <script setup> (experimental) no IE11 support https://blog.vuejs.org/posts/vue-3-one-piece.html 4
  • 5. 5
  • 6. OPTIONS API (VUE 2, VUE 3) export default { data() { return { count: 0 } }, methods: { increment() { this.count++ }, }, } <template> <button @click="increment">Count is: {{ count }}</button> </template> 6
  • 7. COMPOSITION API IN setup() (VUE 3) <script> import { ref } from 'vue' export default { setup() { const count = ref(0) function increment() { count.value++ } return { count, increment } }, } <template> <button @click="increment">Count is: {{ count }}</button> </template> 7
  • 8. COMPOSITION API IN setup() (Vue 2 + @vue/composition-api) import VueCompositionAPI from '@vue/composition-api' Vue.use(VueCompositionAPI) - import { ref, ... } from 'vue' + import { ref, ... } from '@vue/composition-api' 8
  • 9. COMPOSITION API IN setup() (Vue 2 + @vue/composition-api) import VueCompositionAPI from '@vue/composition-api' Vue.use(VueCompositionAPI) - import { ref, ... } from 'vue' + import { ref, ... } from '@vue/composition-api' BROKEN TESTS 8.1
  • 10. COMPOSITION API IN setup() (Vue 2 + @vue/composition-api) import VueCompositionAPI from '@vue/composition-api' Vue.use(VueCompositionAPI) - import { ref, ... } from 'vue' + import { ref, ... } from '@vue/composition-api' BROKEN TESTS in tests files Vue.use(VueCompositionAPI) // or localVue.use(VueCompositionAPI) 8.2
  • 11. COMPOSITION API + SCRIPT SETUP (VUE 3) <script setup> import { ref } from 'vue' const count = ref(0) function increment() { count.value++ } </script> <template> <button @click="increment">Count is: {{ count }}</button> </template> 9
  • 12. FEBRUARY 7, 2022 VUE 3 AS NEW DEFAULT https://blog.vuejs.org/posts/vue-3-as-the-new-default.html 10
  • 13. POTENTIAL REQUIRED ACTIONS NPM dependency versions in package.json Use "^" to bind to a specific major version "dependencies": { - "vue": "latest", + "vue": "^2.6.14", - "vue-router": "*", + "vue-router": "^3.5.3", - "vuex": "latest" + "vuex": "^3.6.2" }, "devDependencies": { - "vue-loader": "latest", + "vue-loader": "^15.9.8", - "@vue/test-utils": "latest" + "@vue/test-utils": "^1.3.0" } 11
  • 14. SPOILER ALERT means 2.x Starting from July 1, 2022 it auto-updates to Vue 2.7 if you don't use explicit package-lock.json or yarn.lock files to accept only patch releases "vue": "^2.6.14" - "vue": "^2.6.14" + "vue": "~2.6.14" 12
  • 15. JULY 1, 2022 VUE 2.7 "NARUTO" RELEASED Composition API <script setup> (partial) https://blog.vuejs.org/posts/vue-2-7-naruto.html 13
  • 16. 14
  • 17. VUE 2.7 UPGRADE GUIDE 1. Upgrade local @vue/cli-xxx dependencies Upgrade to the latest version in your major version range (if applicable) ~4.5.18 for v4 ~5.0.6 for v5 npx @vue/cli@latest upgrade 15
  • 18. VUE 2.7 UPGRADE GUIDE 2. Upgrade vue to ^2.7 You can also remove vue-template-compiler from the dependencies, it is no longer needed in 2.7. If you are using @vue/test-utils, you may need to keep it in the dependencies for now, but this requirement will also be lifted in a new release of test utils. Always keep vue and vue-template-compiler in sync. npm install -S vue@~2.7 npm install -D vue-template-compiler@~2.7 16
  • 19. VUE 2.7 UPGRADE GUIDE 3. Check your package manager lockfile for version requirements If not, you will need to remove node_modules and the lockfile and perform a fresh install to ensure they are bumped to the latest version. npm ls vue-loader # should be at least ^15.10.0 npm ls vue-demi # should be at least ^0.13.1 17
  • 20. VUE 2.7 UPGRADE GUIDE 4. Remove @vue/composition-api and update imports to vue instead npm uninstall @vue/composition-api - import VueCompositionAPI from '@vue/composition-api' - Vue.use(VueCompositionAPI) - import { ref, ... } from '@vue/composition-api' + import { ref, ... } from 'vue' 18
  • 21. More info about Vue 2.7 upgrade https://blog.vuejs.org/posts/vue-2-7-naruto.html 19
  • 22. USING <script setup> - <script> + <script setup> import { ref } from 'vue' - export default { - setup() { const count = ref(0) function increment() { count.value++ } - return { count, increment } - }, - } </script> 20
  • 23. 21
  • 24. Broken vue-router usage! npm i -S vue-router@^3.6.5 + import { useRoute, useRouter } from 'vue-router/composables' + const route = useRoute() + const router = useRouter() - this.$route + route - this.$router + router 22
  • 25. Same for vuex $store usage? Import the store and navigate through it or migrate to pinia import store from '@/store'; store.state.propertyName store.state.moduleName.propertyName store.getters.getterName store.getters['moduleName/getterName'] store.commit(/* */) store.dispatch(/* */) 23
  • 26. 24
  • 28. Broken tests! console.error [Vue warn]: Property or method "count" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://v2.vuejs.org/v2/guide/reactivity.html#Declaring-R console.error [Vue warn]: Property or method "increment" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://v2.vuejs.org/v2/guide/reactivity.html#Declaring-R 26
  • 29. Broken tests! console.error [Vue warn]: Property or method "count" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://v2.vuejs.org/v2/guide/reactivity.html#Declaring-R console.error [Vue warn]: Property or method "increment" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://v2.vuejs.org/v2/guide/reactivity.html#Declaring-R @vue/vue2-jest 27.x not working with Vue 2.7 26.1
  • 30. SEPTEMBER 15, 2022 @vue/vue2-jest 29.1 released with support for <script setup> in Vue 2.7... 27
  • 31. SEPTEMBER 15, 2022 @vue/vue2-jest 29.1 released with support for <script setup> in Vue 2.7... ...with Jest 29 27.1
  • 32. USING JEST DIRECTLY update jest.config.js from node_modules @vue/cli-plugin-unit-jest/presets/default/jest-preset.js update package.json test script run tests without vue-cli-service - "test:unit": "vue-cli-service test:unit", + "test:unit": "jest", npm run test:unit # or npx jest 28
  • 33. UPGRADING JEST TO 29.X and fix deprecation warnings npm uninstall @vue/cli-plugin-unit-jest npm install -D jest-environment-jsdom jest-serializer-vue jest-transform-stub jest-watch-typeahead @vue/vue2-jest@^29 babel-jest@^29 jest@^29 - testURL: 'http://localhost/', + testEnvironmentOptions: { + url: 'http://localhost/', + }, 29
  • 34. Components using <script setup> are closed by default Won't work anymore const spyIncrement = jest.spyOn(wrapper.vm, 'increment') defineExpose({ increment }) # not working 30
  • 35. Components using <script setup> are closed by default Won't work anymore const spyIncrement = jest.spyOn(wrapper.vm, 'increment') defineExpose({ increment }) # not working Temporary (not suggested) workaround // FIXME: temporary workaround - const spyIncrement = jest.spyOn(wrapper.vm, 'increment') + const spyIncrement = jest.spyOn( + wrapper.vm._setupState, 'increment') 30.1
  • 36. COMPONENT TESTING Test what a component does, not how it does it. - // FIXME: temporary workaround - const spyIncrement = jest.spyOn( - wrapper.vm._setupState, 'increment') - wrapper.find('button').trigger('click') - expect(spyIncrement).toHaveBeenCalled() + expect(wrapper.find('p').text()).toBe('Count is: 0') + await wrapper.find('button').trigger('click') + expect(wrapper.find('p').text()).toBe('Count is: 1') https://vuejs.org/guide/scaling-up/testing.html#component-testing 31
  • 37. MIGRATION TO VUE 3 https://v3-migration.vuejs.org/ 32
  • 38. MIGRATION TO VUE 3 New Features Breaking Changes Recommendations Migration Build https://v3-migration.vuejs.org/ 33
  • 39. MIGRATION TO VUE 3 BREAKING CHANGES While it looks like a lot has changed, a lot of what you know and love about Vue is still the same; but we wanted to be as thorough as possible and provide detailed explanations and examples for every documented change. https://v3-migration.vuejs.org/breaking-changes/ 34
  • 40. NEW FRAMEWORK-LEVEL RECOMMENDATIONS New versions of Router, Devtools & test utils w/ Vue 3 support Build Toolchain: Vue CLI -> Vite State Management: Vuex -> Pinia IDE Support: Vetur -> Volar ... https://v3-migration.vuejs.org/recommendations.html 35
  • 42. MANDATORY MIGRATIONS Vue Router Vuex Test utils Third party libraries (Vuetify, Quasar, ElementUI, etc...) 37
  • 43. AVOIDABLE MIGRATIONS Vue CLI -> Vite Jest -> Vitest 38
  • 44. MIGRATION BUILD: @vue/compat build of Vue 3 configurable Vue 2 compatible behavior runs in Vue 2 mode by default usage of changed/deprecated features will emit runtime warnings https://v3-migration.vuejs.org/migration-build.html 39
  • 45. KNOWN LIMITATIONS dependencies that rely on Vue 2 internal APIs or undocumented behavior. usage of private properties on VNodes (Vuetify, Quasar, ElementUI, ...) IE11 support dropped Server-side rendering 40
  • 46. MIGRATION BUILD: EXPECTATIONS aims to cover only publicly documented Vue 2 APIs and behavior if your application is large and complex, migration will likely be a challenge even with the migration build 41
  • 47. UPGRADE WORKFLOW 1. upgrade tooling if applicable vue-cli: custom webpack setup: upgrade vue-loader to ^16 npx @vue/cli@latest upgrade 42
  • 48. 2. update vue in package.json "dependencies": { - "vue": "~2.7", + "vue": "^3.2.39", + "@vue/compat": "^3.2.39" ... }, "devDependencies": { - "vue-template-compiler": "~2.7" } npm i -S vue@^3.2 @vue/compat@^3.2 --force npm uninstall vue-template-compiler --force 43
  • 49. 3.1. alias vue to @vue/compat Webpack or Vite config on // vue.config.js module.exports = { // ... chainWebpack: (config) => { config.resolve.alias.set('vue', '@vue/compat') // ... } } https://v3-migration.vuejs.org/migration-build.html 44
  • 50. 3.2. enable compat mode via Vue compiler options Webpack or Vite config on config.module .rule('vue') .use('vue-loader') .tap((options) => { return { ...options, compilerOptions: { compatConfig: { MODE: 2 } } } }) https://v3-migration.vuejs.org/migration-build.html 45
  • 51. 4. if using TypeScript, update vue's typing declare module 'vue' { import { CompatVue } from '@vue/runtime-dom' const Vue: CompatVue export default Vue export * from '@vue/runtime-dom' const { configureCompat } = Vue export { configureCompat } } 46
  • 52. 5. fix compile-time errors When compiler warnings are gone, you can set the compiler to Vue 3 mode compilerOptions: { compatConfig: { MODE: 3 } } 47
  • 53. 6. Run the app 48
  • 54. 6. Run the app the app should be able to run if no limitations mentioned above focus on fixing your own source code warnings first 49
  • 55. 7. Update <transition> class names This feature does not have a runtime warning. Search for `.*-enter` and `.*-leave` CSS class names - .*-enter + .*-enter-from - .*-leave + .*-leave-to 50
  • 56. 8. Update app entry to use new global mounting API - import Vue from 'vue' + import { createApp } from 'vue' import App from './App.vue' import router from './router' import store from './store' - Vue.config.productionTip = false - new Vue({ + const app = createApp({ router, store, - render: h => h(App) + ...App, - }).$mount('#app') + }) + app.mount('#app') 51
  • 57. 9. Upgrade vuex to v4 npm i -S vuex@^4 --force https://vuex.vuejs.org/guide/migrating-to-4-0-from-3-x.html 52
  • 58. 9. Upgrade vuex to v4 // src/store/index.js - import Vue from 'vue' - import Vuex from 'vuex' + import { createStore } from 'vuex' - Vue.use(Vuex) - export default new Vuex.Store({ + export default createStore({ - state: { - count: 0, + state() { + return { + count: 0, + }; }, // ... 53
  • 59. 9. Upgrade vuex to v4 // src/main.js import store from './store' const app = createApp({ router, - store, ...App, }) + app.use(store) 54
  • 60. 9. Upgrade vuex to v4 Composition API usage import { useStore } from 'vuex' const store = useStore() 55
  • 61. 10. Upgrade vue-router to v4 npm i -S vue-router@^4 --force https://router.vuejs.org/guide/migration/index.html 56
  • 62. 10. Upgrade vue-router to v4 // src/router/index.js - import Vue from 'vue' - import VueRouter from 'vue-router' + import { createRouter, createWebHistory } from 'vue-router' - Vue.use(Vuex) const routes = [ // ... ] - const default new VueRouter({ + export default createRouter({ - mode: 'history', - base: process.env.BASE_URL, + history: createWebHistory(process.env.BASE_URL), routes }) 57
  • 63. 10. Upgrade vue-router to v4 // src/main.js import router from './router' const app = createApp({ - router, ...App, }) + app.use(router) 58
  • 64. 10. Upgrade vue-router to v4 Composition API usage import { useRouter, useRoute } from 'vue-router' const router = useRouter() const route = useRoute() 59
  • 65. 11. Pick off individual warnings (if any) Always refer to the doc. https://v3-migration.vuejs.org/ 60
  • 66. 12. Remove the migration build and switch to Vue 3 when all warnings are fixed. Note you may not be able to do so if you still have dependencies that rely on Vue 2 behavior. npm uninstall @vue/compat --force 61
  • 67. 62
  • 68. BROKEN TESTS! Upgrade testing packages npm uninstall @vue/vue2-jest --force npm i -D @vue/vue3-jest@^29 --force npm i -D @vue/test-utils@^2 --force // jest.config.js transform: { - '^.+.vue$': '@vue/vue2-jest', + '^.+.vue$': '@vue/vue3-jest', https://test-utils.vuejs.org/migration/ 63
  • 69. VUE TEST UTILS V2 CHANGES propsData is now props no more createLocalVue mocks and stubs are now in global findAll().at() removed use findAll()[] ... https://test-utils.vuejs.org/migration/ 64
  • 70. SOLVING TEST ERRORS/WARNINGS Solution console.warn [Vue warn]: Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead. - expect(wrapper).toMatchSnapshot() + expect(wrapper.html()).toMatchSnapshot() 65
  • 71. SOLVING TEST ERRORS/WARNINGS Solution ReferenceError: Vue is not defined > 1 | import { shallowMount } from '@vue/test-utils'; | ^ // jest.config.js testEnvironmentOptions: { customExportConditions: ["node", "node-addons"], }, https://github.com/vuejs/vue-jest/issues/479#issuecomment-1163421581 https://stackoverflow.com/a/72608494/3963422 66
  • 72. 67
  • 73. RECAP Vue 2.6 + @vue/composition-api Composition API (setup() only) Vue 2.6 → 2.7 Composition API <script setup> Vue 2.x → 3.x long term support for your codebase 68
  • 74. THANK YOU! | | migrate-to-vue3 branch @dennybiasiolli blog.vuejs.org vuejs.org v3-migration.vuejs.org vuex.vuejs.org router.vuejs.org test-utils.vuejs.org github.com/dennybiasiolli/vue-migration-2-to-3 www.dennybiasiolli.com 69