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

ARTICLE DETAIL

資訊詳情

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

插件加載失敗排查指南:從did not activate到根治

插件加載失敗排查指南:從did not activate到根治 先說實(shí)話過去一周我至少收到了三條跟plugins相關(guān)的求助消息報(bào)錯(cuò)長(zhǎng)得幾乎一模一樣——Failed to load plugins web boot: 2 entries did not activate后面還跟著一串奇怪的包名比如linxin666/dsh-p、huayu-yuan。問的人多了我突然意識(shí)到這不是個(gè)例而是所有跟插件體系打交道的開發(fā)者遲早要撞上的那堵墻。這個(gè)標(biāo)題下的熱搜詞也很有意思有人問iar plugins 是干什么的有人在搜musicfree plugins還有一堆人卡在harness failed to load plugins上。表面看是不同工具、不同生態(tài)但翻來覆去其實(shí)是同一件事——插件機(jī)制本身的工作原理和排查思路。這篇文章不打算做成plugins的詞條百科我也沒有那個(gè)能力把全世界所有插件框架講一遍。我只想以加載失敗為切口把插件的加載、激活、依賴分析、故障定位這些底層邏輯徹底講透。不管你用的是 Harness、MusicFree、IAR 還是自己寫的插件系統(tǒng)這套排查方法論都通用??赐曛竽阍儆龅絛id not activate大概率不需要去搜索引擎里碰運(yùn)氣了。1. 先拆開那句最讓新手崩潰的報(bào)錯(cuò)2 entries did not activate很多人第一次看到Failed to load plugins web boot: 2 entries did not activate的時(shí)候第一反應(yīng)是插件壞了第二反應(yīng)是刪了重裝。這兩個(gè)反應(yīng)都不算錯(cuò)但沒有一個(gè)觸及真正的問題。我見過的項(xiàng)目里這句報(bào)錯(cuò)背后藏著至少七八種完全不同的原因而且大部分跟插件本身的代碼好壞沒有直接關(guān)系。要讀懂這句話得先接受一個(gè)插件系統(tǒng)領(lǐng)域里很多人下意識(shí)忽略的事實(shí)加載插件和激活插件是兩件不同的事。一個(gè)現(xiàn)代的插件系統(tǒng)比如 Harness 的 web boot 加載器在啟動(dòng)時(shí)做的事情遠(yuǎn)不止把插件的 JS 拉過來跑一遍。它內(nèi)部是分階段的發(fā)現(xiàn)階段掃描所有聲明過的插件入口entry把它們從模塊系統(tǒng)里加載進(jìn)來拿到插件的元信息。校驗(yàn)階段檢查這個(gè)插件是否滿足宿主聲明的依賴、版本、平臺(tái)要求。激活階段真正執(zhí)行插件的激活函數(shù)讓插件向宿主注冊(cè)能力、擴(kuò)展點(diǎn)或服務(wù)。報(bào)錯(cuò)里說的2 entries did not activate意思是加載器已經(jīng)發(fā)現(xiàn)了兩個(gè)入口但它們?cè)诩せ铍A段沒有成功。這里就有一個(gè)很多人容易誤解的細(xì)節(jié)did not activate并不等于插件代碼報(bào)錯(cuò)了。它只是一個(gè)結(jié)果描述。插件可能因?yàn)楸旧淼拇a拋異常而沒激活可能是因?yàn)楫惒匠跏蓟瘺]等完就被宿主判定超時(shí)也可能是因?yàn)樗蕾嚨牧硪粋€(gè)插件沒起來它的激活函數(shù)選擇了靜默退出。甚至還有更離譜的情況——插件聲明了activate函數(shù)但函數(shù)簽名跟宿主期望的不匹配宿主根本就沒調(diào)用它。我的建議是遇到這句報(bào)錯(cuò)先別急著懷疑插件作者也別急著懷疑自己配錯(cuò)了。第一步應(yīng)該是去看日志里是否還有其他更早的報(bào)錯(cuò)信息。很多框架在拋出did not activate之前會(huì)先寫一條詳細(xì)得多的錯(cuò)誤日志包含具體是哪個(gè)入口、拋出的是什么異常、哪個(gè)依賴缺失。只盯著最終報(bào)錯(cuò)看等于只看到了事故現(xiàn)場(chǎng)沒看到事故原因。從搜索引擎的熱搜詞來看linxin666/dsh-p和huayu-yuan這兩個(gè)包名反復(fù)出現(xiàn)在報(bào)錯(cuò)信息里。這其實(shí)是另一個(gè)重要信號(hào)報(bào)錯(cuò)里的包名越具體越說明加載器工作正常問題越集中在插件自身的元信息或依賴關(guān)系上。你順著包名去查它的package.json、它的plugin.json、它的依賴樹往往能很快找到答案。2. 為什么插件系統(tǒng)偏愛兩段式激活而不是一個(gè)init干到底弄清楚了did not activate的字面意思下一個(gè)自然的問題就是為什么要把加載和激活分開為什么不干脆像普通模塊那樣import之后就執(zhí)行、執(zhí)行完就算完成這個(gè)問題如果沒想透排查問題的思路很容易走偏。我見過不止一個(gè)開發(fā)者一看到插件加載失敗就猛改插件代碼加各種try...catch試圖讓插件跑起來。但很多時(shí)候問題根本不是插件跑不跑得起來而是宿主跟插件之間的接口協(xié)議沒對(duì)齊。插件系統(tǒng)的兩段式設(shè)計(jì)本質(zhì)上是在模仿操作系統(tǒng)加載應(yīng)用程序的過程。你想想Linux 啟動(dòng)一個(gè)可執(zhí)行文件時(shí)先是由內(nèi)核把文件映射到內(nèi)存分配地址空間然后才跳轉(zhuǎn)到入口函數(shù)執(zhí)行。映射失敗是加載階段的錯(cuò)誤入口函數(shù)崩了是運(yùn)行階段的錯(cuò)誤。插件系統(tǒng)把這兩個(gè)階段分開能換來幾個(gè)實(shí)實(shí)在在的好處第一個(gè)好處是可控性。宿主可以對(duì)已經(jīng)加載但沒有激活的插件做預(yù)檢。插件的元信息、依賴列表、權(quán)限聲明都可以在激活之前被審查和校驗(yàn)。發(fā)現(xiàn)插件需要的宿主 API 版本不滿足直接在激活之前攔截掉不讓它執(zhí)行任何代碼。如果只有一個(gè)init函數(shù)那你只能在插件代碼執(zhí)行到一半的時(shí)候發(fā)現(xiàn)問題那時(shí)候可能已經(jīng)造成了部分副作用。第二個(gè)好處是并行和容錯(cuò)。在 Harness 這類系統(tǒng)里多個(gè)插件的加載順序往往是經(jīng)過拓?fù)渑判虻?。宿主提前知道了所有插件的依賴關(guān)系圖就可以讓互不依賴的插件并行加載讓被依賴的插件先激活。如果某個(gè)插件激活失敗宿主可以決定是終止整個(gè)啟動(dòng)流程還是跳過它繼續(xù)用其他插件。兩段式設(shè)計(jì)給這個(gè)決策留出了明確的判斷節(jié)點(diǎn)。第三個(gè)好處是重試和延遲激活。我舉個(gè)最常見的場(chǎng)景配置管理系統(tǒng)里插件 A 依賴配置服務(wù)的某個(gè)數(shù)據(jù)但配置服務(wù)本身也是另一個(gè)插件 B 提供的。宿主先加載 A 和 B然后讓 B 先激活等 B 激活完成后再去激活 A。如果 A 發(fā)現(xiàn)數(shù)據(jù)還沒準(zhǔn)備好它可以告訴宿主我沒激活但我愿意等。這種能力在init一體化設(shè)計(jì)里很難優(yōu)雅實(shí)現(xiàn)。理解了這一點(diǎn)再看did not activate你就會(huì)明白這句話既不是說插件文件下載失敗也不是說插件被禁用了而是說宿主給了你激活的機(jī)會(huì)但你沒有完成激活流程。排查的重心應(yīng)該放在激活條件是否滿足、激活函數(shù)是否拋出異常、激活結(jié)果是否被宿主正確接收這三個(gè)地方。順帶說一個(gè)我自己的實(shí)際經(jīng)驗(yàn)不少插件框架的激活函數(shù)支持返回值宿主會(huì)根據(jù)返回的 Promise 是否 resolve 來判斷激活是否成功。有的插件作者在激活函數(shù)里做了異步操作比如拉取遠(yuǎn)程配置結(jié)果忘了把這個(gè)異步操作放在返回的 Promise 鏈上導(dǎo)致激活函數(shù)已經(jīng)返回了但真正的初始化還沒完成。宿主一看函數(shù)返回了就認(rèn)為激活成功但功能實(shí)際上是殘缺的反過來如果拉取遠(yuǎn)程配置失敗異步操作在 Promise 之外拋了異常宿主捕獲不到就會(huì)一直處于未激活的懸掛狀態(tài)。這種 bug 非常隱蔽日志里未必有直接痕跡需要你仔細(xì)讀代碼才能發(fā)現(xiàn)。3. 一條完整的排查鏈路從failed to load plugins到真相大白光說理論還是太虛我用自己處理過的一個(gè)真實(shí)案例來走一遍完整排查流程。項(xiàng)目背景是一個(gè)內(nèi)部工具用了類 Harness 的插件加載器啟動(dòng)時(shí)必現(xiàn)報(bào)錯(cuò)Failed to load plugins web boot: 2 entries did not activate這兩個(gè)入口一個(gè)叫l(wèi)inxin666/dsh-p一個(gè)內(nèi)部封裝的儀表盤插件一個(gè)叫huayu-yuan一個(gè)數(shù)據(jù)源插件。這個(gè)場(chǎng)景跟熱搜詞里的情況幾乎一模一樣所以我拿它當(dāng)主案例講。3.1 第一步確認(rèn)報(bào)錯(cuò)的實(shí)際觸發(fā)點(diǎn)我最初的做法很簡(jiǎn)單直接在瀏覽器 DevTools 里打開 Network 面板看啟動(dòng)時(shí)到底請(qǐng)求了哪些文件。結(jié)果發(fā)現(xiàn)兩個(gè)插件對(duì)應(yīng)的 JS 文件都被正常下載了HTTP 狀態(tài)碼全是 200文件內(nèi)容也能正常解析。這說明問題確實(shí)不在文件加載層面符合報(bào)錯(cuò)信息里的did not activate而不是failed to load plugin file。這一步的核心價(jià)值是縮小范圍。我可以直接排除路徑配錯(cuò)文件不存在CORS 攔截網(wǎng)絡(luò)超時(shí)這一類問題把注意力全部集中到激活階段。3.2 第二步復(fù)現(xiàn)并抓取更底層的錯(cuò)誤光看 Network 不夠我打開了 Console把日志級(jí)別調(diào)到 verbose重新刷新頁面。這次看到了幾條之前被忽略的警告[plugin-loader] Entry huayu-yuan skipped: dependency dsh-p not active [plugin-loader] Entry linxin666/dsh-p activation failed: TypeError: Cannot read properties of undefined (reading registerPanel)這兩條日志一出來謎底基本就揭了一半。huayu-yuan之所以沒激活不是因?yàn)樽约河袉栴}而是因?yàn)樗蕾嚨膁sh-p沒激活成功。所以真正的病根在dsh-p那行TypeError上。這里就體現(xiàn)出兩段式激活和依賴注入的價(jià)值了加載器明確地把依賴未激活作為拒絕激活的原因而不是讓插件自己蒙著初始化然后詭異報(bào)錯(cuò)。如果你用的是一個(gè)日志不友好的框架可能只能看到一堆undefined is not a function連是誰調(diào)誰都不知道。3.3 第三步分析插件代碼與宿主 API 的匹配關(guān)系拿到Cannot read properties of undefined (reading registerPanel)這條線索后接下來就是讀代碼。我去翻了dsh-p的源碼找到一個(gè)關(guān)鍵片段// 偽代碼示意 export function activate(host) { host.panels.registerPanel({ id: dsh, component: DashboardComponent, }); }這段代碼假設(shè)宿主傳進(jìn)來的host對(duì)象上有panels.registerPanel方法但運(yùn)行時(shí)host.panels是undefined所以直接拋了 TypeError。這意味著什么意味著插件是在面向一個(gè)較新的宿主 API 版本開發(fā)的但實(shí)際運(yùn)行它的宿主還是一個(gè)老版本老版本里面板注冊(cè)的 API 路徑是host.registerPanel沒有panels這個(gè)命名空間。這種問題特別典型的出現(xiàn)場(chǎng)景是插件作者升級(jí)了宿主 SDK但部署環(huán)境里宿主核心沒升級(jí)或者反過來宿主升級(jí)了老插件還在用舊 API。我后來查了項(xiàng)目的依賴鎖文件確認(rèn)dsh-p這個(gè)包是在宿主升級(jí)核心之后才發(fā)布的而宿主核心并沒有包含它預(yù)期的panels命名空間。3.4 第四步定位依賴關(guān)系中的順序問題順便解釋一下huayu-yuan的情況。它在插件目錄里聲明了對(duì)dsh-p的依賴。加載器做了拓?fù)渑判蚶碚撋蠒?huì)先激活dsh-p再激活huayu-yuan。但dsh-p激活時(shí)拋了異常宿主標(biāo)記它為failed然后輪到huayu-yuan時(shí)加載器檢測(cè)到它的依賴不可用直接跳過了它的激活連它的代碼都沒執(zhí)行。這種依賴未滿足就靜默跳過的設(shè)計(jì)對(duì)一個(gè)健康的插件生態(tài)其實(shí)是友好的。它避免了插件在一個(gè)殘缺的環(huán)境里運(yùn)行產(chǎn)生更難查的狀態(tài)污染。但你作為排查者必須理解這條鏈路表面上兩個(gè)插件都沒激活但真正的問題只出在第一個(gè)插件上第二個(gè)是被連帶影響的。在踩坑過程中我還發(fā)現(xiàn)一個(gè)容易誤導(dǎo)人的細(xì)節(jié)如果加載器沒有明確告訴你依賴未激活你可能會(huì)看到huayu-yuan那邊有一條Promise timeout或activation aborted之類的模糊錯(cuò)誤很容易把方向引向這個(gè)插件自己卡死了。所以排查時(shí)一定要把日志里所有跟插件加載相關(guān)的條目全部拉出來看不要只看跟你懷疑對(duì)象相關(guān)的部分。3.5 第五步修復(fù)與驗(yàn)證定位到根因之后修復(fù)方案反而很簡(jiǎn)單了。我當(dāng)時(shí)做了兩件事先把dsh-p插件升級(jí)到與當(dāng)前宿主 API 兼容的版本然后給huayu-yuan聲明依賴時(shí)加上版本范圍約束避免它再匹配到不兼容的版本。重啟應(yīng)用兩個(gè)插件都正常激活報(bào)錯(cuò)消失。這個(gè)案例帶給我的方法論沉淀是插件激活失敗的問題90% 的根因不在網(wǎng)絡(luò)、不在文件缺失而在 API 兼容性、依賴順序和異步初始化三者之中。后面我會(huì)針對(duì)這三類根源分別給排查技巧。4. 真實(shí)生態(tài)觀察IAR、MusicFree、Harness 這些熱門里的插件門道熱搜詞里特別提到了三個(gè)具體的生態(tài)iar plugins嵌入式 IDE 的插件體系、musicfree plugins開源音樂播放器的音源擴(kuò)展、harness failed to load plugins web boot持續(xù)交付平臺(tái)的插件加載。把它們放在一起看特別能說明插件機(jī)制的普適性和差異性。4.1 IAR 插件嵌入式 IDE 里的能力補(bǔ)充協(xié)議iar plugins 是干什么的這個(gè)問題很多人搜是因?yàn)槌醮谓佑|嵌入式 IDE 時(shí)看到插件管理界面一頭霧水。IAR Embedded Workbench 的插件體系核心作用是擴(kuò)展編譯、調(diào)試、靜態(tài)分析之外的能力。比如你可以通過插件集成自己的代碼格式化工具、自定義構(gòu)建步驟、或者對(duì)接內(nèi)部的日志分析平臺(tái)。插件的本質(zhì)是宿主定義了一組能力協(xié)議第三方代碼通過這些協(xié)議接入。在 IAR 里這個(gè)協(xié)議通常表現(xiàn)為 IDE 提供的一組 COM 接口或自動(dòng)化 API。你寫的插件只要實(shí)現(xiàn)了對(duì)應(yīng)接口就能被 IDE 識(shí)別并在菜單欄、工具欄、事件回調(diào)里出現(xiàn)入口。這里有一個(gè)通用經(jīng)驗(yàn)越是老牌的工業(yè)軟件插件協(xié)議越保守。IAR 的插件接口版本演進(jìn)速度很慢你今天按舊文檔寫的插件放在十年后的新版本 IDE 上大概率還能跑。但這種保守也意味著新特性只能靠 IDE 廠商自己加插件作者很難突破宿主能力邊界。如果你動(dòng)了用插件改 IDE 內(nèi)部行為的念頭我勸你先確認(rèn)插件協(xié)議是否有暴露對(duì)應(yīng)的鉤子沒暴露就別折騰繞過去幾乎不可能穩(wěn)定。4.2 MusicFree 插件小而美的插件化思路MusicFree 是一個(gè)開源的音樂播放器它的插件機(jī)制很有代表性——插件本質(zhì)上就是一個(gè) JS 文件導(dǎo)出一組provider接口。用戶要增加一個(gè)新音源只需要下載一個(gè) JS 文件放進(jìn)插件目錄應(yīng)用就能在列表里多一個(gè)源選項(xiàng)。這個(gè)設(shè)計(jì)最大的優(yōu)點(diǎn)是把插件的開發(fā)門檻拉到極低不需要編譯、不需要簽名、不需要復(fù)雜的依賴聲明。但低門檻的代價(jià)就是健壯性全靠作者自律。我在 MusicFree 社區(qū)里見過不少翻車案例插件作者沒有處理異常的網(wǎng)絡(luò)請(qǐng)求、沒有做好超時(shí)控制導(dǎo)致應(yīng)用在解析某個(gè)音源時(shí)卡死。還有插件在provider接口里偷偷聲明了一個(gè)全局變量跟其他插件的全局變量沖突兩個(gè)插件同時(shí)啟用時(shí)行為詭異。如果你是想給 MusicFree 這類應(yīng)用寫插件我的建議是嚴(yán)格把插件當(dāng)成一個(gè)被隔離的播放適配層來寫。對(duì)外只導(dǎo)出宿主要求的接口對(duì)內(nèi)不要碰任何全局狀態(tài)所有網(wǎng)絡(luò)請(qǐng)求都要設(shè)置超時(shí)和錯(cuò)誤兜底。插件的激活和調(diào)用是高頻操作任何一次卡頓都會(huì)直接影響用戶體驗(yàn)宿主可沒有任何節(jié)流保護(hù)。4.3 Harness企業(yè)級(jí)插件加載的復(fù)雜性和穩(wěn)定性平衡Harness 的web boot插件加載器是我個(gè)人覺得最值得研究的一種設(shè)計(jì)。它面向的是持續(xù)交付平臺(tái)這種高復(fù)雜度場(chǎng)景插件的來源可能是三方供應(yīng)商、內(nèi)部團(tuán)隊(duì)、甚至是同一個(gè)項(xiàng)目里的不同模塊。這樣的場(chǎng)景里插件之間的依賴往往非常復(fù)雜一個(gè)插件可能需要另一個(gè)插件暴露的運(yùn)行時(shí)數(shù)據(jù)而不是簡(jiǎn)單的你先跑我再跑。企業(yè)級(jí)插件系統(tǒng)的加載失敗根因幾乎必然落在依賴版本漂移上。我在實(shí)際項(xiàng)目中見過最典型的 case插件 A 依賴某公共庫的 v2 版本插件 B 也聲明依賴同一個(gè)公共庫但鎖定了 v3宿主啟動(dòng)時(shí)做了依賴加載結(jié)果先把 v2 加載了B 激活時(shí)發(fā)現(xiàn) API 對(duì)不上直接拋異常。這種問題在單體應(yīng)用里根本不可能出現(xiàn)但在插件插件化的世界里因?yàn)槟銦o法完全隔離每個(gè)插件的依賴版本沖突就成了需要持續(xù)管理的常態(tài)。解決版本漂移的方案五花八門有讓每個(gè)插件捆綁依賴做隔離的有在宿主層面做依賴協(xié)調(diào)的還有干脆規(guī)定所有公共依賴由宿主統(tǒng)一提供、插件只能使用宿主聲明的版本。這里不展開講但你應(yīng)該記住插件體系越復(fù)雜宿主對(duì)依賴的管理策略就越重要。排查問題的時(shí)候先搞清楚宿主用什么策略管理跨插件的共享依賴能幫你省掉一半的瞎猜。4.4 三個(gè)生態(tài)的橫向?qū)φ帐裁醋兞繘Q定了插件的難易度把這三個(gè)生態(tài)放在同一張表里看很多規(guī)律就清楚了維度IAR 插件MusicFree 插件Harness 插件插件載體原生代碼/DLL/COM 組件JS 文件JS bundle / npm 包激活方式IDE 啟動(dòng)時(shí)掃描注冊(cè)應(yīng)用掃描目錄后調(diào)用 provider按拓?fù)漤樞驁?zhí)行 activate依賴管理宿主提供接口無顯式依賴基本無依賴顯式依賴聲明支持版本約束升級(jí)策略調(diào)接口版本文件直接覆蓋版本鎖定 發(fā)布通道常見失敗原因接口版本不匹配代碼健壯性差、全局污染依賴版本漂移、API 不兼容這張表看起來信息很多但核心就一句話插件生態(tài)的復(fù)雜度主要取決于宿主對(duì)依賴的管理強(qiáng)度。你在排查任何插件問題時(shí)都要先判斷自己處在哪種生態(tài)層級(jí)里再用對(duì)應(yīng)的方法論。5. 排查插件激活失敗的三板斧日志、代碼、隔離驗(yàn)證聊了理論、講了案例、看了生態(tài)接下來這部分是我最想讓你帶走的實(shí)戰(zhàn)方法論。不管你在什么系統(tǒng)里遇到did not activate或者failed to load plugins折騰的時(shí)候都別離開這條主線日志找直接原因、代碼找底層原因、隔離驗(yàn)證排除外部干擾。5.1 第一板斧讓日志開口說話很多時(shí)候你覺得日志沒用其實(shí)是因?yàn)槟悴恢涝摽茨念惾罩?。插件加載器通常會(huì)分幾個(gè)日志域loader記錄插件的發(fā)現(xiàn)、讀取、校驗(yàn)流程activation記錄每個(gè)入口的激活開始和結(jié)束以及失敗時(shí)的異常堆棧dependency記錄依賴關(guān)系解析和拓?fù)渑判虻倪^程以 Harness 的web boot為例如果你在啟動(dòng)時(shí)看到2 entries did not activate我建議你先去激活日志域里抓取類似這樣的信息activation: activating linxin666/dsh-p activation: error in linxin666/dsh-p: TypeError: Cannot read properties of undefined activation: linxin666/dsh-p activation failed, propagation: skip activation: huayu-yuan blocked by dependency: linxin666/dsh-p大多數(shù)情況下這類日志已經(jīng)把根因?qū)懺谀樕狭?。最怕的情況是日志被設(shè)置成只輸出 error 級(jí)別把 warning 和 info 級(jí)別的關(guān)鍵線索過濾掉了。所以排查插件問題之前先把日志級(jí)別調(diào)到 debug 或 trace多出來的信息量往往能直接省掉你半小時(shí)的代碼閱讀。5.2 第二板斧順著代碼路徑讀而不是泛泛看拿到了異常堆棧之后不要滿足于哦是這里報(bào)錯(cuò)了要繼續(xù)問三個(gè)問題這個(gè)變量為什么是 undefined是宿主 API 版本沒有這個(gè)方法還是插件在錯(cuò)誤的時(shí)間讀取了錯(cuò)誤的上下文這個(gè)函數(shù)為什么沒有被調(diào)用是宿主沒有找到它還是插件導(dǎo)出的對(duì)象結(jié)構(gòu)跟接口定義不一致這個(gè) Promise 為什么沒有 resolve是異步邏輯掛起了還是回調(diào)根本沒有被觸發(fā)我在排查中反復(fù)驗(yàn)證過一件事插件激活失敗的 80% 的根因藏在接口簽名和 API 版本的匹配里只有 20% 才是真正的邏輯 bug。所以寧可先花時(shí)間比對(duì)插件聲明的接口版本和宿主導(dǎo)出的實(shí)際 API也別急著深挖邏輯實(shí)現(xiàn)。具體操作上我會(huì)把插件入口文件的開頭部分完整讀一遍特別關(guān)注導(dǎo)出的對(duì)象形狀。比如宿主要求導(dǎo)出{ name, version, activate, deactivate }插件卻只導(dǎo)出了{(lán) name, activate }那deactivate缺失通常不會(huì)導(dǎo)致激活失敗但如果宿主在激活前就要讀取version字段那問題就來了。5.3 第三板斧把問題壓到最小可復(fù)現(xiàn)單元如果前兩步做完還沒定位到根因那就要考慮是不是外部環(huán)境干擾太多。我的建議是做一個(gè)最小化驗(yàn)證只保留一個(gè)插件在配置里其他全部禁用看是否還能復(fù)現(xiàn)報(bào)錯(cuò)。如果單插件能激活再把第二個(gè)插件加回來觀察是不是依賴順序?qū)е碌?。如果單插件也激活不了直接寫一個(gè)跳過插件的宿主入口手動(dòng)調(diào)用該插件的activate函數(shù)傳入一個(gè) mock 的宿主對(duì)象在 Node 環(huán)境里跑一遍。這個(gè)流程在邏輯上等價(jià)于功能開關(guān) 二分定位的思路。而且它有一個(gè)額外的好處當(dāng)你在獨(dú)立環(huán)境里手動(dòng)調(diào)用插件激活函數(shù)時(shí)所有異常都會(huì)直接暴露在控制臺(tái)里不會(huì)再被加載器吞掉或包裝成含糊的did not activate。我自己處理過一個(gè)特別頑固的 case在宿主里怎么都激活失敗報(bào)錯(cuò)信息永遠(yuǎn)只有activation failed沒有堆棧。后來我把插件的activate函數(shù)拉出來在 Node 里手動(dòng)執(zhí)行發(fā)現(xiàn)是插件代碼里引用了window對(duì)象但加載器在 web worker 環(huán)境里激活插件window不存在。這個(gè)問題在宿主界面完全看不出端倪只有隔離驗(yàn)證才能暴露。6. 從插件使用者視角寫一份自查清單下次遇到報(bào)錯(cuò)不再慌前面幾章更像是診斷思路這一章我干脆整理成可以照著做的自查清單。遇到plugins相關(guān)的加載失敗按順序逐項(xiàng)檢查大概率能在 10 分鐘內(nèi)找到方向。6.1 環(huán)境與版本自查是否有更新過宿主核心版本插件是否有對(duì)應(yīng)的版本適配插件目錄里有多個(gè)版本混放嗎同一插件的多個(gè)副本會(huì)干擾加載器。插件的依賴聲明和實(shí)際安裝的依賴版本是否匹配用npm ls或等價(jià)命令查依賴樹。宿主運(yùn)行平臺(tái)是瀏覽器、Node 還是移動(dòng)端插件是否用了平臺(tái)專有 API如window、process6.2 配置與注冊(cè)自查插件入口的路徑是否指向了正確的文件大小寫和擴(kuò)展名有沒有錯(cuò)插件 ID 是否唯一有沒有跟其他插件的 ID 撞車插件的激活條件是否依賴某些配置項(xiàng)配置項(xiàng)是否存在且格式正確6.3 激活流程自查插件的activate函數(shù)是同步還是異步如果異步是否把 Promise 返回給了宿主激活函數(shù)里有沒有未捕獲的異常加一層try...catch打印日志再試一次。有沒有執(zhí)行超時(shí)的可能遠(yuǎn)程調(diào)用、文件讀取、數(shù)據(jù)庫連接都可能卡住激活流程。是否需要依賴另一個(gè)插件激活宿主是否按照依賴順序在加載6.4. 常見錯(cuò)誤速查表報(bào)錯(cuò)特征大概率原因優(yōu)先排查方向TypeError: Cannot read properties of undefinedAPI 版本不匹配或上下文缺失比對(duì)宿主版本與插件要求ReferenceError: xxx is not defined插件引用了不能訪問的全局變量檢查插件運(yùn)行環(huán)境隔離性activation timed out異步初始化未完成或死循環(huán)檢查激活函數(shù)里的異步鏈路blocked by dependency被依賴的插件沒有激活先解決被依賴插件的激活失敗missing required field插件導(dǎo)出對(duì)象缺少必填字段檢查導(dǎo)出對(duì)象結(jié)構(gòu)version conflict共享依賴版本沖突用依賴分析工具查看沖突鏈這張表我用引號(hào)把典型詞匯括起來是因?yàn)槟阍谌罩纠锟吹降膱?bào)錯(cuò)原文千差萬別但關(guān)鍵詞是高度相似的??匆奷ependency、timed out、undefined這些詞就要立刻調(diào)動(dòng)對(duì)應(yīng)的預(yù)案。7. 作為插件開發(fā)者怎么設(shè)計(jì)才不容易被did not activate前面從使用者角度講完了排查最后這部分我想站在更底層一點(diǎn)的位置談?wù)勗趺磳懖寮挪蝗菀撞冗M(jìn)激活失敗的坑。很多插件作者寫代碼時(shí)只看功能是否實(shí)現(xiàn)完全不考慮宿主加載器的預(yù)期結(jié)果用戶一集成就報(bào)錯(cuò)然后作者覺得是宿主的問題用戶覺得是插件的問題兩邊扯皮。這類問題的本質(zhì)是插件沒有遵循宿主對(duì)插件的生命周期契約。7.1 導(dǎo)出正確的對(duì)象形狀比寫好邏輯更優(yōu)先一個(gè)合格插件入口文件至少應(yīng)該導(dǎo)出以下字段id唯一標(biāo)識(shí)name展示名稱version語義化版本號(hào)activate激活函數(shù)deactivate銷毀函數(shù)可選但強(qiáng)烈建議有些宿主還會(huì)要求requiredHostVersion、dependencies這類元信息。寫插件的第一步就是去讀宿主的插件開發(fā)文檔把導(dǎo)出對(duì)象的結(jié)構(gòu) 100% 對(duì)照清楚而不是憑經(jīng)驗(yàn)猜。我在實(shí)際項(xiàng)目中遇到過一件事有個(gè)插件作者在導(dǎo)出對(duì)象里多加了一個(gè)constructor字段導(dǎo)致宿主在序列化插件元信息時(shí)把整個(gè)對(duì)象當(dāng)成一個(gè)構(gòu)造函數(shù)來執(zhí)行激活過程直接崩潰。這類低級(jí)但致命的錯(cuò)誤根因就是想當(dāng)然地給導(dǎo)出對(duì)象加料。7.2 激活函數(shù)要做到可重入、可失敗、可恢復(fù)可重入的意思是插件激活函數(shù)不應(yīng)該有只能調(diào)用一次的隱式狀態(tài)。宿主可能在熱重載、配置變更后再次調(diào)用你的activate如果你在激活時(shí)給全局變量賦值了卻沒有在設(shè)計(jì)上支持二次賦值那么第二次激活就會(huì)出現(xiàn)臟狀態(tài)??墒〉囊馑际羌せ詈瘮?shù)要敢于拋異常。很多人寫插件時(shí)喜歡把所有異常都吞掉用catch (e) {}把錯(cuò)誤壓下去然后return一個(gè)成功狀態(tài)。這樣做表面上讓激活流程成功了但功能模塊實(shí)際處于半初始化狀態(tài)后續(xù)調(diào)用必然出詭異問題。寧可讓激活失敗、讓宿主跳過你也不要用一個(gè)虛假的成功掩蓋問題??苫謴?fù)的意思是插件要盡量在激活失敗后清理自己已經(jīng)產(chǎn)生的副作用。比如你已經(jīng)注冊(cè)了某個(gè)事件監(jiān)聽器然后后續(xù)初始化失敗了最好在返回失敗之前把監(jiān)聽器移除掉。不然下次重試激活的時(shí)候監(jiān)聽器會(huì)疊加成一個(gè)副本行為可預(yù)測(cè)性大幅下降。7.3 異步初始化必須有明確的超時(shí)和取消機(jī)制假裝沒看到這個(gè)建議的人大概率會(huì)寫出讓用戶崩潰的插件。異步初始化里最常見的坑是激活函數(shù)拉取遠(yuǎn)程配置結(jié)果遠(yuǎn)程服務(wù)掛了插件就一直掛在 pending 狀態(tài)宿主卡在啟動(dòng)階段用戶看到的就是一個(gè)轉(zhuǎn)圈轉(zhuǎn)個(gè)不停的應(yīng)用。好的插件設(shè)計(jì)絕對(duì)要自己做超時(shí)控制export async function activate(host: Host): Promisevoid { const controller new AbortController(); const timer setTimeout(() controller.abort(), 5000); // 5s 超時(shí) try { const config await fetchRemoteConfig({ signal: controller.signal }); host.registerConfig(config); } catch (error) { if (error.name AbortError) { throw new Error(activate: remote config fetch timed out after 5s); } throw error; } finally { clearTimeout(timer); } }這段代碼里我做了三件事給網(wǎng)絡(luò)請(qǐng)求掛了一個(gè) 5 秒的取消信號(hào)超時(shí)之后主動(dòng)中斷在超時(shí)的情況下拋一個(gè)明確的錯(cuò)誤讓宿主知道這個(gè)插件激活失敗的具體原因在finally里清理定時(shí)器。同樣邏輯可以推廣到數(shù)據(jù)庫連接、文件讀取、嵌套插件調(diào)用等所有異步操作。7.4 主動(dòng)聲明依賴但別把依賴當(dāng)作保姆插件對(duì)宿主能力的需求最好通過元數(shù)據(jù)主動(dòng)聲明出來而不是等運(yùn)行時(shí)發(fā)現(xiàn)缺了什么才報(bào)錯(cuò)。在 Harness 這類支持顯式依賴的體系里你應(yīng)該寫成{ id: my-plugin, dependencies: { linxin666/dsh-p: ^2.0.0, core-utils: 1.4.0 } }依賴版本號(hào)別用*或者不加約束那是給自己埋雷。但反過來依賴也別聲明得太貪婪——不是每個(gè)插件都需要一大堆基礎(chǔ)庫。盡量依賴宿主已經(jīng)暴露的通用能力減少外部依賴的數(shù)量這樣整體穩(wěn)定性會(huì)高很多。我自己寫插件時(shí)的原則是能用宿主提供的能力絕不自己引入第三方庫。宿主里的公共庫版本統(tǒng)一由宿主管理是最省心的方案。7.5 最后給你的插件做一次客戶端視角冒煙測(cè)試Emit 上線之前我強(qiáng)烈建議做一個(gè)最簡(jiǎn)單的冒煙測(cè)試裝在一個(gè)干凈環(huán)境里只加載你一個(gè)插件觀察激活日志然后跟其他插件共存觀察依賴解析最后再模擬一次宿主核心升級(jí)的場(chǎng)景確認(rèn)你的插件兼容性不會(huì)突然斷裂。這輪冒煙測(cè)試做下來你已經(jīng)提前替用戶踩過了一遍最常見的坑。反過來從一個(gè)普通使用者的角度看如果你只是想解決今天報(bào)的錯(cuò)把所有排查手段濃縮成一句話就是別被最終報(bào)錯(cuò)迷惑順著日志往前翻找到真正的第一條錯(cuò)誤剩下的大多數(shù)問題都是連鎖反應(yīng)。插件世界沒有魔法破壞依賴鏈的任何一個(gè)環(huán)節(jié)都會(huì)在最終的did not activate上暴露。你只要耐心把鏈條重新接上它就能恢復(fù)運(yùn)轉(zhuǎn)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产精品久久久久久久久久梁医生| 夜夜操91744565| 600国产精品视频| 丰满搜索结果 -第18页- 久久高清无码| 天堂俺去俺来也www久久婷婷| 亚洲色婷婷综合久久久久中文| 日韩精品一二三四| 亚洲国产麻豆一区二区三区| 成人av毛片在线观看| 青青草好吊| 九一精品牛牛一区二区| 久噜噜| 亚洲色鬼| 国产精品老熟女一区二区| 大香网站| 免费又黄又裸乳的视频| 国产精品麻豆免费视频| 日韩操啪| 韩三级a视频在线观看| 91综合中文字幕| 午夜噜噜噜| 色97综合中文字幕| 九九碰九九爱97超| 在线午夜成人无码视频| 中文字幕av色| 日本免费中文一区二区三区四区| 色五月婷婷久久| 亚洲αv一区二区三区| 亚洲性爱乱操x| 一区二区中文| 国产无码三级视频在线观看| 亚洲h片在线免费观看| 蜜乳AV免费观看| 成人小说视频在线精品欧美| 日韩欧美午夜视频在线| 无码99| 一区二区三区在线资源| 日本一区99| 青青草啪啪网| 加勒比伊人影院| yazhouzaixian| 色欧美色交综合| 青久久| 午夜精品人妻二区三区| 97色操| 国产成人精品网站| h4610国产人妻| 最新日产中文在线麻豆| 美女自卫慰黄网站免费| 一区二区三区精品黑丝白丝酒店对鸡 | 男人综合网| 三级色影综合网| 成人性生活高清视频在线播放| 亚欧美综合网| 加勒比在线观看一区二区| 欧美韩国你懂得在线 | 欧美伊人久久综合网| 日韩中文字幕视频| 一区二区三区免费岛国片| 青娱乐日韩无码| 亚洲色图91欧美日韩| 无码人妻丰满熟妇奶水区毛片| 韩国女主播青草在线| 欧美久久久| 黄色成年| 欧美精品日韩久久久九| 国语人妻精彩刺激| 99热99re6国产在线播放| 97久久国产| 亚洲AV麻豆Aⅴ无码电影一| 日韩精品人妻一| 国产乱伦性爱AV| 蜜桃久久综合视频| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 狠狠色婷婷777| 盗摄 精品 另类 一区| 久久嫩草国产成人一区| 久久久久久九九九九九| 人妻99p| av在线人气| 亚一综合久久久久久久久久| 殴美性色a级欧美| 道久久五香丁月婷婷激情综合| 大奶的诱惑| 久操网视频| 男人的天堂不卡一区二区| 91精品婷婷国产综合久久竹菊| AV天堂因数| 手机看片日韩人妻| 国产人妻精品久久久一区二区三区| 99热 按摩 日韩| 国产精品天堂| 欧美男女午夜啪啪| 这里都是精品| 国产 三级自拍| 在线天堂999| 精品人妻一区二区三区四区| 欧美色五月| 久久妇| 黄色操人| 天天操天天日天天干| 天天射天天操天天干天天吃2018| AV 少妇 人妻 偷拍| 色偷综合| 久久亚洲AV无码专区国产精品| 欧美有码亚洲中文字幕一区二区三区四区| 国产精品丝袜在线| 六月丁香网| 开心五月婷婷| 色色婷婷五月| 欧美在线大香999| 国产懂色精品国产av| 欧洲精品人妻| 强奸国产精品视频| 欧美A√综合网 | 91白嫩| av大香蕉| 国产无码精品高清| 清清草影| 18禁的网站在线| 国产地址二三| 中文字幕一区电影在线观看| 99精品高潮| 人人操人人操人人人操| 久久人人爽av亚洲精品天堂桃色| 超碰在线香蕉| 一区二区视频在看| yazhousetuoumei| 国产精品操| 97AV爱| av爱爱爱| 五月天精品| 99久久综合| 97碰碰色| www.操| 丰满人妻区一区二区三| 亚洲精品国产AV天美传媒| 亚洲国产精品成人综合| 久久精品女同亚洲女同13| 欧美黑人精品一区二区| 日本男人天堂| 久久日本熟女精品一区| 亚洲一区二区三区久久 亚洲一区二区| 亚洲影视综合| 男人的天堂VA在线| 丁香五月性| 97亚洲精品| 欧美91精彩| 熟女突然公开看18禁影片| 久一区久久蜜桃| 超碰97最新人妻| 男人的天堂三级| 97人人草| 吖在线不卡一区二区国产剧情| 久草精品一区| 中文字幕av色| 色香阁在线| 亚洲国产91精品一区二区久久| 欧美一区二区三区成人性生活| 中国探花熟女| 成人性爱高清视频免费看| 欧美色图在线视频少妇| 五月婷婷综合网| 伊人五月天婷婷| 日韩有码回春沙龙第一页| 麻豆视频test| 丁香五月激情综合国产| 欧美天天干| 性91| 日本精品一区二区不卡| 日韩欧美蜜桃精品久久中文字幕久久| 天天日日本| 性爱精品一区| 国产一区二区精品久久99| 亚洲视频精选| 玖色av| 午夜AV污污污| 久草新免费| 91人妻爽爽人人做人人澡| 乱伦a片视频| 日韩97视频!在线| 免费观看的黄色的网站| 色在线亚洲视频www| 人妻铁牛TV| 乱操9999| 少好三P| 操人妻逼91| 丁香六月啪啪| 丰满人妻一区二区三区免费,| 日本免费专区| 亚洲第一精品在线视频| {男男暴菊gay无套网站| 日韩啊V| 亚洲97超碰| 日韩青久久| 97精品在线| 91成人久久| 怡红院成人av| 91女优在线观看| 综合天天网| 欧美天天谢综合网| 强奸熟女一区二区三区| 97网址97| 熟女91网| 亚洲天天综合| 九九九精品成人免费视频小说| 亚洲超碰综合网| 操狠狠| 精品四五区| 久操九九九九| 日本丝袜美腿人妻九九| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 日本道不卡| 91中出视频| 国产精品播放| 国产JDAV无码视频在线观看| 欧美性爱18观看| 草莓精品视频在线免费观看| 亚洲欧美国产va在线| 欧亚久久偷拍视频| 欧美另类天堂| 牛牛操视频逼| 思思热影视| 丰满的三级少妇欧美久久久| 伊人97色天使| 亚洲宗合网| 视频在线97| 午夜一区| 丝袜剧情| 欧美综合第一| 日韩人妻无码不卡网站| 久久亚洲中文字幕视频| 久操大香蕉| 久久久久精| 中文幕97| 精品国产AV一区天美传媒| 激情五月综合开心五月| 免费A V在线| 欧美天堂日韩三级国产传媒| 99999这里都精品| 大香蕉视频啪啪啪啪| 国产精品不卡av免费在线观看| 欧美的性爱网站免费| 日本黄 R色 成 人网站| 久久久久中出| 欧美热图99| 欧美v日韩v亚洲v最新在线| 一级成人性爱| 骚逼高潮久久精品| 午夜精品人妻二区三区| 亚洲成人黄色在线观看| 久久人妻办公室视频| 懂色AV中文| 亚洲AV永久无码精品成人调教| 精品网站9999| 人人操超碰在线| 久久一二三四| 亚洲婷婷五月天| 自拍亚洲综合| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | rivers-china.com| 人妻中文字幕精品无码| 激情露脸爱| 深夜激情| 五月天激情四射| 亚洲区限制级| 午夜无遮挡男女啪啪视频| 激情五月天网| 亚洲精品九九九九九九| 成人性爱视频在线看| 蜜桃成人1区2区3区| 情色大香蕉| 91艹B视频| ai欧美亚洲小说| 国产内射爽爽大片| 天天综合精品| 欧美高清91| 欧美麻豆成人同性GⅤ在线| 久久夜嗨| 日韩免费a级毛片无码a∨| 黄片视频,下载| 中美日韩毛片| 欧美激情性爱视频网站| 国产丝袜视频| 超碰色老头| AA丁香综合激情| 人妻熟妇一区二区三区| 亚洲欧美中文日韩视频中国语| 欧美第二页午夜| 超碰97最新人妻| 飘花国产午夜精品不卡| 天天天天天天天天综合| 日韩av不卡在线看| 丝袜美女诱惑 91 视频| 91人妻尻屄视频| 久久宗合亚洲| 久久一区二区三区入口| 操一对老熟妇爽上天视频| 色综合色综合网| 九九九九九精品视频| 大香蕉av在线| 91亚洲综合| 亚洲综合网图| 一级黄色牲爱A级片| 久操视频在线| 97资源超碰| 久久久国产av美女私房| 国产欧洲精品亚洲午夜拍精品| 国产女人和拘做爰视频| 激情婷婷丁香网| 亚洲日韩精品在线播放| 国内外内射高清视频| 国产精品乱人伊人网| 精品国产av一区二区三区四区入口| 国产suv精品一区二区四| 伊人一级免费黄片| 97精品97久久| 一区二区三区四区色图| 亚洲AV无码乱码| 噜噜噜亚洲精品| 99视频内射三四| 日本成人在线不卡一区二区三区| 色大师网站www永久网站视频| 热热色国产一二区AV| 久久98| 精品九九九九| 9999久久久久| 成年男人的天堂| 伊人精品久久网站| 亚洲女人91| 99热导航| 五月丁香久久| 看一级特黄a大一片| 青青草好吊色| 五十路熟女,国产欧美精品区一区二区三区| 丁香五月大香蕉| 激情五月综合开心五月| 蜜屁av| 国产天天看| 91|九色|国产熟女| 新久久AV| 国产v亚洲v日韩v欧美v片另类| 白丝少妇一区二区| 91在线|亚| 免费黄色A片| 国产亚洲精品A在线观看下载| 天天综合网亚洲综合网| 99www.bibizy香蕉资源国产一区二区三区高清 | 后入 亚洲 美女 射| 久干9操| 91精品人妻偷情| 亚洲成人在线资源| A男人的天堂| 97色冈| 国产久久久久久久久一区二区| 视频一区二区三区精品| 起碰97| 国产sv美女内射| 在线免费试看60秒| 国产一区二区久久| 综合91网| 学生妹天天看| 97av,com| 丰满熟女人妻一区二区三五十一路| 欧美激情一区二区| 老司机福利青青草| 91麻豆天美传媒在线| 亚洲文学偷乱拍啪啪啪啪| 久日91在线| 嫩草 人人网精品| 亚洲不卡不卡中文字幕不卡| 日韩AV电影网站| 99操碰| 可以免费观看的AV| 啊啊啊啊嗯嗯嗯用力好爽| 亚洲福利中文字幕在线| 久久精品国产免费观看99| 国产操逼逼网| 3p国产色噜噜一区| 97色婷婷| 亚洲综合网电影91| 精品国产一区二区久久| 91伊人大香蕉| 久9久精品视频| 欧美少妇性乱| 狠操91,com| 热久久无毒不卡| 久久精品无码不卡| 男人午夜天堂| 涩涩涩综合| 2020中文在线一区二区三区| h无码动漫在线观看| 国产女人操逼视频| 色色色99| 日本伦理一区二区| 亚洲综合贴图91| 男人天堂网手机版婷婷| 久久成人东京热人妻| 国精综合一二三区影视| 国产精品。| 九九av| 天天夜夜rb| 啊啊啊啊免费视频| 成人免费视瓶| 久久精视频美日韩在线视频| 国产一区96在线| 美女高潮视频91| 欧美在线视频播放| 精品久久視頻在线| 五月天色电影| 91亚洲网站| 日韩欧美大片免费高清啪啪| 亚州AV无码国产精品| 亚洲1区| 熟妇人妻一区二区| 91天天综合在线观看| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 久久久新亚洲AV| 国产乱伦亚洲| 综合网色| 在线黄色污污网站| 91色亚洲| 亚洲一区二区三区中文字幕| 婷婷成人五月天| 老熟妇综合| 亚洲资源站| 亚洲国产欧美一区二区潘金莲 | 在线中文AV| 综合久久97| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 欧美草草| 91精品久久久久五月天精品| 日韩人体偷拍| 大香蕉92| 欧美亚洲一级在线观看| 野狼激情网| 欧美黑人日韩少妇色情| 中日韩熟女| 久久九七| 少妇综合| 亚洲五月丁香花狠狠干一区二区三区 | 成人情色综合网| 日韩欧美午夜一区二区| 男人天堂一区二区| 九九九只有精品| 交换娇妻呻吟声不停中文字幕| 91视频国品一二三区| 欧美最大综合网| 国产乱伦性爱区| 激情六月婷婷| 日本大香蕉综合网红本杳社区| 可能人人看人人摸| 国产精品欧美激在线| 大香蕉2017| 国产亚洲精品无码三区| 激情图片亚洲色图| 999久久久免费精品国产牛牛| 99热精品在线播放| 青草精品视频一日本久久久久网站| 免费公开人人操| 亚洲综合在线高清| 日韩免费簧片| 96免费视频在线| 免费观看网黄| 蜜桃久久精品一区二区三区| 爽极品影院| 97精品综合久久网| 人妻乱仑一区二区三区| 91老熟女91老女人| 在线无码操| 97国产精选| JULIA一区二区三区在线播放| 日韩图区| 91超碰人人操| 淫荡网址| 久久久婷婷| 先锋激情∨在线视频播放| 97欧美色资源| 日本午夜精品理论片A级APP发布| 青青草色AV| 婷婷久久综合| 国产成人超碰在线| 亚欧洲一区二区视频| 91精品无码人妻系列| 国产久9| 女优免费一区二区永久| 中文?日韩?免费?精品| 中文AV制服乱伦| 日日AV加勒比| 久久久久国产精品片区无码直播 | 久久激情综合| 热99这里有精品综合久久| 99国产在线绯色一区| 人妻一二三区| 超碰偷拍| 欧美超碰96| av强奸乱轮| 九九九九九九精品| 日韩/97| 国产精品无码av在线| 精品美女少妇一区二区| 天天天肏屄欧美| 中文字幕一区电影在线观看| 91A欧美电影网站| 久久久久久久久九九久孕交| 日本女人操逼| 精品国产无码中文| 久久婷婷成人综合色怡春院| 91草草草| 久久久999网站| 超清福利精品视频在线| 综合日韩激情另类图片| 国模不卡一本二本三电影| 东京热av男人的天堂| 成人小说视频在线精品欧美| 国产精品熟女乱伦| 91GD.COM| 日韩中文字幕2020| 综合伊人网12色| 神马精品视频| 男人的天堂kva| 操我啊啊啊啊啊| 天天干夜夜操网| 中国操逼无码| 久久αⅴ| 日韩综合色网| 加勒比AV网| 狠狠狠狠狠干| 操逼网站地址| 欧美性爱第一区| 少妇一区二区三区| 欧美色图另类图片| 99久在线精品99re8热视频在线| 伊人亚洲国产一成人久久精品,久久| 性爱乱伦视频免费| 天天做天天爱天天高潮| 亚洲最大网站av| 国产精品点击进入在线影院| 网友自拍第一页| 天美传媒麻豆一区二区三区国产精| 国产精品久久久久久久免牛肉蒲团| 天天看少妇| 99久热| 在线观看国产黄色| 青娱乐国产精品| 51久久夜色精品国产麻豆| 亚洲本色精品一区二区久久| 97超碰中文在线| 精品日日人妻| 78精品| 天天欧美| 色悠久| 丰满人妻一区二区三区| 97亚洲中文| 欧美日韩制服| 亚洲熟妇A V黑人| 揉揉日日日日| 亚洲国产综合图区中文字幕| 精品一区二区三区麻豆| 欧美加勒比| 人妻天堂网| 9丨久久九九九| 亚欧美色| 自拍偷拍草一草| 亚洲精品乱码线路中文字幕 | 久久人妻| 精品三级在线专区| 青青免费在线视频一区| 欧美成人A√在线一区二区| 18禁止看精品中文字幕| 蜜乳AV免费观看| 国产成年女人免费视频播放a| 99老司机精品视频在线观看| 国产精品嫩草影院免费| 欧美色综合影院| 丁香婷婷色五月| 91九九九馒头| 日韩电影天堂视频一区二区| 999久久芭蕾| 人妻娇喘 激情视频| 日本不卡五区| 97色涩| 亚洲涩图欧美| 欧美色图20p| 中文字幕人成乱码熟女香港| 国产福利影视| 色av中文字| 伊人网在线视频| 欧美自拍网| www熟女乱伦com| 成人三一级一片aaa| 色色五月婷| 无码欧美有限公司| 天天拍天| 一起草三级AV电影在线观看| 黄片aaaaa一区| www.激情| 区二区亚洲婷| 91成人无码| 亚洲天堂人妻熟妇视频| 亚洲一区深夜| 91精品国产91熟女| 国产高清免费不卡av| 丁香色色网| 91骚妇| 亚洲欧美黄| 中国女人内射6XXXXX| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 熟妇人妻丰满久久久久久久无码| 浓厚中出中文字幕在线| 天天综合精品| 九九九九九九免费视频| 囯产精品久久久久久久久久梁医生 | 久久久久久久久久久97| 蜜桃香蕉久草精品在线| 色天使亚洲综合在线观看| 欧美不卡在线美女| 超碰九九| 成人美女av| 91l欧美在线| 色吧 综合| 五月天婷婷基地| 丝袜狠狠草尤物 91| 人妻色偷色噜| 天美精品av| 男人的天堂Va| 久热精品在线| 黄色视频特级毛片| 日韩一级二级三级免费看完整版国语版| 欧美91变态| 激情四射五月天| 伊人96在线| 一区二区三区免费岛国片| 操逼精品视频| 天天做天天爱夜夜爽毛片试看| 女优视频第10页| 久久老熟女| 日本日逼视频网| 一本一道久久综合久久| 影音先锋中文字幕日本好一区二区| 天美传媒AV国产在线| 澳门黄片一香蕉视频| 十八禁网站在线| 91综合色| 亚洲丝袜天堂| 99久久精品无码一区二区毛片免费| 台湾佬中文娱乐自偷自拍| 97视频免费在线观看| 曰韩欧美国产传媒麻豆第一区| 日本Suv精品一区二区| 开心五月深爱五月| 四虎免费在线观看| 色女网日韩| 成年人黄色视频免费| 色 婷97| 热无码中文亚洲H一道本一区二区| 粉嫩国产精品久久久| 性久久久| 99re热| 亚洲色综合| 超碰九7| 91AV老熟女视频| 国产成久久综合片| 青青欧洲黑| 综合欧美日韩在线观看| 国内一级精品| 夜夜操老骚逼视频网站| 97在线精品观看视频| 性交一区二区在线播放| 亚洲欧洲综合视频在线| 亚洲成成熟女人综合一区二区| 亚洲国男人的天堂| A级国产欧美激情在线| 婷婷另类小说| 久久欧美性爱视频| 99久久99久久免费精品蜜臀| 91一区二区三区蜜桃| 欧美A√综合网| 午夜精品探花| 亚洲一区二区三区在线激情| 久久AV色| 欧美成人9797| 26uuu国产日韩综合在线观看| 青青草原av| 香一区二区三区| 夜嗨影院| 久久综合九色综合欧洲98| 天天激色| 亚洲91少妇| 国产Aα| 91美| 色拍偷亚洲| 欧美九九爱| 亚洲成人性爱在线观看| 亚洲中文字幕熟女| 久久久久久中文| 亚洲中文人妻色| 无码自拍SM| 国产主播福利| 奶水 人妻 哺乳 在线| 日韩精品第3页| 久久精品人体AV| 中日韩熟女| 偷拍 欧美 日韩| 日韩97超碰| 9999九九九久久久| 欧美色图亚州激情| 色欧美天天| av片在线观看免费播放| 国产一区二区三区白丝| 尤物网站91| 九七超碰人人乐| 欧美青青草视频| 加勒比综合九九99视频在线播放| 9 9精品一区二区三区| 午夜理论片在线观看免费| 亚洲精品一区二区精品| 91天天看| 久夜视频| 欧美黄业| 91亚洲欧美激情| 在线播放欧洲免费av| 九草九九九| 乱子伦一区二区三区国产精品| 日韩影片中文字幕一区二区三区| 婷婷中文字幕| 99在线精品观看99| 717影院理论午夜伦八戒| 日本Xx性爱| 久久男人精品| 97在线精品观看视频| 18禁看网站一区| yiqicaoav| 91搡老女人老妇女老熟女歌词翻译| 久久老熟女| 竹菊一区二区三区AV线| 蜜臀中文无码午夜| 麻豆熟妇乱妇熟色A片在线看| 中文字幕第95页| 日韩97视频| 精品国产乱码久久久久久日本公司| jiujiujiujingpin| 高清肉丝中文无码| 超碰97在线中文| 日韩熟女视频二区| 91模特在线观看| 超碰97人妻自拍| 欧美熟妇精品黑人巨大91| 久久女人| 日本一道在线播放高清| 亚洲欧洲av影音| 日韩操p| 欧美精品xxxwww| 人妻乱仑一区二区三区| 凹凸视频特色日本特黄| 天天综合色| 四虎 精品 WWW| 日韩ab网| 蜜汁欧美| 尤物av网站免费在线播放| 精品美女久久久久| 成人亚欧免费视频| 国产乱伦性爱AV| 亚洲美乱| 亚洲老司机123专区| 97超碰欧美手机在线| 99re视频在线播放青草| 久久精品熟女亚洲AV麻豆软件| 激情小说图片亚洲首页| 日韩精品免费高清视频在线| 色综合网1| 久久极品一区二区| 色九九九综合| 91狠狠综合久久| 夜夜操美女| 综合久久欧美| 亚洲人精品久久久喷水| 久久精品视频一区三区小泽玛利亚| 日韩成人人妻网站| 熟女乱3伦999| 立川理惠无码一区二区| 蜜臀在线免费观看在线免费观看| 是还免费视频1727我| 精品色色| 欧美大战久久久伊人| 1024精品在线| 一本大道不卡一二三区| 九九热在线视频| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 97久精品| 久久婷婷苹果| 欧美精品日韩久久久九| 亚洲熟妇自偷自拍另欧美| 青青草乱入乱欲视频在线观看| 人妻精品一区二区| 韩国黄片aaaa| 久久免费老司机精品| 区自美91| 国产精品视频自拍在线| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 一区三区啪啪| 国产精品视频播放| 午夜毛片亚洲精品片国产久久久| 91成人久久| 歐美一級亂黃99在綫精品| 超碰97久| 日韩性爱电影一区| 久久久久久久久久黄色网| 九九亚洲| 激情开心五月天| 色香91| 国产一级不卡在线观看| n1038 一二三区| 东京热毛片177b2viP| 性色av婷婷久久一区二区点复制| 日欧毛片久久| 日韩AV无码网站| 日本不卡卡一区| 丰满人妻一区二区三区| 五月丁香在线| 精品人妻一区二区三区免费视频| 男女激情黄色网址| 婷婷香网站| 都市久久精品激情亚洲| 欧美 青青草| 操屄日韩| 青青草伊人久久| 内射夫妻三片| AV丝袜少妇| 国产成人 综合亚洲 天堂| 欧美日韩222| av网站免费看| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 92性色国产午夜福利在线661| 国模限制级电影| 男人亚洲天堂| 67194无码不卡| 操逼无码操逼| 国产日韩人人| 亚洲αv一区二区三区| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 色欲三区| 欧美国产一区二区三区麻豆传媒| 国产美女销魂在线观看不卡| 青青草乱入乱欲视频在线观看| 久久亚洲欧美中文字幕国语| 综合欧美日韩在线| 国产区性爱在线视频秋霞豆| 色97国产69香蕉| 久热91| 青青色在线观看| 午夜欧美J进J出白浆流出久久久| 日本色色视频网站| 另类专区加勒比| 九九香蕉网| 久久六六| 欧美成人一区二区| 国产精品青草综合久久| 国产精品网址| 欧美另类自拍 | 精品无码一区二区三区| 九九激情网| 久久双插| 超碰欧美97资源| 欧美一区91大爱| 亚洲日本激情| 香蕉国产97| 国产乱婷婷精品二区三区| 国产极品精品美女视频| 亚洲极品| 天天操天天射青青草| 欧美性爱日韩性爱| 国产又粗又长又大的视频| 日本天堂网| 国产亚州精品美女久久久免费| 97精品在线视频| 伊人精品视频| 九九色综合| 日韩无码三级影院| 色图四区| 在线情色电影 91大 | 97干在线视频| 青青欧洲黑| 女人天堂AV五区在线| 人人操人人操草草| 国产精品电影大全| 亚洲天天精品| 成人老鸭窝人人在线视频| 性做久久久久久免费观看软件| 97久久久| 大茄子熟女AV导航| 国产一区二区三区久久精品太古里| 丁香六月激情综合| 国产欧美精选自拍一区| 超清中文乱码字幕| 熟妇女伦乱视频视频| 日韩激情视频| 亚洲 图片 综合91| 国模精品一区二区三区苹果色戒| 亚洲一卡二卡在线免费| 78精品| 久久精品一区一起草| 久久综合女优| 亚州操操穴网| 亚洲精品99| 新版天堂中文资源8在线| 黄色人人| 色哟哟 日韩精品| 人人妻人人爽一区二区三区| 青青操视频在线| 99久久综合| 日本天天吊| 五月丁香色综合| 91精品大奶人妻| 中日韩欧美精品无码AⅤ一区二区| 另类图片欧美激情综合| 火箭成精品视频884必出精品| rivers-china.com| 精彩久久中文| 久久久久久久久久久久久久久久9| 18一区二区三区| 亚洲中文字幕噜噜噜久久久| 日本岛国黄色网址| 日韩少妇一区二区三区| 国产毛片在线| 国产亚洲女v在线观看| 激情天天视频| 久久av无码| a片久久久久久久久久久久 | 厕所偷拍在线| 久久亚洲影院一区二区| 欧美制服另类丝袜| 9久超碰| 超碰 97国产熟女| 久久久草成人网站久久久草成人久久久草久久久 | 99久久99九九99九九九| 96国产精品| AV有码在线| 熟妇色99| 一级二级在线观看| 伊人影院日本| 亚洲日韩在线a不卡99精品| 在线毛片片免费观看| A片大香蕉在线| 午夜乱轮操逼视频免费看| 亚洲国产ⅴ高清在线观看| 99久久久无码精品国产人| 波多野42部无码喷潮在线观看| 成人激情无码在线视频| 亚洲精品一区二区三区在线播放| JIZZJIZZ国产精品喷水| 乱老女人一区二区视频| 欧美色图天堂在线| 97 亚洲 日韩 欧美 在线| 黄总AV色图| 98超碰日本| 88在线一区二区三区| 久久内射| 国产成人99久久亚洲综合| 搡老人老9丨女老熟人| 激情久久av一区av二区av| 天天综合精品| 久久久久久久78| 亚洲人人夜夜澡人人爽| 亚洲色图A| 久久久精品中文字幕爱豆| 亚洲毛片一级带毛片基地| 五月天丁香网| 九九英色视频| 久久禁| 麻豆三极片| 久久人人舔人人爽舔人人av片| 色欲久久综合| 国产福利夜| 东北操逼| 国产精品人妻无码久久久老鸭窝| 一类av片在线看| 亚洲五月婷婷| 久久精品老司| 久久久久久十| 国产极品精品美女视频| 久热这里| 99黄页网站| 黄页av| 欧美日韩香蕉| 夜夜操夜夜爽夜夜高潮| 中文字幕一区二区三区蜜桃视频| 久久这里只| 中文字幕日韩人妻视频一区二区三区| 密桃99999| 亚洲综合一| 亚洲欧美人妻| 不卡啪啪视频| 日韩 成人 有码| 99精品人妻| 欧亚在线视频| 自拍二页| 日日骚中文字幕| 日本熟妇人妻中出视频| 91麻豆天美传媒HD| 91亚洲影视| 久草免费在线一区二区| 久草精品国产蜜臀| 狠狠爱大香蕉| 巨爆乳肉感一区二区三区竹菊影视 | 欧美一区二区| 国产精品成人蜜臀AV在线| 欧美亚洲丝袜美女电影| 久久加勒比| 亚洲精品日韩国产欧美| 欧美一区二区成人一卡| 国产免费黄色一级大片| 色综合色色| 中出人妻中文字幕91在线| 另类TS人妖一区二区三区 | 免费中文综合精品| 97舔舔| 大香蕉伊人75| 亚洲天堂99| 亚洲日韩狠狠撸视频| 精品人妻av在线播放| 国产成自自拍在线观看| 在线免费观看高清无码视频| 污啪啪啪视频| 99夜夜操| 熟妇在线视频一区二区| 97国产|免费| 婷婷视频网| 一区二区三区男人的天堂| 多乙久久久久久| 亚洲综合射| 十八禁成人网站在线观看| 亚洲性少妇| 日韩成人精品视频自拍| 男人的天堂久久狠| 嫩草影院在线观看精品| 在线五区| 欧美一级A片在线看视频性色| 久艹99| 秋霞视频一区二区| 超碰导航97| 精品视频久久久久九九九九9999| 嗯嗯不要视频| 亚洲18禁| 久久久久久亚洲Av无码精| 97爱爱影院| 97在线精品观看视频| 欧美 综合 亚洲| 国产精品一区二区 尿失禁| 亚洲交换| 啪啪一区| 亚洲欧美综合| 97视频620| 日韩人成网站在线播放| 中出20p| 蜜臀少妇一区二区| 国产精品懂色tv影视免费观看 | 人人看欧美性爱| 亚洲极品| 欧美男人一区| 欧美性生活男人的天堂| 中文字幕人乱码中文字的预防方法 | 无码逼| 欧洲亚洲人妻无码高清久久三区四区| 五月天婷婷色| 人人操 欧美| 韩日自拍| 欧美图片偷拍| 26uuu偷拍亚洲欧洲综合| 中文字幕免费看| 亚洲AV小说| 2020中文在线一区二区三区| 99视频自拍区| 久久久久久久少妇| 精品久久久久av影院| 国产精品农村妇女| 在线综合 亚洲 欧美中文字幕 | 老鸭窝日丰县女人| 国产91美女高潮| 日本 色 导航| 欧美熟妇精品黑人巨大91| 国产SV一线| 午夜男人一级A片7777| 青娱乐淫乱1314| 亚欧美综合| 亚洲另类久操网| 日韩欧美亚洲一区二区三区影院| 国产精品操| 色踪合AV| 特级大荫道BBwBBwBBW| 亚洲AV无码成人精品久久| 91在线免费精品视频| 天天操天天7| 97欧美精品综合| 综合色色网| 99在线免费公开视频| 综合色欧美| 岛国不卡超碰护士AV在线播放| 欧美日韩国产传媒在线精品| α√在线| 久久久精品91八戒| 天天综合官网| 粉嫩久久久极品| 97超碰逼| 69精品少妇一区二区三区蜜桃| 亚洲最新中文字幕免费| 成人国产视频在线观看| 超碰97久| 69丨亚洲丨精品丨入口免费播放| 蜜桃精品一区二区三区ww| 亚洲午夜av| 午夜福利免费福利视频| 激情五月综合开心五月| 亚洲国产熟妇综合色专区| 青青草好吊| 91欧美性| 欧美性爱一区二区三区四区| 十八禁网站在线| 婷婷五月天av| 99操视频| 亚洲AV无码成人精品久久| 岛国黄| 国产一级内射无挡观看| jazzjazz国产精品麻豆| 国产熟女无套内射| 成人草草视频| 乱操9999| 精品中文一区二区| 亚洲色悠悠久久88| 久久国产对白激情浪潮| 色九月综合| 亚洲中文人妻色| 91 丝袜在线| 江都AV在线| 日本少妇va7777| 婷婷国产精品九区| 成 人 影视 一区 二区 三区 四区 | 国偷自 一区二区| 久草精品一区| 欧美人人天天网| 校园春色欧美| 精品综合久久久久久97| 青青青草伊人精品| 热久久无毒不卡| 亚洲在线观看| 国产91 丝袜在线播放| 久久欧美激情| 天天日天天干少妇日| 舔足天天操天天射| 欧美天天综合网| 欧美视频一| 国产强奸乱伦xd| 久操网址| 免费啪啪啪网站18岁| 久久五月丁香| http://qxhbdz.com| 欧美五区| 97热视频在线观看| 久热精品在线| 青青在线视频日韩欧美|