electron
實際集成chrome瀏覽器和node環境, 運行你寫的網頁html
index.html
名稱能夠不是index
, 這個文件與普通網頁的區別是它之中要引用<script 'renderer.js'>
相似這樣main.js
必須爲這個名稱, 用於建立窗口和主線程的操做, 能訪問node模塊renderer.js
渲染進程, 能訪問被打包的node模塊和瀏覽器一開始什麼都不會, 因此用這個腳手架快速弄一個項目模板確定是最好的.
electron-vue
模板項目弄好後, npm run dev
一切正常.
但當你興高采烈的編譯打包項目時, 就發現GG了. 因爲牆, 沒法下載...vue
隨後就發生了一連串問題, 如下是我對每一個問題找到的解決方案node
Error: connect ETIMEDOUT 52.216.65.240:443
linux
添加如下淘寶鏡像到環境變量webpack
ELECTRON_MIRROR=https://npm.taobao.org/mirrors/electron/
ios
下載二進制包到 二進制包緩存目錄git
~/Library/Caches/electron-builder
~/.cache/electron-builder
%LOCALAPPDATA%\electron-builder\cache
我電腦上 二進制包緩存目錄 有如下文件github
可以編譯後不表明可以運行, 運行後發現一片空白, 經過暴力在renderer.js
裏每一行輸出alert('xx')
來判斷哪裏報錯,
發現運行 require('vue')
加載vue時報錯了, 但vue不是應該被webpack打包嗎web
因而在 webpack.renderer.config.js
配置裏找到了 externals
配置, 發現vue特殊被白名單除外了, 既然被打包了怎麼還找不到..vue-router
let whiteListedModules = ['vue', 'iview'] // externals 裏的都將不被webpack打包 externals: [ ...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d)) ],
無論這個了, 我把全部 externals
配置都註釋掉, 都打包進來. 而後發現 HtmlWebpackPlugin
的 nodeModules
字段在運行時是 false
因而改爲
// 原來 nodeModules: process.env.NODE_ENV !== 'production' ? path.resolve(__dirname, '../node_modules') : false // 改爲, 一直提供node模塊的目錄 nodeModules: path.resolve(__dirname, '../node_modules')
這樣暴力以後, 報了另外一個錯誤, 說什麼依賴模塊 vue
未找到
後臺想了半天辦法, 仍是妥協了
設置環境變量 ELECTRON_BUILDER_ALLOW_UNRESOLVED_DEPENDENCIES=1
忽略這個報錯
(後來發現正確配置時根本不會爆什麼錯或這警告的)
這樣打包出來能夠運行了. 雖然有一點大. 我也是後面才體會到爲何 electron-vue
要這麼配置
我通過摸索, 發現雙 package.json
的形式有許多優點, 這是我如今採用的方式
開發根目錄的 package.json
打包配置片斷
"scripts": { // ... 省略一些 "build:win": "electron-builder -- win", "build:deb": "electron-builder --linux deb", "postinstall": "electron-builder install-app-deps" }, "build": { "appId": "com.xueyou.testapp", // 這裏的產品名稱將影響打包出來安裝包的名稱 "productName": "testapp", "copyright": "Copyright © 2017 ${author}", "directories": { // 定義輸出目錄 "output": "release", // 定義app根目錄, 個人在 dist 目錄裏 "app": "./dist" }, // 將 globa 文件匹配到的文件打包, 這裏就是 將 app根目錄下的全部文件打包 "files": [ "./**/*" ], "win": { "target": "nsis", "icon": "dist/icons/icon.ico" }, "linux": { "icon": "dist/icons", "category": "Utility" } },
app根目錄的 package.json
打包配置片斷,
注意下面的dependencies
, 這很重要, 咱們想在renderer.js
渲染進程訪問node模塊, 就必須將node模塊打包,
如下的項目依賴就是你的應用能訪問的node外部模塊, 它會在 electron-builder install-app-deps
運行時, 在app根目錄建立node_modules
依賴
webpack
打包renderer.js
時, 要 output
配置 libraryTarget: 'commonjs2'
, 讓輸出的模塊能訪問node
{ // app 名稱, 注意不是安裝包的名稱 "name": "checkout-counter", // app 版本 "version": "1.0.1", // app 說明 "description": "央聯收銀臺", "author": "XueYou <xueyoucd@gmail.com>", "license": "MIT", // 入口文件 "main": "./main.js", // 項目依賴 "dependencies": { "axios": "^0.17.1", "echarts": "^3.8.5", "querystring": "^0.2.0", "vue-router": "^3.0.1", "vuex": "^3.0.1" } }
Need executable 'ar' to convert dir to deb
fpm
工具須要 ar
命令才能打包deb, 後來google後發現這個命令包含在binutils
sudo apt install binutils
解決依賴順利打包
打包出來的deb安裝時失敗, 會報 libconf-2.so
找不到
suduo apt install -f
安裝依賴後, 在安裝deb包就好了
而後就能在運行了
之後我再研究怎麼自動更新, 若是有疑問能夠聯繫我
ubuntu 下的運行圖