色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合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
返回資訊列表
91网站在线播放| 亚欧美色| 色婷婷网| 国产精品久久成人免费| 中国一级特黄大片护士| 97啪啪| 91天天爱| 国产精品经典一卡久久久| 国模艳艳啪啪一区| 日本视频在线中文字幕| 超碰在线1234区| 亚洲春色激情小说| 五月丁香社区婷婷日韩欧美精品影院 | 亚洲高清无码AAA久久久精品| 欧美亚洲中文| 男同专区一区二区三区在线| 曰韩少妇无码| 亚洲激情色片| 天天日日日射| 亚洲av总站| 精品国产乱码久久久久久影片| 岛国在线免费视频| 亚洲天堂一区二区久久| 男女猛烈无遮掩视频免费软件| 公司1区2区3区精产精| 亚洲中文字幕妇伦久久| 日韩国语字幕| 婷婷久草一区二区三区| 久/久精品99看9| 国产亚洲禁久一区二区| 亚洲九月丁香| 中文字幕在线日亚洲9| 黄在线| 欧洲成人性爱视频| 国产成人免费观看在线视频| 精品视频免费在线一区| 性色生活片久久毛片婬片免费放女人一级毛片| 人妻夜夜爽天天爽三区麻豆AV网站| 欧美黑人91| 欧美97视频| 97超碰免费人人性爱| sss视频华人在线| 六六久久日韩不卡| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 国产人妻精品久久久一区二区三区 | 欧美日本一区二区a人| 蜜乳Av成人片网站| 中文字幕精品日韩中文字幕| 狠狠色狠狠色狠狠五月| 精品久久久久av影院| 欧美午夜视频免费观看| 青青操综合网| 91在线无码精品秘 软件| 亚洲AV无线| 色成人Www精品永久观看| 欧美黄片免费在线观看视频| 欧美aaaaaaa| 岛国艾薇凹凸视频天堂| 97天天爽| 亚洲无限观看| 欧美色图综合网| 亚洲欧美不卡线| 国产h小视频在线观看免费| 亚洲国产成人综合碰碰三级经典| 亚洲天堂精品日韩电影| aⅴ日韩成人电影av在线免费看av大全| 在线观看色视频| 欧美日韩性爱操大逼| 91丨九色丨43老版熟女| 九九十八精品| 后入式999| 九九九999久久久网站| 亚洲天堂2020| 久久曰曰| 日韩情色AV| 精品大全99999| 婷婷超| 青青久久手机线视频| 91久久久久久久| 人妻天天爽夜夜爽爽| 国产熟女精品区| 久久久性少妇| 日韩精品资源专区二区| 无套内射人妻在线播放| 91黑丝在线播放| 91色噜噜狠狠| 亚洲视频精选| 日韩一级成人毛片免费观看| 久热精品色情| 尤物视频视频官网| 欧美疯狂做爰xxxx| 人妻酒店出差被中出免费在线播放| 加勒比综合a∨| 999999精品| 久久无码电影| 九九九偷拍| A级片一区| 久久久久国产亚洲一区欧美色图日韩| 人妻天天爽夜夜爽2| 岛国A V在线免费看| 伊人五月天| 大吊色| 97亚洲在线| 久久久久亚洲Aⅴ无码| 嗯阿好爽好紧| 男人天堂2030| 九九碰九九爱97超碰| 日本新免费二区三区| 9Ⅰ老熟女| 99精品久久久久久久婷婷蜜桃| 91精品人妻偷情| 亚洲色欲天天人妻无码系列专区| 欧美人人天天网| 人妻9117c| 人人操av| 亚洲精品乱码久久久久久蜜桃麻豆| 久久精品国产精品一区 | 婷婷五月天成人| 9 1超碰九色| AAAAAAAAA黄片| 丝袜狠狠草尤物人妻av91| 亚洲色电影在线| 国产精品免费美女视频| 青青青草伊人精品| 国产黄色av大片网站| h色99999| 久久 国产精品 一区| 91超碰在线播放| 久久三| 青青草久久| 一区操逼日比视频| 国产99999久久精品| 操人人| 超碰97男人| 黄骗免费网站| 中文字幕-区二区三区四区视频中国| 97亚洲在线| 日本欧美成人片AAAA| 操91| 亚洲天天在线| 熟妇人妻一区二区三区| 午夜福利无毒不卡| 久久中文字幕人妻熟av女蜜柚| 久久精品国产亚洲AV成人直播| 97天天插| 无码免费一区二区三区啪啪| 日韩成人精品| 呻吟 欧美 日本 中出| 亚洲国产一级精品毛一级精品看免费视频 | 五月开心久久AV官网| 国产中文大片资源中文字幕| 1区2区3区视频| 91原创在线观看| 高清在线不卡一区二区 视频| 欧美国产有色电影| 亚洲色堂免费视频| 久久婷婷色| 91中文字幕| 国产精品久久久久久久久久久久久久久久| 自拍偷拍2025在线观看| 国产一区在线播放| 超碰久久网| 在线播放成人网站| 操逼无码操逼| 久久久精| 久久中出在线| 亚洲91色在线| 日韩熟妇二区| 久久久久九九九| 亚洲欧美日韩偷拍色图| 欧美第五页| 亚洲色图久久成人| 国产成人精品日本视频| 天天插夜夜操| 91精品人妻| 日韩钢筋无码高清啾啾啾| 国产无马av| 国产精品女aA片爽爽视频| 九九久久国产精品| 大香樵伊人网| www.色婷婷色综合| 日小BB小视频| 久久大黄片| 日日AAvv| av东京热男人的天堂| 欧美性天天影视| 国产 亚洲 丝袜 制服| 91春色| 97在线播放| 中文字幕88av在线| 中文伊人大香蕉视频| 青娱乐国产精品| 日本潮催一卡操| 91精品网站| 少妇色欲综合网2| 91爱做| 嗯嗯啊啊用力视频免费| 天天爽天天| 干婷婷综合网| 国产成人自拍视频在线| 人妻熟女午夜精品在线| 人人扣人人操| 久久这里只精品99re66图| 一线黄色免费性爱片| 无遮挡又黄又刺激的视频| 99re免费| 欧美精品宗合| 精品无码一区二区三区| 91人妻在线视频| 欧美激情内射| 日韩有码中文字幕女同性恋 | 18禁无码永久免费无限制| 国产精品久久久 | 97超碰这里只有精品| 国产精品探花色| 91操操操操| 91亚洲综合| 97爱| 国产av激情无码久久天堂| 中文字幕人妻资源在线| 翔田千里Av在线| 欧美一级AAAAAAA| 亚洲欧美日韩免费观看| 亚洲av综合伊人久久| 国产无码久久高清| 岛国视频一二三区| 国产亚洲精品玖玖玖在线观看| 国产熟女完整版中字| 激情抓乳插进去啪啪啪日韩| 围产精品一区二区三区视频播放| 91N欧美| 久久一区,青青青青草视频在线播放| 日韩精品三区四区| 色拍偷亚洲| 亚洲人妻久久久| 极品肉射| 日韩丰满熟妇| 欧美色偷拍| 香蕉久久精品| 综合网亚洲1| 人妻丝袜一区二区三区在线| 少妇厨房愉情理伦片bd在线观看| 欧美大香蕉专区网| 免费看污网址| 96久久久久久久| 偷拍精品一区二区三区| av一区二区三区四区| 人妻熟女av国产网站| 亚洲图片欧美日韩| 亚洲欧美啪啪| 亚洲人妻在线一区| 国产又粗又长的视频| 国产精品另类| 国产一区自拍欧美日韩| 黑丝内射一区二区三区| 超碰综合97在线| 好属操| 久草免费福利在线播放| 99只有精品| 91色鬼| 亚洲 国产 精品一区| 久操视频在线| 久久9免费视频| 欧美顶级黄色大片免费| 日本欧美m v精品网站加| 秋霞曰韩R级| 99热精品在线观看| 综合久久99亚洲人妻中文在线| 99re在线视频这里只有精品| 激情 欧美 亚洲 小说| 91久久婷婷| juliaann丝袜大战黑鬼| 97欧美日韩| 搡老女人老妇女AAA一VU麻豆| 婷婷五月天激情网| 精品超碰色| 亚洲日韩在线a不卡99精品| 免费在线黄片视频| 日本999精品视频| 亚洲天堂一区二区| 在线免费观看日韩一区| 99色悠悠| 91网站18| 超碰av在线| 日韩熟女视频二区| 一级啊性爱在线视频| 色老汉色| 99无码狠狠久久| 亚洲AV成人在线| 日本孕妇孕交| 五月婷婷丁香六月丁香| 久久久婷| 精品成人无码| 99热日| 中文字幕精品免费一区二区| 精品免费一区二区三区在线亚洲人成| 韩日欧亚a级| 成人5码视频| 亚洲涩涩| 久久精品国产亚洲AV无码电影| 久久綜合很很很| 欧美中文字幕日韩在线| 97在线欧洲| 国产免费内射视频| 91亚·色| 蜜臀一区二区三区在线| 9久久9综合| yaouchengrenav| 中文字幕老熟妇黄色视频| 欧美97av| julia高潮后不停追击中出| 久操影视| 插欧洲美女欧美精品| 在线小视频| 国产操操日韩三级黄| 欧美中文狠| 高清无码在线播放网站| 亚洲青色欧美| 18禁网站在线播放| 玖玖超碰熟| 91天堂色男人的天堂| 看看日B真人视频| aaaa黄片| 综合久久99| AV天堂丝袜| 亚洲欧美综合| 美国久久一二三四| 激情啪啪拍91| 屁股久久久久久| 91精品电影18| 日韩性爱人人爱人人操| 久操| 91青视频| 精品久久久av| 久久精品国产亚洲AV嘿嘿| 亚洲怡春院| 色五月婷婷在线| 亚洲视频中文一区| 精品中文日韩字幕视频| 久热伊人| 日本成人A片网站| 最新9久久久9免费视频| 99免费在线视频| 国产亚洲精品一区二区三区| 啊啊啊啊免费视频| 中文熟女五十乱码在线| 亚洲色鬼| 青青操狠狠撩| 测评在线观看AV| 人澡逼| 日本一区二区电影网站| 极品美女福利在线观看| 国产精品黑人一区二区三区| 久久久91福利姬| 亚洲欧洲美腿丝袜| 亚洲中文字幕精品久久久久久直播| 亚洲熟女av中文字幕| 日本最新免费韩国1区2区视频播放| 免费A V在线| 国产在线综合网| 热热色青青草| 草B在线| 久热久| 高潮内射在线| 婷婷丁香五月综合| 这里只有精品视频| 欧美日韩性爱精品| 国产 亚洲 丝袜 制服| 国内偷拍精品一区二区| 99夜夜操| 青青草公开在线免费不卡视频| 中文字幕-区二区三区四区视频中国| 五月天激情四射| 18禁精品网站在线看| 搡老熟女免费视频| 久久久999| 日产精品久久久一区二区| 久操在97| 秋霞福利网| 亚洲AV高潮| 东京太热久久久| 91九色网| 色色色色色色色色色色色色色色综合| 国产精品老师| 欧美精品自慰系列寂寞少妇 | 国模无码一区二区三区在线| 中文字幕日韩专区精品系列| 91P0RNY大屁股人妻| 九九九九热| 久久久久久加勒比| 国产深夜福利| 欧美日韩在线视频网站| 天天插夜夜操| 强奸乱伦大香蕉网| AV无码久久久精品| 天天日日夜夜| 色五91| 泰国AV在线观看| www老逼91| 青娱乐 成人娱乐在线| 91在线美女| 99999精品成人| 中文字幕少妇色| 中文字幕-区二区三区四区视频中国| 蜜奶av| 日本最新免费韩国1区2区视频播放| 丝袜天堂| 91色综合色| 18精品一二区| 国产在线视频午夜精华在| 中文字幕99999| 日日操免费视频| 精品成人亚洲午夜电影| 91精品无码人妻系列| 三级片网站在线播放| 色婷婷激情| 熟妇人妻一区二区三区| 日日骚精品视频| 少妇大屁屁| 啊啊啊啊啊啊在线观看| 中文字幕人成乱码熟女香港| 26uuu国产免费观看| 99re视频在线观看这里只有精品| 久久久久久久久久久久久久久乱码| 男人久久精品| 男女啊啊啊| 欧美福利视频啊啊啊啊| 午夜寂寞欧美| 一道本东京热加勒比一区二区三区| 亚州色国| 国产成人亚洲精品无| 岛国网址国产| 亚洲有码 欧美精品| 成人五月天色网| 欧美成人精品一区二区男人蜜臀| 欧美91精品国产自产| 久久成人国产| 蜜臀AV一区二区三区激情综合| 91丝袜美腿片| 乱伦一二三| 欧美一区二区亚洲天堂| 九九拍拍精品视频在线播放 | 97久久国产| 欧美aa一级片| 伊人影院中文字幕| 夜夜嗨老熟女AV一区二区三区| 亚洲阿v天堂在线| 日欧操屄视频| 久久久9 9 9精品| 久久超碰国产一区二区三区| 人妻久久久久久| 91路www| 97在线免费观看| 新版天堂中文资源8在线| 玖玖爱一区在线| 日韩人妻丝袜中文字幕| 五月丁香综合激情| 久射吧| 国产精品久久99日日| 美女啊啊啊啊啊啊啊| 99操逼| 国产真实野战在线视频| 日韩精品9区| 精品九九九| 丁香久久| 欧美性夜| 粉嫩国产精品久久粉嫩| 欧美97爱| 91亚州日韩高清| 久久精品区| 成人日本视频人妻在线| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 黄片在线免费在线观看| 欧美第五页| 婷婷色影院| 精品一区二区2| 色爱三区| 欧美综合综合| 综合色久| 国产精品人妻无码久久久互動交流 | A 天堂| 99re这里只有精品3| 欧美黄页| 日韩成人午夜精品久久高潮| 日韩无码精品综合久久| 亚洲欧美日韩中文久久自慰| 粉嫩av在线一区二区| 亚洲国产亚洲天堂| 亚洲天堂99| 91色婷婷综合久久中文字幕二区| 五月婷婷性爱| 国产99999| 免费农村成人少妇人妻Aa一区二区视频| 大香蕉78| 色九九九综合| 秋霞曰韩R级| 欧美激情内射| 绯色AV粉色AV蜜臀AV| 天堂а√在线最新版在线| 久热大香蕉网站| 国产成人在线观看综合| 麻豆成人AV| 亚洲不卡不卡中文字幕不卡 | 欧美另类自拍 | 亚洲人妻久久| 青青草五月天| 欧美大香蕉专区网| 人乳av| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 岛国大片国产| 十八禁黄色| 九久久九精品视频| 国产精品999zyz| 久久97视频| 91在线美女| 天天天天天天天天天天干美女| 亚州欧美在线| 97免费免费视频网| 日本三级大片| 先锋激情∨在线视频播放| 青草伊人久久| 天天日日日射| 色婷婷综合视频| 久久国产逼| 亚洲欧美国产精品久久久久久久| 青青草视频在线观看一区二区| 口爆吞精在线观看| 成人国产视频在线观看| 久久成人东京热人妻| 大香蕉十区| 狠狠色综合网| 激情网色| 日本欧美韩国国产在线| 色噜噜狠狠色综无码久久合欧美| 日韩中文9| 久久的网站啊啊啊啊啊| 九九热九九| 芊芊操逼视频无码| 中文字幕av亚洲精品| 欧美亚洲韩国视频十五区 | 欧美激情视频在线一区| 中文字幕乱亚洲美女精品一区| 国产精品乱码久久久、久久| 台湾大香蕉99热| 乱人伦 国语对白:视频直接看| www.99中文字幕| 大色综合| 色汉综合| 伊色久人大在线| 九九热午夜欧亚国产视频| 中文字幕片| 口爆综合网| 91久操| 破苞ⅩXXX性无码动漫无码| 欧美不卡二区| 国产美女裸体秘 永久无遮挡| 国产日韩久久| 精品人妻av区天天看片| 青青草一区二区高清无码视频| 亚洲综人| 亚洲在线A| 福利大香蕉| 老鸭窝日丰县女人| 国产精品大屁股999| 亚州国产成人精品女人久久| 太久视频| 亚洲五码一区二区三区| 日韩不卡毛片Av免费高清| 青青青青青手机视频| 午夜福利 成人 91| 欲香欲色综合天天伊人| 亚洲久久久| 淫荡网址| 精品高清av中文字幕| {男男暴菊gay无套网站| 久操网视频| 亚洲最新av无码成人精品区| 成人免费不卡在线视频| 婷婷激情综合网| 久久怡红院| 国产成人资源| 96免费视频在线| 91综合国产精品| 91网站18+| 欧美中日韩XXXX| 日本精品五区| 精品国产一区二区三区四区在线看| 欧美综合娱乐久久| 久99热| 欧美少妇一区二区三区| 我中文字幕6区| 90后后入| 女性喷水高潮在线观看| 九色精品视频导航1| 婬女免费一二三区A片| 国产亚洲人妻综合日韩 久久| 欧美熟女激情| 国产精品一二三| 91狠狠综合网| 风流老熟女一区二区三区l| 在线播放成人网站| 国产大片精久久久久久| 智利AV在线网| 成人午夜高潮av猛片| 在线强奷到舒服的无码视频| 天美传媒国产原创中文字幕亚洲欧美另类 | 酒色综合网| 91丨九色丨国产丨人妻在线| 久久99亚洲精品久久99果| 99青草| 青青草国产一区二区三区| 女色综合| 热热色国产一二区AV| 日本不卡一区| 九九黄色视频在线观看| 91偷拍欧美亚洲| 中文字幕一二三av| 亚洲AV无码AV吞精久久久久| 色综合中文字幕不卡| 亚州国产成人精品女人久久| 69视频入口| 九九性视频| 久湿久久 | 啊啊啊啊操死我了| 欧美性天天| 大香蕉丝袜一级片| 一本色道久久综合熟妇| 欧美gv在线观看| 丁香激情网| 老鸭窝在线视频播放| 日韩激情毛片一级久久久| 婷婷香蕉欧美在线一区二区三区| 久久久性少妇| 老司机老司机午夜影院| 久久久婷| 亚洲成人精品在线一区| 午夜激情床戏激情| 老熟女91视频| 欧美激情综合| 精品丰满熟妇人妻一区| 干婷婷综合网| 丰满人妻一区二区中文| 91在线超高颜值国产| 日韩一区二区熟女| 国产日韩精品suv| 97国产色综合| 蜜桃狠狠色伊人亚洲综合网站| 五月天婷婷色色| 亚洲 欧美 日本 国内 首页| 白嫩国模丰满一二三区| 国产精品久久久久999| 黑丝自慰喷水网站| 无毛精品| 美女黄频a美女大全免费皮| 久久久久久久9最新免费视频观看| 久久无码一区二区二三区性色| 亚洲精品一二三四区| 亚洲视频中文一区| 精品国产91久久久久久一区黄无| 成人免费视瓶| 在线观看高清AV| 欧美伦乱爱| blacked精品一区国产| 91视频综合在线| 久久一区二区三区入口| 亚洲天堂久久| 久久黄黄| 日韩精品字幕| 97丝袜亚洲在线播放| 无码高清专| 欧美在线大香999| 亚洲精品视频二区| 超碰在线欧美性爱激情| 97bbn| 日本在线视频导航| 夫妻天天操岛国视频| 亚洲中文字幕妇伦久久| 欧美探花网| 91少妇通奸网站| av国产无码| AAAA级日本片免费视频| 无码视频一区二区| 中文字幕免费看大片| 97亚洲在线| 黄色高清久久无码依人| 亚洲最新a在线观看| 欧美亚洲手机在线| 天堂麻豆天美| 午夜男人一级A片7777| 九色黄站| 人妻少妇久久中文| 91狠婷| 99久久婷婷丁香| 日韩三级av片| 美国久久一二三四| 久久98| 日韩成人在线性爱视频| 99热在线只有精品| 日本啊啊啊啊啊视频| 精品成人av一区二区三区在线| 天天综合97| 福利大香蕉| 欧美大香蕉在线观看| 国产精品一级片在线看| 亚洲天天综合| 怡红院久久老司机| 欧美猛交黑寡妇中文字幕| 狠狠操狠狠| 十八岁啪啪视频免费看| 亚洲天堂精品日韩电影| 在线色资源| 青青草日本中文字幕| 亚洲天堂区| 国产福利av精彩对白| A级片日韩欧美国产欧美视频精选观看| 加勒比久久av| 欧美日韩国产电影| 久悠悠av| 日韩人妻大香蕉| 欧美国产伊人久久久久| 久久精品国产亚洲妲己影视| 欧美黑人熟妇精品91| 国产九九九九九九| 男人天堂综合| 欧美日日夜夜| 欧美色三级片91| 五月天色色网站| av午夜影院在线播放| 五十路六十路七十路熟婆| 人妻铁牛TV| 久久香蕉国产线看观看亚洲女人 | 思思热在线视频在线| 久久久精品九| 中文字幕综合人妻| 人妻无码后入| 91精品成人www| 亚洲激情综合| 91丨九色丨国产打屁股| 九九综合久久| 亚洲Av无码成人精品国产| 可能人人看人人摸| 色操逼网| 免费观看性欧美一级| 人妻精品视频一区二区三区| 中文字幕99999| 伊人骚琪琪亚洲天堂网站| 伊人欧美大香蕉视频| 国产天天噜一噜久久久| 激情四射婷婷六月天| 久湿久久| 加勒比av网| 中文字幕精品三级久久久| 青操影院| 精品人妻视频一区二区在线播放| 另类专区加勒比| 乱操9999| 日日躁夜夜躁狠狠躁超爽| 久久久久国色αv免费观看| 国产综合久| 99热在线播放| 精品蜜乳AV免费观看| 久久久久久亚洲Av无码精| 日本人妻伦在线中文字幕| 国产婷婷综合在线观看| 国产精品亚洲一级av第二区| 亚洲高清无码在线桃色| 精品人人插人人操| 91狠| 韩国三级三级BD在线| 九区国产| 97伊人超碰| 久久久999| gogogo免费高清看中国国语 | 天天干一区二区| 亚洲天堂自拍| 肉丝中文无码高清| 酒色综合网| 国产无码久久高清| 嫩草影院性色| 天天插天天干| 99热导航| 国产精品一区在线播放| 91精品人| 日韩一区二区高清在线观看的| 日韩婷婷| 97视频620| 自拍偷拍 日韩无码| 91精品丝袜久久久久久| 91人妻视频在线| 欧美第二页午夜| 欧美天天射| 国产麻豆福利av在线播放| 天天插天天射| 欧美色图 人妻| 午夜欧美精品久久久| 欧美不卡在线一区二区| 午夜男女爽爽爽在线视频| 夜夜夜久久| 啊嗯嗯啊好大好爽| 日本性感人妻91| 91丨九色丨熟女高潮| 91艹逼精品| 中文字幕AV中出| 啪啪啪东京| 国语人妻精彩刺激| 91熟女视频网| 日韩美女啪啪一区| 翘臀vidoes| 97中文字幕一区| 欧美一级久久久丰满| 中文字幕二区日韩天堂| 插入粉嫩少妇视频| 丁香五六月啪啪| 欧美色图天堂在线| 伊人久大| 99久久婷婷丁香| 五月天伊人| 伊人久久AV诱惑悠悠| 天天天天天天天天天天干美女| 91暧暧| 综合网91| 丁香五月天激情综合| 青青青草伊人精品| 懂色av色欲av蜜臀av| 快点操死我| 日韩精品人妻| 色综合五月天| 少妇的嫩逼图片| 色官网在线| 青青草久久| 日韩卡一卡二卡三在线| 国产极品久久久| 男女啪啪啪18禁网站| 啊啊啊不要好疼视频| 校园春色 亚洲| 人人插人人搞人人操| 91少妇通奸网站| 日韩久久.一级黄色片| 国产肏屁眼视频| 日本中文字幕不卡视频| 嗯嗯啊啊啊好舒服| 欧美岛国精品在线观看| 91久青| 国产女同在线观看视频| 蜜臀久久99精品久久久久久久久| 综合色区偷拍| 精品一级| 五月天色图影视| 欧美激情综合网| 人人乐大香蕉| 日韩一级欧美一级国产一级台湾| 青青爽| 亚洲精品一二牛牛| 日韩丝袜高跟制服在线观看| 亚洲最大成人a毛毛片| 国产精品在线一区二区| 嫩草影院性色| 91在线一起| www久久久| 亚洲精品九九九| 91 国产丝袜在线放观看| 一级做a爰片性色毛片久久| 四虎视频在线观看| 日韩午夜精品一区二区三区电影| 欧美九一精品久久久熟妇| 国产免费永久精品无码| 欧美色图第一页| 久久不卡一区二区| 最新的亚洲无吗| 欧美色97| 免费的av网| 99色热国产视频精品| 国产精品一区二区麻豆| 欧美夜夜狠| 亚洲精品一区二区精华| 天美一区在线| 伊人激情| 亚洲成人在线高清| 91精品操美女| 久9久| 国产精品一二三在线看| 精品无码久久| 日产中文字幕2020| 精品一二三区久久AAA片| 欧美日韩狠狠爱| 91网亚洲| 无套内射性感少妇视频| 在线午夜成人无码视频| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | AV在线资源| 免费人成?大片在线播放| 国产熟女精品一区二区| 亚洲日韩少妇一道本视频| 久久9视频| 亚洲密乳AV| 天天狂操夜夜狂日| 色香伊人| 日本青青草在线| 爱我干综合| 亚洲精品性爱片| 99热这里只有精品18| 99精品人人爽| 精品国产自在在线99| 睡产熟女乱伦| 亚洲视频1区| 人妻丝袜一区二区三区在线| 青娱乐蜜桃臀AV色婷| 青草视频在线看看看看看看看看看| 日韩99精品视频综合区| 啊啊啊爽爽| 好一吊区二区| 久久婷婷亚洲欧| 国产不卡精品91| 色综合久久久久| 操逼啊啊啊91| 伦激情人妻另类人妻| 欧美加勒比| 欧美 日韩第一性色| 国产亚洲精品无码三区| www亚洲欧美| 97在线播放| 久久久精品久久| 超碰夫妻97| 台湾肥佬网一区二区三区| 国产精品一二三区福利| 探花一区在线| 亚洲系列第一页| 日日夜夜精品| 欧美人人操人人插| 欧美国产精品久久九九| 人妻天堂网| 清纯唯美激情| 亚洲天天自拍| 五月天精品| 91热色| 嗯~啊~轻一点 视频| 久久综合久色欧美综合狠狠| 久9久9精品| 日本 免费 一区二区三区 久久香蕉| 殴美牲| 花野真衣| www.四虎在线| 夜夜操天天肏| 亚洲欧美另类少妇精品| n1038 一二三区| 青青草精玖玖69精品| AV老汉| 老熟妇综合| 国产免费久久精品99re韩国| 欧美综合制服在线| 亚洲综合贴图91| 97就爱干| 美女上床网站| 九九九九热只有精品| 熟女少妇视频| 欧美资源| 欧美一区二区一级岛国大片| 在线有码中文字幕| 国产毛片在线| 在线精品福利免费播放| 国产精品成人无码av| 亚洲欧美成人在线| 人人爽天天爽| 91骚妇| 中文字幕视频免费| 色偷偷2020免费视频播放| 奶水 人妻 哺乳 在线| 亚洲精品九九九| 思思视频免费看网站| 黄色电影观看久久9| 黄色片大香蕉| 婷婷久草一区二区三区| 97人人爱人人做人人乐| 91艹| 美女久久久久久久久久久| 边做饭边操逼逼| 亚洲av综合色区无码一| 国产成人无码高清| 素人美腿视频网站| 日韩天天本| 欧美综合色图网| 一道α片欧美| 性爱乱伦一区| 高凊专区人人操| 久久久久密臀视频| 97久久超碰国产精品| 国产精品成久久久久午夜午夜| 激情网色| 久久国产三区| 校园春色亚洲无码| 四虎影视精品| 你想操日本小逼吗| 中文高清一区二区的| 一区二区视频你懂的| 黄色工厂这里只有精品| 国产日韩欧美操逼视频| 久色网| 日韩丝袜高跟制服在线观看| 少妇大屁屁| 收看日本人日bb| 大香蕉av在线| 18禁久极品美女久久哦哟呀!| 欲色综合| 亚欧无码在线| 欧美亚洲丝袜美女电影| 老熟乱一区二区三区四区| 翔田千里无码一区| 性一交一乱一交A片久久四色| 97亚洲资源| 中文字幕视频二区| 熟女精品va中文字幕| 婷婷国产精品九区| 激情一区二区三区在线观看| 国产白丝在线| 中文字幕在线免费观看2| 久久婷色| 成人一级二级| 日韩99精品视频综合区| www鬼畜国产男人的天堂| 天天综合91入口| 国产性爱乱伦AV| 啊啊啊啊二区好大| 免费AV中文网在线观看| 五月婷婷综合网| 老熟妇一区二区三区| 精品午夜福利国产一区二区在线观看| 日本91白丝| 撸无码不卡免费视频| 亚洲图片欧洲图片aⅴ| 久久久久久久国产| 久久精品一区二区一8| 免费观看欧美日韩操逼视频| 精品少妇一区二区三区| 日本色色色色色视频| 性爱欧美五月| 欧美性爱免费短视频| 亚州色站 日韩电影| 精品国产Av无码久久久伦古装| 五月激情在线| 亚洲男人天堂手机版| 欧美丰满熟妇XXXX性ppX人交| 色哟哟av网址| 国产麻豆福利av在线播放| 国产十八禁视频| 操逼免费视频无码国产| 人妻 制服 日韩 中文 在线| 国产精品久久久久久高清无码免费看| 东京太热久久久| 色综合av综合久久| 精品一区二区三区最新| 999久久久| 国产免费大片| 91人精品妻入口| 欧美久久久15P| 亚洲精品性爱片| 国产精品久久久久久久久久久久久久久| 久久中文字幕一区不卡| 欧美伦乱爱| 强奸乱伦大香蕉网| 熟妇无码视频三区| 激情五月综合网| 99re超碰| 亚洲一区二区三区麻豆传媒| 黄色片一区二区三区四区五区| 操一区| 免费av大片| 国产又粗又长视频| 精品妇女一区二区三区| 日本中文字幕不卡视频 | 一级AV性爱| 亚州欧美一区| 99久久久久| 操逼网站网站| 日韩欧美水蜜桃人妻| 女人双腿搬开让男人桶| 亚洲情色 自拍| 性感女人网页在线观看视频| 日韩精品在线放| 97免费视频在线观看视频| www…国产操逼| 久久久久久9| 综合av影片| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 香蕉黄色一级视频| 青青草女人天天干| 国产精品天美传媒| 搡老女人老妇女AAA一VU麻豆| 欧美色图99| 91色黑人少妇| 九九色影院| 四虎国产精品永久入口| 国产日韩中文字幕欧美| 99精品丰满人妻无| 1禁看欧美黄片免费看| 诱惑网综合| 久久偷偷色综合蜜桃| 韩国久久97| 国产www色在线观看| 青青草中文字幕| 一区二区三区色综合| 久久精精区一区二区一蜜桃一区二区| 亚洲AV成人无码一二三久久| 伊人欧美大香蕉视频| 亚州精品丝袜-不卡成人免费| 国产精品国产拍高清AV| 女人与公拘交酡2020视频| 色噜噜人妻av中文字幕| 精品国产一区二区三区久久久蜜臀 | 男生通女生屁股| 欧美一区二区成人一卡| 狠狠 91| 女人高潮抽搐喷水视频网站| 性暴力欧美猛交在线直播| 91一区二匹| 午夜福利一区二区三区四区五区色婷婷| 天天摸夜夜摸| 嗯啊不要啊在线 | 9久9久| 老熟妇一区二区三区啪啪| 91狠狠综合久久久久久| 婷婷伊人网| 亚洲欧美综合区自拍另类| 超碰午夜| 美女91在线| 97超级久久| 国产91专区| 国产精品丝袜久久亚洲不卡| 欲色影视综合吧| 花野真衣| 熟妇熟女视频一区二区三区| 欧美刺激色黄片免费看| 国产精品自拍xxxx| 成人av福利在线观看| 张柏芝国产一区在线观看| 果冻传媒A片麻豆熟妇人妻| 91热色| 夜夜爽夜夜摸夜夜操免费视频| 欧美影音在线| 情色五月天网| 蜜桃久久久久久久久久久久| 欧美一二三区四五区| 蜜桃久久久久久久| 日韩欧美亚洲国产日韩| 亚 欧 美 综合| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 亚洲中文字幕97久久精品少妇| 91丨国产丨白浆| 色色色999| 探花精品视频| 探花激情视频| 亚卅熟女乱色| 巨爆乳肉感一区二区三区竹菊影视| 国产精品一级毛片不卡视| 日韩精品人妻一| 欧美精品99久久久**| 天天操天天干一区二区| 日韩精品 视频一区二区| 91精品无码人妻系列| 九九九精品色乱九九九| 久久↗↗|