앱 캐싱을 사용하는 오프라인 웹 애플리케이션이 있습니다. 주로 PNG 이미지 파일로 구성된 (클라이언트 측) 저장할 데이터의 약 10MB-20MB를 제공해야합니다. 작업은 다음과 같습니다.
- 웹 애플리케이션 다운로드 및 appcache에서 설치 (매니페스트 사용)
- 서버 PNG 데이터 파일의 웹 앱 요청 (방법?-아래 대안 참조)
- 때때로 웹 앱이 서버와 다시 동기화되고 PNG 데이터베이스에 대한 작은 부분 업데이트 / 삭제 / 추가 작업을 수행합니다.
- 참고 : 서버는 픽업을 위해 wwwroot에 파일을 배치 할 수있는 JSON REST 서버입니다.
다음은 이진 Blob 저장소를 처리하는 클라이언트 기반 "데이터베이스"에 대한 현재 분석입니다.
하단에서 업데이트보기
- AppCache (매니페스트를 통해 모든 PNG를 추가 한 다음 요청시 업데이트)
- 단점 : PNG 데이터베이스 항목이 변경되면 매니페스트의 모든 항목이 완전히 다운로드됩니다 (정말 나쁜 소식입니다!).
- WebStorage
- 단점 : JSON 스토리지 용으로 설계됨
- 단점 : base64 인코딩을 통해서만 blob을 저장할 수 있습니다 (디 인코딩 비용으로 인해 치명적인 결함 일 수 있음).
- 단점 : webStorage에 대한 하드 제한 5MB http://htmlui.com/blog/2011-08-23-5-obscure-facts-about-html5-localstorage.html
- PhoneGap 및 SQLLite
- 단점 : 스폰서는 인증이 필요한 기본 앱으로 거부합니다.
- 압축 파일
- 서버가 zip 파일을 생성하고이를 wwwroot에 배치하고 클라이언트에 알립니다.
- 사용자는 수동으로 압축을 풀고 (적어도 내가 보는 방식) 클라이언트 파일 시스템에 저장해야합니다.
- 웹 앱은 FileSystem API를 사용하여 파일을 참조합니다.
- 단점 : ZIP이 너무 클 수 있습니다 (zip64?), 생성하는 데 시간이 오래 걸립니다.
- 단점 : FileSystem API가 항상 샌드 박스에서 읽을 수 있는지 확실하지 않습니다.
- USB 또는 SD 카드 (석기 시대로 돌아 가기 ....)
- 사용자는 오프라인으로 전환하기 전에 서버에 로컬입니다.
- 그래서 우리는 그에게 SD 카드를 삽입하도록 할 수 있고, 서버가 그것을 PNG 파일로 채우도록 할 수 있습니다.
- 그런 다음 사용자는 노트북, 태블릿에 연결합니다.
- 웹 앱은 FileSystem API를 사용하여 파일을 읽습니다.
- 단점 : FileSystem API가 항상 샌드 박스에서 읽을 수 있는지 확실하지 않습니다.
- WebSQL
- 단점 : w3c가 포기했습니다.
- IndexedDB 및 WebSQL을 폴백으로 사용하는 Javascript 래퍼를 고려할 수 있습니다.
- FileSystem API
- Chrome은 Blob 읽기 / 쓰기를 지원합니다.
- 단점 : IE 및 FireFox에 대해 명확하지 않음 (IE10, 비표준 msSave 포함)
- caniuse.com은 IOS 및 Android 지원을보고합니다 (하지만 이것은 JSON의 r / w 일 뿐입니 까, 아니면 작성을위한 전체 blob API를 포함합니까?
- 단점 : FireFox 사람들은 FileSystem API를 싫어하고 blob 저장을 지원하는지 명확하지 않습니다 : https://hacks.mozilla.org/2012/07/why-no-filesystem-api-in-firefox/
- PRO : jsperf http://jsperf.com/indexeddb-vs-localstorage/15 에 따라 Blob 용 IndexedDB보다 훨씬 빠름 (2 페이지)
- IndexedDB
- IE10, FireFox에서 우수한 지원 (Blob 저장, 읽기)
- 파일 시스템보다 빠르고 쉬운 관리 (삭제, 업데이트)
- PRO : 속도 테스트 참조 : http://jsperf.com/indexeddb-vs-localstorage/15
- IndexedDB에서 이미지 저장 및 표시에 대한이 기사를 참조하십시오 : https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
- 단점 : Chrome이 아직 blob 쓰기를 지원하지 않는다는 것을 확인했습니다 (현재 버그이지만 언제 수정 될지 명확하지 않음).
- 업데이트 : Chrome 개발자는 데스크톱과 Android 모두에서이 작업을하고 있음을 확인합니다! 아직 타임 라인이 없습니다.
- LawnChair 자바 스크립트 래퍼 http://brian.io/lawnchair/
- PRO : IndexedDB, WebSQL 또는 보유하고있는 모든 데이터베이스에 대한 매우 깨끗한 래퍼 (폴리 필을 생각해보세요)
- 단점 : 바이너리 blob을 저장할 수없고 data : uri (base64 인코딩) 만 (아마도 디코딩 비용으로 인해 치명적인 결함이 있음)
- IndexedDB JQUERY polyFill https://github.com/axemclion/jquery-indexeddb
- Parashuram은 원시 IndexedDB 인터페이스에 대한 멋진 JQUERY 래퍼를 작성했습니다.
- PRO : IndexedDB 사용을 크게 단순화합니다. Chrome FileSystemAPI에 대한 shim / polyfill을 추가하고 싶었습니다.
- 단점 : Blob을 처리해야하지만 작동하지 못했습니다.
- idb.filesystem.js http://ericbidelman.tumblr.com/post/21649963613/idb-filesystem-js-bringing-the-html5-filesystem-api
- Eric Bidelman @ Google은 Indexed DB를 폴백으로 사용하는 파일 시스템 API 인 PolyFill을 잘 테스트했습니다.
- PRO : FileSystem API는 Blob 저장에 적합합니다.
- PRO : FireFox 및 Chrome에서 잘 작동합니다.
- PRO : 클라우드 기반 CouchDB와의 동기화에 적합
- 단점 : 이유는 명확하지 않지만 IE10에서는 작동하지 않습니다.
- PouchDB 자바 스크립트 라이브러리 http://pouchdb.com/
- CouchDB를 로컬 DB와 동기화하는 데 적합합니다 (WebSQL 또는 IndexedDB 사용 (내 문제는 아님))
- 단점 : 단점 없음, PouchDB는 이제 모든 최신 브라우저 (IE, Chrome, Firefox, 모바일 용 Chrome 등) 및 많은 이전 브라우저에 대해 바이너리 Blob을 지원합니다. 이 게시물을 처음했을 때는 그렇지 않았습니다.
참고 : PNG의 data : uri 인코딩을 보려면 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는 IndexedDB에 대해 Exchange 및 Active Directory와 동일한 데이터베이스 형식을 사용합니다.
- Firefox는 SQLite를 사용하므로 SQL 데이터베이스에 NoSQL 데이터베이스를 구현하는 것과 같습니다.
- Chrome (및 WebKit)은 BigTable에 유산이있는 키 / 값 저장소를 사용하고 있습니다.
내 현재 결과
- IndexedDB 접근 방식을 사용하기로 선택했습니다 (그리고 Blob 지원을 제공 할 때까지 Chrome 용 FileSystemAPI로 폴리 필)
- 타일을 가져 오기 위해 JQUERY 사람들이 이것을 AJAX에 추가하는 것에 대해 kvetching 때문에 나는 딜레마를 가졌습니다.
- Phil Parsons의 XHR2-Lib를 사용했는데 JQUERY .ajax () https://github.com/pmp/xhr2-lib 와 매우 비슷합니다.
- 100MB 다운로드 성능 (IE10 4s, Chrome 6s, FireFox 7s).
- Blob (lawnchair, PouchDB, jquery-indexeddb 등)에 대해 작동하도록 IndexedDB 래퍼를 가져올 수 없습니다.
- 내 래퍼를 감았는데 성능은 (IE10 2s, Chrome 3s, FireFox 10s)
- FF를 사용하면 비 SQL 스토리지에 관계형 DB (sqllite)를 사용할 때 성능 문제가 발생한다고 가정합니다.
- 참고로 Chrome에는 IndexedDB의 상태를 검사하기위한 뛰어난 디버그 도구 (개발자 탭, 리소스)가 있습니다.
답변으로 아래 게시 된 최종 결과
최신 정보
PouchDB는 이제 모든 최신 브라우저 (IE, Chrome, Firefox, 모바일 용 Chrome 등)와 많은 이전 브라우저에 대해 바이너리 Blob을 지원합니다. 이 게시물을 처음했을 때는 그렇지 않았습니다.