Adapting to Change

London Web Standards / #lwsVue / @blakenewman

Plan A

Plan V

By Blake Newman

Front-end please stop!

Frameworks...
Task Runner tools...
Build tools...
All the things™...

London Web Standards / #lwsVue / @blakenewman

Why we need change?

London Web Standards / #lwsVue / @blakenewman

Imperative    JavaScript

Declarative    CSS

                           HTML

London Web Standards / #lwsVue / @blakenewman

JavaScript is Fragile

London Web Standards / #lwsVue / @blakenewman

Modularisation

London Web Standards / #lwsVue / @blakenewman

Maintainability

London Web Standards / #lwsVue / @blakenewman

London Web Standards / #lwsVue / @blakenewman

Scalability

https://addyosmani.com/scalablejs/

London Web Standards / #lwsVue / @blakenewman

LIFT Principles

London Web Standards / #lwsVue / @blakenewman

Locate

London Web Standards / #lwsVue / @blakenewman

Identify

London Web Standards / #lwsVue / @blakenewman

Flat

London Web Standards / #lwsVue / @blakenewman

T-DRY

London Web Standards / #lwsVue / @blakenewman

(Try to Stick to DRY)

How can we adapt?

London Web Standards / #lwsVue / @blakenewman

Dependency Management

Sacrificial Architecture

Keep in control

Development experience

London Web Standards / #lwsVue / @blakenewman

Dependency Management done wrong:

{
  "name": "sample-package-json",
  "dependencies": {
    "babel-runtime": "^6.0.0",
    "vue": "^1.0.0",
    "vue-resource": "^0.8.0",
    "vue-router": "^0.7.0",
    "vuex": "^0.6.0",
    "vuex-router-sync": "^1.0.0"
  }
}

https://docs.npmjs.com/misc/semver

London Web Standards / #lwsVue / @blakenewman

The problem with `Caret Ranges`

^1.0.0
 1.0.0 <= 2.0.0

=

London Web Standards / #lwsVue / @blakenewman

Use `X-Ranges` or `Direct Version`

1.0.x
 1.0.0 <= 1.1.0

=

London Web Standards / #lwsVue / @blakenewman

1.0.17
 1.0.17

=

Keep in control

$ npm i -g npm-check-updates

London Web Standards / #lwsVue / @blakenewman

$ ncu

 eslint              2.12.x  →  2.13.x
 vue-hot-reload-api   1.3.x  →   2.0.x

Sacrificial Architecture

London Web Standards / #lwsVue / @blakenewman

Module A

Module B

Module C

Store

State

London Web Standards / #lwsVue / @blakenewman

London Web Standards / #lwsVue / @blakenewman

Module A

Module B

Module C

Store

State A

    State B

State C

London Web Standards / #lwsVue / @blakenewman

Code splitting

Initialisation performance

Designate entry points

Asynchronous code

Fixes: “Monolithic bundle” and “Unmaintainable manual imports”


require.ensure([ './basket.vue' ], (require) => {
    require([ './basket.vue' ], resolve);
}, 'basket');

London Web Standards / #lwsVue / @blakenewman

Problems are with Frameworks

London Web Standards / #lwsVue / @blakenewman

London Web Standards / #lwsVue / @blakenewman

Choose your framework as if you will need to change it after six months

Don't be a slave to Frameworks

London Web Standards / #lwsVue / @blakenewman

// getUsers factory
getUsers.$inject = ['$http'];
function getUsers($http) {
    return $http.get('api/v1/users');
}
app.factory('getUsers', getUsers);




// Home controller
homeController.$inject = ['$scope', 'getUsers'];
function homeController($score, getUsers) {
    getUsers().then(response => {
        $scope.users = response.data;
    });
}
app.controller('home', homeController);

London Web Standards / #lwsVue / @blakenewman

// getUsers es6 module
export default function(){
   return fetch('api/v1/users').then(function (response) {
       return response.json();
   });
};



// Home controller
import getUsers from './getUsers';

homeController.$inject = ['$scope'];
function homeController($scope) {
    getUsers().then(users => {
        $scope.users = users;
    });
}
app.controller('home', homeController);

London Web Standards / #lwsVue / @blakenewman

Development Experience

London Web Standards / #lwsVue / @blakenewman

London Web Standards / #lwsVue / @blakenewman

The best code that you can write now, probably won't be in a few years

London Web Standards / #lwsVue / @blakenewman

The best way to cope with change is to increase productivity

HMR (Hot Module Replacement)


Patch part of dependency tree with the new code

Changes appear live without page reloading
 

Compiler

HMR Server

Bundle Server

Compile

Change

code

HMR runtime

bundle

London Web Standards / #lwsVue / @blakenewman

Hot module replacement in action

London Web Standards / #lwsVue / @blakenewman

Hiring people to write is not the same as hiring people to design and build durable, usable, dependable software.

London Web Standards / #lwsVue / @blakenewman

Exploring Vue.js

London Web Standards / #lwsVue / @blakenewman

What does Vue deliver?

Library for the View layer

Components with reactivity

Extendable via plugins

Lightweight

Simplicity

Testable

London Web Standards / #lwsVue / @blakenewman

How does Vue.js work?

 

Reactive data-binding system for a  Data-driven view

DOM in sync with data

Object.defineProperty

London Web Standards / #lwsVue / @blakenewman

How does Vue.js work?

Component System helps with small abstraction layer

 

Component loosely modeled after the Web Components spec

 

Implements the Slot API and the special attribute is

London Web Standards / #lwsVue / @blakenewman

What is Reactivity?

London Web Standards / #lwsVue / @blakenewman

Vue.js works with Sacrificial Arcitecture!

Comp A

Comp B

Module A

Store

State Module A

State Module B

London Web Standards / #lwsVue / @blakenewman

Actions

Business logic is simple!

London Web Standards / #lwsVue / @blakenewman

// getUsers es6 module
export default function(){
   return fetch('api/v1/users').then(function (response) {
       return response.json();
   });
};


// Vue component script
import getUsers from './getUsers';

export default {
  data() {
    return {
      users: [ ]
    }
  },
  created() {
    getUsers().then(users => {
        this.users = users;
    });
  }
};

Vue.js Components

London Web Standards / #lwsVue / @blakenewman


Vue.component('demo-component', {
    template: '<div> {{ msg }} </div>',
    // Data initialization
    data() {
        return {
            msg: 'Vue is cool'
        };
    }, 
    computed: { }, 
    methods: { }, 
    events: { },
    ready() {
        // Execute logic on ready hook
    },
});


// -------


<demo-component></demo-component>

London Web Standards / #lwsVue / @blakenewman

London Web Standards / #lwsVue / @blakenewman

Vue.js 2.0

London Web Standards / #lwsVue / @blakenewman

    
    const vnode = {
        tag: 'div',
        children: [
            { tag: 'my-component' }
        ]
    };

    <div>
        <my-component></my-component>
    </div>

Virtual DOM

Thanks

London Web Standards / #lwsVue / @blakenewman

Chat to me on twitter: @blakenewman
OR
Chat to me in the real world :)

Adapting to change #lswvue

By Blake Newman

Adapting to change #lswvue

Best practises to ensure you can adapt to change. Sacrificial Architecture can ensure you can constantly adapt your code and tooling. We will take a look at Vue.js, to see what it is trying to solve. Seeing how it can help you now and in the future.

  • 3,553