Una polyfill o polyfiller, è un pezzo di codice (o plugin) che fornisce allo sviluppatore la tecnologia che si aspetta dal browser per lavorare in modo nativo; o, se si vuole, è l’appiattimento del panorama API.

Questo è la traduzione di un post di Parashuram Narasimhan su come utilizzare IndexedDB oggi.

Utilizzando le polyfills, menzionate sopra, gli sviluppatori web possono iniziare a utilizzare le API IndexedDB nelle loro applicazioni visto che sono già supportate da una vasta gamma di browsers.
Le API IndexedDB sono già mature in una specifica stabile e ha il supporto dei maggiori produttori di browser. Tuttavia, la specifica non è ancora supportata su tutti i browser, per cui rende più difficile il suo utilizzo in produzione. Ci sono anche alcune interessanti differenze nelle implementazioni tra i browser che supportano questa specifica. Questo articolo esplora un paio di polyfills che potrebbero essere sfruttate per consentire agli sviluppatori di utilizzare IndexedDB su diversi tipi di browser.
Polyfill utilizzando WebSql

WebSql è stata una delle prime specifiche per la conservazione dei dati nei browsers ed è supportato in alcuni browser che non dispongono ancora di una implementazione di IndexeddB. Tuttavia, la sua manutenzione non è più attiva. Come menzionato nel documento: “era la traccia della raccomandazione W3C ma il lavoro per la sua specifica si è fermato. La specifica ha raggiunto un vicolo cieco: tutti gli implementatori interessati avevano utilizzato la stessa backend SQL (SQLite) e abbiamo bisogno di più implementazioni indipendenti per procedere lungo il percorso di standardizzazione“.

Questo polyfill utilizzando WebSql si serve delle implementazioni WebSQL per esporre le API IndexedDB. Per utilizzare la polyfill, è sufficiente collegare o includere il file indexeddb.shim.js.

La polyfill assegna a window.indexedDB l’oggetto window.mozIndexedDB, window.webkitIndexedDB o window.msIndexedDB, se una di queste implementazioni sono disponibili. Se non sono disponibili, la polyfill assegna un window.shimIndexedDB a window.indexedDB. Le applicazioni Web possono così iniziare a utilizzare window.indexedDB come punto di partenza per tutte le operazioni del database. Internamente, la polyfill utilizza le tabelle WebSql per memorizzare i dati Object Store e prende in prestito molto dall’impementazione IndexedDB in Firefox.

La polyfill è stata testata con diverse librerie IndexedDB, come PouchDB, LINQ2IndexedDB, JQuery-IndexedDB e DB.JS. Dal momento che sfrutta WebSql, siamo in grado di scrivere il codice delle applicazioni, in base alle API IndexedDB, sui browsers come Opera e Safari e, in aggiunta, sui browsers per dispositivi mobili come Safari su iPad / iPhone o su piattaforme di sviluppo mobile come Cordova, che ha il browser WebSql incorporato.

È implementato in Javascript ma è un work in progress. Si noti che non confermano pienamente le specifiche e possono apparire dei problemi: volendo, si può generare un bug o si può inviare una richiesta di pull al repositorio di origine.

Polyfill per setVersion
Una versione precedente della specifica IndexedDB utilizzava la chiamata “setVersion” per cambiare la versione del Database IndexedDB. Questo è stato poi rivisto per facilitare la retrochiamata o callback “onupgradeneeded”. Anche se Internet Explorer e Firefox supportano la versione più recente di “onupgradeneeded” per inizializzare la versione del database e avviare la creazione o l’eliminazione degli objectStores e Indexes, Google Chrome (22.0.1194.0 canary) ancora utilizza la vecchia versione di setVersion.

Presto tutti i browser potranno usare il metodo più recente di “onupgradeneded”, questo semplice polyfill per setVersion ci permette di usare le API IndexedDB con il metodo onupgradeneeded.

La polyfill sostituisce la chiamata indexeddb.open() con la chiamata a openReqShim(). La chiamata a openReqShim() invoca a setVersion() e poi lo converte per il callback a “onupgradeneeded” solo se setVersion() è supportato. Se l’implementazione supporta “onupgradeneeded”, openReqShim() realizza semplicemente una chiamata al metodo indexedb.open. Quindi, per utilizzare questo polyfill, la chiamata a indexeddb.open() dovrebbe essere sostituita con la chiamata openReqShim().

IDBWrapper
La libreria è un wrapper per indexedDB e nasconde alcune delle stranezze di indexedDB dietro una bella facciata. È destinato a:

  • facilitare l’impiego di indexedDB e di astrarre le differenze tra le impls esistenti in Chrome e Firefox;
  • mostrare come funziona IDB. Il codice è suddiviso in metodi brevi, quindi è facile vedere cosa succede in un determinato metodo.

Per informazioni dettagliate sul suo utilizzo, si prega di leggere il file README del progetto e verificare gli esempi.