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

ARTICLE DETAIL

資訊詳情

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

Vue2管理系統(tǒng)如何打包成Windows安裝包:Electron桌面化實踐指南

Vue2管理系統(tǒng)如何打包成Windows安裝包:Electron桌面化實踐指南 1. 為什么要把好好的Web管理系統(tǒng)做成Windows安裝包先說結(jié)論這個需求并不是拍腦袋想出來的而是管理類軟件在真實業(yè)務(wù)場景里被逼出來的。我接過好幾個類似的單子甲方無一例外都說了差不多的話瀏覽器里用著別扭IT部門不好管理業(yè)務(wù)員老是把網(wǎng)址搞丟或者是壓根不允許員工隨便打開瀏覽器亂逛。拿一個典型的案例來說。某公司內(nèi)部有一個基于Vue2搭建的后臺管理系統(tǒng)功能包括訂單錄入、客戶管理、報表查看、審批流。系統(tǒng)上線大半年功能層面早就穩(wěn)定了但運營那邊三天兩頭吐槽收藏夾被清理了找不到網(wǎng)址、Chrome自動升級之后頁面字體變樣了、業(yè)務(wù)員同時開好幾個標簽頁經(jīng)常把系統(tǒng)頁面關(guān)掉、每次登錄都要敲一遍地址和賬號密碼。這些其實都不是技術(shù)問題而是Web形態(tài)在專用工具場景下的天然短板。把Vue2的Web管理系統(tǒng)升級成Windows應(yīng)用程序安裝包本質(zhì)上就是給現(xiàn)成的網(wǎng)頁套上一層桌面殼并且利用桌面殼的能力把一些Web端做不好或者不能做的事情補上。對用戶來說桌面桌面直接雙擊圖標就能打開不依賴瀏覽器不依賴網(wǎng)址記憶還能自動登錄、記住窗口位置、托盤常駐。對IT運維來說裝機、更新、權(quán)限管控都可以通過安裝包來統(tǒng)一分發(fā)比挨個瀏覽器加書簽靠譜得多。但這篇文章并不是讓你把項目推倒重來。Vue2的代碼基座完全不用動我接下來講的所有內(nèi)容都是圍繞如何用最小的成本把已有的Vue2管理系統(tǒng)跑進一個Windows桌面應(yīng)用殼里再打包成安裝包展開。你不需要會C不需要懂Windows底層API只需要熟悉JavaScript和Node.js環(huán)境就夠了。我盡量把選型、改造、打包、上線后維護的整套思路講透附帶上可以直接參考的配置和代碼讓你在自己的項目里能少走彎路。2. 選型Electron、Tauri還是輕量級瀏覽器套殼2.1 三套主流桌面化方案的橫向?qū)Ρ任乙娺^不少人在第一步就卡住糾結(jié)用什么框架來封裝。實際上最適合Vue2老項目改造的路線翻來覆去也就那么幾條方案核心原理前端改動量安裝包體積內(nèi)存占用Win7及老系統(tǒng)兼容性Electron內(nèi)置Chromium內(nèi)核 Node.js運行時極小幾乎不用改60MB起步常見100MB偏高約300MB取決于Electron版本老版本可兼容Win7Tauri調(diào)用操作系統(tǒng)原生WebView后端用Rust較小但要適配前端資源加載方式很小幾MB到十幾MB低Win7需要額外配置WebView2麻煩CefBrowser套殼CEF/WebView2封裝自己嵌瀏覽器內(nèi)核寫C宿主程序中等視內(nèi)核而定中等需要開發(fā)能力不適合前端團隊對于Vue2這種以JavaScript生態(tài)為主的團隊Electron是綜合阻力最小的選擇。雖然有體積大、內(nèi)存高的毛病但它的開發(fā)模型跟前端工程完全一致主進程用Node.js寫界面直接用現(xiàn)有Web頁面通信走IPC資料多得能堆成山。最重要的是Vue2項目里用的各種依賴、插件、構(gòu)建配置全部可以保留不動這是Tauri方案做不到的——Tauri要求前端資源以靜態(tài)文件方式加載而且對老版本W(wǎng)indows的支持依賴WebView2運行時在內(nèi)網(wǎng)離線環(huán)境里光裝這個運行時就能折騰死人。2.2 為什么兼容老舊Vue2項目時Electron最省心Tauri聽起來很香體積小、內(nèi)存占用低但它在跟Vue2老項目配合時有兩個繞不開的坑。第一個是WebView內(nèi)核版本不一致用戶的Windows 10或Windows 11系統(tǒng)上可能裝了不同版本的WebView2代碼里用到的某些ES2020以上語法、某些CSS特性在不同內(nèi)核上表現(xiàn)不一致你很難在研發(fā)環(huán)境完全模擬用戶的運行環(huán)境。第二個是Vue2本身已經(jīng)進入維護期對新的桌面封裝生態(tài)適配不足強行用Tauri的通信模式改造現(xiàn)有代碼改動量會超過預(yù)期。Electron則相反它直接把Chromium內(nèi)核打進了安裝包里意味著所有用戶看到的瀏覽器行為和你在開發(fā)環(huán)境里Chrome的表現(xiàn)完全一致。對于管理系統(tǒng)這種重交互、重表格、重表單校驗的業(yè)務(wù)場景內(nèi)核一致性帶來的好處非常明顯不會再出現(xiàn)我這好好的客戶機器上日期組件變成英文這種Web開發(fā)的經(jīng)典噩夢。而且Electron的Node.js集成可以直接操作文件系統(tǒng)后面做自動更新、本地日志、數(shù)據(jù)庫導出這些功能都順理成章。我有一個關(guān)系不錯的團隊做過反面教材。他們一開始為了追求安裝包體積堅持用Tauri改造一個Vue2的進銷存系統(tǒng)結(jié)果Rust編譯環(huán)境就把前端同事搞蒙了隨后WebView2在內(nèi)網(wǎng)老機器上的缺失問題又導致部署卡了快兩周。最后回到Electron兩天就把殼跑起來了。所以如果你不是對安裝包體積有硬性要求也不是有充裕的Rust人力Vue2項目就老老實實用Electron。2.3 我在選型時踩過的具體教訓選Electron也不意味著隨便裝最新版就完事。Vue2的管理系統(tǒng)如果要照顧到Win7或者老舊的工控機Electron版本不能無腦追新。我自己的經(jīng)驗是如果目標機器有Win7Electron版本最好控制在22.x以下如果全是Win10和Win11用當前的LTS版本即可太老的版本反而會有安全補丁缺失的問題。另外還有一點容易被忽略Electron主進程代碼里不要引入跟DOM操作有關(guān)的瀏覽器API兩個世界的邊界從一開始就要分清楚。很多從Web轉(zhuǎn)過來的同事一開始會習慣性地在主進程里寫window、document實際跑起來直接報錯因為主進程跑在Node環(huán)境里界面UI和邏輯進程完全是兩套東西。這個邊界理清楚后面所有開發(fā)都不會亂。3. 開工前的改造先讓Vue2項目適配桌面容器3.1 調(diào)整前端構(gòu)建配置別讓打包出來的文件路徑帶坑你的Vue2項目在瀏覽器里跑得好好的不代表放進Electron里就直接能用。首先要處理的是資源路徑問題。Web項目的構(gòu)建產(chǎn)物默認會生成index.html、static/js、static/css這樣的目錄并且在index.html里通過相對路徑或者絕對路徑去引用資源。當你把構(gòu)建產(chǎn)物交給Electron通過file://協(xié)議加載時絕對路徑會直接失效因為file://協(xié)議下不存在/js/app.js這種根路徑概念。修改方式是在vue.config.js或者config/index.js里把publicPath改成相對路徑// vue.config.js module.exports { publicPath: ./, outputDir: dist, assetsDir: static, productionSourceMap: false }這里用./開頭構(gòu)建出來的index.html里的資源引用會變成./static/js/app.js這種相對路徑Electron加載本地文件時才找得到。這個細節(jié)不處理打包后十有八九是白屏而且報錯信息往往一閃而過很難定位。還有history路由的問題。Vue2項目如果用的是vue-router的history模式在Web服務(wù)器上有后端配置兜底但在Electron的file://協(xié)議下刷新一個深層路由頁面就會直接找不到文件。最簡單的辦法是把路由模式改成hash模式// router/index.js const router new VueRouter({ mode: hash, routes })別覺得換成hash模式就low了桌面應(yīng)用本來就不需要漂亮的URL路徑穩(wěn)定能跑才是第一位的。3.2 API地址和環(huán)境變量的桌面適配管理系統(tǒng)必然要連后端接口。Web端的習慣是把baseURL寫死在環(huán)境變量里區(qū)分開發(fā)環(huán)境和生產(chǎn)環(huán)境。到了桌面端情況變得稍微復(fù)雜一點同一個安裝包可能被不同的用戶使用不同客戶現(xiàn)場的接口地址不一樣甚至一個用戶電腦上同時連著多個不同的服務(wù)器。我的做法是在Electron主進程里準備一個本地配置文件比如放在app.getPath(userData)目錄下的config.json把API基礎(chǔ)地址、端口、超時時間都放進去。前端在啟動時通過IPC向主進程請求這份配置動態(tài)設(shè)置axios的baseURL// 主進程 side const { app, ipcMain } require(electron) const fs require(fs) const path require(path) function getUserConfig() { const userDataPath app.getPath(userData) const configPath path.join(userDataPath, config.json) if (fs.existsSync(configPath)) { return JSON.parse(fs.readFileSync(configPath, utf-8)) } return { apiBaseUrl: http://127.0.0.1:8080 } } ipcMain.handle(get-config, () { return getUserConfig() })// 渲染進程 side const { ipcRenderer } require(electron) async function initConfig() { const config await ipcRenderer.invoke(get-config) // 這里把 axios 的 baseURL 設(shè)置為 config.apiBaseUrl axios.defaults.baseURL config.apiBaseUrl }這種設(shè)計的好處是換服務(wù)器地址不用重新打包只需要在目標機器上改一個config.json文件或者做一個簡單的服務(wù)器地址配置界面往這個文件里寫數(shù)據(jù)就行。對于面向幾十個客戶現(xiàn)場分發(fā)管理系統(tǒng)的場景這個能力簡直是剛需。3.3 開發(fā)環(huán)境的雙開問題瀏覽器調(diào)試與桌面殼并行改造期間你肯定還是要用瀏覽器來調(diào)試Vue2頁面本身的所以開發(fā)模式不要把Electron殼和前端頁面綁死。我通常用npm run dev正常啟動webpack-dev-server然后在另一個終端運行一個僅包含主進程的Electron入口讓它加載http://localhost:8080這個地址。這樣Vue2頁面熱更新和Electron主進程調(diào)試互不打擾。主進程里判斷一下環(huán)境變量開發(fā)模式加載本地服務(wù)地址生產(chǎn)模式加載打包后的index.htmlconst isDev process.env.NODE_ENV development function createWindow() { const win new BrowserWindow({ width: 1280, height: 800 }) if (isDev) { win.loadURL(http://localhost:8080) win.webContents.openDevTools() } else { win.loadFile(path.join(__dirname, ../dist/index.html)) } }這樣一套模式跑下來前端團隊唯一要習慣的是每次改完主進程代碼要重啟Electron但這套改法對現(xiàn)有Vue2代碼的侵入性已經(jīng)拿到了最低點。4. 手寫Electron主進程從零搭出一個能跑的殼4.1 窗口骨架、單實例鎖和優(yōu)雅退出主進程的窗口管理看起來簡單實際要照顧的細節(jié)不少。管理系統(tǒng)的用戶通常不希望同時開多個窗口一個桌面里彈五六個一樣的系統(tǒng)窗口既混亂又容易被誤關(guān)。所以第一步就是給應(yīng)用加單實例鎖const gotTheLock app.requestSingleInstanceLock() if (!gotTheLock) { app.quit() } else { app.on(second-instance, () { const win getMainWindow() if (win) { if (win.isMinimized()) win.restore() win.show() win.focus() } }) app.whenReady().then(createWindow) }這段代碼的意思是用戶第二次雙擊圖標不會新開窗口而是把已經(jīng)存在的窗口喚起置頂。管理系統(tǒng)的日常使用場景里這個體驗比網(wǎng)頁端好了不止一點半點——很多用戶習慣不關(guān)窗口直接鎖屏下班第二天雙擊圖標把窗口彈出來繼續(xù)干活。窗口關(guān)閉行為也要單獨處理。管理系統(tǒng)關(guān)掉主窗口往往不是退出軟件而是隱藏到托盤。很多業(yè)務(wù)系統(tǒng)都期望它一直在后臺跑著隨時能接收WebSocket推送或者自動刷新數(shù)據(jù)。這里我習慣把關(guān)閉按鈕的行為改成隱藏const { Tray, Menu, nativeImage } require(electron) let tray null function onWindowClose(e) { if (!app.isQuiting) { e.preventDefault() win.hide() } } function createTray() { const icon nativeImage.createFromPath(path.join(__dirname, assets/tray.ico)) tray new Tray(icon) const contextMenu Menu.buildFromTemplate([ { label: 顯示主窗口, click: () { win.show() } }, { label: 退出系統(tǒng), click: () { app.isQuiting true; app.quit() } } ]) tray.setToolTip(內(nèi)部管理系統(tǒng)) tray.setContextMenu(contextMenu) }注意托盤圖標需要單獨準備一份小尺寸的ico或者png直接用應(yīng)用大圖標縮下來會很丑。這一點屬于純?nèi)庋垠w驗細節(jié)但對用戶的第一印象影響很大。4.2 dev環(huán)境下自動重啟主進程主進程代碼在開發(fā)期間改動頻繁手動一個個CtrlC再重啟太影響效率。我見過有人給Electron主進程裝nodemon這個方向是對的但不建議裸用因為nodemon會把整個進程殺掉重啟結(jié)果渲染進程也被帶走開發(fā)窗口就會炸掉。我的做法是把主進程代碼用electron-reload或者直接在npm腳本里串聯(lián)兩個命令。實際更穩(wěn)妥的是用wait-on等待webpack-dev-server起來再啟動Electron{ scripts: { dev:main: cross-env NODE_ENVdevelopment electron ., dev:renderer: vue-cli-service serve --port 8080, dev: npm run dev:renderer npm run dev:main } }另一種做法是用concurrently把兩個命令并在一個終端里看日志但你依舊需要手動重啟主進程。好在主進程代碼邏輯通常不復(fù)雜改完重啟也就幾秒鐘不必過度工程化。4.3 主進程和渲染進程的IPC通信邊界設(shè)計前面已經(jīng)提到過Electron里渲染進程不能直接訪問Node.js的fs、path這些模塊。如果前端頁面碰到下載Excel文件并保存到指定目錄這種需求就必須通過IPC把文件內(nèi)容傳給主進程由主進程調(diào)用Node的文件系統(tǒng)去落地。IPC通信有一個設(shè)計原則渲染進程只發(fā)請求主進程做所有臟活累活。比如管理系統(tǒng)里常見的從服務(wù)器下載對賬單并保存渲染進程拿著后端返回的二進制流然后走IPC讓主進程調(diào)fs.writeFileSync// 主進程 ipcMain.handle(save-file, async (event, { filename, data }) { const { dialog } require(electron) const result await dialog.showSaveDialog({ defaultPath: filename }) if (!result.canceled) { fs.writeFileSync(result.filePath, Buffer.from(data)) return { success: true, path: result.filePath } } return { success: false, canceled: true } })// 渲染進程 const result await ipcRenderer.invoke(save-file, { filename: 9月對賬單.xlsx, data: excelBinary })注意data在IPC傳輸過程中會被序列化。如果是真的大文件流建議先寫到臨時目錄再傳路徑給主進程去移動避免一次傳幾十兆數(shù)據(jù)把IPC通道擠爆。管理系統(tǒng)的文件導出通常不會頻繁操作按上面的方式已經(jīng)夠用。還有一點要提前約定IPC方法的命名規(guī)范。別今天一個save-excel明天一個downloadFile項目一大你會自己都找不著。我見過有個團隊在主進程里維護一個handlers目錄每個功能一個文件文件名就是IPC方法名找起來非常直觀。5. 打包Windows安裝包electron-builder的完整實踐5.1 準備工作electron-builder環(huán)境與目錄規(guī)范開發(fā)完殼之后下一步就是把它變成.exe安裝包。這塊目前生態(tài)里最成熟的是electron-builder。它可以把你的Electron應(yīng)用、前端構(gòu)建產(chǎn)物、Node依賴、圖標、安裝腳本一起打成一個NSIS安裝程序。先給項目安一個清晰的目錄結(jié)構(gòu)。我建議這樣組織project-root/ ├── dist/ # Vue2 構(gòu)建產(chǎn)物npm run build 生成 ├── electron/ │ ├── main.js # 主進程入口 │ ├── preload.js # 預(yù)加載腳本可選 │ ├── config.js # 打包相關(guān)常量 │ └── build/ │ ├── icon.ico # 應(yīng)用安裝圖標 │ └── icon.png # 托盤小圖標 ├── package.json └── electron-builder.yml在package.json里必須把main字段指向主進程入口同時注意dependencies和devDependencies的劃分。打包時electron-builder會把dependencies里的內(nèi)容一并打包進app.asar如果你把所有依賴都放在devDependencies里生產(chǎn)環(huán)境運行時可能缺模塊。5.2 electron-builder.yml配置細節(jié)一份能直接工作的electron-builder.yml大概是這樣的appId: com.example.internalms productName: 內(nèi)部管理系統(tǒng) directories: output: release buildResources: electron/build files: - dist/**/* - electron/**/* - package.json win: target: - target: nsis arch: - x64 - ia32 icon: electron/build/icon.ico legalTrademarks: 本軟件僅供內(nèi)部使用 nsis: oneClick: false perMachine: false allowToChangeInstallationDirectory: true createDesktopShortcut: always shortcutName: 內(nèi)部管理系統(tǒng) artifactName: ${productName}-${version}-${arch}.${ext} electronVersion: 21.4.4幾個關(guān)鍵點解釋一下appId是應(yīng)用的唯一標識別隨便填后期做自動升級、區(qū)分多款安裝在同機器上的應(yīng)用時都靠它。productName是用戶看到的應(yīng)用名稱可以跟項目名不一樣。directories.buildResources目錄里放的是打包用的圖標和資源文件不會被打進安裝包。nsis配置里oneClick: false配合allowToChangeInstallationDirectory: true這樣在安裝時用戶能看到選擇安裝目錄的選項管理系統(tǒng)經(jīng)常要裝到非系統(tǒng)盤這個選項建議保留。還有個容易忽略的artifactName定義產(chǎn)出安裝包的文件名格式。如果你同時打x64和ia32兩個版本的包不帶${arch}的話兩個文件會互相覆蓋。5.3 版本號、產(chǎn)品名稱和圖標踩坑記錄圖標問題是最容易拖慢進度的。electron-builder要求Windows安裝圖標必須是ico格式至少包含256x256這個尺寸。直接用在線工具把png轉(zhuǎn)ico經(jīng)常會出現(xiàn)多尺寸缺失裝完桌面快捷方式上看還行打開任務(wù)管理器或者應(yīng)用屬性里的圖標卻低清得嚇人。我會用工具生成一個包含16/24/32/48/64/128/256多尺寸的完整ico這個花不了多少時間但產(chǎn)出的專業(yè)度完全不一樣。版本號也要注意規(guī)范。Windows安裝包要求版本號是a.b.c這樣三段式不能直接寫1.0。electron-builder會讀取package.json里的version字段然后應(yīng)用到安裝包屬性和程序信息里。如果后續(xù)要上自動更新版本號管理更要嚴格降版本會被更新邏輯直接拒絕。產(chǎn)品名稱方面盡量避免在productName里帶測試版臨時版這類字樣因為一旦安裝到系統(tǒng)里添加刪除程序的列表顯示的就是這個名稱以后正式版也要改名的話會很麻煩。5.4 安裝包體積大先別急著罵Electron很多第一次打包的人會驚訝一個幾百KB的前端項目打出來的安裝包居然有70MB甚至100MB以上。體積主要來源是electron內(nèi)置的Chromium內(nèi)核和Node.js運行時這部分占大頭。想壓縮是有限的但可以通過幾個手段改善在electron-builder.yml里加上files白名單確認沒有把node_modules里用不到的包打進去。使用electron-builder自帶的asar壓縮把應(yīng)用代碼和依賴打包成一個歸檔文件默認是開啟的不要手動關(guān)閉。刪除主進程代碼里不會用到的Electron模塊雖然Electron本身不會把全部模塊裝進每個應(yīng)用但你自己引入的依賴要清理干凈。如果用戶機器上普遍有較高配置只打包x64版本可以省掉ia32的那部分體積。管理系統(tǒng)通常部署在公司內(nèi)網(wǎng)或者客戶局域網(wǎng)安裝包體積用戶的感知沒有那么敏銳功能穩(wěn)定遠比體積重要所以我對體積的態(tài)度是能減就減不強制追求。真正需要重點關(guān)照的反而是安裝速度和殺毒軟件誤報這后面專門說。6. 管理系統(tǒng)場景下繞不開的適配細節(jié)6.1 登錄憑證與Token的本地持久化Web管理系統(tǒng)的登錄態(tài)通常存在localStorage里換成桌面應(yīng)用之后繼續(xù)這樣用其實也可以但有一個更好的替代方案通過Electron的safeStorage接口把Token加密后存到用戶數(shù)據(jù)目錄。原因是localStorage雖然方便但明文存儲一旦被其他程序掃到Token泄露的風險是實打?qū)嵉?。方案如下主進程提供方法寫入和讀取加密Tokenconst { safeStorage } require(electron) ipcMain.handle(set-token, (e, token) { const encrypted safeStorage.encryptString(JSON.stringify(token)) fs.writeFileSync(path.join(app.getPath(userData), token.bin), encrypted) }) ipcMain.handle(get-token, () { const filePath path.join(app.getPath(userData), token.bin) if (!fs.existsSync(filePath)) return null const encrypted fs.readFileSync(filePath) return JSON.parse(safeStorage.decryptString(encrypted)) })這樣即使有人拿到了這個文件沒有當前用戶Windows賬戶的解密密鑰也無法還原明文。不過要留意的是safeStorage在部分Windows環(huán)境下依賴DPAPI如果用戶的賬戶權(quán)限太受限解密可能會失敗這種情況需要增加一個降級策略直接明文存儲但提示用戶注意風險。管理系統(tǒng)一般跑在可控內(nèi)網(wǎng)環(huán)境這個權(quán)衡是可以接受的。6.2 Web端文件下載在桌面殼里的體驗升級管理系統(tǒng)總要導數(shù)據(jù)Web端導出Excel一般直接觸發(fā)瀏覽器下載。但在Electron殼里如果沿用window.open或者a標簽下載的方式瀏覽器會自己接管下載流程用戶根本看不到保存路徑體驗很割裂。正確的做法是前端拿到后端返回的文件流或者下載URL后全部交給主進程處理。如果后端返回的是Blob前端先轉(zhuǎn)成ArrayBuffer再通過IPC給主進程如果是一個下載鏈接直接傳URL給主進程用session.defaultSession的下載管理器處理const { session } require(electron) ipcMain.handle(download-file, (event, { url, filename }) { const win BrowserWindow.fromWebContents(event.sender) session.defaultSession.once(will-download, (e, item) { const filePath path.join(app.getPath(downloads), filename) item.setSavePath(filePath) }) win.webContents.session.downloadURL(url) })這樣做的好處是一旦開始下載系統(tǒng)任務(wù)欄會出現(xiàn)一個真實的下載進度下載完成后文件就在用戶的下載目錄里跟瀏覽器行為一致。如果你不想讓文件存到默認下載目錄可以在setSavePath里改成你指定的業(yè)務(wù)目錄。6.3 前端緩存的經(jīng)典問題桌面應(yīng)用不是瀏覽器標簽頁Web端可以通過CtrlF5強制刷新桌面應(yīng)用沒有這么直觀的操作。管理系統(tǒng)部署后一旦前端代碼更新很常見的情況是老用戶打開桌面應(yīng)用還是舊的頁面因為Chromium把頁面緩存住了。處理方式有兩個層面。一是在構(gòu)建配置里給靜態(tài)資源加上帶hash的文件名升級時index.html引用的JS/CSS文件名變化緩存自然失效。這個Vue2項目默認就會做。二是給Electron的窗口加上升級后的強制刷新邏輯每次軟件版本升級后第一次啟動時主動清理緩存app.on(browser-window-created, (event, win) { win.webContents.session.clearCache() })也可以把清緩存的操作綁定在版本更新后執(zhí)行避免每次啟動都清理導致首屏變慢。6.4 桌面端獨有的系統(tǒng)集成快捷鍵、開機啟動和右鍵菜單管理系統(tǒng)放到桌面上之后能不能充分利用系統(tǒng)的能力是用戶體驗好不好的分水嶺。我遇到過的實際需求包括開機自啟動。很多倉庫管理、門店收銀的系統(tǒng)需要電腦開機后自動進入系統(tǒng)省去人工打開。這塊可以調(diào)用app.setLoginItemSettingsapp.setLoginItemSettings({ openAtLogin: true, path: process.execPath })全局快捷鍵。比如倉庫錄入場景需要快速呼出掃碼輸入框可以在主進程里注冊快捷鍵const { globalShortcut } require(electron) globalShortcut.register(CommandOrControlShiftS, () { win.show() win.webContents.send(open-scan-dialog) })這會讓你在窗口不聚焦時也能喚起系統(tǒng)窗口。但要注意這些快捷鍵是全局的可能會跟用戶其他軟件沖突注冊時要提供可配置的開關(guān)不要寫死。打印和導出。管理系統(tǒng)里打印單據(jù)是個高頻操作Web端的window.print()在Electron里依然可用但更專業(yè)的做法是調(diào)用主進程的webContents.print()可以指定打印方向、邊距、隱藏頁眉頁腳還能靜默打印。這個能力是Web端很難超越的。7. 實際調(diào)試中踩過的坑從白屏到被殺軟攔截7.1 白屏的定位思路別慌先看devtools第一次把Vue2項目裝進Electron十有八九會遇到白屏。這里說的白屏指的是窗口框架正常打開但里面什么都沒有也沒有報錯彈窗。第一步永遠是打開DevTools確認報錯原因。手動打開的方式在主進程里臨時加一行代碼或者在菜單中加一個開發(fā)者工具的入口。常見的幾個白屏原因和對應(yīng)解法現(xiàn)象原因處理方式控制臺報Failed to load resource: net::ERR_FILE_NOT_FOUND靜態(tài)資源使用絕對路徑修改publicPath為./控制臺報ReferenceError: process is not defined渲染進程直接訪問Node API把相關(guān)邏輯移動到主進程或通過preload暴露頁面能加載但空白無報錯Vue路由用了history模式改成hash模式加載后立馬閃退主進程main字段指向錯誤檢查package.json的main字段白屏問題大多能在五分鐘內(nèi)定位難點其實是窗口一閃而過的狀態(tài)這時候可以給main.js加一個process.on(uncaughtException)監(jiān)聽把異常信息寫進日志文件這樣用戶現(xiàn)場出問題時至少能拿到排查線索。7.2 低配Windows機器上的卡頓與渲染優(yōu)化管理系統(tǒng)界面往往充滿表格、圖表動輒上千行的數(shù)據(jù)在Electron里大面積渲染時會卡。普通Web用戶還能換個好電腦桌面化之后用戶會直接把卡頓歸咎于這個軟件寫得差。針對低配機器的優(yōu)化我在Eectron殼項目里常用三招。第一是開啟窗口的backgroundThrottling: false避免窗口被切到后臺后定時器和請求被強制節(jié)流這個選項對管理系統(tǒng)尤其實用因為很多系統(tǒng)要接收服務(wù)端推進來的消息被節(jié)流會導致看起來沒收到。第二是關(guān)閉不需要的硬件加速。有些管理系統(tǒng)的部署環(huán)境是虛擬機GPU驅(qū)動不完整默認開啟硬件加速反而會導致頁面花屏??梢栽趩訒r加上app.disableHardwareAcceleration()不過不要全局無腦關(guān)閉如果確需硬件加速的場景比如地圖、視頻監(jiān)控關(guān)掉之后性能會下降??梢宰鲆粋€配置開關(guān)默認關(guān)閉需要時再打開。第三是主進程里控制好創(chuàng)建BrowserWindow的數(shù)量。管理系統(tǒng)如果還要開獨立彈窗頁面比如報表全屏模式務(wù)必復(fù)用同一個窗口或者用webContents的導航切換而不是new BrowserWindow一次開一個窗。窗口太多內(nèi)存直接崩。7.3 安裝包被殺毒軟件攔截、代碼簽名問題在真實分公司部署時我遇到過不止一次殺毒軟件把安裝包當木馬隔離的情況。原因倒也不復(fù)雜Electron應(yīng)用體積大內(nèi)部結(jié)構(gòu)復(fù)雜某些不嚴格的殺毒軟件會把asar歸檔和自動更新程序誤判為可疑行為。應(yīng)對手段從物理上能解決一部分給安裝包做代碼簽名。Windows系統(tǒng)對未簽名的程序會有SmartScreen攔截提示W(wǎng)indows已保護你的電腦用戶要點更多信息才能繼續(xù)運行。這一步足以勸退一大半業(yè)務(wù)人員。通過代碼簽名后這個提示會變成正常的品牌信息信任度高很多。代碼簽名證書需要企業(yè)資質(zhì)申請在某正規(guī)CA機構(gòu)購買價格不便宜但管理系統(tǒng)如果是正式商業(yè)產(chǎn)品這筆成本不能省。如果沒有簽名證書只能靠加白名單管理。常見做法是在安裝文檔里寫清楚內(nèi)網(wǎng)IT人員部署時統(tǒng)一處理。另外在electron-builder里關(guān)閉自動更新檢查相關(guān)的進程autoUpdater也能降低殺毒軟件對后臺聯(lián)網(wǎng)行為的敏感度。7.4 老系統(tǒng)兼容性的最后兜底如果你面對的終端用戶里還有Windows 7 SP1那有幾個細節(jié)必須提前確認。第一個是electron版本選型新版Electron從32開始已經(jīng)不支持Win7所以得選擇技術(shù)路線時確定好版本。第二個是運行時依賴Win7機器上需要提前裝好Microsoft Visual C RedistributableElectron依賴它很多內(nèi)網(wǎng)老爺機沒裝裝上之后就正常運行。第三個是高分屏適配老的1366x768分辨率屏幕上管理系統(tǒng)原本按1920寬度設(shè)計的布局會嚴重擠壓要在CSS層面給桌面殼單獨做一套中等寬度的適配斷點。我實際見過的情況是同一個Vue2管理系統(tǒng)在Win7的聯(lián)想老臺式機上跑得非常穩(wěn)反而在某個精簡版Win10的虛擬機上各種圖標缺失。老系統(tǒng)兼容性問題沒有銀彈最好的辦法是發(fā)布前在一臺跟客戶現(xiàn)場配置差不多的機器上做一輪冒煙測試重點過一遍登錄、首頁、數(shù)據(jù)錄入、導出、托盤、自動更新這幾個環(huán)節(jié)。8. 升級與維護這層殼后續(xù)應(yīng)該怎么疊功能8.1 自動升級的落地方式桌面應(yīng)用的升級不能依賴用戶自覺去官網(wǎng)下載新版本管理系統(tǒng)的升級最好是開機檢查更新一鍵安裝。electron-builder生態(tài)里自帶electron-updater模塊配合publish配置可以做到增量升級。配置好發(fā)布地址后在應(yīng)用啟動時檢查更新const { autoUpdater } require(electron-updater) autoUpdater.autoDownload true autoUpdater.autoInstallOnAppQuit true function checkForUpdates() { autoUpdater.checkForUpdates() } autoUpdater.on(update-downloaded, () { const dialogOpts { type: info, buttons: [現(xiàn)在重啟, 稍后重啟], message: 新版本已下載重啟應(yīng)用完成更新。 } dialog.showMessageBox(dialogOpts).then((result) { if (result.response 0) { autoUpdater.quitAndInstall() } }) })需要注意electron-updater要求安裝包配置里保留latest.yml文件信息部署時要把這個文件一并上傳到文件服務(wù)器。內(nèi)網(wǎng)環(huán)境如果禁用外網(wǎng)可以把更新包放到file://協(xié)議能訪問的本地共享目錄方案是通用的。8.2 從Web端遷到桌面殼之后架構(gòu)上多出來的可能性當你把Vue2管理系統(tǒng)裝進Electron殼之后很多以前在Web端沒法做或者做得很別扭的事情都有了新解法。典型的是本地數(shù)據(jù)庫管理系統(tǒng)如果在某些現(xiàn)場需要離線錄入就可以在殼內(nèi)集成一個better-sqlite3或者SQLite把數(shù)據(jù)先攢在本地等網(wǎng)絡(luò)恢復(fù)再同步到服務(wù)端。托盤消息推送也能做到真正的系統(tǒng)級服務(wù)端通過WebSocket推來一條訂單提醒主進程收到后直接在右下角彈一個Notification不需要用戶打開網(wǎng)頁才能看到。微信掃碼登錄、硬件設(shè)備調(diào)用掃碼槍、打印機、讀卡器也都可以通過主進程的Node能力直接對接不再受瀏覽器沙箱限制。這里要提醒的是即便你有這些擴展空間也不要在一開始就把所有功能都塞進來。管理系統(tǒng)的核心價值是業(yè)務(wù)閉環(huán)桌面殼最大的意義是減少使用阻力而不是把客戶端做成一個全功能平臺。每加一個本地能力相應(yīng)的升級、兼容、數(shù)據(jù)備份問題就多一層量力而行。8.3 我建議的后續(xù)演進節(jié)奏如果你手頭正好有一個Vue2管理系統(tǒng)要桌面化按下面這個節(jié)奏推進比較穩(wěn)第一階段先把殼跑通實現(xiàn)安裝、啟動、登錄、數(shù)據(jù)展示這些基礎(chǔ)流程中間遇到的白屏、路徑、路由問題集中解決。第二階段再把Web端不好用的細節(jié)做桌面化適配包括文件導出、托盤關(guān)閉、快捷鍵和開機啟動。第三階段把自動更新和日志埋點加進去這樣后續(xù)迭代才有數(shù)據(jù)支撐。最后一步才是本地數(shù)據(jù)庫、硬件交互這些進階能力。我在幾個項目里都是這么推進的每一階段都在真實業(yè)務(wù)環(huán)境里可用避免了憋大招最后崩盤的風險。一個穩(wěn)定可靠的管理系統(tǒng)桌面版通常不需要炫酷的外表但一定要能讓用戶在平平無奇的辦公環(huán)境中不知不覺用下去。最后分享一個小經(jīng)驗給Vue2項目做Electron殼改造最難的不是技術(shù)本身而是迭代節(jié)奏和需求邊界。團隊里有人會期待著順手把界面重構(gòu)了有人會想著趁這個機會換掉Vue2——這些都要堅決攔住。殼就是殼它的任務(wù)是讓現(xiàn)有業(yè)務(wù)更穩(wěn)定地觸達用戶。等你真正把殼跑穩(wěn)了再談技術(shù)棧革命也不遲。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
97欧美精品综合| 97在线视频观看| 日韩精品在线观看网站| 欧美第一页| 久久日本熟女精品一区| 亚洲影视综合网| 国产精品极品美女视频| 日韩欧美中文| 无码精品久久| 亚洲色交| 老鸭窝成人| 久久超碰亚洲人| 欧美色五月| 性色av蜜臀av色欲aV| 久久天堂| 天美传媒婬乱| 粉嫩av平台| 成人国产二区三区在线,男女精品。| 好看的91视频| 禁止观看美女黄| 五月婷婷久久综合| 爱爱动态试试看6 0秒| 九九热在线视频| AV不卡在线| 无码精品久久| 人人性爱视频免费| 国产白丝精品在线观看| 97亚洲综合影院| 91N综合网| 欧美亚洲系列| 91操熟女视频 | 少妇人妻激情四射| 少妇被c 黄 免费观看| 97超碰欧美精品| 怡红院久久老司机| 国产嫩草精品A88AV| av草草在线电影| 久久后入制服| 大香蕉性欧美| 国产91亚洲精品一区二区三区| 大香蕉中文在线| 久久精品无码专区| 天天综合网在线观看| 亚洲 欧美 第一页| 中文日本免费高清| 色色色欧美| 国产区91柔拿会所技师| 1769精品一区二区三区| 五月天社区| 黄污污污污| 熟女丰满人妻一区| 久久精品一区二区三区蜜桃臀| 少妇色综合| 无码操逼天堂| 久操国产在线| 国产AAAAAABBBBB| 超碰成人最新最好看| 九色婷婷| 国产SV一线| 久久视频少妇美女| 色香av| 91精品人妻一区二区三区蜜臀| 啪啪性爱免费视频| 不卡啪啪视频| 欧美日韩少妇色情| 亚洲精品乱码久久久久久蜜桃麻豆| 久久大香蕉97| 在线综合色| 另类天堂| 国产一二三在线视频五十路| 国产玖玖| 国产精品久久久999| 高清孕妇孕交 交| 爱妃国产亚洲视频中文字幕| 亚洲欧美激情在线视频| 日日干男人的天堂| 嗯嗯啊啊啊好爽| 久久精品午夜国产亚洲AV无码| 91强热人妻| 97电影院超碰| 一本色道久久综合亚洲二区三区| 国产福利合集| 日韩精品一区二区三区色欲| 鸥美插入视频| 九九九热| 激情色播| 精品一区99999| 亚洲成人性爱网站在线播放| 久久久久久性爱片| 日本成a人v网站在线观看| 国产操逼逼网| 97自拍一区| 久久99九九九九6666免费观看软件| 久久性爱视频99| 人妻22p| 美女毛片999| 久九九九| 青青草视频这里只有精品| 久久精品91| 青娱乐淫乱1314| 秋霞一级视频在线观看免费| 麻豆国产成人精品| 九色精品视频导航1| 乱人伦 国语对白:视频直接看| 1区2区3区中文字幕日韩| 成人怡红院| 亚洲综合中文字幕有码| 亚洲性少妇| 色哟哟综合| 久久精彩视频| 操逼无码操逼| 欧美大干日韩| 久久人妻视频| 99999re| 中文字幕一区二区三区视频播放| 伊人96在线| 色婷婷视频| 色天使大香蕉| 内射夫妻三片| 蜜屁Av| 亚洲熟女性高潮久久久| 久久久月天| 国产欧美一区激情交| 91网站18+| 久操网线| 九九九九一区| 精品区9| 久久AV无码AV| 男人天堂久久日韩| 国产乱伦亚洲色图高清无码| 色色综合97| 收看日本人日bb| 97超碰天天| 日韩簧片免费看| 欧美日动态视频| Av手机版天堂网| 性爱AV天堂| 高清无码 国产精品| 久久久性少妇| 久久久∴| 亚洲黄网在哪免费看| 欧美精品系列| 99热免费精品| 精品成人av一区二区三区在线| 亚洲脚交| 欧美白嫩在线放| 亚洲日韩美国人妻| 91中文字幕在线观看| 国产精品电影| 黄色AAAAA欧美| 亚洲欧美综合图片| 九久久九精品视频| 人人操人人摸人 | 97自拍视频在线| 男人天堂网站| 欧美激情黑人| 欧美日韩黄色片一区二区三区四区人与兽做爱| 久久久久久一日韩字幕无码| 日韩十八禁| 白丝少妇一区二区| 婷婷91| 亚欧高清| 91天堂| 久久、1234| 色色色综合网| 免费看黄视频亚洲网站| 国产精品第一页国产大屁股视频免费区 | 欧美亚洲综合色| 欧美亚洲日本视频久久久| 国产农村妇女毛片精品久久| 日韩欧美中文字| 欧美夜夜狠| 亚洲中文日韩欧美大香蕉视频| 日日骚av| 亚洲成人贴图| 国产内射爽爽大片| 84YTCOM性无码| 天天日天天屌天天操| www.色婷婷| 免费人成在线观看网站品爱网| 日1区2区3区2020| 好看的91视频| 麻豆天美国美国产AV| 91人妻做a观看视频| 少妇久久久久久| 啊啊啊啊啊舒服| 大香蕉十区| 亚洲色五月| 日韩A优精品在线观看| 91狠狠综合| 中文字幕丝袜| 97操碰| 91精品在线播放| 福利大香蕉| 亚州再线| 精品97久久综合| 亚洲综合网图| 国产25页| 九七人妻在线| 九九九九九九免费视频| 超碰97在线中文| 色色99| AV一二区| 亚洲色图a| 久久久久久性爱片| 日本亚洲vr欧美不卡高清专区| 日本色色网| 国产亚洲国产超碰| 在线看免费无码AV天堂的| 在线A日本| 欧洲综合无码| 亚洲人妻在线一区| 黄色AAAAA欧美| 成人免费看吃奶视频网站| 亚洲一区日韩精品| 精品成人动漫一区二区| 色狠狠综合| 色综合色色| 天天综合精品| 精品妇操一区二区三区| 青久久| 超碰天天去日穴| 色狠狠一区二区三区香蕉| 精品免费囯产一区二区三区| 97天天日| 精品成人无码| 欧美视频在线视频免费va| 乱老女人一区二区视频| 9久超碰| 欧美 中文字幕 一区| 一区二区三区四区五区高清无码永久视频 | 麻豆成人AV| 亚欧色图在线激情| 五月丁香社区婷婷日韩欧美精品影院| 亚洲激情久久| 大吊色| 欧美九一精品久久久熟妇| 日韩精品一二三| 亚洲无码视频免费在线观看网址! J?P?NESEHD熟女熟妇伦 | 国产真实野战在线视频| 亚洲熟妇图片| 北野未奈加勒比av| 欧美色乱| 國產尤物AV尤物在線觀看| 久久久人妻| 顶级少妇BT天堂| 伊人久久亚洲色欲综合网站| 啪啪啪亚欧美视频| 懂色天天爱天天日天天射天天澡| 亚洲精品三| 日韩伦理视频| 欲色综合| 久久东京伊人一本到鬼色| 韩国一级婬片A片AAAAA| 熟女天天干| 欧美精品系列| 艹少妇网站| 亚洲另类久操网| 一区二区三区色综合| 精品天堂| www.色婷婷色综合| 久久久久久久久9| 成人无码电影在线观看网| 婷婷久久大香蕉| 丰满少妇高潮无码| 欧美色图91| 色哟哟511老熟女| 中文字幕在线观看AV| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 久久久少妇诱惑精品视频| 亚洲人妻在线精品| www.狠狠| 一本久道久久综合狠狠爱一密臀精| 高清国产性猛交xxxx乱大交| 91在线综合网| 偷拍盗拍亚洲色图图片| 久久av成人无码免费| 日本999精品视频| 亚洲综合第一页| 日本综合久久| 人人澡人人干| 凹凸视频特色日本特黄| 九九人妻| 91干熟女| 哈哈操电影| 亚洲各类熟们中文字幕| aV中文麻| 欧美黑人猛交春色影视大全| 日韩欧美传媒一区国产| 九九热精品视频在线观看| 欧美性性性| 男人夜色天堂ss| 超碰97人妻自拍| 亚洲四虎熟女精品| 综合少妇网| 亚洲无线码一区国产欧美国| 久久久月天| 人妻无码后入| 四虎免费看黄| 色91综合网| 极品销魂美女一区二区| 99久久com免费视频′| 麻豆av一区二区| 色优久久| 操屄日韩| 亚州综合色图| 乱伦av.com| 国桃视频产巨乳精品一区二区在线| 国产一区二区成人av在线播放| 国语人妻精彩刺激| 秋霞怕怕片| 高清不卡一二三区视频......| 亚洲综合20p| 色欧美天天| 蜜臀在线视频| 国产亚洲色婷婷99精品91| 一区操逼| 日韩欧美麻豆 | 蜜臀AV一区二区三区激情综合| 大学生美女口爆| 四季AV综合网址| 国产精品露脸在线观看| 国产九九九九九九| 无码又爽又硬又激情免费视频| 密臀在线一区尤物| 国产精品久久久777| 亚洲 自拍偷拍 欧美| 啊啊啊好疼| 婷婷丁香六月天| 久久九九综合| 色综合国产在线观看| 91老熟女老女人国产老太| 男人的天堂一区三区| 国产精品白丝| 亚洲日本大香蕉1| 偷拍 精品 另类 四区| 中国一级操逼视频| 日本天天干天天操一区| 久久少妇人妻| 草b在线| 日本三级R| A 天堂| 欧美日韩不卡传媒| 精品97精品97| 欧美午夜精品久久久久久超碰| 狠狠中文字幕| 亚洲天堂久久久久久粉红视频| 新视频sss国产| 欧美国产日韩清纯唯美| av绯色| 在线日韩日本亚洲国产| 九九九成人| 国产AV人人 夜夜人人澡| 国产欧美一区激情交| 色色网91| 亚洲激情片| 久久久涩| 熟女露脸激情自拍视频| 欧亚第一综合网| 久久极品一区二区| 九九色热| 色色五月天激情| 久久91精品国产9丨久久分亭| 97超碰站| 啊啊啊啊啊啊啊啊在线观看| 高清无码学生妹高潮| 97就爱干| 青青操视频在线| 91视频成人福利网站在线一区| 成人欧美一区二区三区黑人一| 国产真实野战在线视频| 盗摄女人妻在线| 麻豆视频国产一区二区| 秋霞 色色| 天天日夜干| 伊人九九| 欧美人妻少妇| 久久久久久九九九九| 在线二区不卡| 中文字幕视频二区| 97久久久久| 久久久性少妇| 日韩久射综合| 2017天天拍大香蕉| 超碰欧美| 亚洲 日本 国产 综合| 天天射天天操天天干天天吃2018 | 久久午夜伦| 久久人妻视频| 青青草原人妻| 91美乳| 久久九七| 亚洲色情在线影视| 日韩色图 一区二区| 人妻天天爽夜夜爽2| 看看日B真人视频| 亚洲丰满很很操| 国产精品电| 曰本特级特黄特色黄色A级网站高清在线免费看 | 久久久久久久| 亚洲乱码精品一区二区| 国产精品成人无码a v毛片| 家庭乱伦性爱av| 午夜国产成人福利视频| 久热久| 99自拍B亚洲| 三级网站超变态精品| 使劲用力艹少妇视频一区二区| 嗯,啊。舔我逼| 偷拍新久久| 神马麻豆福利院| 欧美夜夜草视频| 密乳无码| 五月婷婷色| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 狼人狠干| 国产精品美女久久久久AⅤ国产馆| 精品欧美А∨无码黑人大荫蒂| 欧美成人一级免费电影| 伊人久久国产免费观看视频| 91n免费处女| 激情在线青青操| 国模私拍一区二区三区神乳| 黄色毛片A片| 炮色五月| 狠狠操狠狠燥| 操操操五月天婷婷丁香影院| 欧美日综合| 亚洲91网。| 亚洲图片偷拍欧美| 日韩欧美操逼xxx| 探花精品视频| 狠狠2050在线观看| 大香蕉一级黄色片久久| 日韩不卡毛片Av免费高清| 蜜臀久久久久久999| 粉嫩小泬久久久一区二区| 亚州男人天堂| 国产无套粉嫩白浆在| 亚洲精品欧美专业| 欧美翘臀视频网站一区二区三区| 国产精品探花视频| 欧美 牲| 91精品老女人| 亚洲综合五月天| 97精品中文字幕| 一级婬片120分钟试看| 337p大胆噜噜噜噜噜91Av| 淫乱图区 | 蜜臀少妇一区二区| 深夜激情| 无码精品蜜桃一区二区三区ww| 少妇诱惑视频| 精品久久久久久中文字幕视频免费| 在线无码操| 人人搡人人肉久久精品| 嫩草美女久久| 东北女人被操| 色网站导航大全| 91欧美高清| 日韩本不卡视频在线观看 | 941超碰| 午夜AV人气不卡| 99热免费精品| 国产精品盗摄 偷窥盗摄| 大香蕉手机在线视频| 天天综合官网| 婷婷尹人大香蕉免费| 美女黄色91| 92午夜免费福利视频| 欧美 亚洲 91| caoni国产亚洲av| 大乔未久88一区| 精品中文字幕第一页| 密臀AV在线| 中文字幕乱码人妻二区三区| 农村妇女精品一区二区| 91三级理论片播放器| 亚州国产成人精品女人久久| 日韩成人性爱电影在线播放| 亚洲同性aV综合| 一本大道青青| 九九热精品| 久久精品一区二区| 一区二区三区四区姦女| 高清一区AV无码| 亚洲熟女乱色一区二区三区久久久| 日韩中文字幕人妻视频| 日本免费二区三区| 亚洲美乱| 欧美性爱www免费版| 欧亚韩国999| 丰满人妻一区二区三区| 人妻色偷色噜| 久久大陆| 婷婷五月天综合网| 久久草草亚洲蜜桃臀| B049AV在线播放| 中文字幕 国产 精品| 狠狠爱大香蕉| 干B| 久久激情视频| 国产亚洲精品久久久久小| 嗯嗯啊啊的视频| 天天干美少妇一区| 免费啪啪av| 欧美日韩亚洲少妇寂寞影院正在播放| 国产精品九9| 2019天天干天天操| 综合网91| 91网站18+| 成年女人一区| 黄色高清无码无码破解免费暗网| 欧美精品宗合| 欧美日本视频一区| 97se综合网| 久久精品三级影视| 国产综合在线视频网站| 国语精品av| 午夜福利在线视频1000| 嗯嗯嗯好爽| 加勒比在线视频一区二区三区| 欧洲亚洲少妇| 懂色av中文字幕一区二区三区天美| 黑操B| 97最新在线播放视频| 成人性爱AV在线免费观看| 美女好片色日本| 加勒比东京热五月天天堂网| 久久久久久性爱视频| 国产亚州日韩欧美看片| 老熟女乱子伦中文字幕一区二区| 亚洲自拍偷拍视频在线| 欧美亚洲手机在线| 97在线观看视频| 青娱乐手机日韩在线视频| 蜜色网色哟哟| 91N欧美| 九九在线视频| 亚洲黄色影视| 欧美精品日韩一区二区| 日韩人妻中文视频| 国产精品久久99日日| yw尤物av无码点击进入麻豆| 成·人免费午夜在线观看| 992视频一区| 黄色成年| 東南亚性呦成人伦理资源在线视频| 久久九操在线观看| 自拍亚洲综合| 精品九九淫乱男| 狠狠躁天天躁日日躁| 久久水蜜臀亚洲AV无码精品| 九热大香蕉| 欧美18禁91| 人妻久热在线| 久久人人爽爽爽人久久久| 狼人综合婷婷激情四射 | 亚洲自拍小说| 密臀在线一区尤物| 午夜αv| 绯色一区二区三区不卡少妇| 思思久热在线精品66| 91东北熟女| 男女性无套 免费九一| 色婷婷国产精品一区在线观看| 亚洲成人贴图| 思思热在线视频免费| 蜜乳成人AV| 激情抓乳插进去啪啪啪日韩| 欧美日韩 强奸乱伦| 精品区国产区一区二区三区| 我爱大香蕉| 人妻啊啊人妻啊啊| 99热导航| 国产又长又大又粗的视频| 欧美瑟综合| 屁股久久久久久| 亚洲欧美一区二区网址| 久久亚洲AV无码专区首页| 日本操BAV| 久久久爆乳翘臀一线天伦理视频| 在线女人91| 亚州综合AⅤ| 九九九久| 家庭乱伦麻豆| 人人操,操人人| 亚洲激情综合| 嗯嗯啊好大| 欧美激情精品久久久久久| 沈阳熟女高潮对白视频| 新婚人妻扶着粗大强行坐下| 天综合中文| 日韩精品三级片长长久久| 情色大香蕉| 亚洲国产精品V?在线播放| 蜜乳AV一区二区三区四| 中文啪啪视频| 亚洲久草AV色图| 亚洲日韩国产精品| 国产精品久久成人免费| 欧美 亚洲 综合 制服| 好舒服视频| 色五月AV| 最新国产精品久久精品| 日日夜夜国产综合| 深夜视频| 日韩精品在线观看网站| 日韩在线97| 蜜臀久久99精品久久久久久| 国产成人免费观看在线视频| 后入人妻一区| 欧美性暴力猛交| 国产精品极品美女视频| 夜夜嗨AV蜜臀av| 高颜值美女口爆高潮浪叫| 精品少妇人妻av久久免费| 极品色社| 男人的天堂com| 91人妻中文| 色五月天AV| 欧美日韩中文视频播放| 婷婷久久五月| 久久中久文96| 丰满人妻无码一区二区三区| 91偷拍欧美亚洲| 色臀av| 九九综合久久| 南澳成人一级片在线播放| 成年女人黄网站| 插老姨肥穴| 2024年最新色情网站在线观看 | 91精品操美女| 熟女人妇一区二区三区| 一区二区三区色综合| 午夜视频久久久久一区| 东京热一区二区三区四区五区六区| 人妻丝袜日本| 亚洲性爱高潮影院| 中文字幕一区二区三区50路| 99综合网| 国产97在线视频| 91大胆欧美| 久久久人妻| 日韩另类色图| 又大又大又大又粗爽高潮观看| 一区二区偷拍拍视频| 诱惑网综合| 精品少妇后入一区二区三区四区人妻巨乳| 精品国产乱码久久久久久网站入口| 九九热精品在线| 色噜噜狠狠色综无码久久合欧美| www.婷婷| 欧美日本成人一区二区| 成人日韩中文字幕| 日本成人A片免费看| 日影院久久婷婷夜夜网| 干婷婷综合网| 久久人妻熟女一区二区 | 91熟女视频| 精品v1区| 欧美老妇曰批的视频| 操老熟女AV| 中文字幕黄色片| 97天天操| 国产精品色哟哟| 欧美日韩在线国产在线| 90后后入| Av色五月| 温婉少妇玩3p| 少妇无码999| 91最新综合| 久久亚洲AV无码专区国产精品| 我想要啊 啊 啊| 97天天摸天天碰| 欧美18 在线观看| 伊人久久亚洲色欲综合网站| 欧美在线视频99| 人人人摸人人| 呻吟 欧美 日本 中出| 欧美1727免费观看视频| 波多野结衣一级视频| 国产精品一区二区麻豆| 久久久久久久久久久久久9999| 国产一区二区三区白丝| 亚州欧美另类| 久久、1234| 丁香五月天堂网| 国产精品成人久久一区二区三区| 精品人妻一区二区蜜桃视频| 少妇毛片久久| 亚洲成av人片色午夜乱码| 综合伊人网12色| 老司机福利社视频在线观看| 蜜桃视频精品一区二区三区| 91精品丝袜在线观看| 乱伦熟女专区| 97久久超碰亚洲| 91热情品| 97精品一二区| 激情四射五月天| 少妇人妻好深太紧了vr91| 91精品人妻一区二区三区蜜桃| 四季AV一区二区凹凸精品小说| 天天拍天天操| 99久久久久久久久| 黄片免费视频2019| 91天天看| 日本在线伊人啪啪| 久久九九热| 国产乱人妻精品入口| oumeisetu综合| 超碰99热| 99热只有这里有精品| 成人影院永久免费观看网址| 91视频综合网| 日本男人天堂| 亚洲狠狠入| 综合性视频99| 青娱乐手机日韩在线视频| 97综合在线观看| 亚洲日本成人动漫| 久久婷婷六月综合| 色色婷婷丁香| 亚洲午夜av| 男人的天堂一区三区| 韩国一级AAA| 国产毛片久久久久久久| 日本精品中文字幕视频| 中国AAAAAA黄色片| 在线观看中文字幕| 久久精品国产亚洲AV先锋| 激情欧美97| 亚洲熟女av中文字幕| 99色热| 午夜噜噜噜| 欧美天堂在线| 91综合网站| 性猛交| 香蕉欧美| 黄色视频60分钟| 又粗又长又爽在线观看| 国产精品视频麻豆入口| 男女性感激情网站| 日韩午夜精品一区二区三区电影| 久久国内| 色五月综合| 天天综合网一91网| 熟妇视频一区二区三区在线观看| 亚洲人在线| 国产白丝在线| 丝袜高跟澳门91视频| 骚货 中文字幕 av| 中文字幕一区二区三区四五区| 高潮9999外国| 麻豆成人影音在线| 少妇熟女1区2区3区| 岛国福利在线精品播放| 黑人狂躁日本妞一区二区三区| 三级网色| 激情网五月天| 熟啊v色欧美热| 色妇91| 99热婷婷一区二区三| 深夜福利黄片| 国产成人手机视频激情| 日韩无码成人电影| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 国产九区| 97精品一区二区视频在线观看| 一二三区精品视频| 亚洲国产精品成人综合| 性爱乱伦网址| 懂色AV一区二区三区| 日韩9999| 97久久超碰日韩精品| 少妇熟女1区2区3区| 乱欲一区二区| 青青青操| 免费男人的天堂| 69视频入口| aaaa黄片| 99999精品成人| yazhouzaixian| 91国产操逼视频| 成人性爱电影一区二区| 国产精品经典一卡久久久| 日韩精品一区,二区 九九...老司机| 97Ai亚洲| 亚洲无码AV九九九| 91在线限制级| 99久草| 大香蕉久| 三上制服丝AV| 青草精品视频日本久久久久网站在线| 第四色奇米影视777| 久热99| 欧美91久久久久| 91免费看一区二区三区 | 亚洲素人综合| 免费日韩黄片| 国产天美欧美| 加勒比无码毛片| 精品少妇人妻av久久免费| 91精品电影18| 欲香欲色综合天天伊人| 色乱二区| 国产一区二区久久| 免费国产电影一区二区| 久久超碰、| 凸凹视频在线观看| 蜜臀99精品国产高清在线观看| 日韩BBN| 91视频伊人| 九九热超碰| 99re在线视频| 免费黄色片。| 日韩欧亚太美不卡| 九九九九九精品| 2018色综合天天操| 男女香蕉一区二区| 丰满人妻一区二区三区四区| 91在线视频免费中出| 久久啊啊| 成人欧美一区二区三区黑人一| 天天在线91| 强奸乱伦av电影| 精品少妇人妻| 岛国在线一区二区三区| 国产精品久久久久久久久久久久久久久 | 美女大乳久久久久久久女人18| 97综合久久| 欧美性爱97超碰| 97超碰超碰| 热久久91婷婷| jizz啪啪| 色超碰综合| 伊人久久大香线蕉无码| 成人精品视频| 亚洲欧美国产成人综合不卡| 玖玖爱综合网| 激情九月婷婷| 啊啊啊久久| 91逼逼女人91| 日韩99精品视频综合区| 久久99精品九九久久久婷婷| AV污污污污| 欧美激情亚洲| 情色日播放AV| 成人av福利在线观看| 美美91成人国产精品欧美精品久久久久久久| 国产综合在线视频网站| 极品AV网站在线观看| 操逼网免费无码视频| 亚洲欧美91| 91天天日| 天天插夜夜操| 麻豆区久久久久亚| 六月色婷婷| a片偷拍视频| 亚洲清纯唯美| 亚洲欧美大香蕉| 性videos欧美熟妇hdx| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 欧洲精品一级二级精品综合视频综合| 欧美综合骚| se01国产在线视频| 91精品国产长腿丝袜美女| 亚洲激情网一二三四区| 黄视频免费| 日本高清一本二本免费不卡| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 色哟哟精品1精品2| 人妻加勒比东京热| 亚洲一区二区三区中文字幕| 新91视频.cmp| 中文字幕日韩精品一区二区三区| 国产亚洲精品美女久久久m| 人人妻人人爽一区二区三区| 亚洲精品天天影视综合网| 国产视频一区二区免费| 秋霞怕怕片| 久操视频在线| 久久一二三级一一一| 日韩性爱网址| se吧提供国产乱老熟视频胖女人| 免费精品AB| 密臀在线免费观看| 成人午夜无码视频| 午夜操逼不卡| 欧美在线天堂| 亚洲大色鬼| 日日日啊啊啊| 五月天综合在线| 综合欧美激情网| 中文字幕国产在线天堂| www.人人摸在线视频| 目产99999久久999| 日本91白丝| 欧美一级做a爰片免费视频| 欧美性生活男人的天堂| 人人操人人肉久久精品| 蜜臀av网址| 国产午夜视频| 欧美少妇大量自拍视频在线观看| 欧美久久伊人| 在线免费观看日韩一区| 探花视频免费观看国产专区| 精品无av| 少妇熟女视频一区二区三区| 天天看高清麻豆| 精品久久久久9999| 狠狠久久亚洲欧美专区| 欧美成人性爱视频大全| 在线看片国产精品每日更新| 色在线综合| 日语五十路和六十路亚洲国产精品| 免费视频观看60秒| 在线色资源| 亚洲伊人久久精品影院| 夜夜国产一区| 东京成人一区| 熟女一区二区| 天天天肏屄欧美| 日本一区二区三区精品| 天天综合网一91网| 国产熟女少妇一区| 东京热男人的天堂网| 99精品无码| 婷婷成人五月天| 五月丁香六月| 久久久蜜桃一区二区三区| 激情久久久| 久久久人妻| 综合色图,成人综合网| 久久精品欧美一区蜜桃| 婷婷四五区| 97精品国产97久久久久久户外免费| 国产成人亚洲精品自产在线 | 日本人妻最新在线中| 精品视频一区二区| 日韩欧美大片免费高清啪啪| 青青操网| 国产精品人妻熟女aⅴ| 四虎影视永久在线免费| 无码日韩人妻av一| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲色图殴美色图激情乱伦| 留下AⅤ黄色片| 99这里有精品视频| 在线啊啊啊啊| 啊啊啊啊操死我了| 五月天亚洲网| 久草看看看| 国产偷人伦激情在线观看| 国产美女销魂在线观看不卡| 蜜乳AV一区| 一级免费啪啪片| 国产后入精品| 韩国三级三级BD在线| 久久久久国产| 99操逼| 日韩免费中文字幕视频| 天天摸夜夜添无码小视频| 国产精品视频白浆免费| 天天爽夜夜操| 日本999精品视频| 国偷自 一区二区| 亚洲高清91| 国产黄色小视频网站| 欧美自拍偷拍免费观看| 大香蕉97久久| 素人无码中文字幕| 亚洲男人天堂网站| 在线观看一级α片刺激高潮视频| 国产精品激情久久久久久久| 五月激情综合网| 一区二区三区蜜桃成人撸久久东京热| 中文在线视频| 欧美一区二区男人天堂| 97人人操人人摸人人爱| 欧美视频在线第3页| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | av操操不卡| 欧美伦乱| 日韩一区二区精彩视频| 3p国产欧美99热| 99国产在线绯色一区| 欧美色图99| 91丨豆花丨熟女| 日本高清电影欧美色图| 欧美天天综合站| 天天日天天干天天操| 天天日B夜夜干B时时操B| 怡红院怡春院| 亚洲 欧美综合| AA特级绝黄| 国产污视频麻豆传媒一区二区 | 亚洲综合一区二区| 欧美 传媒 麻豆 日韩 偷拍| 96超碰网| 操逼操网| 欧美色日本| 国产品精品自在在线午夜免费| 久久久久久AV无码免费网站| 99啪啪| 超清中文乱码字幕| 久久久中文| 9997se| 免费的很黄很污的全部视频| 少妇毛片久久| 亚洲男人天堂AV| 婷婷久久五月| 中文无线日韩一区| 欧美 日韩 亚洲 春色| 国产精品久久久视频| 不卡视频一区蜜桃视频| 操逼操操操91| 日韩丨制服丨中文|在线| 午夜操逼不卡| 东京成人一区| 操操操五月天婷婷丁香影院| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 一级性爱视频免费观看| 九九久久九九久久| 清纯唯美综合| 激情色播| 欧美色蜜桃97| 久久五月视频| 国产美女高潮视频| 国产福利第一视频| 男人天堂最新手机版在线青青草| 狠狠色狠狠色狠狠五月| 少妇内射www在线观看视频 | 老鸭窝日丰县女人| 国产熟女乱论| 激情婷婷丁香| 欧美日韩中文亚洲v在线综合| 人妻超碰青青草98| 亚洲色 国产 欧美 日韩| 日本不卡一区二区三区| 91在线视频免费播放| 91男人天堂网| 亚洲欧美国产其他二区| 白嫩91在线亚洲| 亚洲色欲天天人妻无码系列专区| 欧美小说区视频区| 五月香婷婷| 一区二区影视| 青青11操操操操操操操操| 久久产精品一区二区三区电影| 少妇毛片久久| 亚洲国产欧美另类自拍| 99re在线精品78| 手机看片1025| 蜜臀久久99精品久久久久久-DVD | 91丨九色丨国产丨人妻在线| 超碰这里只有精品| 亚洲欧美日韩精品久久久一区二区 | 国产一区二区三区免费视频在性观看 | 久久久久久久国产| 国产精品成人福利在线| 久操免费电影| 人妻久热在线| 亚洲精品一二区| 亚洲性综合11| 电影69乱码96| 看大黄色大片原件| 蜜臀va69| 日本天堂网| 欧美性爱1080p| 欧洲精品二区| 超碰色中文| 特级丰满少妇一级AAAA爱毛片| 97视频播放| 国产综合久久久鬼色| 亚洲二区精品在线观看| 亚洲天天更新| 欧美91精彩| 夂久色| av最新免费中文字幕| 精人妻一区二区三区| 99热aaa| 欧美在线视频99| 色就色综合| 国产97色在线| 青青欧洲黑| 中文高清一区二区的| 性色av蜜臀av色欲aV| 97免费视频在线| 免费超碰97久久| 99热99re超碰精品| 欧美久久伊人| 欧美大香蕉久| 大香蕉99999| 黄色一区三区| 久久精品一区| 日本福利社| 新婚人妻扶着粗大强行坐下| 亚洲综合影院| 老熟乱一区二区三区四区| 久久中日麻豆| 天天日老熟妇| 免费av大片| 欧美日韩黄片精品在线| 日韩色香| 美女上床网站| 久久久99999久网站| 婷婷香蕉欧美在线一区二区三区| 国产 v乱码一区二| 中文字幕一区二区免费在线| 亚洲综合999| 天堂亚洲欧美| 天天综合站| 天天天天做夜夜夜夜做| 亚洲天堂性爱| 九九成人视频| 久久国内| 亚洲成人免费中文字幕| 边做饭边操逼逼| 97爱爱爱| 欧美性性性| 怡红院久久老司机| 欧美在线|亚洲| 久久综合av| 久久草视频污视频| 中文字幕-区二区三区四区视频中国| 骚货人妻偷情自拍在线视频| 99色热| 婷色五月| 婷婷久久五月天| 黄网在线播放| 黄色av一区二区在线| 日本高清有码网址视频| 人妻系列无码专区中文有码| 亚洲色图欧美色图日韩色图| 涩涩涩综合| 国产无码高清操逼视频| 69av一区二区三区| 午夜视频黄| 热无码中文亚洲H一道本一区二区| 2024年最新色情网站在线观看| 亚洲国产丝袜熟女av| 91社区伊人| 亚洲熟伦熟妇AV无码春色| 成人午夜高潮av猛片| 九九九精品成人免费视频小说| 日韩国产精品人妻无码久久久| 呦呦一区| 看免费的黄片| www.99中文字幕| 久干9操| 一区二区三区精品久久| 激情五月天丁香社区| 五月丁香婷婷啪啪| 日本有码久久| 67194无码不卡| 你草精品在线视频| 爱妻综合网| 色网亚洲人|