building applications€¦ · building applications for the next billion users. siddharth...

225

Upload: others

Post on 22-May-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 2: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

BUILDING APPLICATIONSFOR THE NEXT BILLION USERS

Page 3: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

Siddharth Kshetrapal

Page 4: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

@siddharthkp

Page 5: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

@siddharthkp

javascript architect

Page 6: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

@siddharthkp

past: @practo

Page 7: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 8: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

bit.ly/siddharthkpshow

Page 9: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

co-organise ReactBangalore

Page 10: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

i teach react

bit.ly/react-training

Page 11: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

340 millioninternet users in India

source

Page 12: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

340 millioninternet users in India

entire population of USA = 320 million

source

Page 13: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

340 millioninternet users in India

25% of the population

source

Page 16: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

within 30 days,the average app loses 85% of it’s DAUs

source: quettra

Page 18: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

storage

Page 19: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

8 - 16 GBaverage storage

from a sample size of 25L devices

source: helpchat/yourstory

Page 20: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

source: helpchat/yourstory

typical storage split of a 8GB device

Page 21: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

30%of helpchat’s uninstalls aredirectly related to storage

source: helpchat/yourstory

Page 22: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

web is the answer

Page 23: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

100%devices ship with an internet browser

Page 24: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 25: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

web sites let you reach users, apps let you deeply engage users

Page 26: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

state of mobile webin 2017

Page 27: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

1. capabilities

Page 28: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

fast/smooth

works offline

lives on your phone

native functionalities

Page 29: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

60 FPS

source: engineering.flipboard

Page 30: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

fast/smooth

works offline

lives on your phone

native functionalities

Page 31: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

source: offline-cookbook

cache as fallback

Page 32: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

fast/smooth

works offline

lives on your phone

native functionalities

Page 33: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

Add to homescreen + app drawer

Page 34: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

standalone window

Page 35: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

fast/smooth

works offline

lives on your phone

native functionalities

Page 36: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

notifications

geolocation

camera

background sync

speech recognition

Page 37: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

upload files

bluetooth

nfc

record audio

vibration

battery state

offline storage

orientation

clipboard

notifications

geolocation

camera

background sync

speech recognition

Page 38: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

sms

contacts

geofencing

proximity sensor

Page 39: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

fast/smooth

works offline

lives on your phone

native functionalities

Page 40: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

fast/smooth

works offline

lives on your phone

native functionalities

Progressive web apps

Page 41: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

fast/smooth

works offline

lives on your phone

native functionalities

Page 42: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

2. user metrics

Page 43: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

web sites let you reach users, apps let you deeply engage users

Page 44: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

3xtime spent on app vs website for Pinterest

source: venturebeat

Page 45: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

27%conversion from app store

source: splitmetrics

Page 46: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

selection bias

Page 47: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

selection bias

1. the users are high intent users

Page 48: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

selection bias

1. the users are high intent users

2. 73% of potential users spentexactly zero time in the app

Page 49: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

270% more users

top 1000 websites vs top 1000 native apps

source: splitmetrics

Page 50: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

promise of the mobile webin 2017

Page 51: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

promise of the mobile web

capabilities of native+

reach of the web

Page 52: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

problems with the web

Page 53: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

340 millioninternet users in India

source

Page 55: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

40%of practo’s mobile users

are on 3G and slower

Page 56: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

63%of flipkart mobile users are on 2G

source : developers.google.com

Page 58: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 60: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 61: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

fast/smooth

works offline

lives on your phone

native functionalities

Page 62: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

web performance checklist

Image credit: Pawel Granatowski

Page 63: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

“If you can’t measure it,you can’t improve it”

Page 64: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

Measure on slow networks,that’s where your users are

Page 65: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 66: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

Faston 3G (1.5Kb/s)

First meaningful paint 1.6s

Page 67: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

Faston 3G (1.5Kb/s)

First meaningful paint 1.6s

Time to interactive 2.5s

Page 68: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

Faston 3G (1.5Kb/s)

First meaningful paint 1.6s

Time to interactive 2.5s

Page ready 3.6s

Page 69: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

HTML

I I I I I I I I I I I I I I I I I

Page 70: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

JS download

HTML

CSS

I I I I I I I I I I I I I I I I I

Page 71: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

JS download

HTML

CSS

parse

I I I I I I I I I I I I I I I I I

Page 72: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

JS download

HTML

CSS

DATA

parse

I I I I I I I I I I I I I I I I I

Page 73: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

JS download

HTML

CSS

DATA

parse

I I I I I I I I I I I I I I I I I

Page 74: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 75: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

#1 render on the server

Page 76: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

#1 render on the server

fetch data on low latency

render with high processing power

Page 77: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* server.js */

import express from 'express'

