Frontend evolution

Modern web applications

Damian Dulisz

Monterail/pwr

Projects in the past

HTML

CSS

JavaScript

50%

30%

20%

Source lines of code/time spent in general*

 

* from my experience

HTML

CSS

JavaScript

15%

15%

70%

Now

Sometimes

HTML

1%

JavaScript

99%

So... more jQuery?

Not rly

Why such a drastic change?

JavaScript development now:

The language got much better.
 

The platform improved and follows standards, meaning jQuery is no longer needed.
 

The ecosystem has grown so big, it can’t be ignored.
 

JavaScript succeeded where Java failed – it is now run on almost every possible platform.

ES6 and beyond

JavaScript implements the ECMAscript standard (currently ES 2016).

Each version extends the language with new syntax and features.

Sadly, not all browsers support the whole standard.

Thankfully we got Babel :) 

Transpilers like Babel, translate ES6+ code into plain old ES5 so usually, you don’t have to worry about compatibility.

You can even use experimental proposals to the language, although that’s not recommended!

And there is TypeScript, a superset of JavaScript with static type checking and more.

So what’s new?

arrow functions
destructuring
spread operator
rest parameter
promises
async/await
generators
block scoped variables
classes
decorators
and more...
type checking
interfaces
es6 modules

Some examples

// arrow functions
const Sum = x => y => x + y
const Add5 = Sum(5)
Add5(10) // 15
// spread
const x = { a: 1, b: 2 }
const y = { b: 5, c: 8 }
const z = { ...x, ...y, d: 10 } 
// { a: 1, b: 5, c: 8, d: 10 }
// promises
function getUsers () {
axios.get('/api/v1/users').then(response => { this.data = response })
}
// or async/await
async function getUsers () {
this.data = await axios.get('/api/v1/users')
}
// destructuring, rest
const validatorString = 'between:5:15'
const [validator, ...args] = valdiatorString.split(':')
console.log(validator) // 'between'
console.log(args) // [5, 15]

ES2015 Modules

import { fetchUser as getUser } from './userService.js'
import * as MUTATIONS from './mutation-types.js'
import UserTable from '~components/UserTable.vue'
// userService.js
export function fetchUser () { ... }

// mutation-types.js
export const SET_USERS = 'SET_USERS'
export const DELETE_USER = 'DELETE_USER'

// UserTable.vue
export default { ... }

To make use of those modules

we need a bundler

webpack

webpack

  • Can statically analyse your bundle and tree-shake it, leaving only the used code in the final bundle.
     
  • Can automatically split your bundle into multiple asynchronously loaded chunks improving the load time and performance (for example based on router views)
     
  • Can take care of things like cache busting, transpilers, preprocessors, inlining images​
     
  • Hot-module replacement and much more!

There are others

Browserify

Rollup.js

Shines for bundling libraries

This brings us to the rise of Single Page Applications

Single Page Application (SPA)

Usually:

  • Consist of just an index.html file and a bunch of JavaScript and CSS files.

  • Completely decoupled from backend

    • Server is no longer responsible for generating HTML files.

    • Thus HTML is no longer the source of data. JavaScript is.

  • JavaScript controls everything including the routing.

  • JavaScript can asynchronously fetch the data from different sources.

  • Better user experience (no page reloads, feels faster)

How is it built?

Mostly components!

Used to create reusable blocks of functionality to use across the application.

Dumb, Presentational

Have no idea about the context they are used in. Reusable.

Configurable with props.

Examples:

  • DatePicker
  • DataTable
  • Multiselect

Smart, containers

Used to implement app specific features. Rather not reusable.

Examples:

  • UserView
  • NewUserForm
  • Dashboard

Components

Are usually divided into two groups based on what information they contain.

Functional and/or reactive programming

  • Thinking about the data model rather than the view.
  • Declarative views.
  • Imperative changes to the DOM are considered an anti-pattern.
  • JavaScript no longer enhances the app. It is the app.
  • VirtualDOM

So what’s this VirtualDOM thing?

Since a HTML document is basically a tree composed of DOM nodes, it can be represented as an JavaScript object.

If it can be an object, it can be created with a function.

 We can compare the virtualDOM objects to find out which DOM node needs to be created, updated or removed.

