ฉันมีแอปพลิเคชันเว็บออฟไลน์โดยใช้ appcaching ฉันต้องให้ข้อมูลประมาณ 10MB - 20MB ที่จะบันทึก (ฝั่งไคลเอ็นต์) ซึ่งประกอบด้วยไฟล์ภาพ PNG เป็นหลัก การดำเนินการมีดังนี้:
- ดาวน์โหลดและติดตั้งแอปพลิเคชันบนเว็บใน appcache (ใช้รายการ)
- คำขอเว็บแอปจากไฟล์ข้อมูล PNG ของเซิร์ฟเวอร์ (อย่างไร - ดูทางเลือกอื่นด้านล่าง)
- บางครั้งเว็บแอปจะซิงค์กับเซิร์ฟเวอร์และทำการอัปเดต / ลบ / เพิ่มเติมบางส่วนในฐานข้อมูล PNG
- FYI: เซิร์ฟเวอร์เป็นเซิร์ฟเวอร์ JSON REST ที่สามารถวางไฟล์ใน wwwroot เพื่อรับได้
นี่คือการวิเคราะห์ "ฐานข้อมูล" แบบไคลเอ็นต์ในปัจจุบันของฉันที่จัดการพื้นที่จัดเก็บไบนารี Blob
ดูอัปเดตที่ด้านล่าง
AppCache (ผ่านรายการเพิ่ม PNG ทั้งหมดแล้วอัปเดตตามต้องการ)
- CON: การเปลี่ยนแปลงใด ๆ ของรายการฐานข้อมูล PNG จะหมายถึงการดาวน์โหลดรายการทั้งหมดในไฟล์ Manifest (ข่าวร้ายจริงๆ!)
WebStorage
- CON: ออกแบบมาเพื่อการจัดเก็บ JSON
- CON: สามารถจัดเก็บ blobs ผ่านการเข้ารหัส base64 เท่านั้น (อาจเป็นข้อบกพร่องร้ายแรงเนื่องจากค่าใช้จ่ายในการเข้ารหัส)
- CON: ขีด จำกัด ฮาร์ด 5MB สำหรับ webStorage http://htmlui.com/blog/2011-08-23-5-obscure-facts-about-html5-localstorage.html
PhoneGap และ SQLLite
- ข้อเสีย: ผู้สนับสนุนจะปฏิเสธเป็นแอปเนทีฟที่ต้องการการรับรอง
ไฟล์ ZIP
- เซิร์ฟเวอร์สร้างไฟล์ zip วางไว้ใน wwwroot และแจ้งให้ลูกค้าทราบ
- ผู้ใช้ต้องทำการคลายซิปด้วยตนเอง (อย่างน้อยก็คือวิธีที่ฉันเห็น) และบันทึกลงในระบบไฟล์ไคลเอ็นต์
- เว็บแอปใช้ FileSystem API เพื่ออ้างอิงไฟล์
- ข้อเสีย: ZIP อาจใหญ่เกินไป (zip64?) ใช้เวลานานในการสร้าง
- CON: ไม่แน่ใจว่า FileSystem API สามารถอ่านออกจาก sandbox ได้ตลอดเวลาหรือไม่ (ฉันคิดอย่างนั้น)
USB หรือการ์ด SD (ย้อนกลับไปในยุคหิน .... )
- ผู้ใช้จะอยู่ในเครื่องเซิร์ฟเวอร์ก่อนที่จะออฟไลน์
- เราจะให้เขาใส่การ์ด SD แล้วให้เซิร์ฟเวอร์เติมไฟล์ PNG
- จากนั้นผู้ใช้จะเสียบเข้ากับแล็ปท็อปแท็บเล็ต
- เว็บแอปจะใช้ FileSystem API เพื่ออ่านไฟล์
- CON: ไม่แน่ใจว่า FileSystem API สามารถอ่านออกจาก sandbox ได้ตลอดเวลาหรือไม่ (ฉันคิดอย่างนั้น)
WebSQL
- CON: w3c ละทิ้งมันไป (ค่อนข้างแย่)
- ฉันอาจพิจารณา Javascript wrapper ที่ใช้ IndexedDB และ WebSQL เป็นตัวสำรอง
FileSystem API
- Chrome รองรับการอ่าน / เขียน blobs
- ข้อเสีย: ไม่ชัดเจนเกี่ยวกับ IE และ FireFox (IE10 มี msSave ที่ไม่ได้มาตรฐาน)
- caniuse.com รายงานการรองรับ IOS และ Android (แต่อีกครั้งนี่เป็นเพียง r / w ของ JSON หรือรวมถึง blob API สำหรับการเขียนด้วย?
- ข้อเสีย: ผู้คน FireFox ไม่ชอบ FileSystem API และไม่ชัดเจนว่าพวกเขารองรับการบันทึก blobs หรือไม่: https://hacks.mozilla.org/2012/07/why-no-filesystem-api-in-firefox/
- PRO: มากเร็วกว่า IndexedDB สำหรับ blobs ตาม jsperf http://jsperf.com/indexeddb-vs-localstorage/15 (หน้า 2)
IndexedDB
- รองรับ IE10, FireFox ได้ดี (บันทึก, อ่าน blobs)
- ความเร็วที่ดีและการจัดการที่ง่ายกว่าระบบไฟล์ (ลบอัปเดต)
- PRO: ดูการทดสอบความเร็ว: http://jsperf.com/indexeddb-vs-localstorage/15
- ดูบทความนี้เกี่ยวกับการจัดเก็บและแสดงภาพใน IndexedDB: https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
- ข้อเสีย: ฉันยืนยันว่า Chrome ยังไม่รองรับการเขียนแบบหยด (ข้อบกพร่องในปัจจุบัน แต่ไม่ชัดเจนว่าจะได้รับการแก้ไขเมื่อใด)
- อัปเดต: บล็อกโพสต์เดือนมิถุนายน 2014แนะนำว่า Chrome รองรับ Blobs ในรูปแบบ
IndexedDB
- อัปเดต: caniuse / indexeddbยืนยัน: "Chrome 36 และต่ำกว่าไม่สนับสนุนวัตถุ Blob เป็นค่า indexedDB"; แนะนำ> Chrome36 รองรับวัตถุ Blob
LawnChairเสื้อคลุม JavaScript http://brian.io/lawnchair/
- PRO: Wrapper ที่สะอาดมากสำหรับ IndexedDB, WebSQL หรือฐานข้อมูลใด ๆ ที่คุณมี (คิดว่าเป็น polyfill)
- CON: ไม่สามารถจัดเก็บ binary blobs ได้เฉพาะข้อมูล: uri (การเข้ารหัส base64) (อาจเป็นข้อบกพร่องที่ร้ายแรงเนื่องจากค่าใช้จ่ายในการเข้ารหัส)
IndexedDB JQUERY polyFill https://github.com/axemclion/jquery-indexeddb
- Parashuram เขียน JQUERY wrapper ที่ดีสำหรับอินเทอร์เฟซ IndexedDB แบบดิบ
- PRO: ทำให้การใช้ IndexedDB ง่ายขึ้นมากฉันหวังว่าจะเพิ่ม shim / polyfill สำหรับ Chrome FileSystemAPI
- ข้อเสีย: ควรจัดการกับ blobs แต่ฉันไม่สามารถใช้งานได้
idb.filesystem.js http://ericbidelman.tumblr.com/post/21649963613/idb-filesystem-js-bringing-the-html5-filesystem-api
- Eric Bidelman @ Google ได้เขียน PolyFill FileSystem API ที่ผ่านการทดสอบมาเป็นอย่างดีซึ่งใช้ Indexed DB เป็นตัวสำรอง
- PRO: FileSystem API เหมาะสำหรับการจัดเก็บ blobs
- PRO: ใช้งานได้ดีกับ FireFox และ Chrome
- PRO: เหมาะสำหรับการซิงโครไนซ์กับ CouchDB บนคลาวด์
- CON: ไม่ชัดเจนว่าทำไม แต่มันไม่ทำงานบน IE10
PouchDB JavaScript Library http://pouchdb.com/
- เหมาะสำหรับการซิงค์ CouchDB กับฐานข้อมูลท้องถิ่น (ใช้ WebSQL หรือ IndexedDB (ไม่ใช่ปัญหาของฉัน)
- ข้อเสีย: ไม่มีข้อตกลงตอนนี้ PouchDB รองรับ binary blobs สำหรับเบราว์เซอร์ล่าสุดทั้งหมด (IE, Chrome, Firefox, Chrome บนมือถือ ฯลฯ ) รวมถึงเบราว์เซอร์รุ่นเก่าจำนวนมาก นั่นไม่ใช่กรณีแรกที่ฉันโพสต์นี้
หมายเหตุ: หากต้องการดูข้อมูล: การเข้ารหัส uri ของ PNG ฉันสร้างตัวอย่างที่: http://jsbin.com/ivefak/1/edit
คุณสมบัติที่ต้องการ / มีประโยชน์ / ไม่จำเป็น
- ไม่มีแอปเนทีฟ (EXE, PhoneGap, ObjectiveC ฯลฯ ) บนไคลเอนต์ (แอปพลิเคชันเว็บแท้)
- ต้องทำงานบน Chrome, FireFox, IE10 ล่าสุดสำหรับแล็ปท็อปเท่านั้น
- ต้องการโซลูชันเดียวกันสำหรับแท็บเล็ต Android (IOS ก็น่าจะดีเช่นกัน) แต่ต้องการเบราว์เซอร์เดียวเท่านั้นที่จะทำงานได้ (FF, Chrome ฯลฯ )
- ประชากร DB เริ่มต้นอย่างรวดเร็ว
- สิ่งที่ต้องมี: การดึงภาพอย่างรวดเร็วโดยใช้เว็บแอปพลิเคชันจากที่จัดเก็บข้อมูล (DB, ไฟล์)
- ไม่ได้มีไว้สำหรับผู้บริโภค เราสามารถ จำกัด เบราว์เซอร์และขอให้ผู้ใช้ทำการตั้งค่าและงานพิเศษได้ แต่จะลดขนาดนั้นลง
การใช้งาน IndexedDB
- มีบทความที่ยอดเยี่ยมเกี่ยวกับการใช้งาน IE, FF และ Chrome ภายในที่: http://www.aaron-powell.com/web/indexeddb-storage
- ในระยะสั้น:
- IE ใช้รูปแบบฐานข้อมูลเดียวกับ Exchange และ Active Directory สำหรับ IndexedDB
- Firefox ใช้ SQLite ดังนั้นจึงเป็นการใช้ฐานข้อมูล NoSQL ในฐานข้อมูล SQL
- Chrome (และ WebKit) ใช้ที่เก็บคีย์ / ค่าซึ่งมีมรดกใน BigTable
ผลลัพธ์ปัจจุบันของฉัน
- ฉันเลือกที่จะใช้แนวทาง IndexedDB (และ polyfill ด้วย FileSystemAPI สำหรับ Chrome จนกว่าพวกเขาจะให้การสนับสนุน Blob)
- สำหรับการดึงกระเบื้องฉันมีปัญหาเนื่องจากคน JQUERY กำลังคิดเกี่ยวกับการเพิ่มสิ่งนี้ใน AJAX
- ฉันไปกับ XHR2-Lib โดย Phil Parsons ซึ่งเหมือนกับ JQUERY .ajax () https://github.com/pmp/xhr2-lib
- ประสิทธิภาพสำหรับการดาวน์โหลด 100MB (IE10 4s, Chrome 6s, FireFox 7s)
- ฉันไม่สามารถนำเครื่องห่อ IndexedDB มาใช้กับ blobs (เก้าอี้สนามหญ้า, PouchDB, jquery-indexeddb ฯลฯ )
- ฉันรีดเสื้อคลุมของตัวเองและประสิทธิภาพคือ (IE10 2s, Chrome 3s, FireFox 10s)
- ด้วย FF ฉันคิดว่าเรากำลังเห็นปัญหาประสิทธิภาพของการใช้ฐานข้อมูลเชิงสัมพันธ์ (sqllite) สำหรับที่เก็บข้อมูลที่ไม่ใช่ sql
- หมายเหตุ Chrome มีเครื่องมือดีบักที่โดดเด่น (แท็บนักพัฒนาทรัพยากร) สำหรับตรวจสอบสถานะของ IndexedDB
ผลลัพธ์สุดท้ายโพสต์ไว้ด้านล่างเป็นคำตอบ
อัปเดต
ขณะนี้ PouchDB รองรับ binary blobs สำหรับเบราว์เซอร์ล่าสุดทั้งหมด (IE, Chrome, Firefox, Chrome บนมือถือ ฯลฯ ) รวมถึงเบราว์เซอร์รุ่นเก่าอีกมากมาย นั่นไม่ใช่กรณีแรกที่ฉันโพสต์นี้