久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

rea:一個(gè)輕量級(jí)項(xiàng)目結(jié)構(gòu)分析工具的設(shè)計(jì)與實(shí)現(xiàn)

rea:一個(gè)輕量級(jí)項(xiàng)目結(jié)構(gòu)分析工具的設(shè)計(jì)與實(shí)現(xiàn) rea這個(gè)項(xiàng)目名乍一看確實(shí)容易讓人一頭霧水三個(gè)字母沒(méi)有官方解釋也沒(méi)有配套文檔。我最早接觸它是在某次接手一個(gè)遺留系統(tǒng)的時(shí)候——代碼倉(cāng)庫(kù)里躺著一個(gè)叫rea的目錄里面全是一堆以rea_開(kāi)頭的腳本文件。當(dāng)時(shí)的第一反應(yīng)是“這是什么鬼”翻了兩天之后才明白它是一個(gè)被團(tuán)隊(duì)內(nèi)部用慣了但從來(lái)沒(méi)正式命名過(guò)的代碼結(jié)構(gòu)梳理工具。后來(lái)我花了兩周時(shí)間把它重寫(xiě)、補(bǔ)全、做成一個(gè)可復(fù)用的命令行工具再后來(lái)它就成了我自己日常開(kāi)發(fā)中離不開(kāi)的一個(gè)小工具箱。我在博客里分享過(guò)不少項(xiàng)目但這是第一次認(rèn)真復(fù)盤(pán)rea本身的來(lái)龍去脈。如果你正在做一個(gè)代碼量失控的項(xiàng)目、需要一個(gè)能快速看清全局的工具或者你也想打造一個(gè)屬于自己、貼合自己工作習(xí)慣的開(kāi)發(fā)者工具這篇文章應(yīng)該對(duì)你有用。我會(huì)把從最初的需求分析、到核心模塊實(shí)現(xiàn)、再到上線后踩過(guò)的一堆坑全部串起來(lái)講盡量給你一份能直接照著落地的參考方案。1. 項(xiàng)目整體設(shè)計(jì)與思路拆解1.1 它到底解決什么問(wèn)題先說(shuō)最核心的那個(gè)問(wèn)題為什么需要一個(gè)叫rea的東西。當(dāng)時(shí)那個(gè)遺留系統(tǒng)技術(shù)棧不算復(fù)雜Spring Boot 后端加一個(gè) Vue 前端代碼規(guī)模也不到十萬(wàn)行。但問(wèn)題在于這個(gè)項(xiàng)目經(jīng)歷了多輪維護(hù)前后好幾個(gè)團(tuán)隊(duì)都往里加過(guò)東西目錄結(jié)構(gòu)已經(jīng)變得非?;靵y。具體表現(xiàn)有這么幾種同一個(gè)功能模塊的代碼分散在四五個(gè)不同的目錄里彼此之間通過(guò)相對(duì)路徑互相引用。有些類文件明明已經(jīng)沒(méi)人在用了但因?yàn)闆](méi)人敢刪就一直躺在deprecated目錄里占據(jù)空間。前端的資源文件命名完全沒(méi)有規(guī)范新建文檔(最終版).js這種名字都能出現(xiàn)。最讓人頭疼的是沒(méi)有人能說(shuō)清楚整個(gè)項(xiàng)目的依賴關(guān)系到底長(zhǎng)什么樣。我當(dāng)時(shí)的任務(wù)是在這個(gè)系統(tǒng)上加一個(gè)新功能。按理說(shuō)這是一個(gè)很常規(guī)的開(kāi)發(fā)任務(wù)但實(shí)際花費(fèi)的時(shí)間里有一半以上都用在了“找代碼”而不是“寫(xiě)代碼”上。每改一個(gè)地方都要先在 IDE 里搜半天上下游調(diào)用生怕漏掉哪個(gè)隱式依賴導(dǎo)致上線出問(wèn)題。rea最初的形態(tài)就是為解決“理清項(xiàng)目結(jié)構(gòu)”這個(gè)痛點(diǎn)而寫(xiě)的一個(gè)命令行工具。它的作用很簡(jiǎn)單遞歸掃描項(xiàng)目的所有源文件提取每一個(gè)文件中定義的函數(shù)、類、變量同時(shí)分析文件之間的引用關(guān)系最后生成一份結(jié)構(gòu)化的報(bào)告告訴你項(xiàng)目里有哪些關(guān)鍵節(jié)點(diǎn)、哪些模塊被依賴得最多、哪些文件是無(wú)人問(wèn)津的死代碼候選對(duì)象。1.2 為什么不直接用現(xiàn)成工具聊到這里可能有人會(huì)問(wèn)代碼覆蓋率工具、依賴分析工具、SonarQube 這些,市面上不是有大把現(xiàn)成的嗎為什么還要自己造輪子這個(gè)問(wèn)題的答案我認(rèn)為恰恰是rea這個(gè)項(xiàng)目最有價(jià)值的地方?,F(xiàn)成的工具確實(shí)功能強(qiáng)大但它們普遍存在兩個(gè)問(wèn)題。第一個(gè)問(wèn)題是重量級(jí)很多分析工具需要你把整個(gè)項(xiàng)目導(dǎo)入、配置數(shù)據(jù)庫(kù)、等待后臺(tái)任務(wù)跑完才能看到結(jié)果。對(duì)于一個(gè)只想快速搞清楚一個(gè)項(xiàng)目大概結(jié)構(gòu)的開(kāi)發(fā)者來(lái)說(shuō)這個(gè)流程太笨重了。第二個(gè)問(wèn)題是不靈活工具輸出的是它定義好的指標(biāo)體系而不是你當(dāng)下最關(guān)心的那幾個(gè)問(wèn)題。我當(dāng)時(shí)需要的其實(shí)是一個(gè)非常輕量、能按需擴(kuò)展、結(jié)果一眼能看懂的東西。rea的設(shè)計(jì)哲學(xué)由此確定單命令、無(wú)配置、純靜態(tài)掃描、輸出可讀性優(yōu)先。它不需要在項(xiàng)目里安裝任何插件不需要建立索引數(shù)據(jù)庫(kù)也不需要聯(lián)網(wǎng)。你在命令行里對(duì)項(xiàng)目根目錄執(zhí)行一條命令幾秒鐘之后就能拿到一份簡(jiǎn)潔的報(bào)告。這個(gè)設(shè)計(jì)思路就像你家里工具箱里那把最常用的螺絲刀——不需要電動(dòng)不需要一堆替換頭就是一把趁手、順手、永遠(yuǎn)不會(huì)壞的工具。1.3 技術(shù)選型背后的思考技術(shù)選型上我選擇了 Node.js 作為運(yùn)行環(huán)境用純 JavaScript 實(shí)現(xiàn)不依賴任何第三方庫(kù)。現(xiàn)在回頭看這個(gè)決定大致是合理的但中間也走過(guò)一些彎路。一開(kāi)始我其實(shí)考慮過(guò)用 Python 寫(xiě)因?yàn)?Python 處理文本和正則表達(dá)式確實(shí)方便而且我本人也更熟悉 Python。但后來(lái)想清楚了兩個(gè)問(wèn)題目標(biāo)用戶包括我自己日常主要工作在 Node 生態(tài)里用 Node 寫(xiě)出來(lái)的工具后續(xù)如果要擴(kuò)展成 IDE 插件或者對(duì)接前端構(gòu)建流程會(huì)順暢得多。Node 在文件系統(tǒng)操作方面擁有非常完善的 API對(duì)讀取目錄樹(shù)這類需求支持得很好。至于為什么不依賴第三方庫(kù)理由就更實(shí)際了這個(gè)工具的核心功能就是讀文件、做匹配、統(tǒng)計(jì)計(jì)數(shù)、輸出結(jié)果這些用 Node 自帶模塊完全可以搞定。每引入一個(gè)依賴都意味著未來(lái)的維護(hù)成本、安全風(fēng)險(xiǎn)、版本兼容問(wèn)題。為了這么一個(gè)小工具去引入依賴樹(shù)實(shí)在劃不來(lái)。這里補(bǔ)充一個(gè)我后來(lái)才意識(shí)到的問(wèn)題。純 JavaScript 腳本在遇到大項(xiàng)目時(shí)性能確實(shí)會(huì)成為一個(gè)瓶頸。印象最深的一次是在一個(gè)大型電商系統(tǒng)上跑rea源文件總數(shù)超過(guò)五萬(wàn)個(gè)直接跑崩了。后來(lái)我用 Worker 線程池做了并發(fā)掃描改造才把耗時(shí)控制在一個(gè)可接受的范圍內(nèi)。這個(gè)優(yōu)化過(guò)程我在后面的實(shí)操部分詳細(xì)講。2. 核心功能拆解與實(shí)操要點(diǎn)rea的功能并不花哨核心就是三件事掃描、分析、報(bào)告。下面一個(gè)一個(gè)拆開(kāi)說(shuō)。2.1 文件掃描模塊的設(shè)計(jì)文件掃描是整個(gè)工具的基石。這一步做不好后面所有的分析都是空中樓閣。掃描模塊的核心需求有三個(gè)能遞歸遍歷目錄、能按規(guī)則過(guò)濾掉不需要分析的文件、能采集到足夠多的文件元數(shù)據(jù)。第一版的實(shí)現(xiàn)非常簡(jiǎn)單就是用fs.readdirSync配合fs.statSync做一個(gè)深度優(yōu)先遍歷。核心邏輯說(shuō)出來(lái)大家都能懂const fs require(fs); const path require(path); class Scanner { constructor(projectRoot, ignoredPatterns) { this.projectRoot projectRoot; this.ignoredPatterns ignoredPatterns; this.fileList []; } walk(dir) { const entries fs.readdirSync(dir, { withFileTypes: true }); for (const entry of entries) { if (this.shouldIgnore(entry.name)) continue; const fullPath path.join(dir, entry.name); if (entry.isDirectory()) { this.walk(fullPath); } else if (entry.isFile()) { this.fileList.push({ path: fullPath, ext: path.extname(entry.name), name: entry.name, size: fs.statSync(fullPath).size }); } } } shouldIgnore(name) { return this.ignoredPatterns.some((pattern) pattern.test(name)); } }這套實(shí)現(xiàn)足夠應(yīng)對(duì)大多數(shù)中小型項(xiàng)目。但在這里我要提一個(gè)實(shí)際踩過(guò)的坑把同步遍歷寫(xiě)進(jìn)一個(gè)遞歸函數(shù)里一旦項(xiàng)目文件層級(jí)特別深很容易爆棧。我們當(dāng)時(shí)那個(gè)項(xiàng)目里有一個(gè)測(cè)試目錄嵌套層級(jí)最深的地方超過(guò)了四十層遞歸調(diào)用的時(shí)候棧幀積累得非常快。雖然一開(kāi)始沒(méi)有直接崩潰但性能明顯下降掃描耗時(shí)達(dá)到了二十多秒。后來(lái)我改成了顯式使用棧數(shù)據(jù)結(jié)構(gòu)來(lái)遍歷而不是依賴函數(shù)調(diào)用棧walk(root) { const stack [root]; while (stack.length 0) { const currentDir stack.pop(); const entries fs.readdirSync(currentDir, { withFileTypes: true }); for (const entry of entries) { if (this.shouldIgnore(entry.name)) continue; const fullPath path.join(currentDir, entry.name); if (entry.isDirectory()) { stack.push(fullPath); } else if (entry.isFile()) { this.fileList.push({ path: fullPath, ext: path.extname(entry.name), name: entry.name, size: fs.statSync(fullPath).size }); } } } }這里我想多啰嗦一句很多新手容易忽略withFileTypes: true這個(gè)參數(shù)。如果不用這個(gè)參數(shù)readdirSync返回的是字符串?dāng)?shù)組你得對(duì)每個(gè)路徑單獨(dú)調(diào)用fs.statSync來(lái)判斷它是文件還是目錄。這相當(dāng)于多了一次系統(tǒng)調(diào)用在文件數(shù)量龐大的時(shí)候損耗非??捎^。用了withFileTypes之后Dirent對(duì)象直接提供了isFile()、isDirectory()方法節(jié)省了額外一次stat的開(kāi)銷。2.2 依賴分析模塊的算法選擇掃描到文件列表之后緊接著要做的事情是分析依賴關(guān)系。這里所謂的依賴不單指代碼里的import或require語(yǔ)句還包括自定義函數(shù)之間的調(diào)用。對(duì)于 JavaScript 項(xiàng)目要精準(zhǔn)分析函數(shù)級(jí)調(diào)用關(guān)系難度非常大,因?yàn)?JavaScript 是動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí)綁定、回調(diào)函數(shù)、閉包這些特性都讓靜態(tài)分析變得很費(fèi)勁。所以我在第一版設(shè)計(jì)時(shí)做了一個(gè)戰(zhàn)略取舍不做精確的函數(shù)調(diào)用分析只做模塊級(jí)的依賴分析。具體來(lái)說(shuō)就是用正則表達(dá)式把每個(gè)文件中出現(xiàn)的import ... from ...、require(...)、const xxx require(...)、import(...)這幾種常見(jiàn)的引用形式全部提取出來(lái)再對(duì)引用路徑做規(guī)范化處理最終生成一張以文件為節(jié)點(diǎn)、以引用關(guān)系為邊的依賴圖。這個(gè)思路的好處用一個(gè)詞概括就是“夠用”。我需要的不是一張完美的代碼架構(gòu)圖而是一個(gè)能告訴我在改動(dòng)某個(gè)文件時(shí)哪些地方可能需要聯(lián)動(dòng)調(diào)整的清單。這個(gè)場(chǎng)景下解析到模塊級(jí)別足夠了。提取引用關(guān)系的邏輯大致是這樣const IMPORT_PATTERN /(?:import\s[\s\S]*?from\s*[]([^])[]|require\s*\(\s*[]([^])[]\s*\))/g; function extractDependencies(sourceCode) { const deps []; let match; while ((match IMPORT_PATTERN.exec(sourceCode)) ! null) { const rawPath match[1] || match[2]; if (rawPath !rawPath.startsWith(.) !rawPath.startsWith(/)) { continue; // 第三方包不做深入分析 } deps.push(normalizePath(rawPath)); } return deps; }這里有一個(gè)細(xì)節(jié)值得注意我在匹配第三方包時(shí)直接跳過(guò)了。因?yàn)閞ea關(guān)注的永遠(yuǎn)是項(xiàng)目?jī)?nèi)部模塊之間的關(guān)系node_modules里的依賴再?gòu)?fù)雜也不是這個(gè)工具要管的范疇。強(qiáng)行分析第三方包既浪費(fèi)性能又會(huì)讓報(bào)告變得嘈雜難讀。規(guī)范化路徑這步也很關(guān)鍵。假設(shè)一個(gè)文件位于src/utils/helpers.js它引用了../constants.js那么我在報(bào)告里應(yīng)該展示的是src/constants.js而不是../constants.js否則后面做聚合統(tǒng)計(jì)的時(shí)候就無(wú)從下手了。路徑規(guī)范化的實(shí)現(xiàn)const path require(path); function normalizePath(rawPath, currentFilePath) { if (rawPath.startsWith(/)) { return path.normalize(rawPath); } const absolutePath path.resolve(path.dirname(currentFilePath), rawPath); return path.relative(process.cwd(), absolutePath); }用path.resolve先把相對(duì)路徑轉(zhuǎn)為絕對(duì)路徑再用path.relative把絕對(duì)路徑轉(zhuǎn)為相對(duì)于項(xiàng)目根目錄的路徑。這樣整理出來(lái)的依賴關(guān)系每一行都是可追溯、可點(diǎn)擊的。2.3 報(bào)告生成的人性化設(shè)計(jì)分析做完以后如何呈現(xiàn)結(jié)果是一個(gè)非常值得琢磨的問(wèn)題。我見(jiàn)過(guò)不少工具分析做得很深入但輸出結(jié)果是一大堆 JSON開(kāi)發(fā)者看完之后依舊一頭霧水。rea從一開(kāi)始就明確了一件事最終交付物必須是人類可讀的純文本報(bào)告。第一版報(bào)告長(zhǎng)這樣Project: demo-shop Generated at: 2025-06-14 10:23:01 規(guī)模概況 Total files: 1,234 Total lines of code: 78,942 Total dependencies (internal): 3,215 高風(fēng)險(xiǎn)模塊 Top 10 1. src/order/service.js (127 inward refs) 2. src/user/session.js (98 inward refs) 3. src/payment/gateway.js (76 inward refs) ... 孤立文件候選 - src/legacy/migrate_old.js (no inward refs, 0 outward refs) - src/pages/UnusedPage.vue (no inward refs, 0 outward refs) ...這個(gè)報(bào)告看起來(lái)不復(fù)雜但需要在背后完成兩件很重要的事。第一件事是統(tǒng)計(jì)每個(gè)文件的被引用次數(shù)。這就需要一個(gè)從目標(biāo)路徑到引用來(lái)源列表的反向映射表構(gòu)建方式很簡(jiǎn)單在收集依賴關(guān)系的時(shí)候每發(fā)現(xiàn)一條引用就在目標(biāo)文件對(duì)應(yīng)的集合里加一個(gè)來(lái)源。第二件事是判斷“孤立文件”。如果某個(gè)文件在內(nèi)部分析中既沒(méi)有被其他文件引用它本身也沒(méi)有引用任何內(nèi)部文件那么它極大概率是從某個(gè)版本的迭代中殘留下來(lái)的廢棄代碼。注意這只是“候選”——因?yàn)閯?dòng)態(tài)加載、反射調(diào)用、配置文件引用這些情況靜態(tài)分析是捕捉不到的。所以報(bào)告里會(huì)用“候選”這個(gè)詞提醒使用者不要直接照單全收。2.4 并發(fā)掃描的優(yōu)化方案如果你只在小項(xiàng)目上用過(guò)rea那你可能永遠(yuǎn)不會(huì)遇到這一節(jié)要講的問(wèn)題。但一旦跑大型項(xiàng)目性能問(wèn)題就會(huì)立刻浮現(xiàn)。我前面提到在一個(gè)五萬(wàn)文件的電商項(xiàng)目上第一版rea直接跑崩了。這里所謂的“崩”不是內(nèi)存溢出而是耗時(shí)長(zhǎng)得不可接受。當(dāng)時(shí)我用計(jì)時(shí)器量了一下掃描耗時(shí)就占了兩分多鐘而理想狀況下一個(gè)命令行工具是不應(yīng)該在交互時(shí)讓人等待這么久的。性能瓶頸主要出在fs.statSync這個(gè)調(diào)用上。當(dāng)年我在遍歷目錄的時(shí)候每遇到一個(gè)文件都會(huì)調(diào)用一次fs.statSync獲取文件大小。五萬(wàn)個(gè)文件就意味著五萬(wàn)次同步的系統(tǒng)調(diào)用這個(gè)開(kāi)銷非??捎^。優(yōu)化方案有兩個(gè)方向可以選擇一個(gè)是改用fs.promises做異步 IO另一個(gè)是用 Worker 線程池做并行掃描。我最終把兩個(gè)方向結(jié)合了。用 Worker 線程池改造的思路是主線程把項(xiàng)目根目錄下的頂層子目錄分發(fā)給若干個(gè) Worker每個(gè) Worker 負(fù)責(zé)掃描自己分到的子目錄把結(jié)果序列化后傳回主線程。這個(gè)過(guò)程有點(diǎn)像把一個(gè)大倉(cāng)庫(kù)的盤(pán)點(diǎn)工作分給幾組人同時(shí)做每組只負(fù)責(zé)自己的片區(qū)最后再把匯總結(jié)果合起來(lái)。這里我給出一個(gè)簡(jiǎn)化版的線程池實(shí)現(xiàn)思路const { Worker } require(worker_threads); function parallelScan(roots) { const workers roots.map((root, index) new Promise((resolve, reject) { const worker new Worker(TASK_FILE, { workerData: { root, index } }); worker.on(message, resolve); worker.on(error, reject); })); return Promise.all(workers); }不過(guò)要提醒大家Worker 線程用起來(lái)隨手就能寫(xiě)但序列化和反序列化fileList的開(kāi)銷也不小。當(dāng)時(shí)測(cè)試下來(lái)文件數(shù)量在三千以下時(shí)單線程和線程池的耗時(shí)幾乎沒(méi)有區(qū)別甚至線程池還更慢一些。只有文件數(shù)量超過(guò)一萬(wàn)時(shí)線程池的收益才明顯體現(xiàn)出來(lái)。所以如果你的項(xiàng)目規(guī)模沒(méi)到這個(gè)量級(jí)沒(méi)必要盲目上并發(fā)先看看是不是被其他低效操作拖了后腿。3. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)理論部分說(shuō)完了接下來(lái)是實(shí)戰(zhàn)環(huán)節(jié)。我的經(jīng)驗(yàn)是做工具類項(xiàng)目先搭一個(gè)可以用起來(lái)的骨架再逐步加功能比一開(kāi)始就追求大而全要高效得多。3.1 環(huán)境準(zhǔn)備與項(xiàng)目初始化rea的運(yùn)行環(huán)境要求是 Node.js 14 及以上原因很簡(jiǎn)單舊版本不支持fs.readdirSync的withFileTypes參數(shù)其實(shí)這個(gè)參數(shù)在 10.10 就引入 了但我建議直接給個(gè)更寬松的底線。項(xiàng)目初始化用的是npm init -y它會(huì)自動(dòng)生成一個(gè)package.json。我習(xí)慣在項(xiàng)目里加上bin字段這樣就能通過(guò)npm link把命令安裝成全局命令{ name: rea, version: 0.1.0, description: A lightweight static analysis tool for project structure, main: src/index.js, bin: { rea: src/index.js }, engines: { node: 14.0.0 } }文件目錄結(jié)構(gòu)我采用了很常見(jiàn)的模式rea/ ├── src/ │ ├── index.js # 入口文件命令分發(fā) │ ├── scanner.js # 目錄掃描模塊 │ ├── analyzer.js # 依賴分析模塊 │ ├── reporter.js # 報(bào)告生成模塊 │ └── utils.js # 通用工具 ├── test/ │ └── fixtures/ # 測(cè)試用的臨時(shí)項(xiàng)目 └── package.json入口文件的寫(xiě)法非常簡(jiǎn)單就是解析命令行參數(shù)然后按指令調(diào)用不同模塊#!/usr/bin/env node const { scanner } require(./scanner); const { analyzer } require(./analyzer); const { reporter } require(./reporter); async function main() { const projectRoot process.argv[2] || .; const scanStart Date.now(); const fileList await scanner.scan(projectRoot); const analysis analyzer.analyze(fileList); const elapsed Date.now() - scanStart; console.log(reporter.render(projectRoot, analysis, elapsed)); } main().catch((err) { console.error([rea] Error:, err.message); process.exit(1); });這一版沒(méi)有引入 commander 之類的參數(shù)解析庫(kù)。因?yàn)樗壳爸恍枰粋€(gè)參數(shù)項(xiàng)目路徑。將來(lái)如果增加了更多命令再考慮引入?yún)?shù)解析框架也不遲。我一直堅(jiān)持一個(gè)原則不過(guò)早引入復(fù)雜度。3.2 依賴分析模塊的完整實(shí)現(xiàn)依賴分析模塊是這個(gè)工具的核心大腦。這里我貼出完整實(shí)現(xiàn)并逐行解釋關(guān)鍵邏輯。class Analyzer { constructor(fileList) { this.fileList fileList; this.nodeMap new Map(); // 存儲(chǔ)每個(gè)文件節(jié)點(diǎn) this.edgeList []; } analyze() { for (const file of this.fileList) { const source this._readFile(file.path); const deps extractDependencies(source, file.path); file.deps deps; this.nodeMap.set(file.path, file); } this._buildReverseMap(); return { nodes: this.nodeMap, edges: this.edgeList }; } _readFile(filePath) { try { return fs.readFileSync(filePath, utf-8); } catch (err) { return ; } } _buildReverseMap() { for (const [targetPath] of this.nodeMap) { this.nodeMap.get(targetPath).inwardRefs []; } for (const file of this.fileList) { for (const dep of file.deps) { // 只統(tǒng)計(jì)存在對(duì)應(yīng)文件節(jié)點(diǎn)的依賴 if (this.nodeMap.has(dep)) { this.nodeMap.get(dep).inwardRefs.push(file.path); this.edgeList.push({ from: file.path, to: dep }); } } } } }這里有幾個(gè)需要特別留意的點(diǎn)。第一個(gè)_buildReverseMap里的inwardRefs初始化放到了外層循環(huán)里。如果你直接把inwardRefs初始化寫(xiě)進(jìn)_readFile那一步那么每個(gè)文件被訪問(wèn)的先后順序就會(huì)影響最終結(jié)果這是典型的初始化順序陷阱。第二個(gè)import解析用的是正則表達(dá)式必然存在誤報(bào)和漏報(bào)的可能。比如代碼中有被注釋掉的require語(yǔ)句或者寫(xiě)在字符串里的import字樣正則都會(huì)把它們誤判為真實(shí)依賴。如果是做嚴(yán)謹(jǐn)?shù)纳暇€檢查這顯然不合格但如果目標(biāo)是快速生成一份“值得人工查看的候選清單”這個(gè)精度足夠了。當(dāng)工具的目標(biāo)定位是提供線索而不是給出裁決時(shí)不完美是可以接受的。第三個(gè)我在正則里特別處理了動(dòng)態(tài)導(dǎo)入import()因?yàn)楝F(xiàn)代代碼中按需加載的場(chǎng)景太常見(jiàn)了忽略它會(huì)漏掉很多真實(shí)的運(yùn)行時(shí)依賴。3.3 報(bào)告渲染引擎的實(shí)現(xiàn)報(bào)告部分的目標(biāo)是盡量保持簡(jiǎn)潔同時(shí)信息密度足夠高。我不建議直接輸出一個(gè)超大表格開(kāi)發(fā)者在終端里滾動(dòng)幾百行體驗(yàn)很差。所以我做了一套“摘要 重點(diǎn)列表”的結(jié)構(gòu)。渲染邏輯的核心其實(shí)是一個(gè)排序與截?cái)嗟倪^(guò)程function renderReport(projectRoot, analysis, elapsed) { const nodes [...analysis.nodes.values()]; const totalFiles nodes.length; let totalLines 0; for (const node of nodes) { totalLines countLines(node); } const lines []; lines.push(Project: ${projectRoot}); lines.push(Generated at: ${new Date().toLocaleString()}); lines.push(); lines.push( 規(guī)模概況 ); lines.push(Total files: ${totalFiles.toLocaleString()}); lines.push(Total lines of code: ${totalLines.toLocaleString()}); lines.push(Total internal edges: ${analysis.edges.length.toLocaleString()}); lines.push(); const sortedByInward nodes .sort((a, b) b.inwardRefs.length - a.inwardRefs.length); lines.push( 高風(fēng)險(xiǎn)模塊 Top 10 ); for (const file of sortedByInward.slice(0, 10)) { lines.push(${file.path} (${file.inwardRefs.length} inward refs)); } lines.push(); const isolatedFiles nodes.filter( (file) file.inwardRefs.length 0 file.deps.length 0 ); lines.push( 孤立文件候選 ); if (isolatedFiles.length 0) { lines.push((none)); } else { for (const file of isolatedFiles.slice(0, 20)) { lines.push(- ${file.path}); } } lines.push(); return lines.join(\n); }這個(gè)渲染函數(shù)雖然看起來(lái)很長(zhǎng)但邏輯非常簡(jiǎn)單聚合數(shù)據(jù)、排序、取前 N 個(gè)、拼接字符串。它的設(shè)計(jì)目標(biāo)就是讓使用者在十秒鐘之內(nèi)抓住項(xiàng)目的核心風(fēng)險(xiǎn)點(diǎn)。3.4 從第一版到可發(fā)布版本的過(guò)程寫(xiě)第一版只用了兩三個(gè)小時(shí)但rea真正變成可用的工具是經(jīng)歷了比較長(zhǎng)的迭代之后。第一版跑通后我遇到的最大問(wèn)題其實(shí)不是技術(shù)難點(diǎn)而是“輸出結(jié)果讓人看不明白”。比如報(bào)告里出現(xiàn)的孤立文件候選有接近一半其實(shí)是前端項(xiàng)目在構(gòu)建時(shí)期引用的less變量文件——它們雖然不被任何 JS 文件直接引用但是在編譯期起著非常重要的作用。如果我只簡(jiǎn)單地輸出一個(gè)候選列表使用者大概率會(huì)誤判。為了解決這個(gè)問(wèn)題我在分析階段加入了一個(gè)“文件類型分組”的維度。針對(duì)特定的文件擴(kuò)展名如.less、.scss、.md、.json打上特殊標(biāo)簽在報(bào)告中用不同的標(biāo)記提示使用者這些文件不適用“孤立”判斷。這個(gè)改動(dòng)雖然不復(fù)雜卻極大地提高了報(bào)告的實(shí)用價(jià)值。另一個(gè)重要的迭代是支持.reaignore文件類似于.gitignore的機(jī)制。因?yàn)橛行┠夸洷热缱詣?dòng)生成的 mock 數(shù)據(jù)目錄根本不應(yīng)該參與分析強(qiáng)行分析只會(huì)制造噪音。這個(gè)功能寫(xiě)起來(lái)很簡(jiǎn)單就是多讀一個(gè)配置文件把其中的每個(gè)模式追加到忽略列表里。4. 實(shí)操過(guò)程記錄一次真實(shí)的使用案例光講原理不落地總感覺(jué)少了點(diǎn)什么。這里我復(fù)盤(pán)一次用rea分析一個(gè)實(shí)際項(xiàng)目以下代稱為模擬項(xiàng)目X的完整過(guò)程包括中間遇到的小狀況。4.1 準(zhǔn)備階段搭建一個(gè)棘手項(xiàng)目模擬項(xiàng)目X 是一個(gè)典型的早期 Web 應(yīng)用體量中等偏下但結(jié)構(gòu)非常雜亂。它的源代碼目錄長(zhǎng)這樣project-x/ ├── src/ │ ├── api/ │ ├── components/ │ │ ├── core/ │ │ └── legacy/ │ ├── pages/ │ ├── styles/ │ ├── utils/ │ └── vendor-patches/ # 放了一些從網(wǎng)上復(fù)制來(lái)的第三方補(bǔ)丁 ├── scripts/ │ ├── build.js │ └── deploy.sh ├── mock/ └── docs/我預(yù)想中的難點(diǎn)有兩個(gè)vendor-patches目錄里的補(bǔ)丁代碼引用了很多古老的文件路徑mock目錄里有一大堆自動(dòng)生成的數(shù)據(jù)文件它們不參與運(yùn)行但會(huì)干擾依賴分析。我在項(xiàng)目根目錄創(chuàng)建了.reaignore文件mock/ vendor-patches/然后把rea工具放到 PATH 中準(zhǔn)備執(zhí)行掃描。4.2 第一次運(yùn)行結(jié)果與分析執(zhí)行命令rea ./project-x輸出的報(bào)告節(jié)選如下Project: ./project-x Generated at: 2025-06-14 10:23:01 規(guī)模概況 Total files: 846 Total lines of code: 51,239 Total internal edges: 1,082 高風(fēng)險(xiǎn)模塊 Top 10 1. src/api/request.js (124 inward refs) 2. src/components/core/Table.js (78 inward refs) 3. src/pages/dashboard/index.js (61 inward refs) 4. src/styles/theme.js (54 inward refs) 5. src/components/core/Form.js (50 inward refs) ...看到這個(gè)結(jié)果我基本可以判斷模擬項(xiàng)目X的核心問(wèn)題在哪了src/api/request.js被一百多個(gè)文件直接引用這意味著任何對(duì)這個(gè)文件的小改動(dòng)都可能波及全項(xiàng)目所有的 API 調(diào)用。用《重構(gòu)》里的術(shù)語(yǔ)來(lái)說(shuō)這就是典型的“霰彈式修改”高危點(diǎn)。順著這個(gè)線索我抽查了幾個(gè)引用request.js的頁(yè)面組件發(fā)現(xiàn)它們確實(shí)共用了一個(gè)全局的請(qǐng)求實(shí)例而且這個(gè)實(shí)例硬編碼了一些業(yè)務(wù)參數(shù)。后面如果要改造項(xiàng)目這個(gè)文件必然是第一優(yōu)先級(jí)。4.3 深入排查孤立文件候選的甄別接著往下看報(bào)告中的孤立文件候選 孤立文件候選 - src/styles/dark-theme.css - src/pages/settings/profile_v2.js - src/pages/settings/profile_v1.js - src/utils/legacy_format.js注意最后這兩個(gè)文件profile_v1.js和profile_v2.js。二者都不被引用但顯然存在一個(gè)版本切換關(guān)系。通過(guò)查看git log我發(fā)現(xiàn)profile_v1.js確實(shí)已經(jīng)被替代而profile_v2.js是通過(guò)路由懶加載方式引用的所以靜態(tài)分析掃不到。這個(gè)案例很好地說(shuō)明了一個(gè)問(wèn)題孤立文件候選不是終點(diǎn)而是下一步人工排查的起點(diǎn)。如果自動(dòng)化工具能直接告訴你哪些代碼可以被刪除那它就不再是輔助工具而是代碼庫(kù)的替代者了。4.4 針對(duì)模擬項(xiàng)目X的優(yōu)化建議基于rea生成的報(bào)告我很快就整理出了幾條優(yōu)化建議將request.js中的基礎(chǔ) API 封裝拆分為獨(dú)立的小函數(shù)同時(shí)增加對(duì)全局請(qǐng)求實(shí)例的注入方式。刪除profile_v1.js以及與其相關(guān)的樣式文件。把utils/legacy_format.js中有價(jià)值的方法合并到utils/format.js確保沒(méi)有邏輯重復(fù)。在mock數(shù)據(jù)入口處增加統(tǒng)一的出口配置避免散落各處導(dǎo)致的認(rèn)知負(fù)擔(dān)。這些建議談不上高大上但他們建立在完整掃描結(jié)果之上因此每一處改動(dòng)都有明確的依據(jù)減少了憑空猜測(cè)帶來(lái)的風(fēng)險(xiǎn)。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄工具開(kāi)發(fā)到后期我陸陸續(xù)續(xù)遇到并解決了一些典型的工程問(wèn)題。這里挑幾個(gè)最有代表性的問(wèn)題做個(gè)速查表也方便你將來(lái)使用或仿寫(xiě)類似工具時(shí)能夠繞開(kāi)這些坑。問(wèn)題原因排查技巧解決方案掃描大目錄耗時(shí)過(guò)長(zhǎng)同步 IO 操作過(guò)多用perf_hooks分階段計(jì)時(shí)定位耗時(shí)集中在掃描還是分析切換到異步 IO 或 Worker 線程池報(bào)告中有大量誤報(bào)的孤立文件靜態(tài)分析無(wú)法覆蓋動(dòng)態(tài)引用抽樣核查個(gè)別文件檢查是否存在import()或配置式引用引入文件類型分組和.reaignore機(jī)制require路徑解析 alias 導(dǎo)致依賴匹配不上構(gòu)建工具里配置了模塊別名在報(bào)告里輸出一條“未匹配 dependency”匯總在工具里增加別名映射配置文件運(yùn)行環(huán)境 Node 版本過(guò)低導(dǎo)致崩潰使用了較新的 API查看堆棧信息定位具體 API明確最低環(huán)境要求啟動(dòng)時(shí)做版本檢查文件編碼不統(tǒng)一導(dǎo)致亂碼GBK 編碼的文件被當(dāng) UTF-8 讀取觀察到輸出中文亂碼時(shí)不應(yīng)盲目跳過(guò)讀取時(shí)嘗試多種編碼解碼并在報(bào)告中標(biāo)記編碼識(shí)別結(jié)果Worker 線程數(shù)據(jù)序列化開(kāi)銷大傳輸海量文件列表對(duì)比單線程與線程池在閾值前后的表現(xiàn)低于閾值時(shí)自動(dòng)退化為單線程模式除了這些常見(jiàn)問(wèn)題之外再分享幾個(gè)我平時(shí)用得比較多的小技巧。第一個(gè)技巧在調(diào)試rea時(shí)我喜歡先用一個(gè)小型 fixture 項(xiàng)目做驗(yàn)證而不是直接跑真實(shí)大項(xiàng)目。fixture 項(xiàng)目里就放三五個(gè)人為制造的依賴關(guān)系比如 a 引用 bb 引用 cc 又引用 a用來(lái)驗(yàn)證循環(huán)依賴是否能被正確識(shí)別。用這種微型案例調(diào)試效率遠(yuǎn)高于在大項(xiàng)目里糊里糊涂找 bug。第二個(gè)技巧輸出中間態(tài)調(diào)試信息。我在工具中加了一個(gè)--debug參數(shù)它會(huì)額外打印出掃描階段的文件數(shù)量、每個(gè)階段耗時(shí)、依賴解析失敗的路徑列表。這些信息在定位問(wèn)題時(shí)價(jià)值極高。第三個(gè)技巧把工具的源碼納入自己的日常代碼習(xí)慣之中。rea雖然是一個(gè)工具項(xiàng)目但它同樣需要版本管理、測(cè)試用例、代碼風(fēng)格統(tǒng)一。我把它推到一個(gè)私有倉(cāng)庫(kù)里每次修復(fù)完 bug 都加一個(gè)針對(duì)性的測(cè)試防止后續(xù)改其他地方時(shí)把修好的問(wèn)題又帶出來(lái)。第四個(gè)技巧也是我認(rèn)為最重要的不要把工具的定位搞錯(cuò)。rea的產(chǎn)出是線索不是結(jié)論。我在最初幾版的使用中曾因?yàn)檫^(guò)度信任“孤立文件候選”列表差點(diǎn)把一個(gè)動(dòng)態(tài)組件給刪了。從那以后我堅(jiān)持在報(bào)告首頁(yè)頂部加一句提示所有分析結(jié)果均需人工復(fù)核。這句話雖然簡(jiǎn)單卻在很大程度上避免了使用者過(guò)度依賴工具帶來(lái)的災(zāi)難。6. 后續(xù)擴(kuò)展方向與個(gè)人經(jīng)驗(yàn)總結(jié)rea目前能做的事情已經(jīng)足夠解決我百分之八十的結(jié)構(gòu)梳理需求但它的擴(kuò)展空間依然很大。如果時(shí)間允許我大概率會(huì)在三個(gè)方向繼續(xù)打磨。第一個(gè)方向是支持更多語(yǔ)言。目前依賴解析主要針對(duì) JavaScript 和 TypeScript 生態(tài)輸出報(bào)告的時(shí)候也會(huì)刻意區(qū)分.js、.jsx、.ts、.tsx。但實(shí)際項(xiàng)目里很可能一個(gè)倉(cāng)庫(kù)同時(shí)包含 Java、Python、甚至 Go 代碼。只要針對(duì)每種語(yǔ)言補(bǔ)充對(duì)應(yīng)的解析規(guī)則rea就可以變成一種真正意義上的多語(yǔ)言項(xiàng)目結(jié)構(gòu)分析工具。第二個(gè)方向是輸出可視化的依賴圖。現(xiàn)在終端文本報(bào)告雖然好讀但面對(duì)大型項(xiàng)目時(shí)一張能夠讓用戶拖動(dòng)、縮放、聚焦的交互式圖表會(huì)帶來(lái)更直觀的體驗(yàn)。我計(jì)劃在未來(lái)版本中把分析結(jié)果同時(shí)輸出一份 JSON 或 DOT 格式方便接入其他可視化工具。第三個(gè)方向是提供增量掃描能力。每次全量掃描雖然已經(jīng)足夠快但如果在 git 提交后只想分析本次變更涉及了多少上下游文件增量模式會(huì)實(shí)用得多。最后說(shuō)一點(diǎn)個(gè)人體會(huì)。我做過(guò)不少工具rea不是技術(shù)含量最高的一個(gè)但它是我認(rèn)為“性價(jià)比”最高的一個(gè)。它解決的問(wèn)題非常具體非常貼近日常開(kāi)發(fā)的真實(shí)痛點(diǎn)而且它本身并不復(fù)雜——一個(gè)會(huì)點(diǎn) Node.js 的開(kāi)發(fā)者幾天時(shí)間就能寫(xiě)出類似的工具。如果你正在為“看不懂項(xiàng)目結(jié)構(gòu)”而頭疼我的建議是先別急著重構(gòu)或換框架花點(diǎn)時(shí)間寫(xiě)一個(gè)像rea這樣的小工具把項(xiàng)目的真實(shí)面貌摸清楚。很多所謂架構(gòu)混亂的問(wèn)題在理清依賴關(guān)系之后往往會(huì)自動(dòng)暴露出清晰的解決路徑。你自己寫(xiě)出來(lái)的工具以后改起來(lái)也特別順手因?yàn)樗拿恳恍写a都貼合你自己的腦回路。還有一個(gè)我始終忘不掉的經(jīng)驗(yàn)。在我第一次重寫(xiě)rea的那個(gè)周期里我曾因?yàn)橄爰右粋€(gè)“自動(dòng)重構(gòu)建議”功能而差點(diǎn)把工具本身給拖垮。后來(lái)我把它砍掉了因?yàn)檫@個(gè)功能需要的智能程度遠(yuǎn)超一個(gè)命令行工具的范疇。做工具最忌貪多一個(gè)工具能專注地把一件事做好就已經(jīng)非常出色了。這句話我現(xiàn)在送給所有在造輪子的朋友也包括未來(lái)的我自己。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
午夜电影在线观看无码专区| 久久日本熟女精品一区| 男女做爰猛烈动高潮A片免费应用| www. 男人天堂成人在线| 综合色播| 最近2019中文字幕国语免费版| 精品一区二区三区丰满熟女-亚洲欧美一区| 欧美天堂超碰97| 特级大荫道BBwBBwBBW| 色婷婷丁香| 国产二区视频在线观看电影| 狠狠操使劲操| 精品综合久久久久久五月天| 高颜值美女口爆高潮浪叫| 中出789在线视频| 少妇蜜汁| 97香焦色区| 久久av色| 亚洲婷婷五月天| h4610国产人妻| 欧美在线天堂| 96国产精品| 久草精品一区| 男人的天堂久久狠| 天天天天天天天天综合| 打av高清| 欧美三级免费伊人| 日韩99神马视频播放| 欧美熟妇视频| 欧美色图偷拍另类| 日韩色图 一区二区| 黄色高清久久无码依人| 黄网站黄视频网站进入口 | 狠狠综合| 精品熟女一区=区三区| 激情婷婷五月天| 亚洲无套久久嗯嗯| 色婷婷淫色网| 日本不卡免费二区| 东京热,男人的天堂| 一级免费精品| 伊人九九九| 五月天婷婷社区| 成人小电影网站tex| 91一区二匹| 69视频入口| 超碰免费人妻人人| 天天干天天操天天干天天操| 人人操AV| 极品粉嫩一区二区| 久久久精品视频欧州站| 婷婷丁香激情| 人妻人人做人人澡人人爽欧美一区| 精品一区二区综合熟妇| 五月天婷婷色| 日韩丝袜高跟制服在线观看| 欧美,日韩,中文,另类| 国产精品播放| 秋霞无码av鲁丝片一区| 99国内精品| 青青色综合| 日韩 欧美 国产 麻豆| 人妻内射一区二区在线视频| 啊啊啊啊嗯嗯在线久久久| 91骚熟女| 97人妻免费中文字幕| 性爱av在线免费观看| 99视频自拍| 97中文字幕色| 大香交| 日本天堂在线播放| 久久久久九九九| 亚洲欧洲综合成人av一区| 欧美日韩一区二区三区四区蜜桃| 欧美激情综合色综合啪啪五月| 嗯嗯,啊啊,国产精品| 99只有精品| 青青青在线高清视频在线一二三四区| WWW啪啪的com| 97亚洲综合电影| av橘色网站| 熟女精品一区二区三区| 国产精品午夜成人福利| 精品十八在线观看| 韩国午夜理伦三级好看| 日本一二区免费| 9997se| 久久一二三四| 久久性视频| 97免费视频网| 亚洲色图欧美| 91九色首页| av72网| 午夜男人的天堂| 亚欧性爱ab| 日韩99神马视频播放| 性欧美999| 黄色AAAAA欧美| 熟妇亚洲一区二区三区| 91综合中文字幕| 激情五月天社区| 中文字幕人妻色偷偷久久皮| 欧美人黑A片无码免视费| 丝袜熟女一区二区三区| 久草精品一区| 蜜乳AV一区| 人妻一区二区三区| 国产又黄又粗的视频| 人妻日日夜夜精品| 丁香色狠狠色综合久久小说| 91在线限制级| 呦呦影院| 做爱福利视频一区二区| 天天躁日日躁xxxxx| 久久视网78| 久操97| 五月丁香在线| AV中亚| 精品无码一区二区| 日本国产欧美一区三区二区| 骚货人妻偷情自拍在线视频| 狠狠操狠狠操操| 亚洲少妇喷视频看| 日韩大香蕉| 99re6国产精品99re在线| 亚洲色图欧美一区二区不卡| 亚州高清色综合| 亚洲伊人久久综合97| 男人的天堂在线2| 国产一级内射高清视频| 啊啊啊不要啊啊受不了了视频在线 | 欧美亚洲厕所精品偷拍91| 国产福利视频精品视频| 亚洲se电影| 蜜乳AV色欲AVAV无码| 丝袜视频网国产90| 歐美一級亂黃99在綫精品| 91网九色蝌蚪操熟女| 中文字幕国产精品1区| 日本欧美中文字幕| 青青操视频在线| 国产亚洲国产超碰| 精品国产av一区二区三区四区入口| 91老司机在线视频免费观看 | 国产精品交换一区二区| 色一色综合网| 欧美色综合| 精品九九| 韩国女主播青草在线| 久久美女国产| 丰满美女一级毛片在线播放| 中出后入| 91久久国产综合久久| 91在线精品一区二区三区| 青女在线| 婷婷伊人綜合中文字幕| ,成人免费啪啪视频| 91精品国产乱码| 久久久精品国产亚洲伊人| 91一区二区三区蜜桃| 夜夜精品视频一区二区| 激情露脸爱| 精品国产久热在线观看| 欧美老妇曰批的视频| 日韩九九九| 蜜臀久久久| 日韩啪啪视频| 琪琪精品免费一区二区三区| 久久久97| 精品久久97| 午夜福利在线合集| 香蕉久久精品| 97干天天| 亚洲男人的天堂一区二区| 1024人妻熟女一区二区三区| 免费?级毛片无码?∨蜜芽试看| 亚洲另类色综合网站| 国产乱婷婷精品二区三区| 日韩乱插| 欧美熟女操屄| 性爱乱伦视频免费| 97超碰磁| 无码人妻一区二区三区色欲aⅴ | 91精品黄在线观看| 欧美大香蕉同搞| 婷婷婷婷婷婷久久久久| 久久一区二区蜜桃| 欧美视频一区二区三区| 偷拍五区| 高清孕妇孕交 交孕妇| 蜜臀AV成人精品蜜臀| 天天综合亚在线| 操逼日韩无码 | 色墦五月丁香| 久久精品美女一区| 国产精品宅男免费| 久久香蕉国产线看观看猫咪av| 国产av激情无码久久天堂| 91一区二匹| 国语精品对白| 亚洲欧洲综合| 亚洲春色一区二区三区| 亚洲网站一区二区在线| 欧美日韩啪啪电影| 91人妻中文| 少妇无码av专区线| 在线人人人人人人精品超| 777AV电影| 隔壁邻居波多野结衣中文字幕| 伊人网免费视频| 国产在线视频午夜精华在| 欧美综合另类| 久操网视频| 欧美日韩不卡a片| 不卡中文字幕aⅴ在线| 大香蕉免费3| 欧美亚洲国产91在线| a片久久久久久久久久久久| 999久久久免费精品国产牛牛| 26uuu最新| 久久狠狠色噜噜狠狠狠狠97| 少妇人妻好深太紧了vr91| 中文字幕久热视频在线| 久久思思热| 欧洲综合视频| 青青草国产一区二区三区| 成人av性爱电影在线观看| 97无码视频在线播放| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 加勒比久久av| 91亚洲欧美激情| 色呦呦国产精品免费看| xxx0国产在线播放| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 妇女性内射冈站HDWWWCOM| 国产精品高潮呻吟av久久4虎| 九九精品无码专区免费| 精品国产www久久| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 无码视频黄色网战| 亚洲AV无码天美传媒一区| 成人天天看站长推荐| 性感美女啊啊啊在线| 丰满人妻-区二区三区| 欧美性爱精品七区| 国产做?爰片久久毛片?片美国| 五月天激情国产综合婷婷婷| 淫乱图区 | 国产18精品亚洲精品| 精品久久久无码| 大香蕉欧美伊| 欧美啪啪色吧在线| 日va操| 欧美九九爱| 精品久久九| 超碰色97| 超碰人人草| 久色99999| 国产精品一区二区密臀| 日本性爱网址| 日韩欧美被操黄免费观看| 97色操| 亚洲暴力强奸AV| 日韩中字av一区| 国产伊人精品在线| 青青伊人这里只有精品| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 蜜臀av一区二区三区免费观看| 夜夜嗨AV蜜臀av| 亚洲 中文 欧美 日韩 在线| 少妇xx精品| 7月婷婷综合| 蜜臀99久久精品久久久久| 亚洲无码久久久久久久| 亚洲伊人久久精品影院| 高清国产无码av| 操人妻少妇中文 | 日韩草久视频| 97超碰色色| 色婷婷狠狠18禁| 免费日韩黄片| 人妻一区二区三区| 大屁股人妻女教师撅着屁股| 高凊专区人人操| 天天色播亚洲综合网站| 精彩久久中文| 97免费在线观看| 五月丁香色综合| 欧美瑟综合| 伊欧美综合视频| 青青草日本中文字幕| 男人女人18禁片免费看网站| 男人的天堂2019AV| 91美女在线观看| 精品一区二区啪啪啪| 东北女人性交| 嗯嗯啊中文字幕| 992视频一区| 视频二区美腿丝袜制服人妻欧美| 黄页av| 日本精品一区三区| 91久久青青草原精品| 日韩97超碰中文字幕| 91亚洲综合在线| 男人亚洲91首页在线| 亚洲天堂欧美| 欧洲精品一二三在线| 色综合av男人天堂| 日本在线999| 色综合美国| 99久久久久久亚洲精品不卡| 99热日| 国产成人久久久精品免费AV| 9I1性色影院| 精品无码久久久| 成人无码在线视频网站| 久操视频在线| 欧美午夜精品久久久久久3D| 欧美精品一区二区少妇免费A片 | 久久成年片色大黄全免费网站| 高清不卡国产| 久久黄色性爱视频| 日韩有码专区| 国产精品久久久久久久免牛肉蒲团| 人人操人人摸人人看人人干| 婷婷8月天青娱乐| 美腿色图| 色情综合| 欧美天天干| 在线视频资源| 丝袜av一区二区三区| 亚洲经典啪啪| 伊人网免费视频| 九一国产精品| 绯色AV粉色AV蜜臀AV| 1禁看欧美黄片免费看| 麻豆视频一区二区| 蜜屁Av| 伊人久久88国产女| 国产亚洲精品玖玖玖在线观看| 亚洲a色| 伊蕉97蜜桃97狠狠综合干| 强奸乱亚洲| 一级AV性爱| 九九九国产| 亚洲熟女一区| 99精品网站| 亚洲综合色婷婷| 日韩成人精品| 综合一区中亚洲国产成人综合精品 | 国产一区二区在线播放量| 亚洲天堂电影网99999| 嫩草 人人网精品| 激情综合五| 色乱二区| 日韩欧美aⅴ综合网站发布| 亚洲情色欧美| 国产免费内射视频| 国产91美女视频| 精品国产乱码久久久兰草影视| 看看小穴| 亚洲天天艹| 人人色人人操在线| 香蕉人人操tv| 亚洲精品aa久久伊人| 久久首页| 国产性爱在线视频一区二区| 粉嫩av久久一区二区三区| 久久一二三四| 青娱乐国产剧情av一区| 亚洲AV资源| 白丝一区| 精品传媒在线一区| 欧美人妻制服| 另类欧美色| 欧美—性—交—色| 水滴偷拍| 97亚洲在线| 一区二区三区麻豆| 午夜啊啊| 欧美激情精品| 特色a在线上| 天躁夜夜躁2021| 亚洲日韩黑丝| 亚洲AV不卡在线观看| 欧美91久久久久| 一区二区三区色综合| 伊人操操| 天堂涩涩| 一本久久久精品| 久久婷婷一区| 黑人综合网| 亚洲国产精品成人久久蜜臀| 久久在线观看免费视频| 久久国产AⅤ| 国产强奸乱伦xd| 无码日韩人妻av一| 99热官网| 亚洲色欲一区二区三区| 亚洲天堂自拍| 精彩久久中文| 好吊色青靑草| 26UUU欧美激情一区二区| 日本三级一区二区 在线| 操逼不卡中文字幕| 五月天色图影视| 欧美18禁91| 久久九精品| 天美传媒精品久久视频| 女人天堂av在线播放| A级片日韩欧美国产欧美视频精选观看 | 夜夜爽爽夜夜精品视频| 2017天天插| 丁香五六月啪啪| 国产区91柔拿会所技师| 天天日天天色| 超碰天天操| 青青草原伊人网| 老司机福利青青草| 手机在线看片免费人成视频| 日韩精品影视| juliaann欧美丝袜办公室| 国内毛片热久久思思热| 亚洲av无码成人精品国产| 久操高青| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 国内偷拍精品一区二区| 日本成人电影资源网| 日韩免费人妻色情网站| 亚洲色悠悠久久88| 国产精品熟女一区二区三区| 久久久免费的精品| 伊人久久国产免费观看视频| 婷婷丁香人妻| 日本视频一区二区三区| 国产av青草| 99色在线| 国产亚洲精品第一最新| 精品十三区| 欧美人妻制服| 亚洲熟女中文字幕在线| 免费网站观看www在线观| 麻豆AV一区二区天美传媒| 在线色导航| 99青草| 91色欧美| www.色操逼| 亚洲欧美日韩国产丝袜自拍中文| 亚洲国产精品无码AV久久久| 五月丁香啪啪啪| 尤物视频网 刘玥| 久久久久免费看少妇A片特黄| 天天色综合图片| 4tube欧美女厕所| 天天视频综合在线观看视频| 美女诱惑在线一区| 亚洲一区操| 日本人妻一区二区| 欧美精品三级黄片| 久久精品免费| A级在线视频| 欧美视频在线第3页| 久久精品超碰| 人人色97| 国内偷拍精品一区二区| 日本加靬比网站发布页| 爱妃国产亚洲视频中文字幕| 超碰人妻久久人妻中文97| 探花视频免费观看国产专区| 久久久久性熟视频| 3PAV乱伦视频| 91国产大片| 不卡av在线中文字幕| 综合激情97| 欧美性爱18观看| 欧美色天堂网在线视频| 久久性爱精品一区| 免费超碰97久久| 国产三区免费在线观看| 欧美天天影院| 亚洲另类综合欧美| 精品无码秘 人妻一区二区| 国产性感骚丝袜在线| 插入逼91| 18禁久极品美女久久哦哟呀!| 国产自产自拍| 久久久91福利姬| 日本亚洲熟女视频| 亚洲精品九九九| 67194无码不卡| 99国产在线 精品 视频| 国产怡红院在线| 女同在线视频一区| 8x福利精品第一福利视频导航| 国精综合一二三区影视| 婷婷丁香五月天综合东京热| 欧美天天搞| 婷婷色香| 六月婷婷综合| 国产精品4p在线观看| 久久久免费懂色| 成人电影一区| 偷拍三区| 久久久涩| 美国久久一二三四| 亚洲AV永久无码一区仙野| 天天做天天爱| 91精品免费| 天天色综合图片| 亚洲成人性爱网站在线播放| 亚洲中文sv| 精品国产72| 国产亚洲国产超碰| 欧美自拍偷拍综合图片| 夜间福利片1000无码| 日韩91网| 大香蕉琪琪日本女优不卡| 91五月天| 久热香蕉精品在线视频| 襙一襙| 国产美女91| 久久神马影院| 亚洲日韩AV视色| 天天天天天天天天天天干美女| 亚洲丝袜综合| 91狠狠狠| 免费97视频| 日本天天人人狠狠在线日美女 | 另类小说五月天| 北约熟女超碰| 家庭乱伦麻豆| 91无码精品| 青青操视频在线| 伊人大香蕉在线| 五月丁香激情综合网| 密乳AV免费观看| 91社区伊人| 天美传媒麻豆一区二区三区国产精| 欧美成人色| 天色综合网| 爽爽歪在线视频| 超碰av在线| 蜜桃av综合网发布| 日韩精品人妻一| 日本成人免费一区二区三区| 青草综合| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 99人人干| 天天色综合天天操| 黄片aaaaa一区| 国产女同视频在线播放| 日本高清免费一本视频在线观看| 国产又黄又爽| 9久在线视频只有精品| 熟妇视频一区二区三区在线| 亚洲国产97在线精品一区| 青久久| 91艹| 91熟女视频网| 极品美女嘿咻| 夜夜高潮夜夜爽夜夜爱爱一区| 人妻激情视频| 天天综合青苹果| 九九热av| 一区二区乱码福利| 91看黄片| 日人妻视频91| 欧美在线干| 91在线色综合| 一区二区三区蜜桃成人撸久久东京热 | 久艹99| 蜜臀va69| 青青草福利视频| 国产内射爽爽大片| 国产精品区在线12p| 国产精品999zyz| 色香色欲天天综合网天天来吧| 成人性爱电影一区二区| 夜色五月天| 夜夜狼人妻| 97精品97久久| 91人妻人人澡人人爽人人精品| 蜜臀视频网站| 日本免费中文字幕在线| 人妻人人操| 久久综合18p| 九区国产| 亚洲色交| 天堂а√在线最新版在线 | 99热欧美| 乱伦熟女专区| 探花一区在线| 欧美熟妇乱码在线一区| 97天天插| 91在线视频国产网站| 草草网站影院白丝内射| 婷婷五月丁香五月| 大香蕉之青青草原| 日少妇视频| 日韩欧美中文日韩欧美色| 丁香六月天| 蜜屁Av| 超碰2017| 日本123区操B视频| 伊人一区二区三区| 亚洲天天操| 日本一区二区不卡精品| 大香蕉免| 久久久久久综合久久伊人蜜月| 中文字幕日韩电影人妻| 亚洲情色电影网| 久久久久久裸体| 大屁股人妻女教师撅着屁股| 五月丁香激情综合| 国产免费一区| 特级特黄一级毛片免费| 日本在线不卡123| 啊啊啊啊,啊啊好多水| 国产久久免费精品视频| 丁香五月激情综合| 久久久免费视频18| 乱伦1色页| 九九久久国产精品| 激情小说亚洲| 长长久久88视频| 韩国毛片一区二区三区| 人妻丰满熟妇一区二区三| 91人妻超碰| 精品久久97| 超碰人人超在线观看| 超碰在线97国产| 久久精品福利影院| 九九九久千久久激情蜜桃在线看| 亚洲欧美黄| 99热综合| 97Ai亚洲| 99综合视频一体| 人妻夜爽夜夜爽| 日本道久久综合色色| AV色图| 免费A V在线播放| 日本顶级天天操狠狠操夜夜操中文字幕| 免费观看成人www精品视频| 韩国一区二区精品亚洲| 97超碰色| 国产夜夜操| 100啪啪视频大全| 无码视频一区二区| 6080YYY午夜理论片在线观看| 97超碰天天爱天天爱| 91看黄片| 国产熟女精品区| xxx0国产在线播放| 97在线观看免费| 亚洲人妻av| 亚洲色交| 精品国产91久久久久久一区黄无| 白丝被操91| 欧美人妻中出| 天天躁日日躁AAA片李宗瑞| 91精品国| 69超碰综合| 国产精品第一区第一页| 啊啊啊不要啊啊受不了了视频在线 | 中文字暮97| A片A5445444| 免费成人在线熟妇网| 性爱乱伦网址| 久久超碰com| 狠肏骚人妻| 精品亚洲国产成人av网站| 午夜操操操| 亚洲春色激情小说| 亚洲欧洲综合av在线| 俺也射| 久久极品一区二区| 日韩黄色片子| 蜜桃臀久久| 日韩人妻少妇中文字幕| 国产一级137片内射麻豆| 无码九九| 97激情97激情| 中文字幕在线观看二区三区| 亚洲欧美人妻| 国产精品动态一区二区三区四四| 日本九九九九| 性爱Av免费| 丰满人妻-区二区三区免费看| 蜜桃中文字日产乱幕4区| 夜间福利片1000无码| 熟妇色99| 久久精品成人一区二区三区蜜臀 | 天天综合网日韩| 美女黑人91神马| 吻戏激情性巴克| 日本三级一区二区 在线| 午夜美女诱惑电源网| 大香蕉宅男伊人| 亚洲少妇色| 国产亚洲日本精品在线| 欧美性爱第一页久久| 91精品国产91久久久久久久久久久久| 欧美综合色站| 激情五月综合| 亚洲图片欧洲图片aⅴ| 青青草国产欧美非洲黑人| 欧美在线综合| 日韩99神马视频片| 亚洲AV无码天美传媒一区| 人人插人人摸人人| 中国AV美女| 久艹日日日| 99久久久| 日本 情色 1区2区3区| 精品亚洲俞拍视频一区| 中文高清一区二区的| 大香蕉综合| 加勒比久久综合网高清| wwwxxx日本爽| 亚欧高清| 亚洲性网| 性猛交| 亚洲在线91| 91岛国动作片| 色区97| 欧美伊人电影| 骚货操死你| 欧亚 另类 久| 人伦四五区| 综合情欲网| 久久久久久久9最新免费视频观看| 精品乱子一区二区三区99| 精品网站9999| 手机不卡视频不卡在线一二三区| 欧美黄页在线| 江都AV在线| 国产suv精品一区二区四| 亚洲图片 91| 蜜臀久久99精品久久久老,,| 国产在线76页| 玖玖97综合| 精品一区96| 婷婷色香| 亚洲熟女乱综合一区二区三区| 男人久久精品| 亚州熟妇精品| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 亚洲日韩成人性爱视频| 伦理片秋霞免费影院| 强奸a片网| 婷婷色综合| 性站| 神马午夜久久久| 北条麻妃性愛视频| 欧美性视频二区三区| 日韩av情韩国爱禁区av一区二区| wuyechaopeng| 麻豆熟妇乱妇熟色A片在线看| 91色插| 亚洲中文字幕精品一区| 国产一区二区三区久久久精品| 日韩人妻播放| 亚洲另类在线观看| 日韩精品三区四区| 久草精品视频| 91欧美经典| www.色吧5.com| 激情国产乱伦Av| www99热| 秋霞男人网| 久久精品高清无码一区| 狠狠躁伊人中文字幕| 国产91精品在线免费| 国产精品点击进入在线影院| 桃花色涩综合影院| 国产精品久久久久久夜夜夜| 激情五月天校园春色网| 美女诱惑久久| 国产精品 久久久精品一牛| 天天做日日爱夜夜爽| 一本一道人妻久久一区二区三区 | 久久久免费高清中文视频| 国产熟妇 码视频户外直播| 黄色激情电影在线观看| 久99视频| 亚洲美女色图| 天天影视亚洲| 插日本熟女视频| 亚洲。日韩。欧美| 天天操熟妇| 欧美18 在线观看| 大香蕉婷婷| 亚洲男人综合网| aa片毛片| 国产高潮AA片免费看| 99热aaa| 美女诱惑久久| 中文字幕日本久久| 青青草乱入乱欲视频在线观看| 东京太热男人的天堂久久久| 午夜超爽| 欧美一二三区四五区| 超碰色97| 成年女人18级毛片毛片免费观看| 国内操逼视频二区| 蜜臀久久99精品久久久| www色婷婷| 亚州图片第一页| 人人贴人人摸| 99999精品成人| 国产精品熟女一区二区三区| 五月丁香六月婷综合成人综合| 超碰久久草| 国产三级资源在线观看| 黄色乱论网站| 亚洲人妻久久| 天天摸,夜夜摸| 日韩91网| 免费视频a级毛片免费视频| 日日妻色网| 鸡巴插逼视频| 亚洲精品1区| 国产乱色国产精品免费视| 九九玖玖精品| 在线免费观看高清无码视频| 日本有码久久| 久久久无码视频| 亚洲欧洲偷拍一区| 色香欲综合| www.狠狠| 亚洲熟女av中文字幕| 丁香婷婷大香蕉| 东京热,男人的天堂| 午夜免费福利视频一区| 黑人性暴力毛片| 精品久久99| 97神马久久| 操久久久久久| 超碰免费97| 亚洲人在线| 18啪啪手机免费性爱| 中出789在线视频| 亚欧视频在线| 亚洲在线观看| 大香蕉手机视频| 中文乱码字幕观看视频| 久久欧美按摩999| 国产综合色精品在线观看| 殴美综合色88| 精品少妇人妻av久久免费| 色天欧美| 色婷婷视频| 91亚洲综合| 岛国人妻少妇av在线观看| 这里只有精品视频在线观看麻豆| 欧美色综合图片| 日韩中文字幕视频在线观看| 9久9久9久9久视频网站| 夜夜嗨一区二区| 日B操| 亚洲男人天堂视频| 中文字幕日韩综合| 亚洲精品免费中文字幕| 物业黑人 AV一区| 99视频精品| 国产精品嫩草影院午夜两性| 激情综合网一盗摄| 婷婷激情五月| www.伪伪| 三级色影综合网| 久久一二三四不卡 | 男人的天堂2010| AV一起草在线| 色噜噜狠狠色综无码久久| 亚洲天堂综合AV| 成人a级高清视频在线观看| 激情文学亚洲| 亚洲码和欧洲精品激情系列| 黑人操一区二区| 91亚洲欧洲| 91人妻久久久久久久久久久久久| 清柠毛片| 日本色色色视频| a级免费在线观看| 欧美综合在线第一页| 嗯啊啊啊轻点视频 | 日本一本一区二区三区四区五区欧美日韩中文字幕 | 国产熟女完整版中字| 国产AV中文| 黄色十八禁| 嗯嗯啊啊操死我| 日本网色| 精品午夜福利国产一区二区在线观看| 国产精品白丝www| 中文幕97| 日产国产精品中文久久婷婷| av凤凰久久久| 国产成年免费大片黄在线观看| 欧美日韩另类激情图片| 99热99re6国产在线播放| 超碰国产情侣自拍网| 蜜桃无码AV一区二区| 97在线精品观看视频| 人妻三级在线中文字幕| 久久久天堂| 天天操天天7| 亚洲欧洲日产国产综合网| 午夜精品久久久久久久男人的天堂| 久久毛卡| 无码人妻精品一区二区中文| 日韩肏逼视频| 亚洲资源一区| 日日97| 青青草影视蜜久久| 色网综合网| 目产99999久久999| 国产精品久久久久绯色| 亚洲综合网电影91| a网站免费观看| 久99久视频| 两性综合网| 国产精品亚洲一区二区三区四区| 国产精品免费日韩| 日本欧美韩国国产在线| 久久91精品国产9丨久久分亭 | 国产十八禁视频| 97精品在线视频| 久久精品男人的天堂| 国产精品国产| 熟妇激情| www.成人无码| 97在线观视频免费观看| 疯操AV| 加勒比日本在线| 成人A片男人的天堂| 国产自产91区13区| 日本少妇va7777| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 亚洲第一成人影院色播| 粉嫩av在线一区二区| 久久一级无码精品毛片6| 亚洲成a人片在线观看中文!!!| 黄片国产精品一区二区| 香蕉久久AⅤ...| 东北丰满熟女国产一区| 黑人操一区二区| 国产成人bd在线观看| 亚洲中文日韩精品| 天天插天天操| 五月婷婷六月丁香| 九九热免费国产视频婷婷伊人五月| 97人肏| 日日AV加勒比| 91欧美性| 青草伊人网| 国产路线专区| A级在线视频| 日韩av免费一级电影| 亚洲色系另类精品国产| 最近2019中文字幕国语免费版| 俺去俺来也在线www| 99久热| 91欧美长吊| 青青操视频在线| 97超碰9| 亚洲av综合伊人久久| 国产高清成人mv在线观看| 亚卅熟女乱色| 九月丁香婷婷| 国产精品久久久久久久免牛肉蒲团 | 九九热九九| 国产精品亚洲无码| 自偷自拍的亚洲视频| 天天看少妇| 强奸熟女一区二区三区| 极品色综合| 日韩中文字幕国产| 狠狠色综合网| 熟啊v色欧美热| 婷婷九月丁香| 张柏芝国产一区在线观看| 久久久久亚洲?V片无码V| 91久久久久久| 大香蕉99热| 91久久国产精品| 国产超碰AV在线精品| 中文字幕在线观看二区三区| 美女露胸露奶头| 少妇激情AV| 人人操人人摸人人骑| 中日韩熟女| 亚洲人久久久久日| 啊啊啊免费| WWW啪啪的com| 色欲久久综合| 人妻内射一区二区在线视频| 色色香蕉| 在线观看免费视频国产| 亚洲天天操| 欧亚性爱啪啪| 色婷婷成人综合| 大粗鳼巴久久久久| 伊人久久综合影院| 亚洲夜色在线| 久久宗合97| 尤物网址| 一牛影视久久久一区二区三区| 欧美女同在线| 很黄很色的视频在线观看| 亚洲美乱| 97久久超碰日韩精品| 老色鬼成人精品视频下载大在线观看| 蜜臀va69| 丰满的三级少妇欧美久久久| 国产精品青青草| 91碰碰| 国产CHASE男男GAYGA 毛多色婷婷| 高清无码久操视频| a一区二区三区乱码在线| 免费的黄片有限公司| 欧美天天影院| 男人的天堂在线2| 日韩综合成人免费视频| 久久只有精品一区二区三区| 在线观看亚洲成人精品| 婬女免费一二三区A片| 蜜桃臀一区二区aV | 色男人色天堂东京热| 亚洲五码一区二区三区| 岛国天天午夜影院传媒网| 一线黄色免费性爱片| 精品无码一二三四区| 欧美夜夜草视频| 亚洲日韩AV视色| 97免费视频在线| av九九| 亚洲AV色图| 99久久综合| 九九九精品美女| 男人的天堂2010| 精品欧美乱码久| 国产欧美伊人| 综合久久97| 亚洲日韩av一区二区三区百合| 东京热毛片177b2viP| 狼天天狼天天大香蕉| 成人精品在线免费视频| 国产夜夜艹| 精品亚洲一区在线观看| 久久久网一区| 久久久免费的精品| 色哟哟AV| 超碰在线91| 91欧洲国产成人久久精品网站| 日本熟妇熟色97一本在线观看| 2024年最新色情网站在线观看| 亚洲最大黄网| 2017人人操,人人摸| 91欧美性| 99精品在线观看| 久久久久亚洲Av无码专区老牛影视| 在线人妻熟女一区二区三区四区五区| 日本高清免费一本视频在线观看| 天美欧美国产| 国产一区二区在线电影| 久久精品国产亚洲av水密被窝| 日韩99999色| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 91日产桃蜜| 嗯阿好爽好紧| 色yeye成人免费视频| 欧美亚洲系列| 你草精品在线视频| 一起草精品人妻| 密乳视频在线| 91国产丝袜美女| 婷婷久草一区二区三区| 乱伦一区二区三区‘| 天美av在线| 亚洲男人的天堂一区二区| 亚洲欧洲精品视频发布| 97chaopengongkai| 久久久久ab| 东京日日夜夜| 草草网站影院白丝内射| 日韩小电影| 青青草久草AV| 久热69九色熟妇97| 欧美人妻一区| 国产区日韩区在线观看| 超碰 国产熟女精品一区| 91啪9色| 欧亚在线视频| 伦激情人妻另类人妻| 蜜臀久久99精品久久久久久成人小说 | 美女十八禁| 一区二区视频你懂的| 亚码激情| 久久欧美性爱视频| 国产最火爆久久国产网站网站| 91美| 色偷偷超碰亚洲| 日本天堂网| 日本三级韩国三级99| 午夜爽爽爽在线观看永久入口姬片| 久久久久少妇| 992大香蕉| 天天拍天| 久久色一区二区| 熟妇人妻一区二区| 色爱综合网| 强免费黄色网址| 国产精品成人福利在线| 天天射天天| 日韩无码极品| 96一区二区| 国产在线激情| 麻豆天美AV传媒第一页| 欧美影音在线| 亚洲欧洲无码97久久精品| 久久天天摸| 色色五月天婷婷| 亚洲欧美日韩夜夜| 日本色色的视频| 黄页网站免费高清在线观看| 黄色视频60分钟| 亚洲黄色视频在线观看视频| 97色碰| 亚洲九九九九| 欧美激情专区| 久久这里只有精品9| 亚州性色| 97亚洲在线| 花花AV导航| 人人操人人肉久久精品| 超碰碰97资源站| 九九九九九九九九九国产精品| 天天天肏屄肏屄肏屄欧美欧美| 超碰在线日韩一区| 久久av无码| 成人av性爱电影在线观看| 亚洲成人精品在线一区| 精品无码一区二区三区| 激情小说日韩无码| 看免费的黄片| 伊人久久在线视频观看| 亚洲另类小说卡通动漫| 国产一区在线观看无码AV| 久久直播国产| 97国产成人精品免费视频| 自拍鲍鱼一区在线高清观看免费| 探花精品视频| 97超碰亚洲| 啊啊啊啊好多水| 97日韩超碰超碰中文字幕| 91天天综合日韩欧美| 日韩视频中文字幕| 乱操乱伦AV| 太久视频| 91九色在线|