亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Windows下支持自動更新的Electron應(yīng)用腳手架的方法

 更新時間:2018年12月24日 15:03:12   作者:elle0903  
這篇文章主要介紹了Windows下支持自動更新的Electron應(yīng)用腳手架的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

之前寫過一篇關(guān)于 Windows 下通過 Electron 自帶的 autoUpdater 實現(xiàn)應(yīng)用自動更新的文章,很多小伙伴私信問我要具體實現(xiàn)代碼,不過因為之前一直很忙(還有懶...)。

這兩周正好周末比較空,除了在 github 上搭建了一個腳手架,還順便把實現(xiàn)優(yōu)化了一波,下面將會帶著大家從零開始詳細(xì)介紹實現(xiàn)過程,對小白也很友好的教程哦。

從零開始

進(jìn)入你的工作目錄,比如 d/workspace

# 目錄 d/workspace
mkdir electron-demo # 新建文件夾 electron-demo
cd electron-demo # 進(jìn)入文件夾 electron-demo
npm init # 初始化 npm,一路回車即可
npm i electron --save-dev # 安裝 electron 依賴
touch main.js # 新建文件 main.js
touch index.html # 新建文件 index.html

現(xiàn)在你的文件結(jié)構(gòu)如下:

|- electron-demo
 |- main.js # 空文件
 |- index.html # 空文件
 |- package.json
 |- package-lock.json # npm 自動生成的文件
 |- node_modules

確保 package.json 的name,version,description這三個字段都不為空,main 字段的取值為 main.js 。

{
 "name": "electron-demo",
 "version": "0.0.1",
 "description": "electron-demo",
 "main": "main.js"
}

主進(jìn)程和渲染進(jìn)程

Electron 應(yīng)用分為主進(jìn)程和渲染進(jìn)程。渲染進(jìn)程是直接與用戶產(chǎn)生交互的進(jìn)程,也就是我們看到的一個個窗口頁面,而主進(jìn)程主要負(fù)責(zé)控制應(yīng)用的生命周期,負(fù)責(zé)各個渲染進(jìn)程的通信等。

我們的主進(jìn)程代碼寫在 main.js 中,所以首先在你心愛的代碼編輯中打開 main.js,輸入如下代碼:

const path = require('path');
const url = require('url');
const {
  app,
  BrowserWindow
} = require('electron');

app.on('ready', () => {
  let win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      devTools: true
    }
  });

  win.loadURL(
    url.format({
      pathname: path.join(__dirname, 'index.html'),
      protocol: 'file:',
      slashes: true
    })
  );
});

app.on('window-all-closed', () => app.quit());

再打開 index.html,輸入如下代碼:

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>Hello World!</title>
</head>

<body>
  <h1>Hello World!</h1>
</body>

</html>

之后執(zhí)行

# 目錄 d/workspace/electron-demo
node_modules/.bin/electron .

不出意外的話你會看到一個彈出框,像這樣:

 

我們也可以把 node_modules/.bin/electron . 保存成 npm 腳本,方便以后調(diào)用。打開 package.json,添加如下內(nèi)容:

 "scripts": {
  "start": "electron ."
 }

以后只需要調(diào)用 npm start 即可。

到這里,我們已經(jīng)有了一個最簡單的 Electron 應(yīng)用,如果你對繼續(xù)開發(fā)應(yīng)用本身更感興趣的話,請移步Electron 官方文檔,因為接下來我們會專注在怎么讓這個應(yīng)用實現(xiàn)自動更新。

自動更新

安裝依賴

自動更新功能的實現(xiàn)依賴 electron-builder 和 electron-updater,所以我們需要先安裝這兩個依賴。

# 目錄 d/workspace/electron-demo
npm i electron-builder --save-dev # 必須安裝為開發(fā)依賴,否則打包會出錯
npm i electron-updater --save # 必須安裝為運行依賴,否則運行會出錯

配置 package.json

