# Starting vue.js the right way - Ruben Tan
{%hackmd dh921X26R26y_elFAEP5yg %}
###### tags: `jsdc2018`
---
## Session Overview
* Vue.js overview
* Application overview
* sneaking vue.js in
* Doing it the right way
## Vue.js Overview
* A brief history of reactive forntend frameworks
* Angular vs. React vs. Vue
* Demonstration
## Beief history of reactive frontend frameowkrs
* Observer pattern in the origninal Gang of Four
* Excel is a good example
* And then we have Rx.JS
* reactive-ruben.js
## How do they work?
### Traditional way
在 textbox 的 chnage event 發生時,將值複製到其他地方
如果有很多這種情況,會無法 scalable,一個 textbox 更新,要找到很多其他的 element 去更新
> 資料與 HTML 元件高度耦合
### Reactive-Style
所有的 Element 去 listen textbox 的 value change
## Angular vs. React vs. Vue
### Angular
* 2010/10
* Opinionated
* Maintained by Google
* All-in-one
* Comprehensive tooling
### React
* 2013/05
* Modular
* Maintained by Facebook
* Licensing controversy
* Redux
* Focus on being performance
### Vue
* 2014/02
* Progressive
* Gentle learning curve
* Created by Evan
## Demonstration of vue.js
## Application overview
* An inherited mess
* One ring to rule them all
* Endless mistakes
### An inherited mess
* Frontend code
* Backend code
* API Server
* Database
> It gets worse in the frontend code. (jQuery Bootstrap ....)
>
> 40000 lines of code (css)
> 50 different files, all clones (template)
### Checklist of mistakes
* No test cases
* No build configuration or toolchain
* Multiple versions of the same library
* Every page is copy and pasted with minor modifications
* Multiple developers append to a file with their own code
* Not responsive, or tagged on at the last minute
* ==Client request for more interactive UI==
### Complex UI
> what is a complex UI
>
Pick a category -> pick a role -> pick a year
* Each select needs to fetch data from the server
* Each choice triggers a server loading on the next select
* Needs to be reused in multiple pages
## sneaking vue.js in
### Tackling first real client requirement
* Replaced old code with vue.js
* Clean separation of validation logic and UI interaction
* 700 lines of code to less than 30
### SOON....
> In **2 months**, all forms have been successfully converted to vue.js
Validation
Select Data Population
==**IT WAS PAINFUL**==
* Test Cases
* Added 30+ API endpoints
* Removed/deprecated 100000 lines of code
> 「並不是在寫新的 app,也不是 refactor,只是在 clean up 而已」
### Removing jquery
> 100% of jquery usage was to manipulate the DOM
* Update elements
* Update form data
jquery -> vue
## Turning the backend into an api server
> In **2 months**, from 1 API endpoint to 30+ endpoints
* Separation of concerns
* Ease of testing - mock data
> Change the backend to api driven backend
> Triggered the client to launch a mobile app
## Introducing vue components
* modal dialogs
* 10+
* select boxes with built-in search
* 50+
* counters
* 20+
* progress bars
* 10+
> Codebase further reduced by... 30~40%
## Future Plans
* Integrating vuex - state storage and management
---
## Doing Vue the right way
How our experiences demonstrated something important...
* Progressive Framework
* Evaluate before implement
* Have and end goal in mind
### Progressive Framework
> Vue.js can be used in many ways, simplest way is **unobtrusive**
* Start small, start simple
### Evaluate before implement
> Balance the cost of paradigm change vs. paying off tech debt
### Have and end goal in mind
> Have an idea what you are working towards
* Progressive webapp
* 100% api driven
* low onboarding cost
> Refactor and develop at the same time
* Be a good software ENGINEER