Once the data changes, we calculate the new virtualDOM object, diff it with the old one and patch the changes.

3. VirtualDOM

// Example virtualDOM object
const node = { type: '...', props: { ... }, children: [ ... ] }

// Common helper function
function h (type, props, children) {
  return { type, props, children }
}

// example usage
const render = (
  h('div', { class: 'my-form' }, [
    h('label', {}, 'This is a label'),
    h('input', { type: 'text' }),
    h(‘button’, { type: ‘button’ }, 'Save!')
  ])
)

// or when using JSX
const render = (
  <div className="my-form">
    <label>This is a label</label>
    <input type="text"/>
    <button type="button">Save!</button>
  </div>
)

3. VirtualDOM

// both will return
const render = { 
  type: 'div', 
  props: { class: 'my-form' }, 
  children: [
    { type: 'label', props: {}, children: ['This is a label'] },
    { type: 'input', props: { type: 'text'}, children: [] },
    { type: 'button', props: { type: 'button' }, children: ['Save!'] }
  ] 
}

Imagine DOM = f(state) where state is the data model. That’s how it works.

 

Imperative changes to the real DOM are considered an anti-pattern and will be ignored after the next update.

This is basically how modern front-end libraries and frameworks work

Selected front-end frameworks

Angular

React

Vue

Ember

Just a library

Less opinionated

Very flexible

Full framework

Very opinionated

Not really flexible

Just a library

Less opinionated

Very flexible

My framework of choice

Vue.js

The Progressive Framework

  • Easy to learn and master
  • Very flexible with super performance
  • Not opinionated
  • Great developer experience
  • Some interesting concepts like single-file components (.vue)
  • Reactive "engine" included
  • High quality supporting libraries from the core team
  • Less boilerplate, more productivity
  • Takes the best from React and Angular

Vue

  • Can be added with a <script> tag instead of jQuery
  • Or used with a more sophisticated setup unleashing it full potential
  • Makes complex things simple
  • Works great with code splitting
  • TypeScript support

Beyond the browser

Bonus slides

So we know that webpack is bundling our front-end files.

Apart from tooling, Node.js can also be used for server-side applications just like Ruby, Java or PHP.

But webpack is also mostly written in JavaScript that runs on Node.js, which is basically the V8 JavaScript engine from Chromium running in the background of your system.

Why would you want to use JavaScript as a server language?

  • It’s crazy fast! Since the VM is written in C++ it can be many times faster than Ruby, PHP or even Python.
     
  • Has a non-blocking nature (the event loop) making it great at handling hundreds of concurrent connections.
     
  • You can share the same code (and libraries) between the client and the server.

Why would you want to use JavaScript as a server language?

You can even render front-end apps (Vue, React) on the server so that the user receives a meaningful first paint (HTML full of relevant data) before the SPA client takes over.
 

Great user experience and SEO support.
 

Such apps are often called isomorphic applications.

Btw. do you know those apps?

Do you know what they all have in common?

Electron

It lets you write multi-platform native-like apps that run inside a Chromium-based window with access to the filesystem and native OS API.

 

Works offline. Uses HTML, CSS and JS. Frameworks included.

 

Most of the code can be shared between the web app and the electron app.

 

Runs a Node.js process in the background, but can also make use of .NET (C#) code.

Electron

What if we could use it not only for creating HTML DOM nodes but nodes in general?

Remember VirtualDOM?

Does that ring a bell?

<view>
  <text>
    Hello World!
  </text>
</view>

Turns out we can.

Ever used Instagram or AirBnB on you phone?

Thanks to the abstraction layer of the virtual DOM we’re not limited to just the web.

React native

Runs on the internal JavaScript engine of Android and iOS (not a webview)

 

Can make use of native UI elements as well as the platform API

Progressive Web Apps

What does progressive mean?

It means it’s like a regular web app, just progressively enhanced.

Progressive Web Apps

Possible enhancements:

Offline mode (with background sync once back online)

Push notifications

Able to add to Home Screen (Android only)

Try it out, go to mobile.twitter.com

The end

 

Thank you!

Questions?

Ewolucja Frontendu

By Damian Dulisz

Ewolucja Frontendu

  • 1,860