為了配合打包 package.json 需要新增字段 build:

 "build": {
  "appId": "com.xxx.app",
  "publish": [
   {
    "provider": "generic",
    "url": "http://127.0.0.1:8080"
   }
  ]
 },

同樣為了執(zhí)行方便,我們需要添加一個 npm 腳本,打開 package.json,添加如下內(nèi)容:

 "scripts": {
  "start": "electron .",
  "build": "electron-builder -w"
 }

以后只需要調(diào)用 npm run build 即可。

主進(jìn)程和渲染進(jìn)程

打開main.js,編輯后內(nèi)容如下:

const path = require('path');
const url = require('url');
const {
  app,
  BrowserWindow,
  ipcMain 
} = require('electron');
const { autoUpdater } = require('electron-updater');
const feedUrl = `http://127.0.0.1:8080/${process.platform}`;

let webContents;

let createWindow = () => {
  let win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      devTools: true
    }
  });

  webContents = win.webContents;

  win.loadURL(
    url.format({
      pathname: path.join(__dirname, 'src/index.html'),
      protocol: 'file:',
      slashes: true
    })
  );

  webContents.openDevTools();
};

let sendUpdateMessage = (message, data) => {
  webContents.send('message', { message, data });
};

let checkForUpdates = () => {
  autoUpdater.setFeedURL(feedUrl);

  autoUpdater.on('error', function (message) {
    sendUpdateMessage('error', message)
  });
  autoUpdater.on('checking-for-update', function (message) {
    sendUpdateMessage('checking-for-update', message)
  });
  autoUpdater.on('update-available', function (message) {
    sendUpdateMessage('update-available', message)
  });
  autoUpdater.on('update-not-available', function (message) {
    sendUpdateMessage('update-not-available', message)
  });

  // 更新下載進(jìn)度事件
  autoUpdater.on('download-progress', function (progressObj) {
    sendUpdateMessage('downloadProgress', progressObj)
  })
  autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) {
    ipcMain.on('updateNow', (e, arg) => {
      //some code here to handle event
      autoUpdater.quitAndInstall();
    })
    sendUpdateMessage('isUpdateNow');
  });

  //執(zhí)行自動更新檢查
  autoUpdater.checkForUpdates();
};

app.on('ready', () => {
  createWindow();

  setTimeout(checkForUpdates, 1000);
});

app.on('window-all-closed', () => app.quit());

index.html:

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>Hello World!</title>
</head>

<body>
  <h1>Hello World!</h1>
  <script>
    const { ipcRenderer } = require('electron');

    ipcRenderer.on('message', (event, { message, data }) => {
      console.log(message, data);
      switch (message) {
        case 'isUpdateNow':
          if (confirm('現(xiàn)在更新?')) {
            ipcRenderer.send('updateNow');
          }
          break;
        default:
          document.querySelector('h1').innerHTML = message;
          break;
      }
    });
  </script>
</body>

</html>

打包

npm run build

第一次運行會比較慢,運行結(jié)束后會在當(dāng)前目錄下新增一個 dist 文件夾,dist 的目錄結(jié)構(gòu)如下:

|- dist
 |- win-unpacked
 |- electron-autoupdate-scaffold Setup.exe
 |- electron-autoupdate-scaffold Setup.exe.blockmap
 |- electron-builder-effective-config.yaml
 |- latest.yml

win-unpacked 下是可執(zhí)行文件,但是先別著急運行,我們還缺一個后臺。

自動更新后臺

聰明的你一定注意到,前面代碼中我們有一個:

const feedUrl = `http://127.0.0.1:8080/${process.platform}`;

所以我們現(xiàn)在要做的就是一個可以接受這個請求的服務(wù)。

回到你的工作目錄(d/workspace)

# 目錄 d/workspace
mkdir electron-server
cd electron-server
npm init
npm i koa --save
npm i koa-static --save
touch server.js

打開 server.js,輸入如下內(nèi)容:

// server.js
let Koa = require('koa');
let app = new Koa();
let path = require('path');

