色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實戰(zhàn)洞察。

深入 PouchDB 源碼:瀏覽器存儲 API 兼容性戰(zhàn)役中的十個血淚教訓(xùn)

深入 PouchDB 源碼:瀏覽器存儲 API 兼容性戰(zhàn)役中的十個血淚教訓(xùn) 深入 PouchDB 源碼瀏覽器存儲 API 兼容性戰(zhàn)役中的十個血淚教訓(xùn)【免費(fèi)下載鏈接】pouchdb:kangaroo: - PouchDB is a pocket-sized database.項目地址: https://gitcode.com/gh_mirrors/po/pouchdb在 CouchDB 兼容的客戶端數(shù)據(jù)庫中PouchDB 的價值不僅在于在瀏覽器里跑 CouchDB更在于它必須在 Web SQL、IndexedDB、LocalStorage 乃至 Node.js 的 LevelDB 之間反復(fù)橫跳把五花八門的瀏覽器差異一一抹平。本文源自 PouchDB 核心維護(hù)者 Nolan Lawson 的實戰(zhàn)筆記《10 things I learned from reading (and writing) the PouchDB source》我們將以這篇文檔為主線結(jié)合當(dāng)前倉庫中packages/node_modules下的適配器源碼逐條剖析 Web SQL 與 IndexedDB 的十個坑并展示 PouchDB 是如何用 user-agent 嗅探、特性檢測、字符串拼接鍵、非遞歸 JSON 序列化等土辦法化解它們的。讀完本文你將理解瀏覽器存儲 API 的底層行為差異也能掌握跨端存儲兼容性工程的具體套路。背景作者于 2013 年底加入 PouchDB 項目時PouchDB 已相當(dāng)成熟首個提交距今已四年。他的目標(biāo)集中在提升性能與瀏覽器兼容性——而瀏覽器兼容性正是 Web 世界里那個 Android 生態(tài)聞之色變的碎片化難題。下文涉及 LocalStorage、Web SQL、IndexedDB 三種存儲 API若讀者不熟悉可先閱讀 瀏覽器存儲概覽 了解 PouchDB 視角下的存儲適配器分層。1. 沒有人說得清 Web SQL 的 estimated size 到底是什么意思打開 Web SQL 數(shù)據(jù)庫時需要使用openDatabase()最后一個參數(shù)是所謂的estimated size預(yù)估大小var db openDatabase(documents, 1.0, some description, 5000000);當(dāng)年 PouchDB 是這樣設(shè)置它的文檔原文function getSize(opts) { /* ... */ var isAndroid /Android/.test(window.navigator.userAgent); return isAndroid ? 5000000 : 1; }User-agent 嗅探?jīng)]錯這確實不夠優(yōu)雅。但理由很現(xiàn)實在現(xiàn)代 Chrome 與 Android 4.4上這個 size 會被直接忽略瀏覽器自行根據(jù)磁盤剩余空間設(shè)定上限在Android 4.4上它是一個硬性上限傳 5000000 就永遠(yuǎn)只有 5 MB在Safari/iOS上則更微妙傳大于 5000000 的值應(yīng)用首次加載就會彈出煩人的容量確認(rèn)框見下圖極易嚇跑用戶傳小于 5000000 的值數(shù)據(jù)庫漲到 5 MB 時會再次彈框而 iOS 7.1 還有一個 bug——彈框次數(shù)耗盡后不再出現(xiàn)于是容量被永久釘死在 10 MB想存更多就必須在一開始就要得更多傳 0 到 5000000 之間的值Safari/iOS 會把它當(dāng)作何時彈框的提示PouchDB 的自動化測試跑在 Selenium 下無法點(diǎn)擊OK按鈕所以理想值是 0但PhantomJS 和舊版 WebKitSafari ~5遇到 0 會直接崩潰。這就是 PouchDB 嗅探 Android 才把 size 提到 5000000、其余情況一律設(shè)為 1 的原因。作者還吐槽 W3C 官方示例用5*1024*1024誤導(dǎo)了所有人實際規(guī)避彈框的臨界值是 50000005 MB即 5 兆字節(jié)而非5*1024*10245 MiB5 兆二進(jìn)制字節(jié)但網(wǎng)上博客與 Stack Overflow 到處流傳著錯誤的1024*1024寫法。今天倉庫里的源碼印證了這段歷史packages/node_modules/pouchdb-adapter-websql-core/src/utils.js中的getSize()utils.js#L164-L179保留了幾乎相同的邏輯并補(bǔ)充了關(guān)鍵注釋function getSize(opts) { if (size in opts) { // triggers immediate popup in iOS, fixes #2347 // e.g. 5000001 asks for 5 MB, 10000001 asks for 10 MB, return opts.size * 1000000; } // In iOS, doesnt matter as long as its 5000000. // Except that if you request too much, our tests fail // because of the native do you accept? popup. // In Android 4.3, this value is actually used as an // honest-to-god ceiling for data, so we need to // set it to a decently high number. var isAndroid typeof navigator ! undefined /Android/.test(navigator.userAgent); return isAndroid ? 5000000 : 1; // in PhantomJS, if you use 0 it will crash }可見后來的代碼還增加了對opts.size顯式配置的支持單位按 1e6 換算而5000000 : 1的兜底策略與當(dāng)年的實現(xiàn)一脈相承。該值最終被傳入openDatabase見 pouchdb-adapter-websql-core/src/index.js#L126-L146。2. IE 的 IndexedDB 存在競態(tài)條件微軟的 IndexedDB 實現(xiàn)速度很快——比 Chrome 慢一點(diǎn)但遠(yuǎn)快于 Firefox。然而為了這個速度他們顯然走了捷徑IE10 與 IE11 存在多個令人頭疼的競態(tài)條件。因此 PouchDB 源碼中常見這類防御性代碼文檔原文//Close open request for name database to fix ie delay. if (IdbPouch.openReqList[name] IdbPouch.openReqList[name].result) { IdbPouch.openReqList[name].result.close(); }以及把所有 open 和 destroy 操作串行化的任務(wù)隊列taskQueue.queue.push({ action: function (thisCallback) { destroy(name, opts, thisCallback); }, callback: callback });還有按名稱緩存所有數(shù)據(jù)庫的cachedDBs——因為 IE 不允許同時打開兩個同名的數(shù)據(jù)庫var cached cachedDBs[name]; if (cached) { idb cached.idb; /* ... */ }這些經(jīng)驗在今天倉庫的pouchdb-adapter-idb中依舊可見openReqList被實現(xiàn)為一個Mapindex.js#L54在打開請求完成后從列表中移除index.js#L629-L659串行化打開/銷毀的機(jī)制則被提煉為獨(dú)立的 taskQueue.js 模塊通過enqueueTask對外暴露index.js#L48。作者對 IE 團(tuán)隊的態(tài)度是功過相抵——他們響應(yīng) bug 報告相當(dāng)迅速。3. Web SQL 中的二進(jìn)制數(shù)據(jù)一團(tuán)糟Web SQL 規(guī)范制定時Blob 和 ArrayBuffer 都還沒有標(biāo)準(zhǔn)化。SQLite 本身支持二進(jìn)制 BLOB 類型但要往 Web SQL 里存二進(jìn)制只能用老辦法傳 JavaScript 二進(jìn)制字符串。這帶來兩個棘手問題\u0000被當(dāng)作字符串終止符WebKit 與 Chromium 都存在這個 bug——插入和排序沒問題但讀出來時數(shù)據(jù)會被截斷。由于 BLOB 必須以二進(jìn)制字符串插入任何含 0 字節(jié)的二進(jìn)制數(shù)據(jù)都會被截斷。唯一的繞法是SELECT HEX(columnName)用十六進(jìn)制字符串取回完整數(shù)據(jù)HEX() 也有問題Safari 7.1 與 iOS 8 把所有字符串強(qiáng)制轉(zhuǎn)成 UTF-16導(dǎo)致同樣的十六進(jìn)制串在 UTF-8 瀏覽器Chrome/Opera/Android 及新版 Safari/iOS與 UTF-16 瀏覽器早期 Safari/iOS里必須用不同方式解析。于是有了文檔中這段好玩的代碼function parseHexString(str, encoding) { var result ; var charWidth encoding UTF-8 ? 2 : 4; for (var i 0, len str.length; i len; i charWidth) { var substring str.substring(i, i charWidth); if (charWidth 4) { // UTF-16, twiddle the bits substring substring.substring(2, 4) substring.substring(0, 2); } result String.fromCharCode(parseInt(substring, 16)); } result encoding UTF-8 ? decodeUtf8(result) : result; return result; }作者自嘲 twiddle the bits 注釋不準(zhǔn)確正確的術(shù)語是 nibble-swizzling即高低字節(jié)交換。判斷數(shù)據(jù)庫是 UTF-8 還是 UTF-16 則靠特性檢測——直接查詢dbid及其十六進(jìn)制形式比較長度function checkDbEncoding(tx) { // check db encoding - utf-8 (chrome, opera) or utf-16 (safari)? tx.executeSql(SELECT dbid, hex(dbid) AS hexId FROM META_STORE, [], function (tx, result) { var id result.rows.item(0).dbid; var hexId result.rows.item(0).hexId; encoding (hexId.length id.length * 2) ? UTF-8 : UTF-16; } ); }由于是特性檢測Safari 7.1 與 iOS 8 上可以自動正常工作。作者還預(yù)告PouchDB 3.1.0 起對大二進(jìn)制附件不再 hex 化性能太差改為剔除\u0000字符并在取回時還原。這段歷史在今天被整理成了一個獨(dú)立模塊parseHex.js頭部注釋直接引用了當(dāng)年的兩個 bug 鏈接Chromium 422690 與 WebKit 137637并把 UTF-8/UTF-16 拆成兩個函數(shù)以換取微小的性能提升// Example: // pragma encodingutf16; // select hex(A); // returns 4100 // notice that the 00 comes after the 41 (i.e. its swizzled) function parseHexUtf16(str, start, end) { var result ; while (start end) { // UTF-16, so swizzle the bytes result String.fromCharCode( (hexToInt(str.charCodeAt(start 2)) 12) | (hexToInt(str.charCodeAt(start 3)) 8) | (hexToInt(str.charCodeAt(start)) 4) | hexToInt(str.charCodeAt(start 1))); start 4; } return result; }源碼注釋里那句 Parsing hex strings. Yeah. 隔著十年依然能讀出當(dāng)年的無奈。4. IndexedDB 里的二進(jìn)制數(shù)據(jù)同樣一團(tuán)糟作為 Web SQL 的時髦弟弟IndexedDB 理應(yīng)原生支持 Blob。但現(xiàn)實是Chrome 直到 v37 才支持 Blob而蘋果在修復(fù) IndexedDB 更基礎(chǔ)的問題之前也明確不打算支持。這些情況下PouchDB 退而求其次把 Blob 存成 base64 字符串并用特性檢測來判定try { var blob utils.createBlob([], {type: image/png}); txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, key); txn.oncomplete function () { /* ... */ blobSupport true; /* ... */ }; } catch (err) { blobSupport false; /* ... */ }然而事情沒這么簡單Chrome v37 雖然實現(xiàn)了 Blob卻實現(xiàn)錯了——取回時返回錯誤的 MIME 類型。所以 v37 需要單獨(dú)檢測這種壞支持v38 起才能與其他瀏覽器一視同仁var storedBlob e.target.result; var url URL.createObjectURL(storedBlob); utils.ajax({ url: url, cache: true, binary: true }, function (err, res) { if (err err.status 405) { // firefox wont let us do that. but firefox doesnt // have the blob type bug that Chrome does, so thats ok blobSupport true; } else { blobSupport !!(res res.type image/png); } });Firefox 在這里也有個小 bug好在 nightly 版已修復(fù)。于是出現(xiàn)了荒誕的一幕PouchDB 需要為 Chrome v36、v37、v38 各準(zhǔn)備一種策略而 Android 上凍結(jié)的各代 Chromium 內(nèi)核意味著這三種變體還將在野外長期共存。今天的pouchdb-adapter-idb仍保留了完整的檢測管線checkBlobSupport(txn, DETECT_BLOB_SUPPORT_STORE, key)index.js#L784-L790并把結(jié)果記錄在元信息里后續(xù)寫入時據(jù)此決定附件格式是blob還是base64var blobType api._meta.blobSupport ? blob : base64;見 bulkDocs.js#L63——存儲層對應(yīng)用透明但底下是兩套完全不同的編碼路徑。5. IE 不支持 complex keysCouchDB 是 NoSQL 的元老順理成章地影響了 IndexedDB 的設(shè)計。CouchDB 一個強(qiáng)大而微妙的功能是complex keys視圖的 key 可以是任意 JSON 值而不只是字符串。經(jīng)典用例是把博文及其評論放進(jìn)同一個視圖function(doc) { if (doc.type post) { map([doc._id, 0], doc); } else if (doc.type comment) { map([doc.post, 1], doc); } }key 是一個字符串 整數(shù)的數(shù)組排序時先按字符串、再按整數(shù)。這個特性確實寫進(jìn)了 IndexedDB 規(guī)范對要在 IndexedDB 上重寫 CouchDB的 PouchDB 而言簡直完美。然而 IE 不支持 complex keys所以源碼里出現(xiàn)的是這種偽復(fù)合鍵docInfo.data._doc_id_rev docInfo.data._id :: docInfo.data._rev; var seqStore txn.objectStore(BY_SEQ_STORE); var index seqStore.index(_doc_id_rev);查詢時則用邊界范圍var start docId ::; var end docId ::~; var index seqStore.index(_doc_id_rev); var range global.IDBKeyRange.bound(start, end, false, false); var seqCursor index.openCursor(range);把_id與_rev用::拼成一個字符串——故意選~ASCII 0x7E作為結(jié)束邊界因為任何合法字符都排在它之前。這是有意為之不是失誤。這條設(shè)計還深刻影響了持久化 map/reduce既然不能指望底層數(shù)據(jù)庫按多字段排序PouchDB 干脆發(fā)明了toIndexableString()——把任意 JSON 對象編碼成一條按 CouchDB collation 順序排列的大字符串。這段設(shè)計今天完整地活在pouchdb-collate包中toIndexableString先把 key 規(guī)范化index.js#L116-L120// convert the given key to a string that would be appropriate // for lexical sorting, e.g. within a database, where the // sorting is the same given by the collate() function. function toIndexableString(key) { var zero \u0000; key normalizeKey(key); return collationIndex(key) SEP indexify(key) zero; }其中normalizeKey把undefined/NaN/Infinity歸一為null、Date 轉(zhuǎn)字符串、對象鍵排序index.js#L36-L69indexify對字符串做 0/1/2 控制字符的順序保持替換\u0000→\u0001\u0001等確保詞法排序等價于 CouchDB collationindex.js#L71-L89。數(shù)字則被編碼為帶 3 位量級前綴的字符串-Number.MIN_VALUE到Number.MAX_VALUE都能保序index.js#L1-L5。同樣的字符串拼接技巧在今天的pouchdb-adapter-idb里依然到處可見寫入時doc._doc_id_rev metadata.id :: metadata.revbulkDocs.js#L256讀出時再用lastIndexOf(:)拆回_id/_revutils.js#L57-L65并且在docIdRevIndex上建立了unique: true的唯一索引index.js#L89。allDocs、changes 等模塊均復(fù)用了這個索引做范圍游標(biāo)allDocs.js#L106、changes.js#L206。6. 反向迭代時 start end 會拋錯其實是個誤會文檔中附帶了一段更新說明作者后來承認(rèn)自己誤解了 IndexedDB 規(guī)范——其實把IDBKeyRange的 start 和 end 對調(diào)就能在所有瀏覽器里反向迭代PouchDB 據(jù)此修復(fù)見 issue 3488。但在當(dāng)時這個符合規(guī)范的 bug在 Firefox、IE、Chrome 三大瀏覽器中忠實復(fù)現(xiàn)try { if (start end) { keyRange global.IDBKeyRange.bound(start, end, false, !inclusiveEnd); } else if (start) { /* ... */ } } catch (e) { if (e.name DataError e.code 0) { // data error, start is less than end return callback(null, { total_rows : totalRows, offset : opts.skip, rows : [] }); } else { return callback(errors.error(errors.IDB_ERROR, e.name, e.message)); } }IndexedDB 對任何 start 大于 end 的IDBKeyRange都會拋錯即使你正在反向迭代。當(dāng)時的繞法是手動檢查結(jié)束鍵if (manualDescEnd) { if (inclusiveEnd doc.key manualDescEnd) { return; } else if (!inclusiveEnd doc.key manualDescEnd) { return; } }代價很小只是多取一個多余的鍵而已。這個案例也提醒我們面對瀏覽器都這樣的行為先懷疑自己對規(guī)范的理解再懷疑瀏覽器。7. IndexedDB 與 Web SQL 對回調(diào)嚴(yán)防死守在 IndexedDB 和 Web SQL 中想在事務(wù)里用 Promise 甚至再調(diào)用一個回調(diào)都是奢望一旦控制權(quán)交還事件循環(huán)事務(wù)就自動關(guān)閉。所以用戶側(cè)的 PouchDB API 可以優(yōu)雅地 Promise 化得益于 Calvin Metcalf 的 lie 庫但 PouchDB 內(nèi)部代碼是徹底的回調(diào)地獄。文檔展示了當(dāng)時 IndexedDB 適配器約 400 行與 Web SQL 適配器約 400 行的縮影verifyAttachments(function (err) { if (err) { return callback(err); } /* ... */ });以及這種山寨版Promise.all()function checkDoneWritingDocs() { if (numDocsWritten docInfos.length) { complete(); } }如果需要調(diào)用 FileReader 這類外部回調(diào) API還必須小心翼翼地挪到事務(wù)之外于是出現(xiàn)preprocessAttachments()這類前置處理函數(shù)preprocessAttachments(function () { db.transaction(function (txn) { /* ... */ }); });作者的結(jié)論很實在如果我們沒有大量的集成測試我們幾乎不敢相信這些代碼能跑。 這正是 tests/integration 下數(shù)百個測試文件存在的意義——從 test.basics.js 到 test.attachments.js每一個行為都被瀏覽器矩陣反復(fù)驗證。8. 遞歸是把雙刃劍先看文檔引用的這段代碼// Unfortunately, the metadata has to be stringified // when it is put into the database, because otherwise // IndexedDB can throw errors for deeply-nested objects. // Originally we just used JSON.parse/JSON.stringify; now // we use this custom vuvuzela library that avoids recursion. // If we could do it all over again, wed probably use a // format for the revision trees other than JSON. function encodeMetadata(metadata, winningRev, deleted) { var storedObject {data: vuvuzela.stringify(metadata)}; storedObject.winningRev winningRev; storedObject.deletedOrLocal deleted ? 1 : 0; storedObject.id metadata.id; return storedObject; }這是一個影響所有瀏覽器甚至 Node.js 的刁鉆 bugissue 2543任何接受對象作為輸入的原生函數(shù)如JSON.stringify()或 IndexedDB 的put()對傳入對象的嵌套深度都有硬性上限var object { enhance: { enhance: { enhance: { /* and so on */ } } } };上限值隨可用內(nèi)存浮動一旦觸頂就會拋 too much recursion 或 maximum call stack 錯誤用戶得到的是一個崩潰的 PouchDB。深層嵌套的來源正是文檔的 revision tree——每次文檔更新都在樹上疊一個節(jié)點(diǎn)深度會無限增長。解法是作者與 Calvin 合寫的一個名字滑稽的非遞歸 JSON 庫 vuvuzela。它比原生方法慢但在絕不能崩潰的場景里是救命稻草。今天這個策略被保留在pouchdb-json包里優(yōu)先用原生JSON.stringify捕獲異常后才回退到 vuvuzelasafeJsonStringify.js#L1-L10import vuvuzela from vuvuzela; function safeJsonStringify(json) { try { return JSON.stringify(json); } catch (e) { /* istanbul ignore next */ return vuvuzela.stringify(json); } }對稱的 safeJsonParse.js 處理解析方向。這也是性能與健壯性二選一的典型工程決策先快崩了再慢而穩(wěn)地兜底。9. IndexedDB 中 unique index 拋約束錯誤keyPath 卻不拋這是又一個反直覺的設(shè)計讓作者大為意外。SQLite/Web SQL 中主鍵與唯一索引基本等價——重復(fù)插入都會報約束錯誤CREATE TABLE employees (id PRIMARY KEY UNIQUE, name); CREATE TABLE employees (id, name); CREATE UNIQUE INDEX id_index ON employees (id);但 IndexedDB 中帶主鍵keyPath的 object store 插入重復(fù)鍵不會報錯而是靜默覆蓋原記錄——put()本質(zhì)是 upsert。唯一索引則截然不同重復(fù)插入確實會拋錯。也就是說以下兩種寫法并不等價db.createObjectStore(employees, {keyPath : id}); db.createObjectStore(employees).createIndex(id, id, {unique: true});文末作者補(bǔ)充若想用 keyPath 也拿到約束錯誤可以用add()代替put()。這對數(shù)據(jù)庫設(shè)計的影響是結(jié)構(gòu)性的選用哪種模式直接決定了重復(fù)寫入是覆蓋還是報錯。PouchDB 之所以堅持用唯一索引而非裸 keyPath 來約束_doc_id_rev見第 5 節(jié)的createIndex(_doc_id_rev, _doc_id_rev, {unique: true})正是為了在寫入重復(fù)的 doc_id/rev 時能可靠地檢測沖突從而支撐 CouchDB 的 MVCC 修訂模型。讀者在實現(xiàn)自己的 IndexedDB 層時務(wù)必先想清楚自己要的是 upsert 語義還是沖突檢測語義。10. CouchDB 影響了 IndexedDBIndexedDB 影響了 LevelDB然后呢數(shù)據(jù)庫設(shè)計從來不是在真空中進(jìn)行的。文檔梳理了這條血脈Web SQL最初受Google Gears啟發(fā)——后者在 2008 年一度有望成為移動 Web 存儲標(biāo)準(zhǔn)兩者都離不開SQLite而 SQLite 創(chuàng)始人 Richard Hipp 坦言 SQLite 深受PostgreSQL影響盡管Web SQL 規(guī)范最終被廢棄它深刻影響了后輩 IndexedDB兩者共享異步結(jié)構(gòu)、自動關(guān)閉的事務(wù)和幾乎逐字復(fù)制的安全模型Mozilla 與 Apple 還各自獨(dú)立地把 IndexedDB 實現(xiàn)建在 SQLite 之上更妙的是IndexedDB 早期討論中就能看到CouchDB 的影子——complex keys、start/end key 迭代、類文檔數(shù)據(jù)模型皆源于此。IndexedDB 設(shè)計者 Nikunj Mehta 早在 2009 年就說有些人覺得 [IndexedDB] 很適合做一個 JavaScript 版 CouchDB。 某種意義上這就是 PouchDB 最早的理念宣言Google 又用 LevelDB 實現(xiàn)了 IndexedDB 規(guī)范LevelDB 借由 LevelUP 項目在 Node.js 生態(tài)中聲名鵲起。PouchDB 也順勢搭上了 LevelUP 的船在 Node.js 端用 LevelDB 實現(xiàn)了近乎完整的 CouchDB HTTP API即 PouchDB Server。這條鏈條在今天的倉庫中依然清晰可辨packages/node_modules下pouchdb-adapter-leveldb、pouchdb-adapter-memory、pouchdb-adapter-websql-core、pouchdb-adapter-idb等適配器并存見 packages/node_modules 目錄上層共享同一套 pouchdb-core 核心通過pouchdb-collate統(tǒng)一排序語義。從 IndexedDB 的早期討論經(jīng) LevelDB 與 LevelUP 生態(tài)最終匯成 PouchDB——當(dāng)我看 PouchDB 源碼時這個巨大的成就仍讓我起雞皮疙瘩。它足以讓你原諒所有古怪的 hack、workaround 和不優(yōu)雅。PouchDB 居然能跑起來這本身就是一個小小的奇跡。結(jié)語兼容性工程的通用方法論回顧這十個案例可以提煉出幾條放之四海皆準(zhǔn)的工程原則把嗅探降到最低把特性檢測用到極致getSize()的 UA 嗅探是少數(shù)不得不為之的特例而 Blob 支持、數(shù)據(jù)庫編碼等判斷全部靠運(yùn)行時特性檢測完成為已知 bug 寫注釋、留鏈接parseHex.js頭部保留的 Chromium/WebKit bug 編號讓十年后的維護(hù)者依然知道為什么會有這段看起來多余的代碼用平凡的編碼技巧替代缺失的平臺能力_doc_id_rev字符串拼接、toIndexableString的保序編碼都是底層做不到就自己造輪子的典范性能與健壯性分層兜底safeJsonStringify先快后慢的降級策略是深度嵌套問題的標(biāo)準(zhǔn)解法懷疑規(guī)范、懷疑自己、懷疑瀏覽器最后相信測試第 6 條的反轉(zhuǎn)說明連核心維護(hù)者都會誤讀規(guī)范而 tests/integration 的龐大測試矩陣才是 PouchDB 能在如此多的瀏覽器上存活下來的真正底牌。對于今天仍在瀏覽器存儲領(lǐng)域耕耘的開發(fā)者這些來自 2014 年的教訓(xùn)并未過時——IndexedDB 的怪癖依然存在新的存儲 API如 OPFS、Storage Buckets也正在孕育自己的 quirks。讀懂 PouchDB 當(dāng)年如何馴服這些怪癖就是為下一場兼容性戰(zhàn)役做的最好準(zhǔn)備。【免費(fèi)下載鏈接】pouchdb:kangaroo: - PouchDB is a pocket-sized database.項目地址: https://gitcode.com/gh_mirrors/po/pouchdb創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天堂v无码免费视频| 一本久道在线综合视频| 天天爽天天爽| 亚洲蜜臀精品视频久久| 激情99| 精吧天堂| 国产免费久久久久| 97在线免费视频观看| 久久久免费一级黄片| 美女黑人91神马| 在线岛国新天堂8| 亚洲av在线免费观看| 88在线一区二区三区| 久草国产在线视频| julia ann久久| 亚洲欧洲无码bt精品合集| 欧美拳交在线播放| 精品无码久久久久久久杏吧| 精品人妻一区二区乱码一区二区| 国产美女自拍AV| 国产精品91ai| 亚洲成人性爱在线观看| 丝袜美腿丝袜| 91爽啪| 亚洲欧美骚| 亚卅熟女乱色| 欧美性色欧美| www鬼畜国产男人的天堂| 超碰在线免费一区二区三区| 116美女午夜| 中文字幕第9页萱萱影音先锋| 久久一二三级一一一| 国内精品a| 97网址97| 91粉芽高清在线一区二区| 91亚洲欧美激情| 日韩伦理久 久久 清纯| 午夜操逼不卡| 天天干1区2区在线| 91在线美女| 久久精品久久久久久久久| 亚洲熟久久| 激情久久av一区av二区av| 亚洲色电影在线| 日本久操视频| 亚洲第一黄色av网站| 一卡二卡三卡| 欧美少妇第一页| 金莲网址| 成人免费性爱视视| 人人操人人肉久久精品| 欧美国产有色电影| 可以免费观看的AV| 性色生活片久久毛片婬片免费放女人一级毛片 | 亚洲天天综合| 色欲色香天天天综合网www-亚洲综合国| 青青操综合网| 肏逼视频日本| 麻豆一区二区三区在线看| 久久色一区| 日韩乱伦视频| 四虎影视永久在线免费| 性色AV蜜色av色欲av| 大香蕉琪琪日本女优不卡| 色婷婷电影网| 啪啪免费| 免费观看性欧美一级| 97色操| 青青草字幕AV| 久久AV无码1区2区3区| 探花精品视频| 国产亚州精品美女久久久免费| 特色a在线上| 欧美一品道| 欧美色图天堂网m| 欧美疯狂做爰xxxx| 屁屁影院一区二区三区国产| 少妇厨房愉情理伦片bd在线观看| juliaann丝袜| 少妇熟女视频一区二区三区| 欧美在线55555| 亚洲精品久久久久久久久豆丁网| 99综合| 国产亚洲美日韩Aⅴ中文字幕无码成人| 精品九区| 久久久久久久久999| 91色综合色| 久久久久久久久久久999| 富二代亚洲精品99| 狠插 制服 自拍| 丁香五月激情综合| 丁香六月啪啪| 丁香六月激情| 1024亚洲中文字幕久在线看片你懂的| 五月婷婷六月激情| 蜜桃臀av在线观看| 伊人AAA| 中文字幕在线日亚州9| 岛国激情视频软件| 欧美性巨大╳╳╳╳╳高跟鞋| 69视频入口| 亚洲动态色图| 国产精品内射婷婷一级二| 91熟女网| 久久精品国产亚洲5555| 色牛aV| 亚洲色人| 男女国产精品| 私人尤物在线精品不卡| 好爽视频在线观看视频| 九九九九国产| 秋霞怕怕片| 亚洲一区二区三区春色| 18禁免费视频| www.婷婷六月天| 极品色社| 啊啊啊啊啊啊啊网址在线观看| 国产精品第二页| 国产日韩欧美| 欧美少妇高潮| 青青操网| 韩日性爱av| 26uuu国产免费观看| 97色色婷婷| 六月色婷婷| 欧美日韩99精品麻豆传媒| 不卡人妻少妇精品毛片一区23区视频| 97免费视频网| 日韩日韩日韩-国产乱码精品一区二区| 欧日韩一二三f区| 欧美色综合网| AV天堂国产| 久久99午夜精品一区人妻| 欧美麻豆成人同性GⅤ在线| 激情五月天丁香社区| 九九热精品| 亚码激情| 啊啊啊啊啊啊啊啊啊啊在线观看| 久久国产999| 91美女精品| 亚洲精品久久久久毛片A片拉屎| 久操91视频| AA特级绝黄| 日韩啪啪啪啪啪| 国产四虎在线| 福利五区| 亚洲综合另类小说色区亚洲成av人片在www | 色九九久九九| 青青久久手机线视频| 国产精品久久成人免费| 牛牛久久国产精品视频一二三| 亚洲天堂日本| 亚洲国产丝袜熟女av| 久久性爱精品一区| 婷婷丁香五月综合| 超碰97男人| 97 国产精品| 亚洲欧洲成人在线电影| 亚洲最大AV网| 欧美久久毛片基地| 综合亚州欧美| 日本成人电影资源网| 91美女中出| 中文字幕久久精视频久久大全| 亚洲色图日韩丝袜制服一区二区五月在线 | baisiav| 天天久久久久久| 亚洲天堂五月天国产| 国产 日韩 另类 视频一区爱| 亚洲欧美天堂在线| 久久这里只有精品9| 欧美精品日韩久久久九| 台欧久久精品视频| 另类图片欧美激情综合| 人妻密肉在线观看| 国产无码精品久久久久久| 在线视频免费播放一区| 少妇第一页| 久久无码一区二区二三区性色 | 日韩中文字幕精品一区在线| 性站| 伦理第一页| 伊人久久大香大香线蕉中文| 欧洲综合色| 国语人妻精彩刺激| 夜夜高潮夜夜爽夜夜爱爱一区| 岛国网址国产 | 97se综合网| 久久久久久久| 美女的肌被草喷水视频| 日本不卡一区| 欧洲射精91| 另类图片天天影视| 五月激情影院| 2023天天操夜夜操| 国产suv精品一区二区四区999| 97伊人超碰| 精品毛片久久久精品毛片| 亚洲国内精品成人不卡| 国产91精品福利在线| 97超碰巨乳| 婷婷丁香九月| 欧美少妇高潮视频| 成人片在线播放| 美女十八禁| 日韩av一级黄片| 中文在线视频| 国产激情片在线观看| nuu12国产麻豆精品| 探花在线免费观看视频国产一区| 久久久精品中文字幕麻豆| 欧美亚洲第一页| 91天天c| 色欲蜜臀AV| 欧亚韩国999| 日本精品成人无码| 91丝袜| 一区=区三区视频| 精品高清av中文字幕| 国产不卡中文字幕免费avi| 被男人吃奶很爽的毛片| 嫩草 我啊~嗯~在线| 夜夜影视四色| 亚洲一区二区av| 丝袜熟女2P| www.99色| 人妻 欧美亚洲| 青青草日韩无码| 日韩强奸av| 加勒比AV天堂| 99综合| 久久 精品| 中国黑人三级片网站上区| 国产成年女人免费视频播放a| 中文字幕久久精视频久久大全| 日韩精品一区二区日韩| 九九九一二三| 一区二区三区无卡视频在线观看| 91在线无码精品秘 软件| 日夜伊人网| 亚州久久9| 99热精品在线| 国产中文精品一区二区在线观看| 成·人免费午夜在线观看| 国产精品久久久久久久免牛肉蒲团 | 亚洲天在线| xxx亚洲午夜天堂| 亚洲精品国产熟女久久久久久| 五月天精品| 天天摸天天碰天天添青青| 黄色免费网页无码| 综合伊人激情| 91亚洲欧洲| 亚州九九九精品视频| 91蜜臀熟女| 尤物一级在线免费观看| 欧美日韩在线视频网站| 91精品国产91久久久久久久久久久久| 屌妞视频久久久久久久| 天天综合色| 人人操人人操人人操人人操人人操人人人11.CM| 国产成人啪一区二区| 午夜情侣自拍网站| 亚洲激情综合| 亚洲最新a在线观看| 久久久久久9| 97超色| 天天做天天爱天天爽AV| 能看的av| 免费A V在线| 神马久久久久久伦理片| 色爱综合网| 特污免视频| 久久人人爽人人爽人人片Ⅴ| 91久久精品蜜臀| 伊人久久综合精品欧美| 秋霞一级鲁丝片A片| 九九九九热只有精品| 天堂伊人久久| wwe 天天干.com| 亚洲人妻一区二区三区| 夜夜爽77777| 国产在线视视频有精品| 午夜福利精品| 93人人操人人| 乱伦a片视频| 亚洲好看强奸乱伦| 午夜.DJ高清在线观看免费7| 夜夜操美女| 26uuu最新| 欧美成人一级麻豆| 尤物av网站免费在线播放| 亚洲欧美999| 97超碰欧美精品| 91日产桃蜜| 熟妇无码视频三区| 中文字幕青青草| 少妇高潮九九九九九九九| 成年人免费观看网站| 久久精品高清无码一区| 精品人妻高清麻豆av| 久久熟女嫩草成人片免费| 日本黄色XXX| 国产精品电| 亚洲影视高清第一页| 麻豆a'v电影| 色97欧美| 欧美一二三级精品在线| 日韩人妻制服丝袜av| 亚洲欧洲日韩天堂av| 亚洲成人日韩小说| 欧美一级色| 亚码激情| 久久久久久久国产| 亚洲色天堂九9| AV 少妇 人妻 偷拍| 精品久久久久,69国产成人精| 狠狠干综合| 超碰久久中文| julia ann久久| 啊啊啊啊无码| 国产亚洲深夜激情| 91精品无码人妻系列| 日本3级一区二区免费| 99婷婷| 女人的久久久| 久久久久ab| 亚洲人精品午夜不卡| 久久久一区二区三区麻豆| 中文久久| 婷婷久月| 神马午夜久久久| 欧美在线干| 九九热三级片| 人人看欧美性爱| 色丁香久久| 伊人影院在线理论播放| 青青操日韩| 亚洲婷婷丁香在线| 人妻精品视频一区二区| 天天看人人操屄犊摸阴| 欧美在线啊啊| yellow网站免费观看日韩高清无码| 日本中文字幕在线视频| 伊人久久大香蕉线AV五月天| 老司机香蕉| а√天堂资源官网在线资源| 婷婷激情五月| 久久噜| 亚洲福利影院一区久久| 亚欧性爱在线无码| 97 九色| 男同专区一区二区三区在线| 影音先锋视频在线| 密臀在线免费观看| 伦理第一页| 国产女人操逼视频| 五月天伊人| 亚洲图片欧美偷拍| 黑人操一区二区| 国产精品制服丝袜中文字幕日韩一区二区三区| 婷婷香蕉欧美在线一区二区三区| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 极品白嫩美女白浆成人福利在线看| 国产精品视频电影| 国产9l 大屁股| 91爆操视频| 麻豆福利视频导航| 黑人精品XXX一区一二区| 色色丁香| 伊人网在线点播| 乱伦图一区| 中文久久一区| 91精品无码久久久久久久| 婷婷综合| 狠久久| 人人操人人摸人| 天天日天天屌天天操| 欧美日韩在线视频网站| 东北女人av| 国产精品操| 99精彩视频| 男人天堂最新手机版在线青青草| 再深点灬舒服灬太大了添视频 | 国产原创自拍| 男人的天堂一区| 97人人干人人操| 97欧美色综合| 国产亚州高清国产拍精| 97操97干| 99视频只有精品| 99AV| baisiav| 91操熟女| 黄呦呦在线| 欧美性爱18观看| 在线 亚洲 网爆 自拍| 久久性爱视频免费看| 天美传媒av 在线| 精品人妻一区二区三区在| 午夜精品久久久久久久男人的天堂 | 久久成年片色大黄全免费网站| 久久久久成人蜜桃精品| 蜜乳中文字幕a在线| 91深夜夜| 嫩草91| 美女自卫慰黄网站免费| 伊人超碰97| 天堂岛av| 日韩福利综合一区| 日日干夜夜欢| 国产精品久久久亚洲一区| 久久精品国产亚洲AV先锋| 大香蕉免| 丁香五月综合| 97在线观看免费视频| 嗯嗯嗯啊啊啊操的我好爽| 强奸乱伦AV一天堂网| 男人久久精品| 久精品无码av一区二免费国产在线观看| 亚洲双插| 天天干一区二区| 啪啪啪东京| 狠狠操狠狠燥| 久久久工口| 99老司机精品视频在线观看| 欧美后入式| 九九毛片这里只有精品| 日韩乱伦影音先锋| 久热一区二区| 91精品国| 麻豆一区二区三区精品| 色狠狠色| 日韩无码三级影院| 96久久久久久久| 亚洲男人的天堂V| 久久久久久精品免费看A级| 九九九不卡| 一牛一区二区三区久久| 日韩啪啪啪啪啪| 精品无码久久久久久国产浪潮| 97视频免费在线| 日韩亚洲美女一区久久| 插日本熟女视频| 国产又黄又粗又猛大片| 欧美色图20P| 久久精品视频在线观看| 五月激情小说| 美女自卫慰黄网站免费| 日本免费一级AAA大片器 | 欧洲亚洲人妻无码高清久久三区四区| 亚洲二区精品在线观看| 一区二区乱码福利| 78操B| 青青草久久在线| 国产精品91一样| 日韩AV熟女乱伦| 午夜a成v人电影| 久久久久白虎| 92大香蕉| 青青操视频在线| 国精综合一二三区影视| 久久手机视直播| 久久XX| 日韩精品 视频一区二区| 狠狠婷婷亚洲中文综合久久| 夜夜嗨一区二区三区直播内容| 日韩美女高潮喷水视频| 青青草视频久久久久| 蜜臀少妇一区二区| 巨爆乳肉感一区二区三区竹菊影视 | 骚女高跟AV在线| 久久人人爽爽爽人久久久| 色色色综合网| 中国亚洲呦女专区| 熟女突然公开看18禁影片| 在线岛| www.色吧5.com| 久久久9999| 免费国产视频| 蜜臀久久99精品久久久久久-DVD原版全| 国产免费内射视频| 97综合激情| 欧美偷拍| 亚洲欧美综合| 一区二区三区美女超清| 日本乱人伦片中文三区| 国产精品一区二区亚洲人成毛片| 亚洲熟女乱色一区二区三区| 中文字幕精品一区欧美| 日本免费中文字幕在线| 91快色色色色色| 国产精品探花视频| 日韩精品一区的| 日韩无码专区| 亚洲色鬼| 人妻人人澡人人爽人人| 成人一区二区三区四区| 色五月激情AV在线| 久久久久久久| 国语av狠狠色丁香婷婷综合激情| 色综合一本| 人人贴人人摸| 岛国成人av在线播放网址| 99ri视频| 国产精品经典一卡久久久| 夫妻四区五区六区| 久久久111| 国产又长又大又粗的视频| 综合欧美色图| 丰满人妻被猛烈进入中| 污污汅18禁网站在线永久免费观看| 激情无码日韩| 五月天开心网| 亚洲狼狼干综合1| 欧美一品道| 老司机香蕉久久久久| 91香蕉国产尤物视频| 999精品国产高清一区二区| 美國A片| 亚洲婷婷五月天| 伊人青青一区成人视频在线观看区| 蜜臀久久在线视频| 欧美日韩小说| 国产精品不卡一区二区电影| 伊人久操| 97国伦国色| 久草久日| 国语对白露脸XXXXXX| 国产精品自在线发布| 午夜免费视频1000| 欧美少妇色综合| 国产又粗又长又大的视频| 91性高朝久久久久久久久| 人人干人人搞人人摸| 96久久科窝| 久久亚洲天堂| 五月天我淫我色av| 中文字幕成人| 色偷偷男人的天堂麻豆| 97精品国产| 欧美疯狂做爰xxxx| 淫骚熟女一区二区三区| 伊人天天久久动态图| 一区二区影院| 亚洲97P| 友优传媒精品在线一区二区| 国产成人bd在线观看| 嗯阿好爽好紧| 伊人操| 亚洲欧洲国产综合av| 密臀在线免费观看| 欧美AB在线| 日韩精品中文字幕二区| 国产25页| 国产精品嫩草影院午夜两性 | 99久久婷婷丁香| 日本一二区免费| 午夜精品久久久久久久第一页按摩| 国产熟女完整版中字| 久极品在线观看| 亚洲 欧美 第一页 | A级片日韩欧美国产欧美视频精选观看| 久久性爱免费送| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 日韩成人免费电影| 安微少妇操BBB| 欧美一区二区三区另类精品| 久久綜合很很很| 99久久亚洲精品无码毛片潘甜甜| 欧美久热| 少妇熟女一区二区三区| 99啪啪视频| 欧美色亚洲色| 色色色色网站| av影院十区| av一区二区三区 中文| 久久宗合亚洲| 丰满少妇乱子伦精品无| 啊啊啊啊啊啊啊啊要喷了| 日韩精品在线观看观看| 久久国模av| 人妻啪| 人人澡人人弄| av在线一区二区三区| 亚洲精品1区| 色就色综合| 呦女网站| 色欲久久综合| 97 色综合| 五月天丁香欧洲日韩| 99人妻| 久久e6只有精品| 日本性交操一区二区不卡系列| 亚洲欧美另类少妇精品| 色黄污美女啪啪啪免费网站| 亚州男人的天堂| 91精品国产高清久久久久久,亚洲成人| 加勒比av网| 婷婷午夜| 蜜乳中文字幕a在线| 精品免费国产二区三区| 啪一啪免费视频| 夜夜春夜夜操| 日本一区二区三区欧美日韩中文字幕| 一级二级三级黑人无码| 久久视频,这里只有精品| 超碰人人超在线观看| 久久啊啊啊| 99抽插| 国产黄色av大片网站| 久久精品电影在线| 淫色网综合| 91人妻素女| 麻豆成人影音在线| 大香伊人在线一区| 99久久精品国产高潮| 俞拍久久国应视频| 二级久久网| 五月婷婷丁香中文字幕| 大香蕉欧美| 欧美精品久久| 大香蕉宗合网在线| 性爱免费视频成人| 久久久日本电影| 男女激情中文字幕| 亚洲国产欧美中文永久| 91啦人妻| 99re这里只有精品2| 91在线限制级| 久久久久婷婷| 男人的天堂午夜av| 色臀AV| 欧美影音在线| 国产伦精品免编号公布| 国产乱人伦AVA麻豆软件.| 一起草在线视频| 亚洲 欧美 综合 91| 蜜臀久久99精品久久久老,,| 操逼逼福利视频| 欧美AAAA黄片| 校园春色亚洲色图| 91青青在线视频| 亚洲AV资源| www.色五月| 国产福利小视频高清在线观看| 国产一区二区二区按摩精品啪视频| 欧美91久久久久| 一区麻豆 高清中文字幕| 99视频自拍| 一区二区三区黄片免费观看| 日本成a人v网站在线观看| 揉揉揉夜夜| 免费草草草草草视频| 欧美日韩222| 亚洲天堂东京热| 亚洲综合九九| 欧美国产伊人久久久久| 国产日韩欧美中文在线播放 | 96超碰网| 国产精品一区二区麻豆| 亚洲中亚日激情视频| 欧美后入视频| 欧美激情欧美精品| 亚洲熟妇无码一区二区三区| 久操九九九九| 嗯嗯嗯好爽| 色色婷| 婷婷色五月激情| 人人插人人搞人人操| 精品亚洲黄色片 国产精品导航一区二区| 欧美国产精品久久九九| 亚洲天堂男人网| 91色插| 91精品人妻一品二品三品| 国产精品69久久久久孕妇欧美| 色爽——AV| 2017超碰| 久久影视二区三区行押| 操老熟女AV| 欧美黑人168页欧美黑人167| 日产成人久久| 久久精品91| 久久久性少妇| 成人青青草原伊人| 一本久道久久综合狠狠爱一密臀精| 超碰在线日韩一区| 久久久夜夜夜| 草草电影院| 大二网站亚洲| 超碰在线观看av不卡| 人妻81p| 国产 亚洲 丝袜 制服| 日韩人成网站在线播放| 国产一区二区三区精品观看啪| 国产一级做a爰大片免费久久| 搡老熟女老女人老熟妇免费视频| 亚洲综合中文字幕有码| 婷婷大香蕉| 爱爱60秒免费视频| 97超碰热线| 96国产污污污丝袜| 我爱操| 女生91网站| 欧洲亚洲国产综合在线| 国产精品嫩草久久久久| 国产精品久久久久无码AV会牛| 婷婷五月天成人网| AND人妻系列| 好屌色综合| 亚洲综合在线91| a级免费在线观看| 久久这里是精品| 强奸xx国产| 人妻精品综合中文字幕在线| 天天摸夜夜操视频| 欧美色图校园春色| 亚洲一区二区三区春色| 国产操偷| 最新欧美色网| 欧美视频激情久久久久久| 97天天插| 国产后入| 在线视频日韩欧美国产| 97午夜剧场日韩| 天天干夜夜肏| 极品销魂美女一区二区 | 亚洲国产麻豆一区二区三区| 久久五月份| 99re这里| 亚洲国产综合图区中文字幕| 又大又长又粗又爽又黄| 中文字幕日韩综合| 亚洲国产中文字幕| 91丨国产丨白浆秘 洗澡动漫| 国产操逼逼网| 肉丝网站91| 麻豆一区二区三区在线看| 亚洲熟伦熟妇AV无码春色| 熟女六十路| 久久99手机免费视频| 欧美高清91| 青青伊人这里只有精品| 亚洲AV无码天美传媒一区| 天天拍天| 国产9 9在线 | 亚洲| 人人操AV| 好一吊区二区| 啪啪啪东京| 亚洲欧美一区二区三区在钱蜜桃 | 强奸熟女一区二区三区| 91狠狠| 99操视频| 天堂精品| 欧美人与性动交a美精品| 久久久久久久 九九九九九九九 | 综合久久99亚洲人妻中文在线| 大香蕉一级黄色片久久| 99ri视频| 在线观看啊啊啊啊啊| 99国产精品视频尤物| 亚洲成人一二三区| 欧美色青| 五月丁香六月激情| 999色欧美中文字幕| 男女激情黄色网址| 麻豆国产成人精品| 午夜福利无毒不卡| 男人天堂日日夜夜| 欧美熟妇成人一区二区| 日本一区二区三区精品| 91精片| 插入综合网| 97超碰超| 大香蕉亚洲中文| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 久久久免费一级黄片| 久热大香蕉网站| 加勒比在线视频一区二区三区 | 91精品电影18| 天天综合网网欲色| 旡码电影特区| 亚洲欧美国产中文视频| 一本正道久久熟女| 高清无码久操视频| 闷骚老熟女15P| AV天堂国产| 黄资源| 国产精品无码av嫩草| 97伪v| 3D污黄视频在线观看| 久久是精品| 久久激情网| 久久久久久九九九| 综精品久久久aaaa| 国产又黄又爽又刺激久久久久久| 国厂麻豆77q4| 婷婷丁香五月天亚洲天堂网| 麻豆天美AV传媒第一页| 99自拍视频| 午夜精品久久久| 狠肏骚人妻| 久久人人爽爽人人爽人人片αV| 亚洲综合夜色| 97色色婷婷| 国产精品女aA片爽爽视频| 中文字日本乱码| 一级黄色性爱A级片| 精品超碰色| 国产乱伦亚洲色图高清无码| 亚洲一区二区在线观看91| 岛国在线免费视频| 澳门黄片一香蕉视频| 婷婷15月天青娱乐| 欧美性爱精品一区二区| 免费视频一二三区| 亚洲人妻熟妇三十三区| 国产精品一二三在线看| 97伊人| 国产白领连续中出在线观看| 精品国产91av一区二区三区| 热G综合热G中文| 麻豆视频test| 国产无马视频| 精品999一区二区| 高潮嗯啊性感美女久久久| 人人操人人大香蕉| 大肥女高潮bbwbbwhd视频| 亚洲精品1区| 成人情色一区二区| 日韩精品一区二区日韩| 少妇的嫩逼图片| 丁香五月天久久精品视频一区二区三区| 大香蕉免费乱伦视频| 日韩欧美日韩| 亚洲影视第一页| 久久嫩草国产成人一区| 婷婷久久大香蕉| 成人a级高清视频在线观看| 外国免费性情大片| 亚洲凸凹超碰成人| 亚洲欧洲美腿丝袜| 偷窥自拍亚洲天堂网爆| 天天插夜夜操| 国产精品久久久 | 精品国产少妇高潮视频| 婷婷视频在线免费观看| 成 人 A V免费视频在线观看| 人妻人久久精品中文字幕| 麻豆性爱视频在线播放| a久久| 欧美一级黄色18片免费看| 天堂69亚洲精品中文字| 4虎在线观看| 日韩欧美蜜桃精品久久中文字幕久久| 精品人妻一区二区三区-国产精品| 欧美日韩岛国大片在线观看| 午夜激情成人在线观看| 亚洲图片激情小说| 久久黄黄黄| 91色综合色| 日韩在线97| 白丝1区2区3区| 天天色粽合合合合合合合| 色久桃花影院在线观看| 精品人成视频在线观看| 九九热九九| 欧美草草高清日韩视频| av草草在线电影| 99热这里只有是精品10| 青青操少妇| 久久久久久久 九九九九九九九 | 日韩乱伦AⅤ| 韩国三级一线观看久| 日韩小电影| 婷婷丁香人妻 | 亚洲网站一区二区在线| 97av在线观看| 久久尹人大香焦视| 美女性91| 果冻传媒A片麻豆熟妇人妻| 国产自偷| 国产精品69久久久久久久| 精品妇操一区二区三区| 长久操视频| 97在线资源| 亚洲一二三四区在线免费看视频| 中文字幕日韩精品久久| 一级人妻性爱视频| 一区AV| 国产精品白丝在线播放| 国模无码人体一区二区三| 久草尤物| 免费观看性欧美一级| 国产家庭乱伦性爱视频| 黄片国产精品一区二区| 奇米四色影视777久久久| 精品高清一区二区三区三州| 嗯啊抽插大香蕉网页| 国产92麻豆天美精品色欲5| 最近的最新的中文字幕视频| 婷婷午夜| 国产精品小视频一区二区三区| 中文字幕在在线观看网站| 亚洲免费97免费| 97欧美久久久久久久| 亚洲人妻色图| 一级毛片电影免费看| 波多野结衣被操50分钟免费视频| 日日操丁香五月天| 九九性爱网| 超碰久久中文| 中文字幕十五区| 肉丝中文无码高清| 伊人麻豆传媒| 欧美日韩大黄片| 爽 好舒服 无码刺激久久| 人妻少妇一区二区| 香蕉久久精品| 日韩在线观看AV| 色激情综合网站| 国产成人亚洲精品无码古代早漏男| 日本视频在线观看污污污| 激情综合亚洲| 久操 高清| 日韩欧美麻豆 | 看全色黄大色大片免费视频| 懂色av色欲av蜜臀av| 91九九| 青青草日本中文字幕 | 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 欧美日动态视频| 免费视频观看60秒| www.亚洲黄色| www.色综合| 美骚妇av高清在线| 日本Suv精品一区二区| 久久久久久久九九九九九九| 精品性爱无码在线播放| 亚洲一二三四区机械| 啊啊啊轻点在线观看| 亚洲乱码精品一区二区| www.国产高潮精品| 色盈盈影院| 国产精选视频| 日韩精品碰碰| 97在线国产精品| 中文字幕日韩情色| WWW啪啪的com| 欧美黑人猛交春色影视大全| WWW美腿丝袜香蕉中文| 91被操| 欧洲色| 呦女网站| 国产一区二区三区免费视频在性观看| 婷婷激情五月| 后入式五六区| 久久无码成人| 久久久久久久久久久人妻| 精品国产乱码久久久久久免费| 久久久久久亚洲Av无码| 国产最新AV| 日比av无码| 大伊香蕉在线视频免费| 亚爽爽爽爽爽爽爽爽| 秋霞怕怕片| 深夜操逼网| 69久久| 国产精品自拍欧美在线| 夜精品久无码| Av手机版天堂网| 刺激性视频黄页| 四虎免费在线观看| 亚洲综合激情五月久久| 久久九九精品一区二区| 温婉少妇玩3p| 伊人 俄罗斯 a v| 国产一区免费午夜视频| 久久超碰亚洲人| 中文字幕三四区| 亚洲日产专区| 日韩射精| 日韩欧美视频青青| 免费视频观看60秒| 97在线亚洲| 久操视频资源站公开| 久久久久久久久久精| 人人摸.人人色| ss久久| 国产中出内射一区二区| 色999人与兽| 日韩91网站| 亚洲高潮少妇| 啊啊啊网站| 婷婷五月丁香五月| 麻豆亚洲AV成人无码久久精品| 激情五月丁香五月| 91老妇女| 久久精彩免费视频| 老熟女综合| 97人人干| 久久精品一区二区| 欧美嫩性色| 欧亚日韩一区在线| 欧美性后入| 综合国产影视三级| 亚洲网自拍| 欧美国产欧美在线观看| 97就爱干| 户外裸露刺激视频第一区| 一区超碰一区| 久久草草欧美精品| 99re99| 香蕉一区二区三区在线视频| 中文字幕日韩专区精品系列| 熟女人妻久久中文字幕一二区| 91中出| 蜜臀99999| 日韩熟女乱伦中出| 情侣操 逼视频99| 亚洲国产高清福利视频| 亚洲黄色电影| www.婷婷| 1000部熟女视频在线观看| 久草综合视频| 国产欧美一级在线观看| 九九九九九九综合| 狼人综合婷婷激情四射 | 国产日韩怡红院| 日韩一999精品| 精品一区二区成人| 一本大道久| 伊人久久亚洲中文字幕| 综合操逼| 蜜臀在线视频| 丁香婷婷激情五月天无毒不卡 | 久热精品在线国产| 伊人久久亚洲色欲综合网站 | 囯产乱伦一区二区三女 | 色偷偷人人玩人人舔人人操人人摸人人爽| 岛国片在线观看视频亚洲| 日本精品五区| 91欧美丝袜| 91青青在线视频| 欧洲无码一区二区| 狠狠操夜夜| 日曰骚久久精品| 啊啊啊快操我视频| 婷婷五月天av| 中文字幕日韩电影人妻| 中国91AV| 老女人碰碰在线碰碰视频| 在线 制服丝袜中出 人妻| 欧美片第一页| 97视频一区| 欧美亚洲日韩16色| 99热婷婷| 国产综合网站在线播放| 超碰97久久| 精产国品一区二三产品| 综合色久| 国产精品一级毛片不卡视| 久久精品人妻一区| 东北操逼| 熟啊v色欧美热| 熟妇在线视频一区二区| 看大黄色大片原件| 蜜桃狠狠色伊人亚洲综合网站| 看看日B真人视频| 日本一片一区| 五月丁香成人网| www成人啪啪18秘 免费| 亚洲av无码国产精品字幕| 中出20p| 大肉棒导航| 国产专区路线| 懂色AV蜜臀无码精品APP | 91老司机精品| 骚逼自拍99| 亚洲青色欧美| 青草青青久久久久久国产| 人人操人人狠狠操| 欧美少妇性爱网站| 色吧5亚洲| 欧美懂色综合网| 精品美女少妇一区二区| 玖玖爱伊人玖玖爱| 久久久婷| 9超碰免费| 蜜臀在线免费观看在线免费观看| 乱伦系列一区二区| 国产精品久久久久久片| 天天色,天天干,天天干| 热久久国产| 国产精品免费久久久久久久久久| 91精品人妻一品二品三品| 视频在线97| 久久成年精品| 久久97资源 网| 亚洲高清内射| 四虎免费看黄| 伊人97色天使| 四季AV综合网址| 人妻美腿丝袜制服诱惑综合天堂-| 中文字幕在线24| 狠狠操天天干| 成人五月香网在线| 婷婷色一区| 国产1769在线| 亚洲日韩成人性爱视频| 999国产精品999| 99re久久| 性做久久久久久免费观看软件| 久久九九国产精品| 男人的天堂一区三区| 欧美视频中文字幕区| 郑州宾馆老熟女露脸啪啪| 久草网站免费在线观看| 国产又大又硬又长又粗| 9久久精品| 三级片网站在线播放| 九九成人视频| 四虎永久在线精品免费网址| 男人亚洲91首页在线| 日本一二三高清| 高清肉丝中文无码| 91老熟女91老女人| 大香蕉日亚洲日本亚大 | 校园春色亚洲欧洲| 啊啊啊不要啊啊受不了了视频在线| 欧美亚州综合图片| 中文子幕一二三| 欧洲一区二区| 日本精品五区| 波多野结衣一级视频| 国产强奸超碰AV| 国内三级自拍小视频在线观看| 东京热亚洲一区二区| 久久国产视频专区一二三| 麻豆成人av| 蜜桃狠狠色伊人亚洲综合 | 少妇的嫩逼图片| 好吊色青靑草| 国产精品露脸在线观看| 日韩一区二区三区四区五区| 色色99| 亚洲色堂免费视频| 精品国产乱码久久久兰草影视| 久久激情四射婷婷丁香五月天| 日韩影片中文字幕一区二区三区| 97chaopenrihan| 国产欧美另类久久久精品课程| 九九热AV| 精品国产AV一区天美传媒| 乱伦熟女专区| 99久久久无码国产精品性男| 人妻加勒比东京热| 亚洲一区深夜| 亚洲综合校园春色| 夜夜欢天天干|