Atraskite žiniatinklio programų ateitį su mūsų išsamiu „File System Access API“ vadovu. Išmokite stebėti vietinių failų ir katalogų pokyčius tiesiai iš naršyklės, pateikiant praktinius pavyzdžius, geriausias praktikas ir našumo patarimus.
Realaus Laiko Frontend Galios Atrakinimas: Išsami Failų Sistemos Katalogų Stebėjimo Analizė
Įsivaizduokite žiniatinklio kodo redaktorių, kuris akimirksniu atspindi pakeitimus, kuriuos atliekate projekto aplanke savo vietiniame diske. Pavaizduokite naršyklėje veikiančią nuotraukų galeriją, kuri automatiškai atsinaujina, kai pridedate naujų nuotraukų iš savo fotoaparato. Arba apsvarstykite duomenų vizualizavimo įrankį, kuris perbraižo savo diagramas realiuoju laiku, kai atnaujinamas vietinis žurnalo failas. Dešimtmečius toks integracijos lygis su vietine failų sistema buvo išskirtinė vietinių darbalaukio programų sritis. Naršyklė, saugumo sumetimais, buvo laikoma saugiu atstumu savo „smėlio dėžėje“ (sandbox).
Šiandien ši paradigma dramatiškai keičiasi. Dėka modernių naršyklės API, riba tarp žiniatinklio ir darbalaukio programų nyksta. Vienas galingiausių įrankių, vedančių šį pokytį, yra File System Access API, kuris suteikia žiniatinklio programoms leidimais pagrįstą prieigą skaityti, rašyti ir, kas svarbiausia mūsų diskusijai, stebėti vartotojo vietinių failų ir katalogų pokyčius. Ši galimybė, žinoma kaip katalogų stebėjimas arba failų pokyčių stebėjimas, atveria naują ribą kuriant galingas, jautrias ir labai integruotas žiniatinklio patirtis.
Šis išsamus vadovas leis jums pasinerti į frontend failų sistemos katalogų stebėjimo pasaulį. Išnagrinėsime pagrindinį API, išanalizuosime patikimo stebėtojo kūrimo nuo nulio technikas, panagrinėsime realaus pasaulio naudojimo atvejus ir aptarsime kritinius našumo, saugumo bei vartotojo patirties iššūkius. Nesvarbu, ar kuriate kitą puikią žiniatinklio IDE, ar paprastą įrankį, šios technologijos supratimas yra raktas į visą modernaus žiniatinklio potencialą.
Evoliucija: Nuo Paprastų Failų Įvesčių Iki Realaus Laiko Stebėjimo
Norint pilnai įvertinti File System Access API svarbą, naudinga prisiminti failų tvarkymo žiniatinklyje raidą.
Klasikinis Požiūris: <input type="file">
Ilgą laiką vienintelis mūsų kelias į vartotojo failų sistemą buvo kuklus <input type="file"> elementas. Jis buvo ir tebėra patikimas įrankis paprastam failų įkėlimui. Tačiau jo apribojimai yra reikšmingi:
- Vartotojo Inicijuotas ir Vienkartinis: Vartotojas turi rankiniu būdu spausti mygtuką ir kiekvieną kartą pasirinkti failą. Nėra išliekamumo.
- Tik Failai: Galima pasirinkti vieną ar kelis failus, bet niekada nebuvo galima pasirinkti viso katalogo.
- Jokio Stebėjimo: Pasirinkus failą, naršyklė neturėjo jokios informacijos apie tai, kas nutiko originaliam failui diske. Jei jis buvo pakeistas ar ištrintas, žiniatinklio programa apie tai nežinojo.
Žingsnis Pirmyn: „Drag and Drop“ API
„Drag and Drop“ API suteikė daug geresnę vartotojo patirtį, leisdama vartotojams vilkti failus ir aplankus tiesiai į tinklalapį. Tai atrodė intuityviau ir panašiau į darbalaukio aplinką. Vis dėlto, jis turėjo tą patį esminį apribojimą kaip ir failo įvestis: tai buvo vienkartinis įvykis. Programa gaudavo nuvilktų elementų momentinę kopiją tuo konkrečiu metu ir neturėjo jokio nuolatinio ryšio su šaltinio katalogu.
Revoliucija: „File System Access API“
„File System Access API“ yra esminis šuolis į priekį. Jis buvo sukurtas tam, kad žiniatinklio programoms suteiktų galimybes, prilygstančias vietinėms programoms, leidžiant joms sąveikauti su vartotojo vietine failų sistema nuolatiniu ir galingu būdu. Jo pagrindiniai principai grindžiami saugumu, vartotojo sutikimu ir galimybėmis:
- Į Vartotoją Orientuotas Saugumas: Prieiga niekada nesuteikiama tyliai. Vartotojui visada rodomas raginimas suteikti leidimą konkrečiam failui ar katalogui per naršyklės dialogo langą.
- Išliekantys „Handles“ (Manipuliatoriai): Užuot gavusi vienkartinį duomenų bloką, jūsų programa gauna specialų objektą, vadinamą handle (FileSystemFileHandle arba FileSystemDirectoryHandle). Šis manipuliatorius veikia kaip nuolatinė nuoroda į tikrąjį failą ar katalogą diske.
- Prieiga Katalogo Lygmeniu: Tai yra lemiama savybė. API leidžia vartotojui suteikti programai prieigą prie viso katalogo, įskaitant visus jo pakatalogius ir failus.
Būtent šis išliekantis katalogo manipuliatorius (directory handle) leidžia realiu laiku stebėti failus frontend'e.
„File System Access API“ Supratimas: Pagrindinė Technologija
Prieš kuriant katalogo stebėtoją, turime suprasti pagrindinius API komponentus, kurie leidžia jam veikti. Visas API yra asinchroniškas, o tai reiškia, kad kiekviena operacija, sąveikaujanti su failų sistema, grąžina „Promise“, užtikrindama, kad vartotojo sąsaja išliktų jautri.
Saugumas ir Leidimai: Vartotojas Kontroliuoja
Svarbiausias šio API aspektas yra jo saugumo modelis. Svetainė negali savavališkai nuskaityti jūsų kietojo disko. Prieiga yra griežtai pasirenkama (opt-in).
- Pradinė Prieiga: Vartotojas turi inicijuoti veiksmą, pavyzdžiui, paspausti mygtuką, kuris iškviečia API metodą, pvz., window.showDirectoryPicker(). Tai atidaro pažįstamą OS lygio dialogo langą, kuriame vartotojas pasirenka katalogą ir aiškiai spusteli „Suteikti prieigą“ ar panašų mygtuką.
- Leidimų Būsenos: Svetainės leidimas tam tikram manipuliatoriui gali būti vienoje iš trijų būsenų: 'prompt' (numatytoji, reikalauja paklausti vartotojo), 'granted' (svetainė turi prieigą) arba 'denied' (svetainė negali gauti prieigos ir negali vėl klausti toje pačioje sesijoje).
- Išliekamumas: Siekiant geresnės vartotojo patirties, naršyklė gali išsaugoti „suteiktą“ leidimą tarp sesijų įdiegtoms PWA arba svetainėms, su kuriomis daug sąveikaujama. Tai reiškia, kad vartotojui gali nereikėti kiekvieną kartą apsilankius jūsų programoje iš naujo pasirinkti savo projekto aplanko. Galite patikrinti dabartinę leidimo būseną su directoryHandle.queryPermission() ir paprašyti ją atnaujinti su directoryHandle.requestPermission().
Pagrindiniai Metodai Prieigai Gauti
Įėjimo taškai į API yra trys globalūs metodai window objekte:
- window.showOpenFilePicker(): Paragina vartotoją pasirinkti vieną ar daugiau failų. Grąžina FileSystemFileHandle objektų masyvą.
- window.showDirectoryPicker(): Tai mūsų pagrindinis įrankis. Jis paraginta vartotoją pasirinkti katalogą. Grąžina vieną FileSystemDirectoryHandle.
- window.showSaveFilePicker(): Paragina vartotoją pasirinkti vietą failui išsaugoti. Grąžina FileSystemFileHandle rašymui.
„Handles“ Galia: FileSystemDirectoryHandle
Kai turite FileSystemDirectoryHandle, turite galingą objektą, kuris reprezentuoja tą katalogą. Jame nėra katalogo turinio, bet jis suteikia metodus sąveikai su juo:
- Iteracija: Galite iteruoti per katalogo turinį naudodami asinchroninį iteratorių: for await (const entry of directoryHandle.values()) { ... }. Kiekvienas entry bus arba FileSystemFileHandle, arba kitas FileSystemDirectoryHandle.
- Konkrečių Įrašų Gavimas: Galite gauti manipuliatorių konkrečiam žinomam failui ar pakatalogiui naudodami directoryHandle.getFileHandle('filename.txt') arba directoryHandle.getDirectoryHandle('subfolder').
- Modifikavimas: Galite kurti naujus failus ir pakatalogius, pridėdami { create: true } parinktį prie aukščiau nurodytų metodų, arba juos pašalinti su directoryHandle.removeEntry('item-to-delete').
Reikalo Esmė: Katalogų Stebėjimo Įgyvendinimas
Štai esminė detalė: „File System Access API“ nesuteikia natūralaus, įvykiais pagrįsto stebėjimo mechanizmo, panašaus į Node.js fs.watch(). Nėra jokio directoryHandle.on('change', ...) metodo. Tai dažnai prašoma funkcija, tačiau kol kas stebėjimo logiką turime įgyvendinti patys.
Labiausiai paplitęs ir praktiškiausias požiūris yra periodinis tikrinimas (polling). Tai reiškia, kad reguliariais intervalais daroma katalogo būsenos „momentinė kopija“ ir ji lyginama su ankstesne kopija, siekiant aptikti pakeitimus.
Naivus Požiūris: Paprastas Tikrinimo Ciklas
Paprastas įgyvendinimas galėtų atrodyti maždaug taip:
// Supaprastintas pavyzdys koncepcijai iliustruoti
let initialFiles = new Set();
async function watchDirectory(directoryHandle) {
const currentFiles = new Set();
for await (const entry of directoryHandle.values()) {
currentFiles.add(entry.name);
}
// Palyginimas su ankstesne būsena (ši logika per daug paprasta)
console.log("Directory checked. Current files:", Array.from(currentFiles));
// Būsenos atnaujinimas kitam patikrinimui
initialFiles = currentFiles;
}
// Stebėjimo pradžia
async function start() {
const directoryHandle = await window.showDirectoryPicker();
setInterval(() => watchDirectory(directoryHandle), 2000); // Tikrinti kas 2 sekundes
}
Tai veikia, bet yra labai ribota. Tikrinamas tik aukščiausio lygio katalogas, galima aptikti tik pridėjimus/ištrynimus (ne modifikacijas), ir tai nėra inkapsuliuota. Tai pradinis taškas, bet mes galime padaryti daug geriau.
Sudėtingesnis Požiūris: Rekursyvios Stebėtojo Klasės Kūrimas
Norėdami sukurti tikrai naudingą katalogo stebėtoją, mums reikia patikimesnio sprendimo. Sukurkime klasę, kuri rekursyviai nuskaito katalogą, seka failų metaduomenis, kad aptiktų modifikacijas, ir siunčia aiškius įvykius skirtingų tipų pakeitimams.
1 Žingsnis: Detalios Momentinės Kopijos Darymas
Pirma, mums reikia funkcijos, kuri gali rekursyviai pereiti per katalogą ir sukurti detalų jo turinio žemėlapį. Šis žemėlapis turėtų apimti ne tik failų pavadinimus, bet ir metaduomenis, tokius kaip lastModified laiko žyma, kuri yra būtina pakeitimams aptikti.
// Funkcija rekursyviai sukurti katalogo momentinę kopiją
async function createSnapshot(dirHandle, path = '') {
const snapshot = new Map();
for await (const entry of dirHandle.values()) {
const currentPath = path ? `${path}/${entry.name}` : entry.name;
if (entry.kind === 'file') {
const file = await entry.getFile();
snapshot.set(currentPath, {
lastModified: file.lastModified,
size: file.size,
handle: entry
});
} else if (entry.kind === 'directory') {
const subSnapshot = await createSnapshot(entry, currentPath);
subSnapshot.forEach((value, key) => snapshot.set(key, value));
}
}
return snapshot;
}
2 Žingsnis: Momentinių Kopijų Lyginimas Siekiant Rasti Pakeitimus
Toliau mums reikia funkcijos, kuri palygina seną momentinę kopiją su nauja ir tiksliai nustato, kas pasikeitė.
// Funkcija palyginti dvi momentines kopijas ir grąžinti pakeitimus
function compareSnapshots(oldSnapshot, newSnapshot) {
const changes = {
added: [],
modified: [],
deleted: []
};
// Patikrinti pridėtus ir modifikuotus failus
newSnapshot.forEach((newFile, path) => {
const oldFile = oldSnapshot.get(path);
if (!oldFile) {
changes.added.push({ path, handle: newFile.handle });
} else if (oldFile.lastModified !== newFile.lastModified || oldFile.size !== newFile.size) {
changes.modified.push({ path, handle: newFile.handle });
}
});
// Patikrinti ištrintus failus
oldSnapshot.forEach((oldFile, path) => {
if (!newSnapshot.has(path)) {
changes.deleted.push({ path });
}
});
return changes;
}
3 Žingsnis: Logikos Inkapsuliavimas „DirectoryWatcher“ Klasėje
Galiausiai viską supakuojame į švarią, daugkartinio naudojimo klasę, kuri valdo būseną ir tikrinimo intervalą bei suteikia paprastą, atgalinio ryšio (callback) pagrindu veikiantį API.
class DirectoryWatcher {
constructor(directoryHandle, interval = 1000) {
this.directoryHandle = directoryHandle;
this.interval = interval;
this.lastSnapshot = new Map();
this.intervalId = null;
this.onChange = () => {}; // Numatytoji tuščia atgalinio ryšio funkcija
}
async check() {
try {
const newSnapshot = await createSnapshot(this.directoryHandle);
const changes = compareSnapshots(this.lastSnapshot, newSnapshot);
if (changes.added.length > 0 || changes.modified.length > 0 || changes.deleted.length > 0) {
this.onChange(changes);
}
this.lastSnapshot = newSnapshot;
} catch (error) {
console.error("Error while checking for file changes:", error);
// Galbūt sustabdyti stebėjimą, jei katalogas nebepasiekiamas
this.stop();
}
}
async start(callback) {
if (this.intervalId) {
console.log("Watcher is already running.");
return;
}
this.onChange = callback;
// Atlikti pradinį patikrinimą iš karto
this.lastSnapshot = await createSnapshot(this.directoryHandle);
this.intervalId = setInterval(() => this.check(), this.interval);
console.log(`Started watching "${this.directoryHandle.name}" for changes.`);
}
stop() {
if (this.intervalId) {
clearInterval(this.intervalId);
this.intervalId = null;
console.log(`Stopped watching "${this.directoryHandle.name}".`);
}
}
}
// Kaip naudoti DirectoryWatcher klasę
const startButton = document.getElementById('startButton');
const stopButton = document.getElementById('stopButton');
let watcher;
startButton.addEventListener('click', async () => {
try {
const directoryHandle = await window.showDirectoryPicker();
watcher = new DirectoryWatcher(directoryHandle, 2000); // Tikrinti kas 2 sekundes
watcher.start((changes) => {
console.log("Changes detected:", changes);
// Dabar galite atnaujinti savo UI pagal šiuos pakeitimus
});
} catch (error) {
console.error("User cancelled the dialog or an error occurred.", error);
}
});
stopButton.addEventListener('click', () => {
if (watcher) {
watcher.stop();
}
});
Praktiniai Naudojimo Atvejai ir Globalūs Pavyzdžiai
Ši technologija nėra tik teorinis pratimas; ji leidžia kurti galingas, realaus pasaulio programas, prieinamas pasaulinei auditorijai.
1. Žiniatinklio IDE ir Kodo Redaktoriai
Tai yra esminis naudojimo atvejis. Įrankiai, tokie kaip VS Code for the Web arba GitHub Codespaces, gali leisti kūrėjui atidaryti vietinį projekto aplanką. Katalogo stebėtojas gali stebėti pakeitimus:
- Failų Medžio Sinchronizavimas: Kai failas sukuriamas, ištrinamas ar pervardijamas diske (galbūt naudojant kitą programą), redaktoriaus failų medis akimirksniu atsinaujina.
- Tiesioginis Perkrovimas/Peržiūra: Kuriant svetaines, pakeitimai, išsaugoti HTML, CSS ar JavaScript failuose, gali automatiškai sukelti peržiūros srities atnaujinimą redaktoriuje.
- Fono Užduotys: Failo modifikavimas gali sukelti fone vykdomą kodo tikrinimą (linting), tipų tikrinimą ar kompiliavimą.
2. Skaitmeninio Turto Valdymas (DAM) Kūrybos Profesionalams
Fotografas bet kurioje pasaulio vietoje prijungia savo fotoaparatą prie kompiuterio, ir nuotraukos išsaugomos specialiame „Incoming“ aplanke. Žiniatinklio nuotraukų valdymo įrankis, gavęs prieigą prie šio aplanko, gali jį stebėti ieškodamas naujų failų. Kai tik pasirodo naujas JPEG ar RAW failas, žiniatinklio programa gali jį automatiškai importuoti, sugeneruoti miniatiūrą ir pridėti prie vartotojo bibliotekos be jokio rankinio įsikišimo.
3. Mokslo ir Duomenų Analizės Įrankiai
Mokslinės laboratorijos įranga gali generuoti šimtus mažų CSV ar JSON duomenų failų per valandą į tam skirtą išvesties katalogą. Žiniatinklio prietaisų skydelis gali stebėti šį katalogą. Kai pridedami nauji duomenų failai, jis gali juos apdoroti ir realiu laiku atnaujinti grafikus, diagramas ir statistines suvestines, suteikdamas neatidėliotiną grįžtamąjį ryšį apie vykstantį eksperimentą. Tai globaliai taikoma srityse nuo biologijos iki finansų.
4. „Local-First“ Užrašų ir Dokumentacijos Programos
Daugelis vartotojų nori laikyti savo užrašus kaip paprasto teksto ar Markdown failus vietiniame aplanke, leisdami jiems naudoti galingus darbalaukio redaktorius, tokius kaip Obsidian ar Typora. Progresyvioji žiniatinklio programa (PWA) galėtų veikti kaip kompanionas, stebėdamas šį aplanką. Kai vartotojas redaguoja ir išsaugo failą, žiniatinklio programa aptinka modifikaciją ir atnaujina savo vaizdą. Tai sukuria sklandžią, sinchronizuotą patirtį tarp vietinių ir žiniatinklio įrankių, gerbiant vartotojo duomenų nuosavybę.
Iššūkiai, Apribojimai ir Geriausios Praktikos
Nors katalogų stebėjimo įgyvendinimas yra nepaprastai galingas, jis susijęs su tam tikrais iššūkiais ir atsakomybe.
Naršyklių Suderinamumas
„File System Access API“ yra moderni technologija. 2023 m. pabaigoje ją daugiausia palaiko Chromium pagrindu veikiančios naršyklės, tokios kaip Google Chrome, Microsoft Edge ir Opera. Ji neprieinama Firefox ar Safari naršyklėse. Todėl labai svarbu:
- Funkcijos Aptikimas: Visada patikrinkite, ar egzistuoja 'showDirectoryPicker' in window, prieš bandydami naudoti API.
- Suteikite Alternatyvas: Jei API nepalaikomas, grakščiai pabloginkite patirtį. Galite grįžti prie tradicinio <input type="file" multiple> elemento, informuodami vartotoją apie patobulintas galimybes, prieinamas palaikomoje naršyklėje.
Našumo Aspektai
Periodinis tikrinimas (polling) iš prigimties yra mažiau efektyvus nei sistemos lygio įvykiais pagrįstas požiūris. Našumo kaina yra tiesiogiai susijusi su stebimo katalogo dydžiu ir gilumu bei tikrinimo intervalo dažnumu.
- Dideli Katalogai: Katalogo su dešimtimis tūkstančių failų nuskaitymas kiekvieną sekundę gali sunaudoti daug procesoriaus resursų ir išeikvoti nešiojamojo kompiuterio bateriją.
- Tikrinimo Dažnumas: Pasirinkite ilgiausią intervalą, kuris yra priimtinas jūsų naudojimo atvejui. Realaus laiko kodo redaktoriui gali prireikti 1–2 sekundžių intervalo, tačiau nuotraukų bibliotekos importuotojui gali pakakti 10–15 sekundžių intervalo.
- Optimizavimas: Mūsų momentinių kopijų palyginimas jau yra optimizuotas, tikrinant tik lastModified ir size, o tai yra daug greičiau nei maišos funkcijos (hashing) failų turiniui. Venkite skaityti failų turinį savo tikrinimo cikle, nebent tai yra absoliučiai būtina.
- Fokuso Keitimas: Protinga optimizacija yra sustabdyti stebėtoją, kai naršyklės skirtukas nėra fokuse, naudojant „Page Visibility API“.
Saugumas ir Vartotojų Pasitikėjimas
Pasitikėjimas yra svarbiausias. Vartotojai pagrįstai atsargiai suteikia svetainėms prieigą prie savo vietinių failų. Kaip kūrėjas, turite atsakingai naudotis šia galia.
- Būkite Skaidrūs: Aiškiai paaiškinkite savo UI, kodėl jums reikia prieigos prie katalogo. Pranešimas, pvz., „Pasirinkite projekto aplanką, kad įjungtumėte tiesioginį failų sinchronizavimą“, yra daug geresnis nei bendrinis mygtukas „Atidaryti aplanką“.
- Prašykite Prieigos Vartotojui Veikiant: Niekada neaktyvuokite showDirectoryPicker() raginimo be tiesioginio ir akivaizdaus vartotojo veiksmo, pavyzdžiui, mygtuko paspaudimo.
- Grakščiai Tvarkykite Atsisakymus: Jei vartotojas paspaudžia „Atšaukti“ arba atmeta leidimo prašymą, jūsų programa turėtų elegantiškai tvarkyti šią būseną, nesugadindama veikimo.
UI/UX Geriausios Praktikos
Gera vartotojo patirtis yra raktas į tai, kad ši galinga funkcija atrodytų intuityvi ir saugi.
- Suteikite Aiškų Grįžtamąjį Ryšį: Visada rodykite šiuo metu stebimo katalogo pavadinimą. Tai primena vartotojui, kokia prieiga buvo suteikta.
- Pasiūlykite Aiškų Valdymą: Įtraukite aiškius mygtukus „Pradėti stebėjimą“ ir „Sustabdyti stebėjimą“. Vartotojas visada turėtų jaustis kontroliuojantis procesą.
- Tvarkykite Klaidas: Kas nutiks, jei vartotojas pervadins ar ištrins stebimą aplanką, kol jūsų programa veikia? Kitas jūsų tikrinimas tikriausiai sukels klaidą. Sugaukite šias klaidas ir informuokite vartotoją, galbūt sustabdydami stebėtoją ir paragindami jį pasirinkti naują katalogą.
Ateitis: Kas Toliau Laukia Failų Sistemos Prieigos Žiniatinklyje?
Dabartinis periodinio tikrinimo (polling) požiūris yra protingas ir efektyvus sprendimas, tačiau tai nėra idealus ilgalaikis sprendimas. Žiniatinklio standartų bendruomenė tai puikiai supranta.
Labiausiai laukiamas ateities patobulinimas yra galimas natūralaus, įvykiais pagrįsto failų sistemos stebėjimo mechanizmo pridėjimas prie API. Tai būtų tikras proveržis, leidžiantis naršyklėms prisijungti prie pačios operacinės sistemos efektyvių pranešimų sistemų (pvz., inotify Linux sistemoje, FSEvents macOS sistemoje ar ReadDirectoryChangesW Windows sistemoje). Tai panaikintų poreikį periodiškai tikrinti, drastiškai pagerintų našumą ir efektyvumą, ypač dideliuose kataloguose ir baterija maitinamuose įrenginiuose.
Nors nėra tvirto grafiko tokiai funkcijai, jos potencialas yra aiškus rodiklis, kuria kryptimi juda žiniatinklio platforma: link ateities, kurioje žiniatinklio programų galimybes riboja ne naršyklės „smėlio dėžė“, o tik mūsų vaizduotė.
Išvada
Frontend failų sistemos katalogų stebėjimas, paremtas „File System Access API“, yra transformuojanti technologija. Ji griauna ilgametį barjerą tarp žiniatinklio ir vietinės darbalaukio aplinkos, atverdama kelią naujai kartai sudėtingų, interaktyvių ir produktyvių naršyklės pagrindu veikiančių programų. Suprasdami pagrindinį API, įgyvendindami patikimą tikrinimo strategiją ir laikydamiesi geriausių našumo bei vartotojų pasitikėjimo praktikų, kūrėjai gali sukurti patirtis, kurios atrodo labiau integruotos ir galingesnės nei bet kada anksčiau.
Nors šiuo metu mes patys kuriame savo stebėtojus, aptarti principai yra fundamentalūs. Žiniatinklio platformai toliau tobulėjant, galimybė sklandžiai ir efektyviai sąveikauti su vartotojo vietiniais duomenimis išliks modernios programų kūrimo kertiniu akmeniu, suteikiančiu kūrėjams galią kurti tikrai globalius įrankius, prieinamus kiekvienam, turinčiam naršyklę.