app.use(require('koa-static')(path.resolve(__dirname + '/packages')));

let server = app.listen(8080, () => {
  let { address, port } = server.address();

  console.log("應(yīng)用實例,訪問地址為 http://%s:%s", address, port);
});

將之前打包出來的 dist 目錄下的 4 個文件(除了 win-unpacked)拷貝到這邊的 packages/win32 下(新建目錄 packages/win32),之后

# 目錄 d/workspace/electron-server
npm start

到此為止,我們的自動更新服務(wù)就搭建完成了,現(xiàn)在來一波測試吧。

測試

進(jìn)入 electron-demo/dist/win-unpacked 找到可執(zhí)行文件,雙擊運行,看到打開窗口的控制臺中依次輸出:

checking-for-update
update-not-available

進(jìn)入 electron-demo,打開 package.json,把版本號改為0.0.2,重新打包后拷貝打包文件到自動更新后臺目錄(d/workspace/electron-server/packages/win32)。

進(jìn)入 electron-demo,打開 package.json,把版本號改為0.0.1,重新打包后再次進(jìn)入 dist/win-unpacked 目錄,運行 exe,看到打開窗口的控制臺中依次輸出:

checking-for-update
update-available

并且出現(xiàn)彈窗提示「現(xiàn)在更新?」。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Map與WeakMap類型在JavaScript中的使用詳解

    Map與WeakMap類型在JavaScript中的使用詳解

    這篇文章主要介紹了Map與WeakMap類型在JavaScript中的使用,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 五段實用的js高級技巧

    五段實用的js高級技巧

    五段實用的js高級技巧,一些不錯的小技巧,學(xué)習(xí)js的朋友可以看看。
    2011-12-12
  • webpack4.0+vue2.0利用批處理生成前端單頁或多頁應(yīng)用的方法

    webpack4.0+vue2.0利用批處理生成前端單頁或多頁應(yīng)用的方法

    這篇文章主要介紹了webpack4.0+vue2.0利用批處理生成前端單頁或多頁應(yīng)用的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • JS實現(xiàn)簡單日歷特效

    JS實現(xiàn)簡單日歷特效

    這篇文章主要為大家詳細(xì)介紹了JS實現(xiàn)簡單日歷特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 微信小程序 textarea 層級過高問題簡單解決方案

    微信小程序 textarea 層級過高問題簡單解決方案

    這篇文章主要介紹了微信小程序 textarea 層級過高問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • JS實現(xiàn)提示效果彈出及延遲隱藏的功能

    JS實現(xiàn)提示效果彈出及延遲隱藏的功能

    這篇文章主要介紹了JS實現(xiàn)提示效果彈出及延遲隱藏的功能,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • JS返回iframe中frameBorder屬性值的方法

    JS返回iframe中frameBorder屬性值的方法

    這篇文章主要介紹了JS返回iframe中frameBorder屬性值的方法,分析了frameBorder屬性的功能及javascript獲取frameBorder屬性值的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 微信小程序數(shù)據(jù)統(tǒng)計和錯誤統(tǒng)計的實現(xiàn)方法

    微信小程序數(shù)據(jù)統(tǒng)計和錯誤統(tǒng)計的實現(xiàn)方法

    這篇文章主要介紹了微信小程序數(shù)據(jù)統(tǒng)計和錯誤統(tǒng)計的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • JavaScript控制各種瀏覽器全屏模式的方法、屬性和事件介紹

    JavaScript控制各種瀏覽器全屏模式的方法、屬性和事件介紹

    瀏覽器全屏模式的啟動函數(shù)requestFullscreen仍然需要附帶各瀏覽器的js方言前綴,相信下面這段代碼需要你花大量的搜索才能湊齊:
    2014-04-04
  • 微信小程序picker組件下拉框選擇input輸入框的實例

    微信小程序picker組件下拉框選擇input輸入框的實例

    這篇文章主要介紹了微信小程序picker組件下拉框選擇input輸入框的實例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09

最新評論