Slide 1

Slide 1 text

An empty database in everybody's pocket Phil Nash Topconf Tallinn 2016

Slide 2

Slide 2 text

Phil Nash @philnash http://philna.sh [email protected]

Slide 3

Slide 3 text

An empty database in everybody's pocket

Slide 4

Slide 4 text

IndexedDB

Slide 5

Slide 5 text

IndexedDB has a bad reputation

Slide 6

Slide 6 text

The options

Slide 7

Slide 7 text

Cookies

Slide 8

Slide 8 text

LocalStorage

Slide 9

Slide 9 text

LocalStorage localStorage.setItem('Topconf', 'Awesome');

Slide 10

Slide 10 text

But...

Slide 11

Slide 11 text

WebSQL?

Slide 12

Slide 12 text

So... IndexedDB

Slide 13

Slide 13 text

Why?

Slide 14

Slide 14 text

Performance

Slide 15

Slide 15 text

Offline

Slide 16

Slide 16 text

Offline Poor connectivity

Slide 17

Slide 17 text

User experience

Slide 18

Slide 18 text

What is IndexedDB?

Slide 19

Slide 19 text

Object store

Slide 20

Slide 20 text

Transactional

Slide 21

Slide 21 text

Asynchronous

Slide 22

Slide 22 text

Same origin policy

Slide 23

Slide 23 text

Demo

Slide 24

Slide 24 text

There's more!

Slide 25

Slide 25 text

Indexes

Slide 26

Slide 26 text

Indexes request.onupgradeneeded = (event) => { const db = event.target.result; const objectStore = db.createObjectStore('messages', { keyPath: 'sid' }); objectStore.createIndex('dateUpdated', 'dateUpdated'); }; 01. 02. 03. 04. 05. 06. 07.

Slide 27

Slide 27 text

Indexes const transaction = db.transaction(['messages']); const objectStore = transaction.objectStore('messages'); const index = objectStore.index('dateUpdated'); index.openCursor().onsuccess = (event) => { // do stuff } 01. 02. 03. 04. 05. 06.

Slide 28

Slide 28 text

Upgrades

Slide 29

Slide 29 text

Upgrades request.onupgradeneeded = (event) => { const db = event.target.result; db.createObjectStore("messages", { keyPath: "sid" }); }; 01. 02. 03. 04.

Slide 30

Slide 30 text

Upgrades request.onupgradeneeded = (event) => { const db = event.target.result; if (event.oldVersion < 1) { db.createObjectStore("messages", { keyPath: "sid" }); } if (event.oldVersion < 2) { db.createObjectStore("channels", { keyPath: "sid" }); } }; 01. 02. 03. 04. 05. 06. 07. 08. 09.

Slide 31

Slide 31 text

Bugs

Slide 32

Slide 32 text

Safari

Slide 33

Slide 33 text

Libraries!

Slide 34

Slide 34 text

idb-keyval

Slide 35

Slide 35 text

idb-keyval idbKeyval.set('Topconf', 'Awesome') .then(() => console.log(' ')) .catch(err => console.error(' ', err)); 01. 02. 03.

Slide 36

Slide 36 text

localForage

Slide 37

Slide 37 text

localForage localforage.setItem('key', 'value', function (err) { if (err) { console.error(' ', err); } else { console.log(' '); } }); 01. 02. 03. 04.

Slide 38

Slide 38 text

localForage localforage.setItem('key', 'value') .then(() => { console.log(' '); }) .catch((err) => { console.error(' ', err); }); 01. 02. 03.

Slide 39

Slide 39 text

idb

Slide 40

Slide 40 text

idb const dbPromise = idb.open('messages', 1, upgradeDB => { upgradeDB.createObjectStore('messages'); }); 01. 02. 03.

Slide 41

Slide 41 text

idb dbPromise.then(db => { return db.transaction('messages') .objectStore('messages').get(key); }); 01. 02. 03. 04.

Slide 42

Slide 42 text

Dexie

Slide 43

Slide 43 text

Dexie const dexie = new Dexie("messageStore"); dexie.version(1).stores({ messages: 'sid,dateUpdated' }); 01. 02. 03. 04.

Slide 44

Slide 44 text

Dexie dexie.open().then((db) => { db.messages.where("sid").equals(key) .then((message) => { console.log(message.body); }); }); 01. 02. 03. 04.

Slide 45

Slide 45 text

pouchdb

Slide 46

Slide 46 text

pouchdb var db = new PouchDB('messages'); db.put({ _id: 'sid', body: ' ', }).then((response) => { console.log(' '); }).catch((err) => { console.error(' ', err); }); 01. 02. 03. 04. 05. 06. 07. 08. 09.

Slide 47

Slide 47 text

IndexedDB enhances the experience

Slide 48

Slide 48 text

Let's fill those databases!

Slide 49

Slide 49 text

Thanks! @philnash http://philna.sh [email protected]