幫朋友公司做了點東西,他說有很多bug,我一看,基本問題都是瀏覽器兼容引起的,而electron內帶Chromium內核,正好一直想嘗試下electron,所以研究了一波。這里只是簡單的使用electron作為殼,把自己的項目嵌進去,更多深入研究以后再來。
打包自己的項目
這里沒啥說的自己的項目打包下來,類似下面
快速開始electron
上手electron,官方提供了一個非常好的快速上手實例"electron-quick-start"。
- git clone https://github.com/electron/electron-quick-start
- cd electron-quick-start
- npm install
- 把自己的項目拷進去
- npm run start就啟動起來了
- npm run packager就打包出來了
熱更新
- 因為Chromium的緣故,即使很小的項目打包出來也有120M左右,如果給客戶使用,不可能每次有點改動就讓客戶重新安裝,顯然我們需要熱更新。
- 熱更新的原理:每次啟動程序我們就去拿本地的版本號和服務器上的版本號做對比,如果不一致就去請求資源,下載下來更新本地文件。
- 首先我們觀察打包出來的文件,發現原始文件都放在resources/app下面的,也即是說我們下載下來的文件直接覆蓋到resources/app下就可以達到更新了。
- 這里我推薦七牛雲,免費的可以使用10G內存,我們把更新資源放上去,需要版本號package.json和更新包dist.zip
- 然后改寫electron配置main.js,加入檢測更新的代碼
/**
* 檢測更新
*/
// const baseUrl = "./";
const baseUrl = "./resources/app/";
const fileUrl = "http://pm72qibzx.bkt.clouddn.com/";//這里需要修改為自己的資源外網
(function () {
return new Promise((resolve, reject) => {
request(
{
url: `${fileUrl}package.json?v=${new Date().getTime()}`,//請求package.json,與本地對比版本號
},
(error, res, body) => {
try {
if (error || res.statusCode !== 200) {
throw '更新版本號失敗,請聯系管理員';
}
const json = JSON.parse(body);
const { version, description } = json;
const localVersion = electron.app.getVersion();
// console.log(version, localVersion)
if (version != localVersion) {
mainWindow.webContents.send('updating', '更新中')
console.log('need update')
dialog.showMessageBox({
type: 'info',
title: '發現新版本',
message: '請點擊按鈕進行更新,預計持續幾分鍾,期間請不要操作,更新后會自動重啟',
buttons: ['馬上更新']
},
// (index) => {
// if (index == 0) {
// mainWindow.setProgressBar(0.5)
// } else {
// }
// }
)
mainWindow.setProgressBar(0.5);
downLoad()
.then(() => {
console.log('update success')
//重寫版本號到本地
fs.readFile(`${baseUrl}package.json`, function (err, data) {
if (err) {
return console.error(err);
}
let newData = JSON.parse(data);
newData.version = version;
fs.writeFile(`${baseUrl}package.json`, JSON.stringify(newData), function (err) {
if (err) {
return console.error(err);
}
// 重啟
app.relaunch({ args: process.argv.slice(1) });
app.exit(0);
});
});
})
} else {
console.log('no update')
}
} catch (err) {
reject(err);
}
})
})
})()
/**
* 更新
*/
const downLoad = () => {
return new Promise((resolve, reject) => {
const stream = fs.createWriteStream(`${baseUrl}temp/dist.zip`);
const url = `${fileUrl}dist.zip?v=${new Date().getTime()}`;
request(url).pipe(stream).on('close', () => {
const unzip = new adm_zip(`${baseUrl}temp/dist.zip`); //下載壓縮更新包
unzip.extractAllTo(`${baseUrl}`, /*overwrite*/true); //解壓替換本地文件
resolve()
});
})
}
windows下的安裝包
- 這里使用electron-winstaller
- 配置在build.js
resultPromise = electronInstaller.createWindowsInstaller({
appDirectory: path.join('./electron/ElectronTest-win32-x64'), //入口
outputDirectory: path.join('./installer/installer64'), //出口
authors: 'yyt',
exe: 'ElectronTest.exe', //名稱
setupIcon: path.join('icon.ico'),//安裝圖標,必須本地
iconUrl: 'http://pm72qibzx.bkt.clouddn.com/icon.ico',//程序圖標,必須url
noMsi: true,
});
- node build.js 打包成win安裝包
完成
- 完成安裝后,玩耍吧
源碼
- 刪除electron和install,防止老文件
- 考入自己項目文件到跟目錄,覆蓋index.html
- cnpm i 或者npm i
- 修改main.js中fileUrl為自己的更新包資源地
- 修改build.js中的安裝包名稱,圖標等
- npm run packager 打包
- 注意:需要先進入electron項目,‘比如D:\phpStudy\WWW\others\electron-test\electron\ElectronTest-win32-x64\resources\app’,安裝cnpm i request adm-zip
- node build.js 打包成win安裝包
最后
大家好,這里是「 TaoLand 」,這個博客主要用於記錄一個菜鳥程序猿的Growth之路。這也是自己第一次做博客,希望和大家多多交流,一起成長!文章將會在下列地址同步更新……
個人博客:www.yangyuetao.cn
小程序:TaoLand