亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

Vue 項目純前端解析預(yù)覽 PDF、DOCX、XLSX 完整方案

Vue 項目純前端解析預(yù)覽 PDF、DOCX、XLSX 完整方案 本地預(yù)覽 docx、xlsx、pdf 這類需求我這兩年在后臺管理系統(tǒng)、合同平臺、報表工具里反復(fù)接到過。最有意思的一次是客戶明確提要求文件不能上傳到服務(wù)器必須全在瀏覽器里解析渲染。當時第一反應(yīng)是這不是給自己找麻煩嗎但真做下來發(fā)現(xiàn)純前端解析這條路不僅能走通還能省掉一整套文件轉(zhuǎn)換服務(wù)。這篇就把 PDF、DOCX、XLSX 三種格式在 Vue 項目里的完整落地方案拆開講包含庫的選型理由、構(gòu)建工具的配合細節(jié)、性能取舍以及我實際踩過的那些坑。適合手里正卡在預(yù)覽功能上的前端同學(xué)也適合想搞清楚瀏覽器到底能解析多少 Office 格式的技術(shù)負責人。1. 為什么我最后選了純前端解析這條路接到預(yù)覽需求時多數(shù)團隊的第一反應(yīng)是后端轉(zhuǎn) PDF 或轉(zhuǎn)圖片前端只負責顯示一張圖。這個方案聽起來省事實際做起來賬并不好算。1.1 服務(wù)端轉(zhuǎn)換方案的三筆隱性成本第一筆是服務(wù)器資源。LibreOffice 無頭模式轉(zhuǎn)一份 20 頁帶圖表的 docx在 2 核 4G 的機器上大概要 3 到 8 秒并發(fā)上來之后 CPU 直接打滿你得單獨部署一個轉(zhuǎn)換服務(wù)還要做隊列和超時控制。第二筆是保真度損耗docx 轉(zhuǎn) PDF 之后字體替換、行距偏移、表格錯位是家常便飯用戶拿著原始文件和預(yù)覽頁面對不上投訴就來了。第三筆是隱私和合規(guī)合同、體檢報告、財務(wù)流水這類文件很多客戶在合同里就寫死了不得離開終端設(shè)備你一轉(zhuǎn)就是違規(guī)。純前端方案把這三筆賬一次性抹平文件從頭到尾留在內(nèi)存里解析耗時花在用戶自己的機器上服務(wù)器只承擔靜態(tài)資源分發(fā)。代價也很明確就是前端要引入幾個體積不小的解析庫以及要接受預(yù)覽效果和 Office 原生打開有差異這件事。提示純前端預(yù)覽的核心價值在于不上傳和即時反饋如果你的場景對像素級保真要求極高比如打印級排版校對那還是老老實實走服務(wù)端轉(zhuǎn)換不要硬扛。1.2 三種格式對應(yīng)三套完全不同的解析邏輯很多人以為預(yù)覽文件是一件事其實 PDF、DOCX、XLSX 在瀏覽器里是三套獨立的玩法。PDF 是渲染型的。它本質(zhì)上是一份指令列表告訴你在這里畫一條線、在那里貼一張圖、用這個字體渲染這串字符。pdfjs-dist 做的事就是把這份指令在 Canvas 上重放一遍。它不關(guān)心內(nèi)容語義只管畫得像不像。DOCX 是結(jié)構(gòu)型的。它其實是一個 zip 包里面塞了一堆 XMLword/document.xml存正文word/styles.xml存樣式word/media/存圖片。解析它等于要把 OOXML 那套復(fù)雜的樣式繼承體系翻譯成 HTML 和 CSS。這個翻譯過程注定有損耗因為 Word 的排版模型和瀏覽器的盒模型根本不是一回事。XLSX 是數(shù)據(jù)型的。它同樣是 zip但重點是xl/worksheets/sheet1.xml里的單元格值和xl/sharedStrings.xml里的共享字符串。你要做的是把稀疏的單元格坐標還原成二維表格。這里最難的不是讀數(shù)據(jù)而是處理合并單元格、列寬、日期格式這些看起來是樣式、實際影響可讀性的東西。理解了這三種差異選型思路就清楚了PDF 用 pdfjs-distDOCX 用 docx-previewXLSX 用 SheetJS三套庫分工明確不要指望一個庫通吃。1.3 輸入形態(tài)統(tǒng)一成 ArrayBuffer 是省事的關(guān)鍵這三個庫對輸入的接受度不太一樣pdfjs 接受 URL、Uint8Array、ArrayBufferdocx-preview 接受 Blob、ArrayBuffer、Uint8ArraySheetJS 的read接受 array、binary、base64、buffer 等類型靠type參數(shù)區(qū)分。我最后統(tǒng)一的做法是不管外界傳進來的是File、Blob還是ArrayBuffer都在組件入口處轉(zhuǎn)成ArrayBuffer然后按需切片。async function toArrayBuffer(input) { if (input instanceof ArrayBuffer) return input if (input instanceof Blob) return await input.arrayBuffer() throw new Error(不支持的文件輸入類型) }這么做有兩個好處。一是各個渲染分支的參數(shù)寫法統(tǒng)一了不用在每個庫里判斷類型。二是ArrayBuffer是純內(nèi)存對象沒有 URL 生命周期問題不會像URL.createObjectURL那樣忘了 revoke 就泄漏。代價是同一份數(shù)據(jù)可能被多個庫各持有一份引用超大文件要注意內(nèi)存后面第 5 節(jié)會講怎么釋放。2. PDFpdfjs-dist 在 Vue 里的正確打開方式pdfjs-dist 是三個庫里最容易出問題的一個因為它依賴 Web Worker而 Worker 的加載方式和你的構(gòu)建工具強相關(guān)。我見過太多人卡在第一步就沒往前走。2.1 Worker 加載失敗是最高頻的第一道坎裝完庫直接import * as pdfjsLib from pdfjs-dist然后調(diào)getDocument控制臺大概率會甩一個Setting up fake worker failed或者 404。原因是 pdfjs 把解析邏輯放在pdf.worker.js里主線程只是調(diào)度Worker 文件必須能被瀏覽器單獨請求到。Vite 項目里我推薦用?url后綴讓構(gòu)建工具把文件處理成靜態(tài)資源import * as pdfjsLib from pdfjs-dist import PdfWorker from pdfjs-dist/build/pdf.worker.min.mjs?url pdfjsLib.GlobalWorkerOptions.workerSrc PdfWorkerWebpack 5 項目寫法不同要用new URL語法pdfjsLib.GlobalWorkerOptions.workerSrc new URL( pdfjs-dist/build/pdf.worker.min.mjs, import.meta.url ).toString()這里有個版本坑必須提醒pdfjs-dist 3.x 的 worker 文件是.js4.x 之后改成了.mjsESM 模塊。如果你從網(wǎng)上抄了一段 3.x 的代碼裝到 4.x 上路徑對不上一樣 404。另外 Vite 的預(yù)構(gòu)建有時候會把 worker 也一起打包反而搞壞路徑加一句配置更保險// vite.config.js export default defineConfig({ optimizeDeps: { exclude: [pdfjs-dist] } })2.2 Canvas 渲染的三個參數(shù)決定了清晰度Worker 配好之后渲染一頁 PDF 的代碼本身很短但有幾個參數(shù)直接決定成品質(zhì)量const pdf await pdfjsLib.getDocument({ data: buffer }).promise const page await pdf.getPage(1) const viewport page.getViewport({ scale: 1.5 }) const canvas canvasRef.value const ctx canvas.getContext(2d) const dpr window.devicePixelRatio || 1 canvas.width Math.floor(viewport.width * dpr) canvas.height Math.floor(viewport.height * dpr) canvas.style.width ${Math.floor(viewport.width)}px canvas.style.height ${Math.floor(viewport.height)}px await page.render({ canvasContext: ctx, viewport, transform: dpr ! 1 ? [dpr, 0, 0, dpr, 0, 0] : null }).promisescale控制邏輯尺寸縮放功能就靠它用戶點放大就是scale * 1.2重新渲染。devicePixelRatio決定物理像素密度不處理的話在高分屏上文字邊緣會發(fā)虛。transform是把 DPR 縮放應(yīng)用到繪制上下文上很多人只改了canvas.width卻忘了transform結(jié)果畫布變大了但內(nèi)容還是原尺寸右下角一片空白。注意縮放后必須重新調(diào)用render不能靠 CSStransform: scale()糊弄。CSS 縮放會讓已經(jīng)柵格化的位圖被拉伸字跡立刻變糊而且文字層的位置也會跟著錯位。2.3 多頁渲染要做懶加載而不是一次性鋪開一份 50 頁的 PDF如果一進來就把 50 個 Canvas 全渲染出來內(nèi)存占用輕松上 G頁面直接卡死。我的做法是給每一頁占一個容器容器高度按第一頁的 viewport 預(yù)估然后用IntersectionObserver監(jiān)聽只有進入視口前后一定范圍才真正渲染。const observer new IntersectionObserver((entries) { entries.forEach((entry) { const index Number(entry.target.dataset.page) if (entry.isIntersecting) { renderPage(index) } }) }, { rootMargin: 200px 0px })rootMargin給 200px 是為了讓用戶滑動時提前渲染避免看到白屏。同時我給已渲染的頁做了數(shù)量上限比如同時只保留 10 頁的 Canvas 內(nèi)容超出范圍的頁調(diào)用page.cleanup()并把 Canvas 寬高置零把位圖內(nèi)存還回去。這一招在移動端特別管用不做的話 iOS Safari 很容易因為內(nèi)存超限直接刷新頁面。2.4 文字層不是可有可無的裝飾只渲染 Canvas 的話PDF 里的文字是畫上去的用戶沒法選中、沒法搜索、沒法復(fù)制。要恢復(fù)這些能力得額外渲染一個文字層用page.getTextContent()拿到每個文本片段的內(nèi)容和變換矩陣然后生成一堆絕對定位的透明span蓋在 Canvas 上。pdfjs 4.x 提供了TextLayer類比自己手寫省事const textContent await page.getTextContent() const textLayer new pdfjsLib.TextLayer({ textContentSource: textContent, container: textLayerDiv.value, viewport }) await textLayer.render()對應(yīng)的 CSS 里文字層容器要position: absolute; inset: 0;里面的 span 用color: transparent;選中時的背景色通過::selection自定義。字體大小需要用--scale-factor這個 CSS 變量來配合否則文字位置會和 Canvas 上的實際位置對不齊。這一塊調(diào)試起來比較費勁我的經(jīng)驗是先把 Canvas 渲染對準了再弄文字層不要兩個一起調(diào)。3. DOCXdocx-preview 的樣式還原與它的脾氣DOCX 預(yù)覽的難點從來不是能不能顯示內(nèi)容而是顯示得像不像。我試過三條路線最后穩(wěn)定在 docx-preview 上。3.1 三條解析路線各自的適用場景第一條是mammoth.js。它走的是語義轉(zhuǎn)換路線把 Word 的Heading 1轉(zhuǎn)成h1、把Strong轉(zhuǎn)成strong輸出的 HTML 非常干凈。但它會主動丟棄大量排版信息表格邊框、段落縮進、頁邊距基本都沒了。如果你的需求是把文檔內(nèi)容提取出來展示在移動端mammoth 是首選如果是讓用戶看到和 Word 里一樣的效果它不合適。第二條是docx-preview。它走的是像素級還原路線直接解析 OOXML把每個段落、每個 run 的樣式都翻譯成內(nèi)聯(lián) CSS連頁眉頁腳、分頁符、腳注都能處理。代價是輸出 DOM 非常龐大一份 10 頁文檔能生成幾千個節(jié)點而且它對某些復(fù)雜排版比如文本框、藝術(shù)字支持有限。第三條是自研。用 JSZip 解開 docx自己解析document.xml再自己寫渲染邏輯。我試過一周之后放棄了——OOXML 的樣式繼承鏈太深styles.xml里的樣式可以被document.xml里的直接格式覆蓋還有basedOn的繼承關(guān)系工作量遠超預(yù)期。除非你有非常特殊的定制需求否則不建議走這條。3.2 renderAsync 的 options 里哪幾個必須調(diào)docx-preview 的主 API 是renderAsync第四個參數(shù)是一堆開關(guān)默認值并不適合所有場景import { renderAsync } from docx-preview await renderAsync(blob, containerRef.value, undefined, { className: docx-preview, inWrapper: true, ignoreWidth: false, ignoreHeight: true, ignoreFonts: false, breakPages: true, renderHeaders: true, renderFooters: true, renderFootnotes: true, ignoreLastRenderedPageBreak: true, useBase64URL: true, experimental: true })ignoreWidth我留成了false讓 docx-preview 按文檔里的紙張寬度設(shè)置元素寬度這樣表格和頁邊距才是對的。但副作用是內(nèi)容寬度可能超過容器需要外層包一個overflow-x: auto的滾動容器。ignoreHeight我改成了true。因為 Word 里的分頁高度是固定的 A4 高度瀏覽器里按這個高度切頁會出現(xiàn)大片空白或者內(nèi)容被截斷關(guān)掉之后讓內(nèi)容自然流動更合理。renderHeaders和renderFooters看需求。如果只是給用戶快速看內(nèi)容關(guān)掉能省不少 DOM。如果是合同類文件頁眉里的合同編號、頁腳里的頁碼是有意義的那就打開。useBase64URL建議開啟。默認情況下 docx-preview 會把圖片轉(zhuǎn)成 blob URL文檔切換頻繁時容易泄漏用 base64 雖然會讓 DOM 體積大一些但至少沒有生命周期問題。如果文檔里圖片特別多特別大那還是用 blob URL 并在組件卸載時統(tǒng)一 revoke。3.3 中文文檔跑版的兩個真實原因中文 docx 預(yù)覽最常被吐槽的是字變了、行距不對、換行位置不一樣。這基本不是庫的 bug而是兩個客觀原因。第一個是字體缺失。Word 文檔里寫的是宋體仿宋_GB2312方正小標宋這類字體名但用戶的瀏覽器所在系統(tǒng)不一定裝了這些字體瀏覽器只能回退到默認字體字形寬度一變換行位置全亂。我的處理方式是給預(yù)覽容器指定一個字體棧兜底.docx-preview { font-family: SimSun, Songti SC, Microsoft YaHei, sans-serif; line-height: 1.6; }同時把ignoreFonts保持false讓文檔自己的字體設(shè)置生效——裝了字體的用戶能看到原樣沒裝的用戶至少有合理回退。第二個是行距計算基準不同。Word 的行距是按行這個排版單位算的瀏覽器是按line-height的倍數(shù)算的兩者對同一份w:spacing的解讀有細微差異。這個沒法完美解決只能接受。我一般會在預(yù)覽區(qū)頂部加一行小字說明預(yù)覽效果與實際排版可能存在細微差異把用戶預(yù)期先降下來。3.4 大文檔的性能處理docx-preview 是同步解析整份文檔的主線程會阻塞。一份 30 頁帶 50 張圖的文檔解析加渲染能卡住兩三秒。我做了兩件事緩解。一是渲染前先顯示骨架屏并且用setTimeout讓出一次事件循環(huán)保證 loading 狀態(tài)能先畫出來。二是用requestIdleCallback或者 Web Worker 做預(yù)解析——不過 docx-preview 內(nèi)部依賴 DOM不能直接扔進 Worker所以我的做法是把 JSZip 解壓和 XML 解析這部分提前放到 Worker 里拿到 XML 字符串之后再回主線程渲染。這個改造有點重只有在對大文檔體驗要求很高時才值得做。4. XLSX把二維數(shù)據(jù)還原成表格而不是一堆字符串Excel 預(yù)覽我見過最多的錯誤實現(xiàn)是拿sheet_to_json轉(zhuǎn)出對象數(shù)組然后v-for渲染成table。結(jié)果是日期變成一串 4 萬多的數(shù)字合并單元格全散開列寬全一樣。這里面的細節(jié)值得單獨講一節(jié)。4.1 read 和 sheet_to_json 的參數(shù)決定了數(shù)據(jù)質(zhì)量import * as XLSX from xlsx const wb XLSX.read(buffer, { type: array, cellDates: true, cellStyles: true, cellNF: true, sheetStubs: true }) const ws wb.Sheets[wb.SheetNames[0]] const rows XLSX.utils.sheet_to_json(ws, { header: 1, raw: false, defval: , blankrows: true })cellDates: true是必須的。不開這個參數(shù)日期列讀出來就是 Excel 序列號比如 45123因為 xlsx 存儲日期用的就是從 1900 年 1 月 1 日起的天數(shù)。開了之后 SheetJS 會按單元格的格式判斷轉(zhuǎn)成 JS Date。raw: false配合cellNF: true也很有用。它讓 SheetJS 按照單元格的數(shù)字格式輸出字符串百分比顯示成12.5%、貨幣帶上符號、保留位數(shù)也按格式來。但要注意raw: false之后數(shù)字都變字符串了如果后續(xù)要做數(shù)值排序或者統(tǒng)計得單獨再讀一份raw: true的數(shù)據(jù)。我的做法是同時保留兩份展示用格式化后的排序按原始值。header: 1表示按行輸出數(shù)組而不是對象。這在預(yù)覽場景下更通用因為很多表格第一行不是表頭或者有合并的大標題按對象輸出反而會丟數(shù)據(jù)。4.2 合并單元格必須自己算 rowspan 和 colspansheet_to_json完全不管合并單元格它只在左上角單元格返回值其余位置是空。要正確渲染得用ws[!merges]手動處理function buildMergeMap(merges []) { const spanMap new Map() const skipSet new Set() merges.forEach((m) { const key ${m.s.r}:${m.s.c} spanMap.set(key, { rowspan: m.e.r - m.s.r 1, colspan: m.e.c - m.s.c 1 }) for (let r m.s.r; r m.e.r; r) { for (let c m.s.c; c m.e.c; c) { if (r m.s.r c m.s.c) continue skipSet.add(${r}:${c}) } } }) return { spanMap, skipSet } }渲染時遇到在skipSet里的單元格直接continue跳過遇到在spanMap里的就給td加上對應(yīng)的rowspan和colspan。這套邏輯不復(fù)雜但不寫就是會錯。列寬用ws[!cols]行高用ws[!rows]。列寬的字段是wch字符寬度或wpx像素寬度優(yōu)先用wpx沒有的話按wch * 7 5估算成像素。行高一般用hpx取不到就統(tǒng)一給 28px。4.3 大數(shù)據(jù)量下我放棄了虛擬滾動改用分頁一萬行的 Excel 太常見了。如果直接渲染一萬個tr瀏覽器的布局計算會直接把頁面凍住十幾秒。我一開始上的是虛擬滾動但表格虛擬滾動有個硬傷行高不是固定的內(nèi)容換行的行長不一樣一旦行高動態(tài)變化虛擬滾動的定位就全亂了。后來我換成固定行高 分頁。每頁渲染 200 行用table-layout: fixed鎖死列寬超出寬度的文本用text-overflow: ellipsis截斷鼠標懸停用原生title屬性顯示完整內(nèi)容。這個方案看起來土但實際體驗非常好翻頁幾乎瞬間完成滾動順滑還省掉了虛擬滾動那一堆邊界情況處理。實測數(shù)據(jù)供參考在 2021 款 MacBook Pro 上一個 8MB 的 xlsx 文件約 6 萬行、12 列XLSX.read耗時約 2.1 秒sheet_to_json轉(zhuǎn)換約 0.4 秒渲染首屏 200 行約 60 毫秒。這兩秒多的解析時間是省不掉的所以我一定會給一個明確的進度提示而不是轉(zhuǎn)個圈讓用戶干等。4.4 樣式還原不了那就舍掉必須坦白SheetJS 社區(qū)版的cellStyles拿不到完整的填充色、字體色、邊框這些視覺樣式。想要完整樣式得用商業(yè)版或者換 exceljs 從底層 XML 里摳——但那會讓整個解析流程復(fù)雜度翻好幾倍。我的取舍是只還原影響可讀性的結(jié)構(gòu)性樣式也就是合并單元格、列寬、行高、對齊方式、數(shù)字格式、加粗。填充色和邊框統(tǒng)一用一套干凈的表格 CSS 代替反而比原來花花綠綠的表看著舒服。提示對齊方式從ws[cell].s.alignment.horizontal取社區(qū)版能拿到一部分。如果取不到就按數(shù)據(jù)類型猜——數(shù)字右對齊、文本左對齊、布爾和錯誤值居中這個規(guī)則和 Excel 默認可視行為基本一致。5. 落地到 Vue 組件統(tǒng)一入口、按需加載與資源清理講完三種格式各自的實現(xiàn)真正讓代碼可控的是把它們收進一個統(tǒng)一的 Vue 組件里。我用的是 Vue 3 的script setup但思路在 Options API 和 Vue 2 里同樣適用。5.1 一個組件管三種格式的接口設(shè)計對外只暴露最少的接口內(nèi)部自己做分派script setup import { ref, watch, onBeforeUnmount, nextTick } from vue const props defineProps({ file: { type: [File, Blob, ArrayBuffer], required: true }, fileName: { type: String, default: }, zoom: { type: Number, default: 1 } }) const emit defineEmits([loaded, error]) const wrapperRef ref(null) const loading ref(false) function detectType(name, buffer) { const ext name.split(.).pop()?.toLowerCase() if (ext pdf) return pdf if (ext docx) return docx if (ext xlsx || ext xls) return xlsx return sniffMagic(buffer) } /scriptsniffMagic是兜底用的魔數(shù)檢測主要防兩種臟情況用戶把.doc改名成.docx或者文件名被后端處理丟了擴展名。PDF 的魔數(shù)是開頭 5 個字節(jié)%PDF-docx 和 xlsx 都是 zip開頭 4 字節(jié)都是PK\x03\x04要再深入一步——讀[Content_Types].xml里的內(nèi)容類型區(qū)分或者直接在字節(jié)流里搜word/和xl/這兩個路徑片段。后者簡單粗暴但足夠用。這里有個真實的坑input typefile拿到的File對象是只讀的但ArrayBuffer可以被讀取任意次而不消耗。所以我在組件內(nèi)部第一步就把File轉(zhuǎn)成ArrayBuffer存起來避免切換格式或者重渲染時文件已經(jīng)被讀走了。這個在 Streams API 場景下尤其重要。5.2 動態(tài) import 把首屏體積壓下來三個庫的打包體積加起來接近 2MBpdfjs-dist 約 400KBdocx-preview 約 300KBxlsx 約 900KB。如果全塞進首屏 bundle頁面加載會非常難看。我的做法是全部改成動態(tài) import在真正需要渲染時才加載對應(yīng)庫async function renderPdf(buffer) { const pdfjsLib await import(pdfjs-dist) const workerUrl (await import(pdfjs-dist/build/pdf.worker.min.mjs?url)).default pdfjsLib.GlobalWorkerOptions.workerSrc workerUrl // ...渲染邏輯 }配合 Vite 的build.rollupOptions.output.manualChunks把這三個庫拆到獨立 chunk瀏覽器緩存粒度也更細——用戶第二次打開同一個頁面這些 chunk 直接命中緩存。xlsx 這個庫可以額外說一下體積優(yōu)化。npm 上的xlsx包是完整版包含讀寫能力和所有格式支持。如果你只需要讀 xlsx不需要寫、不需要讀 xls 老格式、不需要 ods可以用它的精簡構(gòu)建xlsx/dist/xlsx.mini.min.js體積能砍掉一大半。我一般會在項目里鎖定版本號因為這個包在小版本之間偶爾會有 API 行為變化。5.3 卸載時的資源清理清單預(yù)覽組件最容易出問題的場景是用戶在一個列表頁里連續(xù)點開十份文件。如果不清理內(nèi)存會一路漲上去。我列了一份卸載清單每次切換文件或組件銷毀時都執(zhí)行資源類型釋放方式不釋放的后果PDF 文檔對象pdf.destroy()Worker 常駐內(nèi)存多份文檔疊加PDF 頁面對象page.cleanup()頁面位圖占用不回收Canvas 位圖canvas.width 0; canvas.height 0大尺寸位圖駐留顯存Blob URLURL.revokeObjectURL(url)內(nèi)存泄漏頁面越用越卡未完成的渲染任務(wù)renderTask.cancel()切換文件時報錯控制臺刷屏IntersectionObserverobserver.disconnect()觀察器持續(xù)持有 DOM 引用renderTask.cancel()這個特別重要。用戶在渲染一份大 PDF 的過程中切換到另一個文件原來的渲染任務(wù)還在跑新任務(wù)又開始了兩者共用一個 Canvas 上下文會拋出Cannot use the same canvas during multiple render() operations這樣的錯誤。我在每次渲染前都先檢查有沒有未完成的任務(wù)有就取消掉。5.4 移動端的額外注意事項移動端有三個和桌面端不同的地方。一是iOS 的內(nèi)存上限。Safari 對單個標簽頁的 Canvas 內(nèi)存有硬限制超了會直接白屏刷新。所以移動端我把同時渲染的 PDF 頁數(shù)從 10 頁壓到 3 頁圖片也做降采樣。二是手勢縮放沖突。用戶雙指縮放時瀏覽器會縮放整個頁面同時我又在做 Canvas 重繪兩者打架。解決辦法是在預(yù)覽容器上加touch-action: pan-x pan-y禁掉瀏覽器的默認縮放自己用按鈕控制縮放比例。三是軟鍵盤和橫豎屏切換。Excel 預(yù)覽的寬表格在豎屏下必然要橫向滾動我會在檢測到屏幕寬度小于 768px 時自動切到一個卡片式的降級展示——每行顯示成一張小卡片字段名和值上下排列可讀性反而比橫向滾動的表格好得多。6. 我踩過的幾個坑和對應(yīng)的排查路徑前面講了方案這一節(jié)專門講排錯。我按現(xiàn)象 → 排查路徑 → 根因 → 修復(fù)的結(jié)構(gòu)寫方便你照著復(fù)現(xiàn)。6.1 worker 404 的三層排查法現(xiàn)象控制臺報Setting up fake worker failed: Cannot load script at ...PDF 渲染不出來。排查路徑是這樣的第一步打開 Network 面板過濾worker關(guān)鍵字看有沒有一個 404 的請求。有 404 說明路徑不對沒請求說明配置壓根沒生效。第二步如果有請求但 404看請求的 URL 長什么樣。如果是http://localhost:5173/node_modules/pdfjs-dist/...那是?url后綴沒加Vite 把它當源碼處理了。如果是一個帶 hash 的路徑但請求不到那是構(gòu)建產(chǎn)物路徑錯了檢查base配置。第三步如果壓根沒有請求檢查GlobalWorkerOptions.workerSrc是不是在調(diào)用getDocument之前就賦值了。這個賦值必須放在最前面晚一步都會 fallback 到 fake worker。根因基本就是這三種路徑?jīng)]處理、構(gòu)建配置干擾、賦值時序不對。我把這三步寫成了一個團隊內(nèi)的排查清單新人踩這個坑基本五分鐘能解決。6.2 打包后體積翻倍的重復(fù)打包問題現(xiàn)象本地 dev 環(huán)境正常npm run build之后產(chǎn)物里出現(xiàn)了兩份 pdfjs 代碼體積比預(yù)期大一倍。排查方式是跑npx vite-bundle-visualizer或者rollup-plugin-visualizer看 chunk 圖里有沒有重復(fù)模塊。根因通常是同時用了靜態(tài) import 和動態(tài) import。比如某個工具文件里import * as pdfjsLib from pdfjs-dist靜態(tài)引入了組件里又await import(pdfjs-dist)動態(tài)引入Rollup 會把兩份都留下。修復(fù)就是全局搜一遍把所有靜態(tài)引入改成動態(tài)引入或者反過來全部靜態(tài)引入但配置manualChunks拆包。注意optimizeDeps.exclude加上之后dev 環(huán)境的依賴預(yù)構(gòu)建不處理這個包冷啟動會慢一點這是正常代價。6.3 頁面越用越卡一次 blob URL 泄漏的完整定位現(xiàn)象預(yù)覽頁面打開十幾次文件之后切換文件明顯變慢打開 DevTools 的 Memory 面板做堆快照發(fā)現(xiàn)有一堆Blob對象沒被回收。定位過程先做一次 GC拍快照切換到下一個文件再拍一次對比兩次快照之間新增且未釋放的對象。找到引用鏈之后發(fā)現(xiàn)是 docx-preview 內(nèi)部為圖片生成的 blob URL組件卸載時沒人 revoke。修復(fù)方案是加一個 URL 收集器const blobUrls new Set() function trackBlobUrl(blob) { const url URL.createObjectURL(blob) blobUrls.add(url) return url } function releaseAll() { blobUrls.forEach((url) URL.revokeObjectURL(url)) blobUrls.clear() } onBeforeUnmount(releaseAll)更省事的辦法是前面提到的useBase64URL: true直接不用 blob URL但代價是 DOM 體積變大。我現(xiàn)在的策略是文檔里的圖片少于 20 張就用 base64超過就走 blob URL 主動回收。6.4 加密文件和損壞文件的優(yōu)雅降級用戶上傳一份加了密碼的 PDFgetDocument會 reject如果不處理就是控制臺一片紅加白屏。pdfjs 提供了密碼回調(diào)const task pdfjsLib.getDocument({ data: buffer, onPassword: (callback, reason) { // reason 為 1 表示需要密碼為 2 表示密碼錯誤 const pwd window.prompt(reason 1 ? 請輸入文件密碼 : 密碼錯誤請重新輸入) if (pwd) callback(pwd) else task.destroy() } })自己做一個密碼輸入框比prompt體驗好得多但思路一樣把密碼交給回調(diào)讓 pdfjs 自己解。損壞文件更簡單三個庫都會拋異常用 try/catch 統(tǒng)一包住給用戶一個文件無法解析請確認文件是否完整的提示就行。我額外做了一件事把錯誤對象打上用戶可見的標記方便客服定位問題時能區(qū)分文件壞了和代碼崩了。這兩種情況給用戶的提示文案應(yīng)該完全不同——前者讓用戶換文件后者讓用戶刷新重試。最后分享一個我項目里用得最多的經(jīng)驗。瀏覽器端解析這件事最大的風險不是技術(shù)實現(xiàn)而是用戶預(yù)期。用戶拿著 Word 打開的效果來對比你的預(yù)覽頁面任何差異都會被當成 bug。所以我現(xiàn)在做這類功能一定會在第一版就把差異說明和下載原文件兩個入口放在顯眼位置——讓用戶隨時能回到原生程序里查看比你在前端死磕像素級還原要劃算得多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99久久精品欧美国产| 中文无码一二三区| 国产超碰97| 婷婷在线视频在线观看| 精品少妇99| 99这里只有精品| 国产精品人妻免费精品| 亚州熟妇精品| 天天色综合图片| 2025年A片视频精品| 蜜臀AV成人精品蜜臀AV久久| 精品一区二区三区蜜桃臀赵总 | 精品亚洲俞拍视频一区| 欧美久热| 国产精品无码av| 午夜天堂精品久久| 色婷网| 五月天婷婷欧美三区| 中文乱码99| 国产啊v在线免费播放| 老鸭窝成人| 九九玖玖精品| 欧美日韩性爱视屏免费看了| 91成人18| 天天综合,91入口| 天天淫人人妻日日色| 久草视频在线视频在线视频在线观看 | 亚欧毛片基地国产毛片基地| 美女骚尻视频| 偷拍在线观看视频| 神马久久久久眼| 日本操逼视频不卡直接放| 亚洲欧美综合图片| 欧美淫乱视频| 亚洲人91| 久久动漫精品视频这里只有精品| 91在线免费观看处女| 美女操逼A A| 国产精品久久久久久久久久久久久久吹| 成人色女网| 九九碰九九爱97| 亚洲 日本 国产 综合| 综合网91| 精品国产乱码久久久A| 偷拍五区| 欧美日韩99精品麻豆传媒| 中文字幕奈奈美被公侵犯| 欧洲一区二区三区四区在线观看| 久久超碰、| 亚洲成人综合在线| 探花精品视频| 超碰在线看| 人妻少妇av在线观看| 一起草三级AV电影在线观看| 亚洲国产成人综合碰碰三级经典| 9Ⅰ老熟女| 青青草一区二区高清无码视频| 久久鲁夜| 91 亚洲情侣偷拍 久久| 日韩中文字幕2020| 国产精品视频播放| 欧洲性人爱视频| 欧美色日本| 97超碰天天爱天天爱| 97久精品| 欧美另类自拍 | 亚洲欧洲日产国产综合网| 99热超碰| 久久久国产精品人妻丝袜| 亚洲精品一区二区三区新线路| 黄片www.| 久久侵犯人妻爽爽爽| 日韩免费人妻色情网站| 九九热免费国产视频婷婷伊人五月 | 日本www操操操| 亚洲图片欧洲图片aⅴ| 欧美一级特黄淫片在线观看| 麻豆这里只有精品| 亚洲麻豆精品二区三区| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 国产丝袜美女诱惑| 国产亚卅97| 亚洲综合九| 欧美少妇高潮| 激情 欧美 亚洲 小说| 色哟哟511老熟女| 天天色播亚洲综合网站| 成人贴图日韩欧美| 都市激情人妻一区二区青青操视频| 亚洲一区二区 麻豆传媒| 精品人妻视频一区二区在线播放| 偷拍精品一区二区三区| 99激情视频| 91jk色拍| 日韩性爱一级片| 男女激情黄色网址| 精品丰满人妻一区二区三区免费观| 97干日韩| 玖玖大干人妻| 久久精品国产AV一区二区三区| 国产综合网站在线播放| 欧美一区二区在线资源| 婷婷丁香人妻 | 欧美激情总合网| 十八禁黄色成人网站观看| 97久久国产亚洲精品超碰热| 国产午夜福利专区综合| 99精品视频在线观看免费| 亚洲色色色| 情色五月天网| 中文字幕精品免费一区二区| 大黄片做爱的大的| 日本丝袜美腿人妻九九| 后入国产| 99婷婷| 日本不卡码黄色 | 亚洲国产精品9999在线观看| 五月丁香综合啪啪| 足交视频老司机| 欧美欧美啪啪视频| 少妇 综合| 日韩97视频| 亚洲激情在线观看一区| 久久一区无码| 97视频在线| 日日夜夜干| 日韩欧美蜜桃精品久久中文字幕久久| 免费1级a做爰片观看| 伊人久久88国产女| 成人无码欧美一级A片狼牙直播| 国产1024在线播放| 蜜色网色哟哟| 欧美性xxxxx狂欢| 精品无码不卡视频| 97色涩| 国产精品麻豆成人av| 99色热| 久久大香蕉97| 青草青青久久久久久国产| 亚洲天在线| 欧美黄片欧美黄片xxx| 久久99草| 超碰人人干| 亚洲第91页| 深夜激情| 新版天堂中文资源8在线| 男人的天堂2010| 亚洲综合性网址| 国产一区二区三区久久久精品| 亭亭丁香激情| 欧美日韩日产免费网站看| 99色视频| 国产午夜在线观看视频| 亚洲色图 综合| 国产成人精品无码久久| www. 男人天堂成人在线| 午夜亚洲WWW湿好大| 国产极品久久久| 欧美亚洲天堂| 亚洲男人的天堂在线看| 97任你吞精| 九九九久久久W精品| 丁香六月婷婷| 97超碰超碰| 亚洲 图片 欧美 色图| 国产精品嫩草影院午夜两性| 人妻内射一区二区在线视频| 色婷五月| 亚洲最大成人a毛毛片| 美女尤物福利视频| 91久久久亚洲| 天天爽夜夜欢视| 亚洲免费成人在线高清无码视频 | 伊人丁香五月婷婷| 深夜激情| 熟女一区二区三区| 久久久久久久 九九九九九九九 | 在线亚洲精品久久久| 无色无码| 另类图片综合| 熟女精品一区二区在线观看| 97色碰| 色婷婷国产精品一区在线观看| 日本超碰97日韩精品人妻| 免费啪啪一级视频| 蜜臀无码视频在线观看| 中文字幕视频免费| 狠狠夜色午夜久久综合在线| 国产激情综合五月久久| 国产又黄又粗的视频| 97久操| 麻豆av一区二区三区| 亚洲乱码国产乱码精网站| 9118禁| 农村妇女精品一区二区| 中文伊人大香蕉视频| 日韩激情啪啪啪| 69天堂| 欧美色色人| 快点操死我| 免费人成?大片在线播放| 亚洲欧美另类激情小说| 日韩精品一区二区人人人| 午夜欧美J进J出白浆流出久久久| 婷婷月色| 国产亚州日韩欧美看片| 午夜国产乱伦视频| 色婷婷国产精品一区在线观看| 人妻天天爽| 日日日啊啊啊| 国内91熟女人妻丝袜天天精品视频在线| 2024黄色视频| 欧美成人性活片| 九九九不卡| 狠狠做深爱婷婷久久二区| 国产高清1234区| 开心激情婷婷| 色情成人五月天| 欧美黄片欧美黄片xxx| 精品久久无码午夜福利| 久久av无码| 亚洲一区日韩精品中文字幕| 久久久精品中文字幕爱豆| 夜夜骑夜夜操| 日本黄色精品专区网站| 日本性爱欧美性爱| 中文字幕一区二区在线日韩精品| 啪啪啪精品视频| 成人激情无码在线视频| 日韩人成网站在线播放| 久久精品国产亚洲AV片多多 | 人人爱人人操人人性| 国产成人99久久亚洲综合| 天天插网| 亚洲综合首页| 激情五月综合开心五月| 少妇一级婬片免费放一级a性色.| 日韩在线观看字幕精品| 国产农村一一级特黄毛片| 人妻精品一区二区在线| 婷婷五月天网| 99九九久久| 色网在线| 老司机香蕉久久久久| 哑洲在线| 东京热一区二区中文字幕| 日产操逼| 成人免费不卡在线视频| 日日夜夜干| 亚洲成人一二三区| 综合情欲网| 人妻久久一区二区三区| 欧美五十路熟| 亚洲综合色网| 青青草视频导航官网| 乱子伦一区二区三区国产精品| 久久免费精品96| 日本加勒比无码专区一二三| 国内一级精品| 国产中文大片资源中文字幕| 黄色污污污污污污网站| 国产情色第一第二页在线观看| 天天躁夜夜躁狠狠躁AV| 天天上日日上日韩精品| 亚洲经典啪啪| 欧美72网页| 国产精品久久久午夜夜伦鲁鲁| 欧美综合自拍| aⅴ日韩成人电影av在线免费看av大全| 色综合久| 欧美日本久久精品一区 | 夜夜欢天天干| 亚洲97久久精品亚洲| 日本99视频| 屌妞视频久久久久久久久久久久| 亚洲男人天堂2017| 999岛国大片| 夜夜嗷嗷一区二区| 久久一区二区三区四区五区| 探花熟女,姿勢到位,體驗感也到位| 九九久久精品| 美女网站黄页| 二男一女成人A片| 五月丁香久久| 久久久一二三四区| 欧美极品| 亚洲字幕一区二区| 成人色女网| 葡萄牙性视频一二区| 国产熟女完整版中字| 丰满人妻一区二区三区四| 欧美性五月| 2018天天干在线视频| 偷拍欧美综合| 丰满人妻一区二区三区免费| 八人操人人摸人人看| 99re69综合| 午夜爽爽爽| 国产成人久久久精品免费AV| 一卡二卡在线播放| 亚洲图片偷拍视频区| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 亚洲九月丁香| 亚洲黄色网址| 精品一二三区久久AAA片| 久久国产精品,久久国产| 亚洲色图综合| 成人影 天天操 亚洲| 骚女天天综合网| 国产精品一区二区黄片| 中文字幕av片| 人人摸人人摸人人干| 欧美日本天堂| 亚洲天堂AV在线播放| 密臀AV在线| 日韩性爱1级片视频| 97久久久精品| 亚洲αv一区二区三区| 日韩淫色网| 日韩人妻免费精品| 亚洲乱熟女一区二区| 一区二区三区视频在线观看免费| 少妇九九九九| 亚洲欧美九九| 成人97人人超碰人人| 人妻熟女一区二区三区在线| 日韩精品在线观看观看| 欧美色蜜桃97| 久久国产视频专区一二三| 一级乱伦网站| 日韩色图 一区二区| 精品一二三区久久AAA片| 99热这里只有精品1| 草草影院日本第一页| 国产第11页| 亚洲一本大道中文字幕无码在线| 人妻久久一区二区三区| 午夜啊啊啊| 思思热在线cao| 精品二区久久| 麻豆乱码久久精| 26uuu国产日韩综合在线观看| 人妻素股| ss久久| 中文字幕交换人妻| 黄页av| 伊人久久大香线综合无码| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 搡老熟女免费视频| 97视频在线观看网站| 欧美九9 9 9| 91视频伊人| 青青草国产一区二区三区| 91麻豆天美国产欧美日| 视频国产精品未满十八禁止在线观看| 丝袜AV一区二区三区| 麻豆国产av网| 日本久久精品| 日韩精品黄片免费观看| 超碰精品日韩欧美国产| 亚州,欧美在线| 天天天肏屄欧美| 欧美日日夜夜| av资源在线观看少妇| 亚洲 在线| 国产丸一视频| 亚洲 综合 第一页| 精品美女少妇一区二区三区| 欧美日本久久精品一区| 99热精品在线| 国产精品自产拍在线观看社区| 黄色片A级一区二区三区| 99精品九九九九九九| 少妇熟女视频一区二区三区| 久婷婷一区| 青娱乐导航AV| 人人澡人人爽人人精品| 99久热| 日本在线视频导航| 亚洲精品aa久久伊人| 亚洲 小说 欧美 激情 另类| 亚洲欧洲成人在线电影| 91视频在线观看18| 亚洲美女av无码| 国产久久天堂资源| 久久久无码精品人妻二区| 内射中国少妇高清视频免费视频| 国产熟女| 久久精品高清无码一区| 亚洲综合贴图91| 丁香五月自拍| 男人夜色天堂ss| 五月丁香六月激情综合| 任你艹| 熟妇熟女视频一区二区三区| 日本一级二级三级网站| 强奸乱伦资源| 日韩有码免费视频| 淫色网综合| 久久一二三四不卡| 欧美中字不卡| 亚洲熟久久| 蜜桃臀一区二区三区久久| 涩涩久久精品| 极品色综合| 99人妻| 看免费的黄片| 中文字幕精品资源在线| 强奸xx国产| 欧美制服网站美腿丝袜| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 91性感在线| 精品午夜福利导航| 2017人人操,人人摸| 日本色色色视频| 桃花色涩综合影院| 日本精品人妻少妇一区二区| 欧美国产有色电影| 97亚洲色图| 日韩性爱长视频免费| 在线中文字幕| 亚洲欧美成人在线| 国产传媒1234区| 日韩AV噜噜噜一区二区三区四区| www.av家庭乱伦| 四虎国产精品永久在线囯在线| 久久中文字幕一区不卡| 国产真实野战在线视频| 免费视频在线观看啊啊啊啊啊| 高树玛利亚无码流出| 蜜臀一二三区| 蜜臀一区二区三区在线| 日本精品一区二区中文字幕| 国产av青草| 亚洲国产精品久久久久婷婷老年| 欧美色网| 欧美精品1区2区3区| 六月激情网| 国产精品高潮久久AV| 日韩av电影网站| 黑人免费福利视频| 五月丁香色色网| 久草综合视频| 精品黄色电影| 国产AV高清AV无码| A男人的天堂| 国产精品乱码久久久久久久久| 国产无码精品高清| 成 人 影视 一区 二区 三区 四区| 亚洲综合九| 日韩精品在线放| 婷婷五月天网| 亚洲做性| 黄色av一区二区在线| 亚洲人在线| 97色碰| 亚洲成人久久美女| 97精品视频在线| 国产精品国产自产高清AV| 蜜臀少妇一区二区| 精品欧美乱码久| aⅴ日韩成人电影av在线免费看av大全| 极品粉嫩少妇视频| 影音先锋每日最新资源在线观看 | 色香天天| 日韩精品99999| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 丁香五月成人| 91丝袜视频在线观看| 亚洲最大的综合性av| 禁十八久久| 成人无码在线视频网站| 中文字幕在在线观看网站| 测评在线观看AV| 蜜臀少妇一区二区| 超碰午夜| 日韩中字av一区| 人妻精品一区二区| 丰满翘臀美女影院视频| 91无遮挡| 中文字幕-区二区三区四区视频中国| 999精品久久久久久久| 久久精品欧美一区蜜桃| 男人天堂网站| 曰本精品久久久| 欧美激情性爱视频网站| 九九九九九九九九九五码| av在线免费一区二区| 热久久国产精品视频大陆精品| 国产二区视频在线观看电影| 欧美暴力猛交| 国产精品一级片在线看| 欧亚三区动漫| 任我爽视频在线观看| 男人的天堂 在线一区| 亚洲最大的黄色电影网站。| 国产黄色小视频网站| 国产青青美女玩逼视频| 亚洲aV性爱| 激情五月天中文字幕色| 高潮嗯啊性感美女久久久| 91九色蝌蚪在线观看| 天天综合~91| 激情婷婷丁香| 国产熟女完整版中字| 欧美日日人人天天| 中文字幕丝袜美腿| 国产91精品福利在线| 无套后入双马尾| 中文啪啪视频| 日本成人A片免费看| 亚洲欧洲日韩中文字幕一区| 欧美在线官网| 4399成人黄A片| 日韩无码一级黄色av片| 欧美,日韩,中文,另类| 欧美制服网站美腿丝袜| 日韩在线欧美精品一区二区| 亚洲欧美综合图片| 亚洲棕合电彰| 99无码视频| 欧美一二三级精品在线| 色97干| 加勒比AV天堂| 亚洲中文字幕有码视频一区二区三区| 天天色天天干天天射| 日韩无码第3页| 夜夜操天天肏| 超碰免费在线| 日本色色的视频| 国产精品久久久啊| 大逼色网站| 性爱AV天堂| 91人人看| 99久久9| 天天射天天| 欧美日韩97| 91模特在线观看| 老司机免费视频在线91| 国产精品情侣啪啪| 丝袜美腿诱惑亚洲欧美视频在线观看 | 国产女人操逼视频| 日本精品中文字幕视频| 一区二区三区国产在线播放 | 柠檬AV导航| 乱伦一区二区三区‘| 日韩亚洲欧美中文字幕| 一本大道青青| 97亚洲国产| 久草老司机| 97超碰亚洲| 亚州综合图片| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 亚洲天堂自拍| 精品免费1| 久久久久久亚洲精品中文字幕人妻| 丁香九月激情啪| 午夜高清成人在线视频| 中文字幕精品日韩中文字幕| 亚洲色图欧美| 国产真实子伦对白| 久久夜夜| 夜夜草天天| 国产精品人妻免费精品| 国产亚洲99久久精品熟| 亚洲情色综合| 日本孕妇一区二区视频操逼免费看 | 天天天乱色综合全| 啊啊啊好舒服好爽啊啊啊视频| 色欧美天天| 色综合一区二区三巨| 天天干天天干天天| 91精品人妻一区二区三区蜜桃臀| 宅男91视频在线播放| 色综合久| 九九热精品在线| 国产乱码久久| 日han少妇无码| 午夜福利区| 亚洲极品| 欧美啪啪色吧在线| 桃花色综合影院| 都市久久精品激情亚洲| 亚洲成A∨人影院在线欢看| 一级黄色牲爱A级片| 亚洲九区| 91色碰| 欧美一区二区三区大综合| 精品无码人妻一区二区免费蜜桃| Aa东京男人的天堂| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 九九九九久久久| 爆乳免费黄网站| 熟女精品一区二区在线观看| 一二区在线观看视频| 成人久久久| 人人摸.人人色| 99久在线精品99re8| 天天综合网~69| 91九久| 加勒比五月天| 欧美翘臀视频网站一区二区三区| 欧美日韩另类在线| 操婷婷逼| 伊人991| 大逼色网站| 91人妻精华帖| 99综合| 日本天天干天天搞一区| 久久三区四区| 操逼操网| 丰满人妻一区二区三区在线| 另类图片五月天| 免费精品无码一级毛片牛牛影视| 成人精品无码| 天美麻花大全视频| 天天综合网站| 女上位精品在线| 中文字幕av亚洲精品| 人人摸人人叼| 五月天伊人| 亚洲天天更新| ?亚洲伊人伊成久久人综合网| 91色噜噜狠狠| 九九九999久久久网站| 亚洲天堂人妻熟妇视频| 国产老熟女| 久久黄人人爽视频| 日韩欧美国产高清视频| 国产久久男人天堂| 大屁股人妻女教师撅着屁股| 免费看久久久性性| 一区二区三区色综合| 亚洲欧美洲综合| 国产女性无套 免费观看| 日韩少妇丰满亚洲| 久久国产在线一区二区| 亚洲欧美大| 色爱亚洲| 99爱爱| KK色在线影院| 色哟哟511老熟女| 白丝在线一区| 黄色激情电影在线观看| 中文字幕人妻色偷偷久久皮| 超清中文乱码字幕| 欧美精品成人亚洲| 天天做天天爱| 97视频观看| 欧在线一二区| 按摩中文字幕| 丰满人妻一区二区三区色-百度| 婷婷丁香六月天| 蜜臀va69| 亚洲色色色| 蜜臀网 一区| 蜜桃视频成a人v在线| 中国小夫妻勾搭露脸淫荡对白| 国产精品午夜福利亚洲综合网| 日本天堂网| 欲色综合| 色av中文字| 午夜小电影在线插入淫高潮| 中文字幕日韩精品一区二区三区| 午夜人人操| 欧美成人色| 温婉少妇玩3p| 快灬快灬 一下爽蜜桃在线观看| 99热婷婷| 国产日韩精品suv| 久草婷婷| www.色婷婷色综合| 草草草视频| 综合久欧洲| 亚洲av综合色| 91精品导航| 97亚洲综合电影| 高清国产成人无码| 老熟妇一区二区三区| 亚洲少妇色| 91东京热男人的天堂| 亚洲视频一二区| 亚洲高清无毛一区二区| 欧美色综合图片| 日本午夜久久电影| 九九九热| 999九九九九国产动| 香蕉在线一区二区三区| 1人人看人人摸人人操| 久久久久幕乱码| 激激五月| 国产精品日日摸夜夜添骚逼| 久久九精品| 国产久久久久久久久一区二区| 国产精品高潮久久久无码| 欧美激情片一区二区| 国产精品久久久久av| 精品无码一区二区三区色欲| 97超碰人操| 久久久久精| 狠狠色噜噜狠狠狠狠狠色综合久久| 一本色道熟妇| 都市激情人妻一区二区青青操视频| 性爱av网站| 日本性爱视频一级| 人妻精品一区二区| 99re99视频在线免费观看| 色婷婷丁香五月| 黄色AAAAA欧美| 欧美亚洲激情| 亚洲欧美校园| 国产精品3| 精品久久久中文字幕不| 人妻中文在线| 韩国一级AAA| 大香蕉免费3| 欧美亚洲特P| 呦女网站| 国产超碰在线一区| 九九视品黄色| 激情五月天色色网| 插日本熟女视频| 亚洲图片欧美色图| 五月天AV资源| 97久久国产精品| 诱惑人妻欧美一区在线播放| 啊啊啊用力在线观看| 欧美视频在线视频免费va| 黄片色区软件| 亚洲精品国产无码高清| 乱伦一二三| 欧美日韩中文字幕人妻| 亚洲欧洲日韩中文字幕一区| 97频视在线| 夜夜人妻爽| 操香逼| 大香蕉综合| 97WW精品| 精品四五区| 亚洲成人碰碰| 69精品在线| 九色97| 性色avv| 一区久久久二区| 久久久久久久久久久久久久久性生活视频 | 天堂涩涩| 97情超碰色| 小明看看网址| 天综合网欧美| rivers-china.com| 国产后入式在线观看| 清纯唯美综合| 日韩精品-原创伙伴| 91综合网站| 又粗又长又大国产不卡| 亚洲一区日韩精品中文字幕| 看全色黄大色大片免费视频| 日本黄大片在线观看视频| 精品国产三级av韩国在线| 欧美日韩黄片精品在线| 免费一级黄色录像影片| 午夜理论片在线观看免费| 草草网站影院白丝内射| 偷窥自拍亚洲天堂网爆| 欧美精品久久久久久久久88| 亚洲无码久久久久久久| 九九热最新| 亚洲熟妇图片| 日欧毛片久久| 国产外初女出血视频| 99热销国产这里有精品| 91黑人狂躁丰满熟妇| 中文字幕日韩精品久久| 免费一级特黄特色大片在线观看看| 国产福利av精彩对白| 日韩精品一区二区三区色欲 | 精品久久久av无码免费| 69少妇一区二区| 日本亚洲熟女视频| 亚洲日韩一区电影| 亚洲人91| 欧美—性—交—色| 久久久久久久九九九九九九| 天天做日日做天天欢。| 啊啊啊操一区| 青青国产在线拍揄自揄拍| 97超碰伊人| 上床啊啊啊| 久久永久无码人妻视频| 留下AⅤ黄色片| 久久精品欧美一区蜜桃| 97日视频| sewuyueav| 无码WWW免费视频网站| 色五月首页| 97欧美日韩中文| 俞拍久久国应视频| 欧美日韩一区二区三区四区蜜桃| 最新欧洲欧美日本激情网站| 天天色怡春院| 亚洲无992tv| 日本肏逼视频在线观看| 97看操| 中出欧美| 日本国产成人亚洲精品无码| 欧美超碰96| 亚州性色| 家庭乱伦性爱av| 第二页中文字幕| 少妇人妻无码| 亚洲全色网| 99热婷婷| 久久AV色| 大学生口爆吞精| 97爱免费插| 欧日韩一二三f区| 欧美黄色片在线播放| 97玖玖人妻| 欧美激情黑人| 九月丁香婷婷色| 激情文学欧美| 国产一级高清免费观看| 五月丁香色情| 久久久成人免费av电影| www.91逼逼.com| 97色论| 国产无马在线| 熟女被操视频网址| 久久宗合亚洲| 乳欲人妻办公室奶水| 很黄很污的免费网站| 天天做天天爱| 国产精品交换一区二区| 中文字幕三四五区| 九九激情网| 少妇天堂| 欧美综合骚| 9丨久久九九九| 屌色在线97视频| 熟女少妇视频| 色噜噜综合在线| 成人国产二区三区在线,男女精品。| 99自拍视频在线观看| 婷婷另类小说| 色色香蕉| 天天影视综合色| 秋霞欧美性爰视频| 久久久久女教师免费一区| 最新国产精品久久精品| 98超碰欧美| 欧美色色色| 中文字幕97| 啊啊啊啊二区好大| 伦激情人妻另类人妻| 国产精品密臀网在线观看| 一个人免费视频观看在线WWW| 天天天乱色综合全| 热久久国产| 偷拍片久久| 激情AV| 亚洲天天更新| 日韩午夜国产| 26uuu国产日韩综合在线观看| 玖玖草久草99蜜月一区二区三区| 新婚人妻扶着粗大强行坐下| 蜜臀网址在线| 樱花蜜乳av| 热久久无毒不卡| 亚洲丝袜色| 亚洲欧美日韩偷拍色图| 国产美女口爆吞精| 久久久久九九九| 天天综合~91| 欧美大码在线视频| 国产精品人人爽人人做可爱福利| 韩国嫰模上门援交视频| 婷婷五月天伊人| 中国农村熟妇毛片视频| 中国的操老妇女| 理论久久婷婷网 8| 操逼不卡中文字幕| 亚洲se91| 欧美激色| 精品少妇一区二区三区免费观看| 国产对白刺激视频| 日韩精品人妻中文字有码在线| 噜噜在线| 思思热国产在线视频| 日逼97| 秋霞福利网| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 99re9在线| 国产日逼视频| 伊人四虎综合| 五月丁香在线| 18禁看网站一区| 2017大香蕉国产精品久久| 欧美激情综合| 国产成人欧美一区二区三区的国产| 精品国产乱码久久久影院| 男人的天堂2018.| 亚洲另类电影| 午夜啪啪片| 人人操人人摸avav| 久久在肏| 欧美日韩国产精品久久色婷婷| 久久精品72| 久久精品人体AV| 乱伦熟女区| 日本高清一区二区在线| 超碰 另类 欧美| 熟女熟妇一区二区三四区| 国产欧美岛国精品一区| 中欧人妻丝袜中文字幕| 中出20p| 中文字幕版| 国产精品交换一区二区| 日韩乱中文| 国产美女口爆吞精视频| 欧美色乱| 中文字幕一品色图| 福利一级版子| 91在线免费观看处女| 大香蕉操久久| 久久久婷婷| 强奸乱伦av电影| 404操逼福利视频| 亚洲欧美国产中文视频| 好吊色综合| 青草一区二区| 天天性射网| 国产热av| 亚洲综合骚逼| 男人把坤坤插入女人的下体| 国产福利夜| 亚洲天堂东京热| 成人婷婷丁香| 五月丁香啪啪| 日本欧美韩国日产片片在线看免| 91久久久久久| 日本肉体xxxx裸交| 亚洲国产精品无码AV在线| 91综合熟女| 激情小说亚洲视频| 日本亚洲vr欧美不卡高清专区| 综合色99| 91oumei| 狠狠躁AV| 久久久久久中文字幕中文字幕最新| 久久欧美按摩999| 色99色| 伊人97色天使| 欧美中字二区| 色五月第四色| 日韩欧美中文字| 丰满精品人妻少妇久久字幕| 嫩草伊人久久精品| 91精品免费| 大香蕉92| 九九九九精品视频| 少妇久久久| 精品欧美老熟女一二区| 亚洲欧洲日本精品中文a∨| 岛国黄片网站| 强歼乱伦资源网| 国产亚洲99久久精品| 五月综合久久| 五月天色电影| 破处bbq| 就去色综合| 天天射天天操天天干天天吃2018 | 中文字幕精品一区二区精品| 色综合五月天| 大香蕉99热| 亚洲天堂久| 超碰在线免费一区二区三区| 84YTCOM性无码| 不卡日本一区二区| 精品中文字幕第一页| 婷婷色五月激情| 大香蕉伊人亚洲| 亚洲高清在线se| 夜夜骑夜夜操| www.91逼逼.com| 青青草日韩无码| 欧美亚洲日韩人妻在线观看| 欧美72网页| 91成人精品| 操逼A∨| 懂色AV蜜臀无码精品APP| 国模限制级电影| 日韩欧美偷拍美女视频| 亚洲天堂男人天堂网| 国产97在线 | 亚洲| 乳欲人妻办公室奶水| 人妻天天夜夜爽一区二区| 丁香婷婷激情五月天无毒不卡| 超碰人人干天天射| 狠狠操夜夜| 嗯嗯啊在线视频| 男人成人黄色视频在线观看免费下载| 亚欧美综合网。| 老女人综合网| aaa一级黄片| 97内射偷拍| 老熟女91视频| 一级A片女人高潮叫床| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 少妇高潮对白在线观看| av婷婷色网| 亚洲欧美天| 国产一区二区精品久久99| 国产精品成人蜜臀AV在线| 黄色高清久久无码依人| 精品视频一二三中文| 日本性爱少妇| 久久一本大香蕉 | 日韩婷婷| 国模91| 麻豆成人影音在线| 久久人人看| 啊啊啊操死我了| 国产乱伦性爱区| 欧美AB在线观看| 青青草福利视频| 亚洲经典啪啪| 人乳av| www.av在线观看| 美美91成人国产精品欧美精品久久久久久久| 欧美97爱| 视频二区美腿丝袜制服人妻欧美| 久久久天美| 久久久久久国产无码精品| 99热超碰| 久久精品一区二区三区四区五区| 激情久久久| 欧美在线|亚洲| 日韩成人性爱电影在线播放| 欧美中字不卡| 免费观看国产小粉嫩喷水精品午| 久久久久久久久久久久黄色 | 国产大学生高潮在线播放 | 国产福利第一视频| 999久久久久久久久| 日韩视频啪啪| 玖玖综合视频| 激情色播| 色色97爱| 欧美午夜精品久久久久久超碰| 热热色中文无码| 激情综合97| 成人精品在线免费视频| 在线国产探花| 九九九国产| 又黄又爽在线观看视频| 日韩精品-原创伙伴| 欧美午夜精品久久久久久超碰| 97综合| 天天综合网国产| 人人干人人操人人爱| 色天堂综合| 操逼不卡中文字幕| 青青青草原| 天天射网| 91精品无码久久久久久久| 欧亚第一综合网| 日韩欧美综合激情| 97国产精品久久久久| 亚洲人妻av| 秋霞免费无码视频日韩A片 | 亚洲精品无码久久AV| 久久超碰av在线| 色官网在线| 91久久久亚洲| 懂色av中文字幕一区二区三区天美| 91成人久久 | 9精品久久| 久热9| 久久国产逼| 熟女中出视频| 全免费a敌肛交毛片免费| 夜夜欢天天干| 欧美青青视频| 色五月首页| 岛国在线免费视频| 超碰综合97在线| www.夜夜| 18禁中文字幕| 丝袜美腿av女优在线| 国产丰满熟夫69mpp| 色狠狠色| 精品中文字幕一区二区| 久久久月天| 99热精品国产| 99热精品免费| 亚洲**2021在线观看| 天天综合站| 久久天天躁日日躁狠狠躁 | 天天热精品| 亚洲色图久久精品蜜| 亚洲成人久久一区二区| 2017大香蕉| 超碰到97情色| 日韩中文字幕av在线播放| 久久一二三四五六七八九区区区| 黑人美精品 A片| 97天天操| 天天综合91入口| 久久精品72| 亚洲天堂另类美腿| www色色色com| 免费观看日本操逼视频| 国产风韵犹存熟妇三区| 色婷婷蜜臀av| 欧美日韩99精品麻豆传媒| 丝袜美腿制服人妻二区中文字幕 | 国产品精品自在在线午夜免费| 99国产在线绯色一区| 91操人视频| 久久人人爽爽人人爽人人片αV| 蜜桃久久精品一区二区三区| 日韩一级二级| 日韩欧美国产高清视频| 一个人免费视频观看在线WWW| 青青草这里只有精品| 污电影在线观看| 中文字幕AV片| 图色综合网| 久久久不能久久久久| 特污免视频| 日本天天操| 一级黄色视频网| 欧洲亚洲国产综合在线| 国产无码久久高清| 97亚洲色图| 欧美日综合| 天天性射网| 狠狠爱夜夜干| 狠狠干2020| 欧美日本视频一区| 美女91av| 久偷拍欧美日韩三区| 97色色国产视频| 东北女人| 日韩av熟女一区二区三区成人| 97色在线观看| 夜夜高潮夜夜爽| 国产精品夜夜夜| 中国AAAAAA黄色片| 中文字幕在线免费观看2| 百度百度日本操逼| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 免费国产电影一区二区| 久久丁香久草综合网| 国产午夜精品理论片a大结局| 午夜成人爽爽爽爽A片李冰冰| 91久久久亚洲| 天天看天天日| 亚洲伊人a线观看视频| 岛国色情视频在线观看|