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

ARTICLE DETAIL

資訊詳情

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

給AI編碼CLI打造桌面外殼:從子進(jìn)程管理到跨平臺(tái)打包

給AI編碼CLI打造桌面外殼:從子進(jìn)程管理到跨平臺(tái)打包 最近在開發(fā)者社區(qū)看到一個(gè)項(xiàng)目展示挺有意思有人給某科技巨頭剛推出的 AI 編碼命令行工具包了一款跨平臺(tái)桌面應(yīng)用Windows、Linux、macOS 三端都有安裝包。乍一看有點(diǎn)像“脫褲子放屁”——CLI 不挺好用的嗎但真把這類工具用進(jìn)日常開發(fā)你會(huì)發(fā)現(xiàn)終端里的體驗(yàn)確實(shí)差點(diǎn)意思AI 生成結(jié)果是一整坨帶 ANSI 顏色的 markdown翻頁翻到眼睛花復(fù)制一段代碼還得手動(dòng)選中想回看之前的生成記錄終端里根本無從下手。桌面應(yīng)用要解決的就是這些問題。這篇文章不打算對(duì)著那個(gè)項(xiàng)目的 README 復(fù)述一遍功能清單我想聊的是三個(gè)更底層的問題第一給 AI 編碼 CLI 套一個(gè)“圖形外殼”到底解決了什么真實(shí)痛點(diǎn)第二從子進(jìn)程管理到流式輸出渲染一個(gè)桌面包裝器在技術(shù)上有哪些關(guān)鍵細(xì)節(jié)第三如果你也想給自己的命令行工具加個(gè)圖形界面基于我在同類項(xiàng)目里見過的常見實(shí)踐應(yīng)該從哪個(gè)最小原型開始起步。這篇文章適合兩類人一類是正在做開發(fā)工具集成、天天跟 CLI 打交道的工程師另一類是團(tuán)隊(duì)內(nèi)部想給“只有終端經(jīng)驗(yàn)的人”提供更友好入口的產(chǎn)品同學(xué)。1. 為什么有人會(huì)給 AI 編碼 CLI 套一個(gè)桌面殼1.1 CLI 能力很強(qiáng)但交互確實(shí)有點(diǎn)“反人性”AI 編碼類 CLI 工具設(shè)計(jì)的核心場(chǎng)景是“讓開發(fā)者留在終端里完成代碼生成、修改、解釋”。對(duì)習(xí)慣了 vim、tmux、各種命令行的老手來說這很自然。但問題是這類工具的能力并不只有“在終端里跑一條命令”這么簡(jiǎn)單它實(shí)際承擔(dān)的是一個(gè)完整的、帶有狀態(tài)和上下文的交互流程。這就帶來幾個(gè)真實(shí)的摩擦點(diǎn)。第一個(gè)是輸出長。一次代碼生成請(qǐng)求返回的可能是幾十行甚至上百行的 markdown里面夾雜著代碼塊、解釋文字、文件路徑建議。終端里雖然有滾動(dòng)但你要從一堆內(nèi)容里精準(zhǔn)找到那一段你想要的函數(shù)實(shí)現(xiàn)體驗(yàn)非常痛苦。尤其當(dāng)你連續(xù)問了好幾個(gè)問題輸出的內(nèi)容混在一起基本只能靠肉眼在一屏一屏的終端回滾里翻找。第二個(gè)是歷史記錄幾乎沒有。終端會(huì)話一關(guān)之前的生成結(jié)果就丟了。哪怕你用 tmux 保留了滾動(dòng)緩沖換個(gè)機(jī)器、換個(gè)窗口全沒了。而桌面應(yīng)用天然具備“持久化保存”的預(yù)期聊天記錄、生成結(jié)果、當(dāng)時(shí)的工作目錄和所用的模型參數(shù)都可以結(jié)構(gòu)化地存下來隨時(shí)回看。第三個(gè)是協(xié)作和分享困難。你想把 AI 幫你寫的代碼片段發(fā)給同事終端里沒法直接選中一段漂亮的帶語法高亮的代碼區(qū)域發(fā)給別人只能截圖。截完圖代碼還不能復(fù)制。桌面端就簡(jiǎn)單多了渲染成代碼塊一個(gè)按鈕復(fù)制 markdown 或純文本再不行直接右鍵分享。第四個(gè)是入口門檻。不是所有人都愿意打開終端。團(tuán)隊(duì)里的產(chǎn)品同學(xué)、測(cè)試同學(xué)可能只是想讓 AI 幫忙解釋一段報(bào)錯(cuò)或者生成一批測(cè)試數(shù)據(jù)。你讓他們記住“先 source 環(huán)境再登錄然后輸入特定前綴跑命令”難。而一個(gè)裝了就能用的桌面應(yīng)用雙擊打開、文本框輸入、按鈕點(diǎn)擊學(xué)習(xí)成本低得多。1.2 桌面應(yīng)用到底補(bǔ)了什么能力說“套殼”不夠準(zhǔn)確準(zhǔn)確的說法是“補(bǔ)全交互層”。CLI 負(fù)責(zé)核心邏輯——調(diào)模型、管上下文、生成代碼桌面應(yīng)用負(fù)責(zé) CLI 缺失的周邊體驗(yàn)。我觀察這類項(xiàng)目做得比較好的部分通常集中在這幾塊會(huì)話管理每個(gè)提問、每次生成按時(shí)間線和項(xiàng)目目錄歸檔支持本地檢索、重新打開、一鍵重跑。代碼塊交互流式輸出過程中實(shí)時(shí)渲染 markdown代碼段有高亮、行號(hào)、復(fù)制按鈕還能直接把生成結(jié)果寫入指定文件。配置總控模型、溫度參數(shù)、工作目錄、環(huán)境變量、賬號(hào)登錄態(tài)全部在圖形界面里集中管理不用再去翻 shell 配置。系統(tǒng)集成全局快捷鍵喚起輸入框、托盤圖標(biāo)顯示任務(wù)狀態(tài)、生成完成彈通知。這些能力終端里很難實(shí)現(xiàn)或者說實(shí)現(xiàn)成本很高。所以這個(gè)“桌面殼”的價(jià)值不是把終端搬進(jìn)窗口而是把終端里做不好的事補(bǔ)上可視化、持久化、上下文管理、分享協(xié)作。CLI 還是后端引擎但交互主戰(zhàn)場(chǎng)換了陣地。1.3 為什么是“包 CLI”而不是“原生重寫一套”這是很多人的第一反應(yīng)既然桌面體驗(yàn)這么好為什么不干脆直接調(diào)模型 API做個(gè)原生 AI 編程應(yīng)用還要費(fèi)勁去包一個(gè) CLI我見過不少團(tuán)隊(duì)做過這種選擇最后基本都踩了同一個(gè)坑如果桌面應(yīng)用自己直接對(duì)接模型 API那意味著要自己維護(hù)一套和原 CLI 等價(jià)的提示詞邏輯、上下文管理、工具調(diào)用協(xié)議、鑒權(quán)流程。這幾乎等于把 CLI 重新實(shí)現(xiàn)一遍而且原 CLI 每次更新桌面應(yīng)用都要同步去追。維護(hù)兩個(gè)語義完全相同的“前端”不是工程上明智的選擇。反過來“包裝 CLI”本質(zhì)上是一種復(fù)用策略。模型能力、提示詞模板、數(shù)據(jù)處理邏輯都在 CLI 里桌面應(yīng)用只關(guān)心兩件事把用戶的意圖變成一條正確的命令把命令的輸出變成圖形化的界面。原 CLI 升級(jí)了桌面應(yīng)用大概率不用改因?yàn)樗玫降氖欠€(wěn)定輸出流或者至少是向后兼容的輸出格式。這才是“包殼”項(xiàng)目的核心增量價(jià)值。但這里有個(gè)隱含風(fēng)險(xiǎn)一旦 CLI 的輸出格式大變或者刪除了某個(gè)非交互子命令依賴方就斷了。所以做這類項(xiàng)目的人通常會(huì)在發(fā)布說明里要求保持輸出格式穩(wěn)定或者提供 JSON 結(jié)構(gòu)化輸出模式。這也是我在下面章節(jié)要重點(diǎn)展開的技術(shù)細(xì)節(jié)。2. 關(guān)鍵技術(shù)拆解桌面殼是怎么連上 CLI 的2.1 進(jìn)程模型與輸出流實(shí)時(shí)轉(zhuǎn)發(fā)先明確一個(gè)基本架構(gòu)桌面應(yīng)用一般會(huì)有主進(jìn)程和渲染進(jìn)程或者至少有一個(gè)后端服務(wù)層和一個(gè)前端界面層。核心邏輯是主進(jìn)程去啟動(dòng) CLI 的子進(jìn)程然后把 stdout、stderr 的數(shù)據(jù)實(shí)時(shí)轉(zhuǎn)發(fā)給界面層渲染。用 Node.js 生態(tài)舉例最常見的是 child_process 的 spawnconst { spawn } require(child_process); const child spawn(aicli, [run, prompt, --model, modelName], { env: { ...process.env, NO_COLOR: 0, FORCE_COLOR: 1 }, shell: false, cwd: workingDir, }); child.stdout.on(data, (chunk) { win.webContents.send(output, chunk.toString()); }); child.stderr.on(data, (chunk) { win.webContents.send(stderr, chunk.toString()); }); child.on(close, (code) { win.webContents.send(done, { code }); });這段代碼看著簡(jiǎn)單但里面有幾個(gè)決策值得展開。第一shell: false意味著不經(jīng)過系統(tǒng) shell直接執(zhí)行二進(jìn)制。好處是安全——參數(shù)不會(huì)經(jīng)過 shell 解析不會(huì)出現(xiàn)注入問題壞處是 CLI 如果依賴 shell 特性比如需要用通配符擴(kuò)展路徑、需要用管道、需要加載某個(gè) shell 函數(shù)就執(zhí)行不了。我實(shí)際見過的情況是像那種用 Python 打包發(fā)布的 CLI直接 spawn 二進(jìn)制沒問題但如果它內(nèi)部調(diào)用了系統(tǒng)命令就可能在特殊環(huán)境下失敗。建議默認(rèn)shell: false遇到具體問題再按需開啟別為了省事全局打開。第二環(huán)境變量的處理。上面代碼把NO_COLOR顯式設(shè)置成了0又把FORCE_COLOR設(shè)置成1這是為了讓 CLI 把帶 ANSI 顏色的文本原樣輸出。很多 CLI 檢測(cè)到 stdout 不是 TTY 以后會(huì)自動(dòng)關(guān)閉顏色但對(duì)于桌面應(yīng)用來說顏色信息恰恰是有用的我們可以在渲染層把\x1b[31m這種顏色碼轉(zhuǎn)成 HTML 樣式。當(dāng)然也有人在 GUI 里更喜歡干凈文本那就反過來設(shè)NO_COLOR: 1。兩種做法都行關(guān)鍵是要在項(xiàng)目一開始就定好策略否則后續(xù)解析代碼會(huì)改得很痛苦。第三實(shí)時(shí)性。spawn的數(shù)據(jù)事件是流式的不會(huì)等命令執(zhí)行完才一次性返回這一點(diǎn)保證了“輸出一個(gè)字界面就渲染一個(gè)字”的效果。但這里有個(gè)細(xì)節(jié)如果 CLI 自身對(duì) stdout 做了塊緩沖把數(shù)據(jù)攢滿一塊才 flush那 GUI 端就會(huì)看到“卡一會(huì)、突然冒出一大段”的情況。解決思路有兩個(gè)一個(gè)是給 CLI 傳--line-buffer之類的參數(shù)讓它按行刷新另一個(gè)是用偽終端PTY繞過行緩沖就是下面說的 node-pty 方案。node-pty 的使用方式const pty require(node-pty); const ptyProcess pty.spawn(aicli, [run, prompt], { name: xterm-color, cols: 120, rows: 40, cwd: workingDir, env: process.env, }); ptyProcess.onData((data) { win.webContents.send(output, data); });node-pty 模擬了一個(gè)虛擬終端CLI 在里面的行為跟真實(shí)終端完全一致顏色、光標(biāo)移動(dòng)、行緩沖問題一次性全解決。代價(jià)是要處理原生模塊編譯而且輸出會(huì)混入大量終端控制序列解析復(fù)雜度比純 stdout 高一個(gè)量級(jí)。我的經(jīng)驗(yàn)是如果 CLI 輸出主要是常規(guī)文本和 ANSI 顏色碼用spawn就夠了如果 CLI 有交互式 TUI 界面、進(jìn)度動(dòng)畫、需要實(shí)時(shí)刷新同一行內(nèi)容那才需要上 PTY。2.2 輸出解析與渲染管線拿到原始輸出流以后真正的技術(shù)活才開始。AI 編碼 CLI 的輸出通常是 markdown 格式但在終端里它被渲染成了帶 ANSI 轉(zhuǎn)義的文本。桌面應(yīng)用要做的是把它還原成“富文本”再展示。我見過不少項(xiàng)目先剝離 ANSI 碼再渲染。如果只剝離不利用等于主動(dòng)丟掉了 CLI 已經(jīng)幫你做好的“高亮”信息。更好的做法是解析 ANSI 顏色序列把它映射成界面里的 span 樣式紅色文本、黃色警告、灰色注釋都對(duì)應(yīng)到界面的色彩體系里。有一些開源庫專門做這件事比如 ansi-to-html用起來就是逐行轉(zhuǎn)換性能也夠。然后是 markdown 的流式渲染這是最容易翻車的地方。AI 生成的時(shí)候代碼是一段一段往外蹦的如果每收到一段數(shù)據(jù)就把整段 markdown 從頭渲染一遍性能會(huì)隨內(nèi)容長度急劇惡化。大家常用的做法是做增量渲染拿到新數(shù)據(jù)解析出末尾未閉合的代碼塊標(biāo)記把已完整的內(nèi)容渲染掉把未閉合的代碼塊留到下一次數(shù)據(jù)到達(dá)時(shí)繼續(xù)拼接。這也是為什么很多 AI 對(duì)話界面的打字機(jī)效果看起來流暢而有些輕量實(shí)現(xiàn)會(huì)越來越卡。還有一個(gè)更穩(wěn)妥的方案是讓 CLI 支持結(jié)構(gòu)化輸出。不少現(xiàn)代 CLI 都有類似--json的選項(xiàng)這樣 stdout 不再是給人看的格式化文本而是帶明確結(jié)構(gòu)的數(shù)據(jù)比如結(jié)果類型、內(nèi)容片段、工具調(diào)用記錄都有獨(dú)立字段。桌面應(yīng)用直接解析 JSON渲染穩(wěn)定不依賴 ANSI 碼和正則表達(dá)式。我可以負(fù)責(zé)任地說所有給 CLI 做 GUI 的成熟項(xiàng)目都會(huì)優(yōu)先爭(zhēng)取讓 CLI 提供結(jié)構(gòu)化輸出純文本解析永遠(yuǎn)是備選方案。關(guān)于渲染性能我建議至少在三個(gè)層面做防護(hù)輸出長度上限。超過比如 20 萬字符就截?cái)嗖⑻崾居脩魞?nèi)容過長。生成超長代碼的時(shí)候?yàn)g覽器 DOM 的承載能力是有限的全量塞進(jìn)去必然卡。虛擬滾動(dòng)或分頁。長輸出切成多個(gè)段落或 block只渲染當(dāng)前可視區(qū)域上下滾動(dòng)時(shí)按需加載。增量 diff。如果每次輸出結(jié)果都完整替換UI 狀態(tài)會(huì)丟失盡量只替換變化的部分。2.3 會(huì)話、配置與系統(tǒng)集成CLI 本身不一定有“會(huì)話管理”概念。它可能是單輪問答模式也可能有交互模式但大多數(shù)會(huì)話狀態(tài)都存在進(jìn)程內(nèi)存里。桌面應(yīng)用的另一個(gè)職責(zé)就是把會(huì)話持久化到本地。我見過比較務(wù)實(shí)的存儲(chǔ)方案是 SQLite比如 better-sqlite3或者 JSON 文件。每條會(huì)話記錄包含時(shí)間戳、工作目錄、所用模型參數(shù)、用戶輸入、完整輸出、狀態(tài)完成/中斷/出錯(cuò)。存儲(chǔ)的關(guān)鍵不在表結(jié)構(gòu)多復(fù)雜而在于“會(huì)和 CLI 的命令參數(shù)一一對(duì)上”這樣用戶回看舊會(huì)話時(shí)可以把當(dāng)時(shí)的參數(shù)原樣重建。比如{ id: session_001, cwd: /home/user/project, command: aicli run, model: llm-v3, temperature: 0.2, prompt: 解釋這段代碼的并發(fā)模型, output: markdown..., createdAt: 2025-01-15T10:22:33.000Z }保存會(huì)話的價(jià)值很大。AI 編碼工具不像普通聊天工具代碼生成往往和項(xiàng)目上下文綁定回看“當(dāng)時(shí)為什么生成這段代碼”其實(shí)是重要的開發(fā)記錄。如果你后續(xù)要做團(tuán)隊(duì)分享、周報(bào)生成、代碼審計(jì)這個(gè)歷史庫會(huì)變成金礦。系統(tǒng)集成方面還有一些更容易被忽視的細(xì)節(jié)。比如全局快捷鍵按下某個(gè)組合鍵就喚起輸入框這需要主進(jìn)程注冊(cè)全局鉤子。比如托盤CLI 任務(wù)跑完以后發(fā)一個(gè)系統(tǒng)通知這需要調(diào)用各平臺(tái)的通知 API。再比如開機(jī)啟動(dòng)、自動(dòng)更新、多顯示器下的窗口位置記憶。這些能力聽起來輔助但實(shí)際拉高了很多使用頻率。3. 實(shí)操從零做一個(gè) CLI 的桌面包裝器3.1 技術(shù)棧選擇與模板搭建圍繞“給 CLI 做桌面殼”這個(gè)需求社區(qū)里的主流選擇有三個(gè)Electron、Tauri、Wails還有少量 Flutter Desktop 和 Qt。我拿實(shí)際項(xiàng)目里的常見痛點(diǎn)做對(duì)比維度ElectronTauriWails后端語言主要寫 Node.jsRustGo前端語言Web 技術(shù)棧Web 技術(shù)棧Web 技術(shù)棧安裝包體積較大約 80~120MB小約 5~15MB適中內(nèi)存占用高低中等子進(jìn)程管理便利度高child_process 原生支持可做需把 stdout 事件傳給前端可做Golang 的 os/exec 很成熟原生模塊兼容性成熟一般依賴系統(tǒng) WebView一般學(xué)習(xí)門檻低中高低我不打算替你做決定只給一個(gè)判斷邏輯團(tuán)隊(duì)里誰更熟悉什么就選什么。如果團(tuán)隊(duì)主要寫前端選 Electron 最穩(wěn)調(diào)試工具鏈成熟遇到問題資料最多如果追求極致安裝包體積、對(duì)內(nèi)存占用敏感Tauri 值得嘗試如果團(tuán)隊(duì)是 Go 背景Wails 的體驗(yàn)比想象中好。無論選哪個(gè)項(xiàng)目骨架都差不多一個(gè) window 一個(gè)后端主進(jìn)程 一個(gè)可被調(diào)用的前端頁面。以 Electron 為例初始化大致是npm create electron-app my-ai-desktop cd my-ai-desktop npm install npm run dev把 dev 模式跑起來窗口起來了立刻就要做的一步是在 dev 模式下允許加載 localhost在 build 模式下加載構(gòu)建產(chǎn)物。這個(gè)判斷條件一定要寫對(duì)否則開發(fā)時(shí)一切正常打包后白屏。3.2 核心代碼實(shí)現(xiàn)主進(jìn)程、渲染進(jìn)程與中轉(zhuǎn) IPC我現(xiàn)在給你一個(gè)最小可跑通的核心鏈路用戶在輸入框輸入問題點(diǎn)擊提交主進(jìn)程啟動(dòng) CLI 子進(jìn)程并傳入該問題子進(jìn)程輸出逐行流轉(zhuǎn)發(fā)到渲染進(jìn)程渲染進(jìn)程以打字機(jī)效果展示完成后展示復(fù)制按鈕。主進(jìn)程里關(guān)鍵是啟動(dòng)命令和 IPC 轉(zhuǎn)發(fā)。在 Electron 里用ipcMain.handle注冊(cè)一個(gè)事件收到用戶請(qǐng)求后 spawn 子進(jìn)程然后通過webContents.send把輸出推給渲染進(jìn)程const { ipcMain } require(electron); const { spawn } require(child_process); ipcMain.handle(run-prompt, (event, { prompt, cwd, model }) { return new Promise((resolve) { const child spawn(aicli, [run, prompt, --model, model], { cwd, env: process.env, }); child.stdout.on(data, (chunk) { event.sender.send(output-chunk, { sessionId: Date.now(), chunk: chunk.toString(), }); }); child.on(close, (code) { event.sender.send(output-done, { code }); resolve({ code }); }); }); });渲染進(jìn)程里監(jiān)聽output-chunk把 chunk 追加到一個(gè)文本緩沖區(qū)里然后觸發(fā) markdown 渲染。這里要注意不要每次收到 chunk 就直接重設(shè)整個(gè) innerHTML這會(huì)瞬間卡死。正確做法是把渲染隊(duì)列控制成每 16ms~30ms 批量處理一次利用文本 diff 或 token 級(jí)追加來更新頁面window.api.onOutputChunk((chunk) { buffer chunk; // 30ms 節(jié)流批量更新 UI throttleRender(); }); function throttleRender() { if (renderTimer) return; renderTimer setTimeout(() { outputContainer.innerHTML renderMarkdown(buffer); renderTimer null; }, 30); }到這里你已經(jīng)有了一個(gè)“能看到字往外蹦”的最小原型。把字體設(shè)成等寬加一個(gè)代碼高亮一個(gè)基礎(chǔ)的 AI CLI 桌面殼就成型了。3.3 打斷、重跑與一鍵復(fù)制交互細(xì)節(jié)決定使用體驗(yàn)。我最想強(qiáng)調(diào)三個(gè)第一中斷。AI 生成不是每次都讓人滿意用戶要有能力打斷。實(shí)現(xiàn)方式是對(duì)子進(jìn)程發(fā)SIGTERM或SIGINT。注意發(fā)送之前要先判斷進(jìn)程是否還存活否則會(huì)報(bào)錯(cuò)。如果是 Windows還需要處理任務(wù)結(jié)束進(jìn)程樹的差異常見做法是用taskkill /pid xxx /T /F。第二重跑。重跑不是簡(jiǎn)單地把同一命令再執(zhí)行一遍而是要考慮要不要保留上次生成的結(jié)果工作目錄是否變化模型是否換過我的建議是重跑時(shí)把新會(huì)話和舊結(jié)果并列展示不要覆蓋方便對(duì)比不同模型、不同參數(shù)下的輸出差異。這個(gè)對(duì)比能力是終端完全沒有的。第三一鍵復(fù)制。很多人以為復(fù)制就是navigator.clipboard.writeText但在 Electron 里最好由主進(jìn)程來處理剪貼板寫入因?yàn)槟承┫到y(tǒng)上渲染進(jìn)程的剪貼板權(quán)限受限。代碼很簡(jiǎn)單const { clipboard } require(electron); ipcMain.on(copy-text, (event, text) { clipboard.writeText(text); event.sender.send(copy-done); });3.4 打包分發(fā)與三平臺(tái)差異如果你只在本機(jī)跑打包無所謂一旦要發(fā)給別人用三平臺(tái)差異立刻浮出水面。Linux 上最常見的是 AppImage 和 deb。AppImage 適合臨時(shí)運(yùn)行但很多系統(tǒng)沒有賦予它可執(zhí)行權(quán)限用戶拿到手還是得先chmod x。deb 適合 Debian/Ubuntu 系用戶但缺少圖形化軟件中心入駐能力分發(fā)半徑也比較有限。更麻煩的是依賴系統(tǒng) WebView 的框架在無 WebView 的服務(wù)器級(jí) Linux 環(huán)境上會(huì)直接跑不起來得提前在文檔里寫清楚依賴要求。macOS 上最麻煩的是簽名和公證。如果沒有開發(fā)者賬號(hào)簽名用戶在系統(tǒng)設(shè)置里會(huì)看到“無法打開因?yàn)闊o法驗(yàn)證開發(fā)者”的警告。哪怕你自己用著沒事發(fā)給別人他們大概率會(huì)卡在這一步。正規(guī)做法是申請(qǐng)開發(fā)者證書配置notarize確保應(yīng)用經(jīng)過公證后再發(fā)布。這個(gè)流程第一次跑通大約要半天但一次配好后續(xù)就順暢了。Windows 上常見的是 NSIS 安裝包和 portable 免安裝版。portable 雖然方便但可能觸發(fā) SmartScreen 的警告需要購買代碼簽名證書來消除。如果沒有簽名也可以引導(dǎo)用戶點(diǎn)“更多信息 — 仍要運(yùn)行”。在 CI 層面比較簡(jiǎn)單的是用 GitHub Actions 的矩陣構(gòu)建一個(gè) job 跑三個(gè) OS 的構(gòu)建產(chǎn)物strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkoutv4 - uses: actions/setup-nodev4 - run: npm ci - run: npm run build - run: npm run dist三平臺(tái)產(chǎn)物分別上傳到 release自動(dòng)更新邏輯可以把 release 接口當(dāng)更新源。這一步做完整個(gè)“桌面殼”項(xiàng)目才算真正能對(duì)外分發(fā)。4. 踩坑實(shí)錄CLI 封裝為桌面應(yīng)用最容易翻車的地方4.1 環(huán)境變量與 PATH 不一致這是跨平臺(tái)桌面應(yīng)用最經(jīng)典的坑沒有之一。用戶在終端里跑 CLI 一切正常原因是在 shell 啟動(dòng)時(shí)加載了.bashrc、.zshrc、.profile里的環(huán)境變量而且 PATH 可能包含用戶通過包管理器安裝的工具路徑。但桌面應(yīng)用由操作系統(tǒng)直接啟動(dòng)不走 shell所以它拿到的 PATH 是最小集合。結(jié)果就是應(yīng)用能打開但找不到 CLI 可執(zhí)行文件報(bào)錯(cuò)command not found。解決思路通常是在啟動(dòng) CLI 之前從用戶默認(rèn) shell 里讀取一份完整的環(huán)境變量。Linux/macOS 上可以執(zhí)行shell -l -c env來獲取登錄 shell 的環(huán)境Windows 上要處理用戶 PATH 與系統(tǒng) PATH 的合并有時(shí)還要讀取注冊(cè)表。這個(gè)過程要放在主進(jìn)程啟動(dòng)早期完成并且緩存起來因?yàn)槊看味既?spawn 一個(gè) shell 成本并不低。我踩過的更多是相反的情況從桌面應(yīng)用啟動(dòng) CLI 后它找不到系統(tǒng)的python3或者node而用戶在終端里明明能不能。排查思路固定先看環(huán)境變量輸出再用一個(gè)最小命令測(cè)試 spawn 是否成功別一上來就懷疑 CLI 邏輯有問題。4.2 輸出編碼與亂碼在 Windows 上跑類似項(xiàng)目很容易遇到 stdout 輸出亂碼。元兇通常是控制臺(tái)代碼頁和進(jìn)程默認(rèn)編碼不一致。CLI 輸出 UTF-8但 Windows 控制臺(tái)默認(rèn)可能是 GBK代碼頁 936或其它編碼數(shù)據(jù)通過管道傳過來就變了。解決方法是顯式指定 UTF-8。如果你在命令行層面控制可以在啟動(dòng)前執(zhí)行chcp 65001但這治標(biāo)不治本因?yàn)槊總€(gè)新的子進(jìn)程都得重新設(shè)置。更穩(wěn)妥的辦法是在代碼里把 stdin/stdout 的編碼包裝成 UTF-8# 如果 CLI 是 Python 寫的 import sys sys.stdout.reconfigure(encodingutf-8)// 如果 CLI 是 Node 寫的 process.stdout.setDefaultEncoding(utf-8);如果這個(gè) CLI 不是你寫的沒法在源碼里改那就只能從環(huán)境入手啟動(dòng)子進(jìn)程時(shí)傳入PYTHONIOENCODINGutf-8或者NODE_OPTIONS--input-typecommonjs這個(gè)看具體情況再不行就用 iconv 之類的庫在收到數(shù)據(jù)后做轉(zhuǎn)碼。我的經(jīng)驗(yàn)是編碼問題要在項(xiàng)目第一天就寫測(cè)試用例別等到用戶反饋亂碼再處理。4.3 長任務(wù)卡死、內(nèi)存膨脹與登錄態(tài)過期AI 編碼請(qǐng)求有時(shí)候要跑很久。讓我拆成三個(gè)問題看。第一個(gè)是長任務(wù)卡死。如果渲染進(jìn)程一次性接收大量輸出或者主進(jìn)程在等待 CLI 關(guān)閉時(shí)發(fā)生了 IPC 消息堆積界面就會(huì)卡住。預(yù)防措施是上面說的節(jié)流和虛擬滾動(dòng)以及給輸出長度設(shè)定硬上限。第二個(gè)是內(nèi)存膨脹。如果用戶連續(xù)進(jìn)行幾十次生成每次 keep 住完整輸出的引用內(nèi)存會(huì)很快漲上來。建議把歷史會(huì)話寫進(jìn)磁盤界面里只保留當(dāng)前可見條目的完整 DOM從視圖上卸載舊數(shù)據(jù)。否則你會(huì)在長時(shí)間使用后看到內(nèi)存占用穩(wěn)步上升最終達(dá)到幾百 MB 甚至上 GB。第三個(gè)是登錄態(tài)過期。AI 編碼 CLI 通常要求用戶先登錄。登錄 token 存儲(chǔ)在系統(tǒng)鑰匙串或 CLI 自己的配置文件里過期后 CLI 會(huì)以非零碼退出同時(shí)輸出提示“需要重新登錄”。桌面應(yīng)用如果不處理用戶會(huì)看到任務(wù)失敗但不知道原因。給 CLI 退出碼做一張映射表很重要非零碼對(duì)應(yīng)哪一類錯(cuò)誤應(yīng)該渲染成什么界面提示是否觸發(fā)重新登錄引導(dǎo)。這一層做得好的話用戶感知會(huì)非?!皩I(yè)”比純文本報(bào)錯(cuò)強(qiáng)幾個(gè)檔次。4.4 快捷鍵沖突與多窗口狀態(tài)同步桌面應(yīng)用往往要在系統(tǒng)級(jí)別注冊(cè)全局快捷鍵。沖突必然存在比如某系統(tǒng)自帶的截圖快捷鍵或者其它應(yīng)用占用了同一個(gè)組合鍵。注冊(cè)失敗時(shí)一定要捕獲錯(cuò)誤并回退到常規(guī) UI 按鈕保證功能可用。不要讓全局快捷鍵成為硬依賴。多窗口狀態(tài)同步是另一個(gè)容易被忽略的問題。用戶可能開了兩個(gè)窗口一個(gè)窗口生成完代碼另一個(gè)窗口應(yīng)該刷新會(huì)話列表。這時(shí)候就涉及跨窗口的廣播Electron 里可以借助主進(jìn)程做一個(gè)簡(jiǎn)單的事件總線所有窗口監(jiān)聽session-updated事件。很多項(xiàng)目剛開始只考慮單窗口等用戶開始多開才發(fā)現(xiàn)數(shù)據(jù)不同步回過頭重構(gòu)成本不低。5. 我對(duì)這類“CLI GUI 殼”項(xiàng)目的一些體會(huì)這個(gè)項(xiàng)目讓我想明白一件事情CLI 不會(huì)消失但它不一定非得是唯一的交互形態(tài)。給 CLI 做 GUI本質(zhì)上是把“專業(yè)工具的使用門檻”降低同時(shí)保留它在自動(dòng)化、批處理、原生效率上的優(yōu)勢(shì)。這種包裝器型項(xiàng)目能不能做大關(guān)鍵不在界面的漂亮程度而在于它是否真的補(bǔ)全了 CLI 缺失的能力可視化、可檢索、可對(duì)比、可分享。我見過比較成功的同類項(xiàng)目幾乎都把重心放在“會(huì)話管理和結(jié)果比較”上而不是花大力氣去重畫按鈕和卡片。CLI 的輸出往往是一次性的但用戶的思考、決策、修改記錄是連續(xù)的誰先把這個(gè)連續(xù)性做出來誰就贏。如果你準(zhǔn)備動(dòng)手做一個(gè)類似的包裝器我建議按這個(gè)順序推進(jìn)先搞定子進(jìn)程 spawn 和流式轉(zhuǎn)發(fā)再做會(huì)話持久化然后處理跨平臺(tái)打包和三平臺(tái) env 差異最后才是界面美化、快捷鍵、自動(dòng)更新這些錦上添花的東西。別一上來就把界面做成設(shè)計(jì)稿那樣大概率會(huì)在“進(jìn)程生命周期管理”這種基礎(chǔ)問題上被拖住。我個(gè)人在實(shí)際操作中的體會(huì)是這類項(xiàng)目的技術(shù)風(fēng)險(xiǎn)永遠(yuǎn)不在圖形界面本身而在 CLI 的“環(huán)境假設(shè)”。它默認(rèn)你有一個(gè)完整 shell、正確的 PATH、齊全的運(yùn)行時(shí)。作為包裝器你的工作就是把這層假設(shè)變得透明讓用戶在 GUI 里意識(shí)不到終端的存在。做到這一步再回頭去看終端里那些操作會(huì)覺得 CLI 和 GUI 更像是互補(bǔ)的兩面缺一不可。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产精品亚洲高清在线| 综合97亚洲| 国产粉嫩蜜臀av一区二区三区| 一区二区蜜臀| 国内精品不卡无毒99999| 亚洲高清国产理伦片| 后入式免费视频| 97爱b| 夜夜夜久久| 91高清无码下载| 天天看精品动漫视频一区| 九九超碰综合网| 97干天天| 麻豆精品A片免费观看| 国产精品亚洲免费| 五月丁香社区婷婷日韩欧美精品影院| 久久久久久久九九九九九九| 日韩操啪| 手机在线视频国内精品| 在线观看岛国有码| 先锋色眉乱伦资源| 国产综合永久精品日韩鬼片| 国产白嫩漂亮KTV在线| 玖玖爱在线视频免费观看| 国产熟女一区二区| 精品国产乱码久久久久久久久久毛片| 亚洲在钱| 91N综合网在线| 丰满熟女人妻一区二区三五十一路| 97人亚洲综合字幕| 欧美性爱网97| 密臀成人视频久久久| 精品国产乱码久久久久久久久久毛片| ss久久| 夜夜一区二区| 蜜奶av| 强上我不卡卡| 久久 久久国内精品亚洲| 精品久久大胆人体| 天堂av最新电影网| 国产白丝av| 国产99999| 日韩欧美加勒比| 搡老女人老熟女91| 99热99在线播放激情| 欧美一级特黄淫片在线观看| 凸凹视频在线观看| 日韩AV电影网站| 1区2区3区在线视频| 日本青青草在线| 三上制服丝AV| 麻豆a'v电影| 色九九综合AV| 五月天亚洲色图| 日韩亚洲欧美中文字幕| 免费强奸av| av大香蕉| 四虎884a| 91天天| 日本色色视频网站| 色婷婷亚洲婷婷| 少妇同性| 欧美激情激情xxxx欧美专区| 99re热有精品视频国产| 岛国片在线观看视频亚洲| 欧美日韩999| 亚洲情色 欧美| 亚洲男人电影天堂| 久久99午夜精品一区人妻| 久久久久人妻| 啊啊啊好疼| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | www.四虎在线| 精品9999| 久操网视频| 丁香婷婷久久| 日韩三级性| 欧美激情综合网| 久久东京伊人一本到鬼色| 欧美黄色大香蕉一区二区| 97WW精品| 精品少妇高潮久久| 国产一级不卡在线观看| 高树玛利亚无码流出| 99精品丰满人妻无码| 污色区网站| 手机在线看片免费人成视频| 噜噜噜亚洲精品| 亚洲黄色| 日韩乱码Av| 国产精品第一页国产大屁股视频免费区i| 91中文字幕制服丝袜免费视频| 色翁荡息又大又硬又粗又爽| 国产13区| 亚洲av青草久久一区二区| 国产精品爽爽va在线观看98| 久久国模av| 亚洲熟女人妻中文字幕一区二区| 日本岛国黄色网址| 国产精品乱码久久久久久久| 91影库| 综精品久久久aaaa| 91天天| 蜜臀国产AV中文字幕| 蜜臀av网址| 无码丰满熟妇一区二区浪潮AV| 啪啪91| 中文字幕丰满子伦无码专区在线视频最新| 久久婷婷精品| 六月色色| 色九九久九九| 嗯嗯啊中文字幕| JuliaAnn丝袜熟女系列| 激情五月综合| 色哟哟 日韩精品| 91啪9色| 久操免费在线| 九九国产| 涩涩五月天| 婷婷激情四射| 97在线精品| 日韩97超碰| 动漫爆乳3D奶水一区在线观看| 日日干男人的天堂| 亚洲最大无码中文字幕网站 | 人人妻人射| 亚洲老司机123专区| 免费久久一级毛片大黄| 夜夜 中文视频rt| 国产成人免费观看在线视频| 亚洲激情在线| 欧美欲色| 一起草精品人妻| 蜜桃久久一区| 国产一区麻豆免费观看| av天堂精品久久| 国产精品国产| 亚洲色性情三级| 日韩中文字幕国产| 国产国产亚洲一二三久久| 中文字幕免费在线观看| 久久久九97| 国产精品成久久久久午夜午夜| 97色论| 操逼逼中文字幕| 我要色综合网站| 97爱爱爱综合| 亚欧成人中文字幕一区| 999综合网| 99re69| 亚洲制服欧美另类内射| 亚洲激情视频| 强奸熟女一区二区三区 | 乱欲性色| 91美女丝袜诱惑视频| 粉嫩av平台| 国产吹潮女在线观看| 久操大香蕉手机视频在线看| 日韩AV熟女乱伦| 久久久久久久9| 欧亚日韩三区| 九九九午夜| 不卡啪啪视频| 国产第12页| 国产天天噜一噜久久久| 一区麻豆 高清中文字幕| 丰满人妻无码一区二区三区| 国产亚洲色停停久久99精品91| 国产免费一区| 麻豆久久久久久久久丝袜 | 欧洲亚洲人人爽爽视频| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 亚欧Av| 激情综合网激情综合| 天堂精品| 久久视频,这里只有精品| 欧美极品女人的天堂| 欧美亚洲日本视频久久久| 人人操,人人液| 欧美激情视频一区二区| 91情色在线| 中文一区二区| 久久久久久久久久精| 精品久久99| 九九人人操| 欧美v亚洲v日韩v最新在线二区| 无码不卡八戒| 亚洲强奸乱伦影视网| 岛国在线国产| 欧美黄色手机在线观看| 丝袜亚洲综合| 青春草莓视频在线观看网址| 性夜影院爽黄A爽免费动漫| 中国熟妇| 我要色综合网站| 国产av色网| 色综合99999| 美欧老女人97| 婷婷五月天无码| 欧美老妇综合网| 9 7超碰在线免费观看| 嗯嗯啊啊操死我| 人妻碰碰碰碰碰碰| 人妻天天爽夜夜爽精品2| 夜夜爽爽爽| 天天干一干| 丁香激情网| 蜜桃色色网站视频三区| 国产美女精品| 亚洲男人在线观看天堂| 啪啪啪亚欧美视频| 日韩啊V| 人妻干天天| 美国一区二区三区视频| 殴美大黄片| 日本午夜久久电影| 香蕉99秘 精品一区丁香| 国产精品天美传媒| 东京热大香焦| 亚洲黄色电影| 亚洲巨爆乳一区二区三区四季网| 日本性爱欧美性爱| 久久综合婷婷| 91老熟女逼| 东京热熟女亚洲视频网站| 美女毛片999| 神马久久久久久久久| 国产suv精品一区二六| 这里只有97精品| 精品亚洲| 18禁美女裸体无遮挡啪啪| 99久久久无码国产精品性男| 99热97| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 国产无套粉嫩白浆在| 超碰人人色| 日韩伦理视频| 色97欧美| 日本免费中文字幕在线| 久久久久久午夜男人的天堂| 熟女高潮合集-永久久久-成人AV | 自拍偷拍第26| 日韩人妻无码专区| 啊啊啊啊啊啊啊好爽不要| 欧美大片一区二区三区 | 超AV色女| 色天天野狼综合社区| 亚洲阿v天堂在线| 超碰成人公开| 野狼激情网| 亚洲国产青青| 性爱综合一区二区| 午夜精品久久久久久久男人的天堂| 91逼逼女人91| 国产丁香精品露脸视频| 亚洲AV成人精品网站在AV| 亚洲一卡2卡3卡4卡乱码网站 | 97干97色| 国产福利第一视频| 国产乱码精品久久久久久| 超碰美女97| 亚一综合久久久久久久久久| 97干com| 天美传媒麻豆一区二区三区国产精| 无码外流操逼视频| 亚洲色婷婷久久久综合日本| 色五月综合| 99精品久久久久久| 综合五月婷婷亚洲一区| 黄网站黄视频网站进入口 | www.超碰| 日曰骚久久精品| 中文字幕91页| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 少妇色欲综合网2| 日本五十路熟女一区二区| 日韩99神马视频播放| 亚洲天堂男人天堂网| 国产女性无套 免费观看| 日本天天干天天搞一区| 嫩草在线视频| 今日头条成人一区二区三区四虎精品 | 国产高清免费不卡av| 91在线限制级| 免费视频在线一区二区不卡| 日韩在线女优天天干| 三四中文字幕| 亚洲图片欧美91N| 亚洲人妻精品一区二区| 性爱久久| 亚洲开心网| 亚洲丝袜色| 中文字幕精品码亚洲| 欧美疯狂做爰xxxx| 亚洲天堂加勒比| 嗯啊不要在线| 超碰色综合| 久久国产99精品72福利| 操操操五月天婷婷丁香影院| 四虎AV影视国产精品亚洲精品| 呦呦影院| 十八禁成人网站在线观看| 超碰这里只有精品| 欧美日韩 强奸乱伦| 久久99深爱久久99精品| 亚洲人妻AV| 九九九999久久久网站| 色婷婷av在线观看| 日韩有码 一区二区三区| 综合干干干av久久久综合网| 近亲乱伦一区二区| 风月影院十八禁| 久久久久久久久九九久孕交| 五月丁香拍拍激情综合三级| 国产日韩美女小穴视频网站不卡| 色婷五月天| 日韩av性爱在线播放| 亚洲色资源| 日韩欧美国产高清视频| 欧美精品97| 97亚洲国产影视| a级免费在线观看| 97在线免费看| 久久精品国产亚洲AV嘿嘿| 91天天爽| 欧美色自拍| 六月丁香网| 国产福利电影| 丝袜综合网| 天堂射| 校园春色 男人天堂 | 亚洲人精| 国产 v乱码一区二| 夜夜草我| 麻豆精品.欧美精品.日韩精品.| 免费看污网站| 激情专区综合| 成人八戒网站| 人人操人人干xxx| 韩日自拍| 久插综合| 久久久久久夜夜夜夜夜| 中文字幕av乱伦| 操屄日韩| 亚洲久久久| 亚洲天堂人人妻| 99热精品在线观看| 久久久亚洲欧美综合| 中文字幕97| 亚洲AV人人澡人人爱| 伊人国产av| 色五月婷婷五月天| 五月天激情婷婷| 92人人操人人| 91碰超| 九九热久久99精品re| 九九九九九九九九九国产精品 | 亚洲精品自拍| 九九九九热| 91热| 亚洲 欧美综合| 欧美人人天天网| 97色97好| 九热大香蕉| 九九热超碰97亚洲最新香蕉| 91综合熟女| 狠狠操狠狠燥| 欧美人妻一区二区| 东京热伊久| 中出20p| 骚女高跟AV在线| 亚洲人妖网| 欧美情色贴图| 亚洲性少妇| 欧美日韩婷婷中文| 97色涩| 亚洲欧洲无码97久久精品| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 97在线视频观看免费| 男人成人黄色视频在线观看免费下载| 九九九九精品一区| 国产AV人人夜夜澡人人爽麻豆| 色网在线| 日韩八十路老熟女| 亚洲中文字幕一区| 中国熟妇| 欧美国产精品久久九九| 波多野结衣之双飞调教在线播放| 日韩熟女操逼| 国产欧美日韩一区二区三区| 国产亚洲色婷婷久久99精品91葵花宝典 | 国产又色又爽又舒服的三级视频| 亚洲精品美女久久久久久久久| AV在线资源| 女人被男人桶爽视频网站| 猛交交| 可以免费观看的日韩av毛片| 欧美成人黄网色网站| 亚洲成A∨人影院在线欢看| 无码免费精品高清| 亚洲精品乱码久久久久久蜜桃麻豆| 两性综合网| www.av在线观看| 性爱综合网| 91狠狠综合久久久久久| 撸撸成人在线视频| 四虎免费视频| 亚洲在饯| 福利操逼| 大香蕉综合网| 亚洲乱色视频一区、二区在线| 久久久人体| 久久精品老司| 国产av色网| 97天天在线| 久热伊人| 国产性爱在线视频一区二区| 99久久精品无码一区二区| 色播综合| 亚爽爽爽爽爽爽爽爽| 在线 欧美 亚洲| 啊v在线观看视频| 久久久国产av美女私房| 成人av免费观看| 青久操| 人妻91少妇| 人妻献身系列第54部| 国产成人精品日本亚洲语言| AV丝袜少妇| 无套后入双马尾| 日韩簧片免费看| 五月婷婷综合在线| 国产风韵犹存熟妇三区| 高清无码久操视频| 26uuu国产| 青青草玖玖爱| 视频一区二区三区精品| 日韩久久三区| 色原狠狠天天天| 无码不卡八戒| 99r九九| 天天天干977| jizzjizz欧美| 东北操逼| 国产av强奸美女| www老逼91| 久久久一区二区三区麻豆| 欧美精品99久久久**| 亚洲日韩av一区二区三区百合| 久久久久久免费电影| 欧美黄色大片在线观看| 天美欧美国产| 日韩乱伦AⅤ| 免费农村成人少妇人妻Aa一区二区视频| 婷婷人妻激情| 国产亚洲在线观看| 国产97在线播放| 日韩欧美中文日韩欧美色| caopeng97人妻| 亚洲一区日韩精品中文字幕| 色色色色色色色色色色色色色色综合| 亚州色图欧美色图| 亚洲日本韩国在线| 18禁久久| 日本中文字幕在线电影| 蜜桃在线观看一区二区三区 | 麻豆天美电影一区二区| 亚洲色人阁| 色综合色综合网| 久久9久久| 综合婷婷| 国产精品国产精品国产| 丝袜内射| AV一区观看| 日韩操呦呦影院在线观看| 天天操天天干一区二区 | 大香蕉92| 97操操| 亚洲熟女综合一区二区| 一区黄二区黄| 久久久99免费| 亚洲素人网| 精品性爱一区二区| 2020中文字幕在线观看| 日韩传媒在线| 欧美黑人精品一区二区| 搡老女人老熟女91老熟女综合网| 中文字幕一区 二 区 三 四 五 区日 日 骚| 欧美97在线欧| 91久久堂| 天天日天天插| 日韩福利综合一区| 亚洲诱惑天堂| 91男女啊啊啊| 操逼啊啊啊91| 少妇精品久久| m欧洲一级午老| 欧美99热| 国产精品亚洲一级av第二区| 老熟乱一区二区三区四区| 精品国产乱码久久久久久久久1 | 91黑丝在线播放| 日韩欧洲操屄视频| 超碰97.com| 丝袜性亚洲| 蜜乳性色无码专日粉嫩骚逼AV| 日本熟妇人妻一区二区三区| 四虎AV影视国产精品亚洲精品| 亚洲古典另类欧美在线| 精品久久久久久中文字幕视频免费| 性色国产东北露脸精品视频| 91久久久久久久久18| 无码人妻一区二区三区色欲aⅴ | 日韩精品中文字幕一| 青草地一本线一区二区三区| 乱久久久| 欧色综合| 欧美亚洲日韩人妻在线观看| 天天做日日爱夜夜爽| 亚洲人成在线放东京热| 色97欧美| 精品美女久久一二三| 最新AVzaixian| 另类小色呦| 美女操逼A A| 色五月av| 久久婷婷苹果| 中文熟女五十乱码在线| 99re只有精品| 男人天堂站| 可以看的av| 亚洲第一在线视频| 强奸乱伦Av网| 免费一级精品啪啪视频| 欧美精品成人一区二区在线观看 | 蜜乳AV色欲AVAV无码| 日韩极品无码B| 九九久久玖玖| 精品午夜福利| 伊人网高清| 91N综合网| 97人人色| 日本三级精品| 性欧美999| 久久久久久中文| 伊人久久亚洲色欲综合网站 | 久久麻豆一区二区| 五月综合视频| 日韩AV片| 精品视频日日夜夜| 国产丝袜美女诱惑| 天天日日舔舔| 日韩精品高清资源在线| 免费农村成人少妇人妻Aa一区二区视频| 日韩AV一区二区三区四四| 99啪啪| 六月丁香啪啪| 99re6久热只有精品6在线直播| 欧美精品99久久久| 欧州色图区| 色性荡荡荡荡视频| 久久精品视频28| 亚洲综合图色在线| 超碰伊人在线| 亚洲图片小说欧洲| av影片在线观看不卡| 97在线观看免费视频| 少妇久久| 性色av大全| 日本操大逼| 天天看,天天做| 五月天社区| 亚洲综合97中文网| 嗯嗯啊啊好疼| 自拍啪啪视频| 肉动漫无遮挡h在线观看| 边做饭边操逼逼| 狼狼色丁香久久婷婷综合五月 | 女人天堂网| 国产精品一区二区三区四区五区| 日韩操啪| 免费一级毛片在线视频观看| 天天色综合图片| 91在线限制级| 一本色道久久综合亚洲二区三区| 哈哈操电影| 黄视频免费| 亚洲成?V人片在线观看福利| 亚洲精品久久久久久久久豆丁网| 老鸭窝黄色视频网站| 欧美日综合| 超碰97人妻免费在线| 国产亚洲中文不卡二区| 婷婷在线视频| 国产精品久久久久久久免牛肉蒲团| 91欧美少妇| 日韩欧美性爱电影在线观看| 色爱三区| 少妇人妻无码| 九九热av| 亚洲一级特黄大片在线播放91| 麻豆人妻精品一区二区| 久日综合网| 天天躁日日躁狠狠躁| 亚洲精品啪视频| 999久久久久久久精| 欧美,亚洲,日韩,v,天堂,手机在线观看 | 人人人摸人人| 色播五月丁香| 99re在线视频这里只有精品| 国产高清视频无码在线| 婷婷丁香在线| 插入粉嫩少妇视频| 欧美熟妇成人一区二区| 女优视频第10页| 伊人四虎综合| 日韩精品在线观看观看| 国产天天骚| 好吊色综合| 超碰成人国产| 色踪合AV| 亚洲第一黄色av网站 | Av手机版天堂网| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 中文字日本乱码| 搡老女人老熟女91| 五月花婷婷| 欧美色91| 色色色综合网| 亚洲少妇视频| 99久久99九九99九九九| 伊人嫩草| 国产在线精品偷| 国产日产欧产美韩系列麻豆免费| 色天使亚洲综合在线观看| 中文字幕丝袜人妻| 中国农村熟妇毛片视频| 69AV女优男人的天堂| 女人久久久| 久久久久久久极品香蕉视频| 亚洲在线a| 精品精品精品| 91日韩| 亚洲 中文 女同| 日韩欧无码一区二区三区免费不卡| 91黑丝在线播放| 超碰欧美97| 人妻夜夜爽天天爽麻豆三区网站 | 久久麻豆一区二区| 精品高潮| 青青草啪啪网| 亚洲导航深夜福利| 人人妻人人色一区二区三区| 韩国一级婬片A片AAAAA| 91bbbbbb| 在线 亚洲 网爆 自拍| 日韩偷拍一区二区三区| 中文字幕AV片| 一区二区三区欧美激情| 欧洲精品二区| 国产夫妻一区二区| 亚洲,日韩,欧美,成人播放| 不卡一区视频| av资源在线播放天堂| 欧美激情区| 天天香香欲综合| 日va操| 久久久久久久| 九九久久国产精品| 最近2019中文字幕国语免费版 | 五月丁香影院| 在线人成亚洲视频免费观看| 东京热大香焦| 超碰三级秋霞| 99国产在线 精品 视频| 天美av在线| 久久精品亚洲东京热色播| 高清国产性猛交xxxx乱大交| 综合情欲网| 欧美熟妇视频| hd成人一区二区在线| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 丰满人妻一区二区三区大胸懂色 | 日本熟女中文| 粉嫩av平台| 9.1小视频| 国产乱婷婷精品二区三区| 国产女乱淫真高清免费视频| 一本久道久久综合狠狠爱一密臀精| 伊人国产av| 久久精品国产免费观看99| 色香AV| 亚洲极品| 诱惑人妻欧美一区在线播放| 五月婷婷爱六月丁香色| 伊人一区二区在线播放| 亚洲中文字幕av| 绑缚麻绳人妻寝取完整版| 大香蕉av在线| 手机在线人成免费视频| 日韩欧美亚洲自拍偷拍| 国产一区二区在线看| 亚洲欧美国产中文字幕| 99热精品在线观看| 亚洲少妇中文字幕网址| 亚洲性爱乱操x| 精品在线蜜臀| 2017,超碰| 蜜臀在线看片| 亚洲熟久久| 欧美成人亚洲精品| 亚洲图片欧美91N| 午夜精品视频777| 国产精品久久久久中文字幕| 思思热在线视频免费| 亚洲黄色| 无码粉嫩白虎一线天b区| 亚洲诱惑天堂 | 少妇熟女视频一区二区三区| 很很很很操| 操逼精品视频| 亚洲色性情三级| 亚洲免费精品一区| 小草精彩毛片| 久久人妻97久久久久久久| 色色99| 色色五月婷| 韩国一级婬片A片AAAAA| 国产亚洲精品第一最新| 亚洲成a人在线观看久| 手机在线中文字幕国产| 另类TS人妖一区二区三区| 成人免费性爱视视| 无码一区免费在线不卡| 国产精品久久久吖| 人妻性爱一区二区| 亚洲日韩av专区无码| 中文字幕在线免费观看2| 试看60秒 爽| 综合网亚洲| 婷婷色色五月天福利| 国产一区二区成人av在线播放| 百度百度日本操逼| 日本性感人妻91| 蜜乳AV.COM| 超97在线精品视频| 囯产乱伦一区二区三女| 婷婷五月天色色| 五月色综合| 宅男91视频在线播放| 色婷婷蜜臀av| 国产欧美成人精品| 玖玖大干人妻| 久久啊啊| 久久精品国内Av熟女高清| 为用户提供免费看黄网址在线观看| 国产女人高潮嗷嗷嗷叫小说 | 夜夜操夜夜高潮夜夜爽国产精品区| 毛片99-全集电影手机免费观看完整-B029AV| 亚洲AV色图一区| 婷婷人妻激情| 一级一性爱免费视频| 国产亚洲性生活视频播放| 人人操,操人人| 婷婷五月天社区| av操操不卡| 日韩人妻丝袜美腿中文| 欧综合网| 性爱Av免费| 久操操| 91在线丝袜视频| 天天综合,91入口| 人妻天天爽天天爽三区| 精品偷拍13p欧美dodk视频| 亚洲欧美成人在线| 在线97在线| 国内毛片四区| 欧美人人曰人人操人人射射 | 超碰97日韩| 成人性爱AV在线免费观看| 日本精品高清一二区一本到| 欧美色图亚洲色图成人在在线| 九9热伊人| 中国人高清www色视频免费| 乱伦av麻豆| 精品免费一区二区三区在线亚洲人成| 校园春色综合香蕉| 91东北熟女| 国产精品无码AV网站| 91色黑人少妇| 啊啊啊啊免费视频| 精品欧美А∨无码黑人大荫蒂| 开心婷婷五月| 九九九九九九九九九九九蜜桃| 97爱| 久久人妻视频| 啊嗯嗯啊好大好爽| AV麻豆免费一区| 国产精品一二三免费网站| 日韩 欧美 国产 麻豆| 人人么人人操| 天天干天天做| 人伦四五区| 久久毛卡| 超碰天天操你比| 亚洲午夜未满十八勿入网站日本又色又爽又黄| 国产福利影视| 四虎在线免费视频| 一区二区三区高清天码| 熟女在线视频| 成人性生活高清视频在线播放| 另类一区| 精品中文一区二区| 国产精品视频麻豆入口| 一区 欧美 日韩 麻豆| 天天噜| 婷婷精品| 超碰久超碰久| 欧美99热| 97超碰公开| 成人性爱电影一区二区| 啊啊啊啊啊啊啊网址在线观看| 亚洲成人精品在线一区| 一牛影视久久久一区二区三区| 欧美高清色| 日韩精品一区二区三区四虎影视| 蜜桃香蕉久草精品在线| 99日精品欧美国产| 91蜜臀人妻中文字幕在线| A片 AV一级在线播放观看免费| 综合激情一一91| 精品一区二区成人| 超碰日韩美妻| 国产福利av精彩对白| 久9爱经典视频| 91狼人| 91观看 国产白丝| 五月色综合| 欧美资源| 黄网站黄视频网站进入口 | 97精品97久久| 精品一二三区久久AAA片| 欧美桃色网| 婷婷五月天成人网| 97aiaiai| 久久 亚洲 日韩 人妻| 日本操大逼| 人人澡人人澡人人| 日日干夜夜干| 久久成年片色大黄全免费网站| 91骚妇| 色yeye成人免费视频| 高潮9999外国| 青青草原人妻| 亚洲综合另类小说色区亚洲成av人片在www | 9ⅰ久久久天天| 超碰免费在线| 中文字幕精品免费一区二区| 中文字幕超碰CAO| 亚洲操人| 国产中出内射一区二区| 日韩操呦呦影院在线观看| 欧美疯狂做爰xxxx| 91人妻在线视频| 欧美国产一区二区三区麻豆传媒| 亚洲最大AV网| 久久男人天堂| 免费97视频| 亚码激情| 手机在线视频国内精品| 欧美大的香蕉有线电视视频| 亚洲色图加勒比| 国产超碰人人爽人人做| 97欧美超碰| 久久精品99久久久久久| 精品久久視頻在线| 秋霞久久亚洲精品成人| 老熟乱一区二区三区四区| 欧洲中文字幕| 色官网在线| 99视频这有这里有精品| 91欧美www| 久久亚洲熟妇在线视频| 五月婷婷激情| 美国aaaaa一级黄片| 91这里只有精品| 亚欧操逼片在线观看 | 999 久久久| 精品女人999| 熟女字幕| 国产精品久久久无码aV去| 欧美色图欧美| 啊啊啊啊好大好硬啊啊啊啊啊| 成人在线视频二区| 欧美强奸一区二区诱惑| 亚洲AV无码乱码| 少妇熟女一区二区三区| 91欧美综合在线| 极品粉嫩一区二区| 五月丁香| 国产免费久久久久| 欧美一级特黄淫片在线观看| 午夜性刺激视频免费观看| 性欧美第一页| 九九九九一级| 天天综合网1| 不卡九肏| 九九热免费国产视频婷婷伊人| 狠狠激情综合狠狠操中文字幕| 无遮挡一级毛片视频免费的| 欧美超碰97| 殴美性天天| 天天综合~91| 99福利社| daxiangjiao你懂的| 啊啊啊不要啊啊受不了了视频在线| 熟妇熟女亚洲天堂网| 91综合在线| 久9视频| 精品人人插人人操| 欧美黄片欧美黄片xxx| 黑人白女精品一区| 摸奶性爱视频网站在线免费播放| 亲子敌伦对白在线播放| 91五十路| 92一区二区| av中亚| 欧美色涩| 人妻三级在线中文字幕| 欧美天天| 国产一区二区成人av在线播放| 免费岛国一级片| 国产成年女黄特黄| 91国产操逼视频| 日本一区二区亚洲综合| 天天上日日上日韩精品| 欧美一级AAAAAAA| 100啪啪视频大全| 黄色片A级一区二区三区| 亚洲男人综合| a一区二区三区乱码在线| 婷婷丁香九月| 秋霞影音一区二区三区| 亚洲超碰AV| 国模吧 一区二区三区| 国产67194| 性色一线| 欧美久久久15P| 九一综合网| 岛国天天午夜影院传媒网| 唯美清纯 妖精视频| 欧美色就是色| 亚洲 欧美 制服 另类 自拍| 国产啊v在线免费播放| 综合自拍| 东北女人无套内谢视频| 久噜噜| 天天欧美| 爱爱动态60秒| 色婷婷六月丁香七月婷婷| 日韩免费在线观看不卡| 国产在线激情视频| 中国一区二区亚洲人妻| 午夜精品久久久久久久99蜜桃一| 日本精品第一视频在'| 先锋精品av色鲁| 人妻美腿丝袜制服诱惑综合天堂-| 欧美激情片一区二区| 日本孕妇孕交| 99国产女人| 狠狠操官网| 亚洲一本大道中文字幕无码在线| 五月开心网| 一区 欧美 日韩 麻豆| 欧美青青草视频| 色欧洲| 制度丝袜99| 狠狠穞A片一區二區三區| 在线天堂999| 97资源站久久| 岛国爱情动作片在国产AV无码专区亚洲AV漫画| AV一起草在线| 婷婷色色五月| 狠狠2050在线观看| 日本媚薬中文字幕在线| 亚洲国产婷婷在线播放| 综合熟女| 91影视亚洲| 国产精品九九九| 人人爱人人操人人性| 色噜噜国产在线| 日韩无码服务区| 亚洲国产精品V?在线播放| 国产又操| 久久久不卡区一区二区三区久久久| 深夜激情| 国产精品久久久久久无码红治院| 午夜天堂精品久久久久91| 我中文字幕6区| 张柏芝国产一区在线观看| 在线视频日韩欧美国产| 操我啊啊啊啊啊| 男人的天堂99| 在线中文字幕极品av| 欧美黑人与女人91~| 久99在线免费观看视频| 国产av强奸美女| 欧美另类色| www.狠狠干.coom | 免费视频无码| 亚洲欧美精品久| 日韩性爱啪啪视频| 97色干| 亚热日本熟女| 97超碰磁| 国产av高清版| 91美| 久热伊人| 男人的天堂kva| 国产剧情AV不卡在线观看| 爽爽歪在线视频| 黄色工厂这里只有精品| 夜夜影视四色| 色麻豆AV| 涩涩这里只有精品视频| 丝袜性亚洲| 超碰日韩人妻| 亚洲精品欧美专业| 久久久久久久强迫| 欧美亚洲性爱一区二区| 天天干电影| 人妻激情在线视频| 日本福利社| 不卡一区二区日本视频| 九九毛片这里只有精品| 精品久久97| 国产精品 午夜福利| 黄色一级视| 久草新免费| 久久久久久中文版| 91丨九色丨国产丨人妻在线| 99re3这里只有精品| 天天看夜夜看日日干| 丝袜内射| 在线观看无码三级少妇| 97在线观看免费视频l| 天天艹天天日| 欧美色图97| 国产热RE99久久6国产精品首| 国产夫妻性生活视频| 激情综合亚洲| 操东北女人| 99九九久久| 国产精品无套内谢| 久久超碰天天| 大香蕉亚洲中文| 国内毛片欧美香蕉精品| 久久精9| 老司机深夜影院18未满| 国产精品禁久久久精品| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 中文字幕伊人| 9l视频自拍9l九色成人| 日韩精品人妻| 一区二区三区成人| 色婷婷基地| 国产二区三区免费视频| 夜夜骑操视频| 色九区| 成人精品久久久午夜福利| 九九九九精品一区| 大香蕉啪啪啪| 日韩精品一区二区高清| 不卡六六在线91| 久久手机视直播| 日本成人电影资源网| 久草这里只有精品 | 国产精品爽爽v| 亚洲欧美在线丝袜| 亚洲大色堂| 涩五月婷婷| 无码国产Av| 天天综合色图| 桃色人妻在线视频| 日韩有码一区三区| www.91理论| 久操精品| 久久国产精品视频| 日欧美色| 91狠狠综合久久久久久| 国产亚洲日韩欧| 校园春色亚洲色图| 欧美亚洲厕所精品偷拍91| 久久婷婷五月天| 国产91乱伦| 亚洲色婷婷久久91| 欧美草草高清日韩视频| 超碰人妻中文在线| 亚洲色图久久精品蜜| 国产亚洲精品农村妇女| 色图综合网| 亚洲美女高潮喷水视频| 男人久久精品| 97干日韩| 婷婷伊人| 一区三区啪啪| 日韩久久.一级黄色片| 国语av狠狠色丁香婷婷综合激情| 偷拍新久久| 久草在| 91亚洲影院综合| 蜜臀少妇一区二区| 精品久久人妻成人网| 手机在线A片| 欧美一二三级精品在线| 97超碰美女| 精品久久97| 欧美日韩国产色五月综合在线| 久久亚洲天天做| 久久理论字幕视频| 亚洲精品一区中文字幕乱码| 欧亚性爱视频免费看| 日本熟女中文字幕一区| 蜜乳AV免费观看| 91亚州| 亚州一区二区| 日韩一卡二卡三卡| 日本一线产区和二线产区伦理片| 在线小视频| 99re这里| 91路www| 欧美午夜视频| 97精品97| 久久久久久波多野吉衣高潮| 蜜臀AV成人精品蜜臀AV久久| 久久发布国产伦子伦精品| 97爱爱爱综合| 97色五月天完| 精品久久久久9999| 日本三级人妻a人妻一在线| www.欧精品| 国产精品对白内射| 熟女一区二区| 91中文精品日韩欧美在线| 91九九九逼| 人妻免费观看| 精久久久| 国产97av| 少妇高潮九九九九| 欧美色网| 国产视频一区二区免费| 久久草在线综合视频| 日本欧美国内在线| 骚逼高潮久久精品| 91久久国产综合久久| 91视频观看网站| 超碰天天操| 97在线欧| 免费视频一二三区|