import { renderToString } from 'react-dom/server'

import api from './api-service'

const server = express()

server.get('/medicine-info', (req, res) => {

api.get(req.path).then(data => {

res.end(renderToString(<App {...data} />))

})

}

Page 78: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* server.js */

import express from 'express'

import { renderToString } from 'react-dom/server'

import api from './api-service'

const server = express()

server.get('/medicine-info', (req, res) => {

api.get(req.path).then(data => {

res.end(renderToString(<App {...data} />))

})

}

Page 79: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* server.js */

import express from 'express'

import { renderToString } from 'react-dom/server'

import api from './api-service'

const server = express()

server.get('/medicine-info', (req, res) => {

api.get(req.path).then(data => {

res.end(renderToString(<App {...data} />))

})

}

Page 80: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* server.js */

import express from 'express'

import { renderToString } from 'react-dom/server'

import api from './api-service'

const server = express()

server.get('/medicine-info', (req, res) => {

api.get(req.path).then(data => {

res.end(renderToString(<App {...data} />))

})

}

Page 81: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

JS download

HTML

CSS

DATA

parse

I I I I I I I I I I I I I I I I I

Page 82: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

JS download

CSS

DATA

parse

I I I I I I I I I I I I I I I I I

HTML

Page 83: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

JS download

CSS

DATA

parse

I I I I I I I I I I I I I I I I I

HTML

Page 84: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

JS download

CSS

DATA

parse

I I I I I I I I I I I I I I I I I

HTML

Page 85: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 87: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 88: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

seo?

time-to-first-byte is delayed

source : viget

Page 89: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* server.js */

import express from 'express'

import { renderToString } from 'react-dom/server'

import api from './api-service'

const server = express()

server.get('/medicine-info', (req, res) => {

res.write(staticHTML)

res.flush()

api.get(req.path).then(data => {

res.write(renderToString(<App {...data} />))

res.end()

})

}

Page 90: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* server.js */

import express from 'express'

import { renderToString } from 'react-dom/server'

import api from './api-service'

const server = express()

server.get('/medicine-info', (req, res) => {

res.write(staticHTML)

res.flush()

api.get(req.path).then(data => {

res.write(renderToString(<App {...data} />))

res.end()

})

}

Page 91: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* server.js */

import express from 'express'

import { renderToString } from 'react-dom/server'

import api from './api-service'

const server = express()

server.get('/medicine-info', (req, res) => {

res.write(staticHTML)

res.flush()

api.get(req.path).then(data => {

res.write(renderToString(<App {...data} />))

res.end()

})

}

Page 93: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

skeleton screens

Page 94: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

JS download

CSS

DATA

parse

I I I I I I I I I I I I I I I I I

HTML

Page 95: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

1.5xusers will wait longer on a custom loader

source : viget

Page 96: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 97: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

First meaningful paint 1.6s

Time to interactive 2.5s

Page ready 3.6s

Page 98: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 99: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

performance.mark('Page ready')

Page 100: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

class Page extends React.Component {

constructor(props) { ... }

componentDidMount() {

performance.mark('Page ready')

}

render() { ... }

}

Page 101: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

Load the minimum amount of javascript required for a page

split on page boundaries

#2

Page 102: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* webpack.config.js */

export default {

/* Use pages as entry points */

entry: {

home: './container/home.js',

brand: './container/brand.js',

search: './container/search.js'

},

output: {

filename: '[name]-[chunkhash].js',

path: resolve('./dist')

}

}

Page 103: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* webpack.config.js */

export default {

/* Use pages as entry points */

entry: {

home: './container/home.js',

brand: './container/brand.js',

search: './container/search.js'

},

output: {

filename: '[name]-[chunkhash].js',

path: resolve('./dist')

}

}

Page 104: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* webpack.config.js */

export default {

/* Use pages as entry points */

entry: {

home: './container/home.js',

brand: './container/brand.js',

search: './container/search.js'

},

output: {

filename: '[name]-[chunkhash].js',

path: resolve('./dist')

}

}

Page 105: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

Load the minimum amount of javascript required for a page

use smaller dependencies

#2

Page 106: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

react + react-dom 34.9kB

preact 3.5kB

Page 107: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

react + react-dom 34.9kB

preact + preact-compat 8.3kB

Page 108: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* webpack.config.js */

export default {

resolve: {

alias: {

'react' : 'preact-compat',

'react-dom' : 'preact-compat'

}

}

}

Page 109: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

#3 Lazy load good to have features

marketing banners, analytics, etc.

Page 110: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

class Page extends React.Component {

constructor(props) { ... }

componentDidMount() {

const tag = document.createElement('script')

tag.src = 'https://analytics.com/script.js'

document.head.appendChild(tag)

}

render() { ... }

}

Page 111: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

class Page extends React.Component {

constructor(props) { ... }

componentDidMount() {

const tag = document.createElement('script')

tag.src = 'https://analytics.com/script.js'

document.head.appendChild(tag)

}

render() { ... }

}

Page 112: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

anticipation is the key to performance

Page 113: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 114: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

#4 Prefetch + cache the next page

Page 115: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

class Page extends React.Component {

constructor(props) { ... }

componentDidMount() {

navigator.serviceWorker.controller.postMessage({

method: 'cache',

urls: ['products', '/cart', 'checkout']

})

}

render() { ... }

}

Page 116: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

class Page extends React.Component {

constructor(props) { ... }

componentDidMount() {

navigator.serviceWorker.controller.postMessage({

method: 'cache',

urls: ['products', '/cart', 'checkout']

})

}

render() { ... }

}

Page 117: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

class Page extends React.Component {

constructor(props) { ... }

componentDidMount() {

navigator.serviceWorker.controller.postMessage({

method: 'cache',

urls: ['products', '/cart', 'checkout']

})

}

render() { ... }

}

Page 118: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* sw.js */

self.addEventListener('message', event => {

if (event.data.method === 'cache') {

caches.open('website-cache').then(cache => {

return cache.addAll(event.data.urls)

})

}

})

Page 119: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* sw.js */

self.addEventListener('message', event => {

if (event.data.method === 'cache') {

caches.open('website-cache').then(cache => {

return cache.addAll(event.data.urls)

})

}

})

Page 120: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* sw.js */

self.addEventListener('message', event => {

if (event.data.method === 'cache') {

caches.open('website-cache').then(cache => {

return cache.addAll(event.data.urls)

})

}

})

Page 121: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

#1 Render meaningful content on the server

#2 Load the min js required for a page/route

#3 Lazy load good-to-have features

#4 Prefetch + cache the next page

Image credit: Pawel Granatowski

Page 122: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

how do you stay fast?

Page 123: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

bundlesize

Page 124: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

bundlesize

used by

preact lighthouse styled-components redux-saga react-apollo

Page 125: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* package.json */

{

"name": "your-awesome-app",

"scripts": {

"test": "jest && bundlesize"

},

"bundlesize": [

{"path": "./dist/common-*.js", "maxSize": "25Kb"},

{"path": "./dist/feature-*.js","maxSize": "30Kb"}

]

}

Page 126: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* package.json */

{

"name": "your-awesome-app",

"scripts": {

"test": "jest && bundlesize"

},

"bundlesize": [

{"path": "./dist/common-*.js", "maxSize": "25Kb"},

{"path": "./dist/feature-*.js","maxSize": "30Kb"}

]

}

Page 127: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 128: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

fast/smooth

works offline

lives on your phone

native functionalities

Page 129: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

navigator.serviceWorker.register('/sw.js')

Page 130: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

install

activate

Page 131: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

install

activate

fetch

message

sync

push

Page 132: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 133: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 134: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 135: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

first run

Page 136: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 137: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 138: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 139: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 140: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

second run

Page 141: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 142: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 143: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 144: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 146: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

i. cache first

Page 147: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 148: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 149: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 150: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 151: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 152: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 153: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 154: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 155: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 156: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 157: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 158: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

ii. network first

Page 159: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 160: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 161: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 162: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 163: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 164: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 165: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 166: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 167: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 168: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 169: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

iii. prefetch

Page 170: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 171: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 172: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 173: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 174: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 175: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 176: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 177: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 178: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 179: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

fast/smooth

works offline

lives on your phone

native functionalities

Page 180: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* index.html */

<head>

<link rel="manifest" href="/manifest.json">

</head>

Page 181: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* manifest.json */

{

"name": "your-awesome-app",

"short_name": "awesome",

"background_color": "#2196F3",

"icons": [

"src": "app-icon-4x.png",

"type": "image/png",

"sizes": "192x192"

],

"start_url": "index.html?launcher=true"

}

Page 182: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* manifest.json */

{

"name": "your-awesome-app",

"short_name": "awesome",

"background_color": "#2196F3",

"icons": [

"src": "app-icon-4x.png",

"type": "image/png",

"sizes": "192x192"

],

"start_url": "index.html?launcher=true"

}

Page 183: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

standalone window

Page 184: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* manifest.json */

{

"name": "your-awesome-app",

"short_name": "awesome",

"background_color": "#2196F3",

"icons": [

"src": "app-icon-4x.png",

"type": "image/png",

"sizes": "192x192"

],

"start_url": "index.html"

}

Page 185: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* manifest.json */

{

"name": "your-awesome-app",

"short_name": "awesome",

"background_color": "#2196F3",

"icons": [

"src": "app-icon-4x.png",

"type": "image/png",

"sizes": "192x192"

],

"start_url": "index.html?launcher=true"

}

Page 186: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

/* manifest.json */

{

"name": "your-awesome-app",

"short_name": "awesome",

"background_color": "#2196F3",

"icons": [

"src": "app-icon-4x.png",

"type": "image/png",

"sizes": "192x192"

],

"start_url": "index.html?launcher=true"

}

Page 187: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

Add to homescreen

Page 188: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

self.addEventListener('beforeinstallprompt', e => {

})

Page 189: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

self.addEventListener('beforeinstallprompt', e => {

e.userChoice.then(choice => {

// send choice to analytics

})

})

Page 190: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

self.addEventListener('beforeinstallprompt', e => {

e.preventDefault()

})

Page 191: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

let deferred

self.addEventListener('beforeinstallprompt', e => {

e.preventDefault()

deferred = e

})

Page 192: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

let deferred

self.addEventListener('beforeinstallprompt', e => {

e.preventDefault()

deferred = e

})

deferred.prompt()

Page 193: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

fast/smooth

works offline

lives on your phone

native functionalities

Page 194: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 195: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

Notification.permission

Page 196: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

if (Notification.permission === 'default') {

Notification.requestPermission(permission => {

if (permission === 'granted') {

new Notification('Hi!')

}

})

} else if (Notification.permission === 'granted') {

new Notification('Welcome back!')

} else {

// can't do anything!

}

Page 197: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

if (Notification.permission === 'default') {

Notification.requestPermission(permission => {

if (permission === 'granted') {

new Notification('Hi!')

}

})

} else if (Notification.permission === 'granted') {

new Notification('Welcome back!')

} else {

// can't do anything!

}

Page 198: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

if (Notification.permission === 'default') {

Notification.requestPermission(permission => {

if (permission === 'granted') {

new Notification('Hi!')

}

})

} else if (Notification.permission === 'granted') {

new Notification('Welcome back!')

} else {

// can't do anything!

}

Page 199: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

if (Notification.permission === 'default') {

Notification.requestPermission(permission => {

if (permission === 'granted') {

new Notification('Hi!')

}

})

} else if (Notification.permission === 'granted') {

new Notification('Welcome back!')

} else {

// can't do anything!

}

Page 200: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

if (Notification.permission === 'default') {

Notification.requestPermission(permission => {

if (permission === 'granted') {

new Notification('Hi!')

}

})

} else if (Notification.permission === 'granted') {

new Notification('Welcome back!')

} else {

// can't do anything!

}

Page 201: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

if (Notification.permission === 'default') {

Notification.requestPermission(permission => {

if (permission === 'granted') {

new Notification('Hi!')

}

})

} else if (Notification.permission === 'granted') {

new Notification('Welcome back!')

} else {

// can't do anything!

}

Page 202: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

if (Notification.permission === 'default') {

Notification.requestPermission(permission => {

if (permission === 'granted') {

new Notification('Hi!')

}

})

} else if (Notification.permission === 'granted') {

new Notification('Welcome back!')

} else {

// can't do anything!

}

Page 203: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 204: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 205: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

navigation.geolocation

Page 206: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

navigator.geolocation.getCurrentPosition(position => {

})

Page 207: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

navigator.geolocation.getCurrentPosition(position => {

// position.coords.latitude

// position.coords.longitude

})

Page 208: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

navigator.mediaDevices

Page 209: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

upload files

bluetooth

nfc

record audio

vibration

battery state

offline storage

orientation

clipboard

notifications

geolocation

camera

background sync

speech recognition

Page 210: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

fast/smooth

works offline

lives on your phone

native functionalities

Page 211: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

web vs native

Page 212: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

it depends™

Page 213: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

games/tools

Page 214: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

utility/daily use

email chat notes news social travel

Page 215: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

utility/daily use

email chat notes news social travel

exception: twitter/uber

Page 216: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

transaction

ecommerce appointments dining

Page 217: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

transaction

ecommerce appointments dining

exception: iOS

Page 218: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 219: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

both?

Page 220: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo
Page 221: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

sharing code

Page 222: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

sharing code

one language across the stack

common logic + different views

Page 223: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

promise of the mobile web

Page 224: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

@siddharthkpDM is open, say hi!

Page 225: BUILDING APPLICATIONS€¦ · BUILDING APPLICATIONS FOR THE NEXT BILLION USERS. Siddharth Kshetrapal. @siddharthkp. @siddharthkp javascript architect. @siddharthkp past: @practo

@greatindiandev bit.ly/gidslinkedin www.developersummit.com

Conference and Deep Dive Sessions

April 24-28, IISc Bangalore

TM

2018

Register early and get the best discounts!