It's not me, it's VUE
APPMAN - András Takács (att@pulilab.com)
DON NICO - Nicolò Maria Mezzopera (nico@pulilab.com)
MR F - Fekete György (f@pulilab.com)
2017-10-19 VUEJS Budapest meetup @ LogMeInHQ
VUE.JS Introduction
The Progressive
JavaScript Framework
- Approachable
- Versatile
- Performant
- Incrementally adoptable
VUE.JS Introduction
<script src="https://unpkg.com/vue"></script>
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
<div id="app">
{{ message }}
</div>
VUE.JS Features
- Declarative rendering
- Virtual DOM
- Component system
Vue.component('todo-item', {
template: '<li>This is a todo</li>'
})
<ol>
<todo-item></todo-item>
</ol>
VUE.JS Features
- MVVM pattern - Reactivity
var vm = new Vue({
data: data
)}
VUE.JS instance
const vm = new Vue({
props: ['default'],
data () {
return {
a: 1,
b: 2
}
},
computed: {
c () {
return this.a + this.b;
}
},
methods: {
divide (value) {
const final = value ? value : this.default
return this.c / final;
}
},
components: {}
})
VUE.JS Caveats
- Vue cannot detect the following changes to an array with:
- vm.items[indexOfItem] = newValue
- vm.items.length = newLength
- Instead:
- Vue.set(vm.items, indexOfItem, newValue)
- vm.items.splice(newLength)
VUE.JS Caveats
- Vue cannot detect property addition or deletion:
var vm = new Vue({
data: {
a: 1
}
})
// `vm.a` is now reactive
vm.b = 2
// `vm.b` is NOT reactive
- Instead:
- Vue.set(vm, 'b', 2)
- this.b = Object.assign({}, this.b, {
lol: 1,
omg: 2
})
VUEX State Management
- The state, which is single source of truth that drives our app
- The view, which is just a declarative mapping of the state
- The actions, which are the possible ways the state could change in reaction to user inputs from the view.
VUEX State Management
VUEX State Management
- Multiple views may depend on the same piece of state.
- Actions from different views may need to mutate the same piece of state.
Why We Chose It
the problem we wanted to solve:
- Build an amazing UI
- 100% test coverage
- flexible business logic
- great flexibility for the designer
Considering all of the above VUEJS was our solution
Summary
-
vue-cli
-
Hello Word
-
Our Strategy
-
Stack
vue-cli & Hello Word
(sudo) npm install -g vue-cli
vue init webpack vuejs-is-awesome
cd vuejs-is-awesome
npm install
npm run dev
Our Strategy
- Put all the Business Logic in the state manager
- Keep components atomic and simple
- Ajax layer handled by the state manager
- Fully unit test all the 'js' files
- Fully e2e test all '.vue or view' components
- Plugins system to 'drop-in' new functionalities
- Aggressive linting and code uniformity
Stack I
- Backend / API served trough Django
- Axios to handle AJAX calls
- Server Side Rendering and Routing with Nuxt
- Vuex as a state manager, divided in meaningful namespaced modules
- AvaJS for Asynchronous unit test
- CypressJS for integration / e2e tests
Stack II
Nuxt.js: a framework for creating Universal Vue.js Applications
We used it for
- Routing
- Server Side Rendering and SEO
- Plugin System
- CSS Minification / Optimisation
- Code Structure
- Integrated fully with Vuex
- Middleware logic
- Layouts
Stack III
Vuex: a state management pattern + library for Vue.js applications
Enabled us to:
- Have one way data binding in our components
- Time Traveling debugging
- Debug logs contain the data structure snapshotted when the bug occurs
- It's the core of the application and serves all the view component reliably
Stack IV
A pinch of probability is worth a pound of perhaps.”— James Thurber
We LOVE Testing...
...but unit test are not enough ...
... and component unit testing are to prone to break:
- We moved all the logic to the store, being able to write 'stable' and reliable tests
- E2E test for the main 'flows' of the app and for every fixed bug (Cypres)
Battle of Frameworks
Battle of Frameworks
- Solve the same problem by different framework: Angular 2, React, Polymer, Vue
- should have:
- sitebuild friendly
- speedy
- good docs
- easy to learn
- support
- community
- hybrid app development
THE WINNER IS
Our concerns were
- One man show?
- Immature?
- Docs?
- Hybrid app?
- Native app?
- Community?
- Speed?
- How to convince mgmt?
The Javascript Family
Family and relatives:
Dad Angular JS
Son React JS
Son Vue JS
Fat Uncle Ember Js
Unpopular Uncle PolymerJS
Grandpa jQuery
PERSONAS
Angular JS
70 y.o. overweight dad
Has his hands in a lot of projects
A bit slow, fixated on his own traditions
Likes stability, dislikes other families approaches
Popular
Can not stop thinking that Grandpa jQuery was right
PERSONAS
React
30 y.o. first rebel son
Hipster attitude but with a lot of friends
Drinks a (gluten free) pumpkin flavoured mocaccino
Refuses all the teaching coming from his Dad but in his rebellion discovered a lot of cool new approaches
PERSONAS
Vue Js
18 y.o. .late son
Learned from dad's mistakes
Ready to embrace his older brothers cool ideas
Too busy studying to make friends during childhood but of increasing popularity
Has a hard time stepping out of his popular brother's shadow
PERSONAS
The Question:
Now that grandpa jQuery is ready to retire, what will be the name written on his will ? Who will inerith his legacy?
SPEED
Comparisons
Angular | React | VueJs | |
---|---|---|---|
Docs | 2 | 3 | 5 |
Size | 143 kb | 43kb | 23kb |
Speed | 3 | 3 | 4 |
Memory | 3 | 3 | 4 |
Learning Curve | 2 | 2 | 5 |
3rd party libs | 5 | 4 | 3 |
Stability / support | LTS | Frozen API | Semver |
Upgrade | 1 | 5 | 3 |
Community | 5 | 5 | 3 |
Jobs | 4 | 5 | 2 |
Flexibility | 2 | 3 | 5 |
Native | 4 (NativeScript) | 5 (ReactNative) | 2 (Weex) |
Hybrid | 5 ( Ionic) | 5 (ReactNative) | 5 (Quasar) |
Project comparisons
D.H.A (A) | Malibu (R) | IMP (V) | |
---|---|---|---|
Size | Big | Small | Big |
Speed | 3 | 2 | 5 |
# Refactor | 1 | 5 | 5 |
# Bugs | 2 | 3 | 4 |
State Mgmt. | N/Y (Redux) | N | Y (Vuex) |
UI Speed | 3 | 5 | 5 |
Js Version | ES6 | ES6 | ES6 |
SSR / SEO | N | Y | Y |
WHEN, WHO ?
- ❤ Typescript: A
- OOP: A
- Big Projects: R || V
- Small Projects: V
- Rely on 3rd party: A || R
- Native: R
- Sitebuild: V
- Performance: V
- All-in-one: A
- Learning Curve: V
- TDD: A || R || V
- Clean Code: V
"NaNNaNNaNNaNNaNNaNNaN"
About Quasar framework
A framework for building web apps,
PWAs, hybrid mobile apps (Cordova) or Electron apps
with the same codebase
based on VUE 2.0
The Ionic of VUE
PWA - Progressive Web Applications
Google's 2 cents on
how to make web apps from now on
- Works offline ( service workers )
- Installable to home screen ( manifest.json, icons )
- Push notifications ( 3rd party )
- under 3s load time, animations ...
- Google Lighthouse
Cordova
Open source tool to build iOS & Android apps
- that use Html & Js & Css inside (via webView)
- has connection to native features via plugins
- core plugins have good documentations, but...
- still need xCode, java & Android SDK
- platform version changing can affect plugins
2 platforms, one codebase,
maybe some plugins & functionality "if"-ed
How does it fit into the ecosystem?
How does it fit into the ecosystem?
Hopefully not gonna see:
// 要做:
vuejs.org team section
quasar-cli
- global npm package
- based on Webpack
- all loaders configured, base ones inside package.json
- comes with BABEL
- sets up the project for you
folder structure & build tools - quite aggressive ESLint setup
- well done, start taking a look, and customize it
UI & Styling in Quasar
- baked in Stylus as CSS preprocessor
global variables used within Quasar components - material design UI component library
inputs, buttons, layouts, sidebars, tabs...
under the hood: .vue components - helper classes (flex, platform-specific & syntactic sugar)
- two default themes: ios & mat
Quasar Ionic
31,781 ⭐️ vs 3.796 ⭐️
- Ionic focuses solely on hybrid apps
- Ionic tries keeping up with Angular versioning
1, 2... 4 - Ionic View VS Quasar Play
- Ionic ecosystem
- Ionic 4 is gonna ship with standard web components
we'll able to use VUE inside
Latest improvements in Quasar
- v0.13 => v0.14
- tree-shaking, like _
- improved components
- PWA capabilities
- improved documentation
Why did we go with it?
worked with Ionic & Cordova before
Angular fatigue
VUE inside
needed a motivation pill after Polymer
something new & familiar at once
Well around framework, not only for web apps
Tricks & tips & best practices I: VUE
- API? Axios, vue-axios
- state? vuex
- getters > props
- local data? vuex-persistedstate
auth, multilang, offline - layer out libraries
axios, moment
network error handling, common function lib - scope Css in templates
- know your lifecycles!
data magic
DOM magic
Tricks & tips & best practices II: Quasar
- separate platform-dependent code
- q-pull-to-refresh
- q-ajax-bar
- q-inline-datetime
- always look out for frameworks own solutions
.styl variables, classes, layout
Tricks & tips & best practices III: Cordova
- Separate cordova plugin code
- researching the right one
- prepare for tedious testing of plugins
- cordova-plugin-camera
- cordova-plugin-file-opener2
- cordova-plugin-file-transfer
- phonegap-plugin-barcodescanner
-
cordova-plugin-downloadmanager
-
com.jcesarmobile.filepicker (iOS)
& com.cesidiodibenedetto.filechooser (Android)
Questions?
Thank you!
What's next
http://bit.ly/2x7Fpiw
Thank you!
https://slides.com/gyorgyfekete/its-not-me-its-vue
It's not me it's VUE
By don_nico
It's not me it's VUE
VUE.JS MEETUP BUDAPEST
- 606