Electron & Angular

Electron 中使用Angular做UI

  • 只打包angular编译后的
  • 环境
    • win10 64x
  • 版本
    • electron 3.0.5
    • angular 6.x
    • ng-alain 2.0.0-beta.5
  • 调试使用两个进程
  • 只打包编译后的 angular 代码
  • windows下的安装,升级
  • 打包与升级 参考: https://segmentfault.com/a/1190000010271226

创建 angular项目

  1. 创建angular项目
    • 创建完成最后运行一下确认项目没有问题
// 因为使用 ng-alain 所有选用 less 做 css 预编译
ng new electron-ng-alain --style less
  1. 添加ng-alain
    • 创建完成最后运行一下确认项目没有问题
// 这里我选用最新的ng-alain(我创建的时候 "ng-alain": "^2.0.0-beta.5")
ng add ng-alain@next

我在运行的时候出现了一些问题
这里我选择直接注释掉这段代码
编译出错
这个错误我选择删除这个错误管道
浏览器报错
缺少一个管道
因为是beta版本的关系,正版应该会解决
我也刚遇到了ng-zorro的图标不显示的问题 在项目下运行一下 ng g ng-zorro-antd:fix-icon (参考:http://ng.ant.design/components/icon/zh
确保ng-alain能正常运行

添加Electron

  • 添加一个app目录(这个目录很重要)
  • 在app目录中创建electron 的程序文件(mian.js 和 package.json)
    • main.js (electron 的入口文件)
    • package.json (electron 中使用的npm包,现在我只知道这样解决electron打包的问题。如果你知道有更好的办法可以告诉我。)
      原目录结构
      修改后目录结构

添加根目录 npm 包

// 添加electron必须的 【"electron": "^3.0.5"】
npm install --save-dev electron
// 打包这里使用 electron-builder 【"electron-builder": "^20.28.4"】
npm install --save-dev electron-builder

// angular 中与electron主进程通信依赖包
npm install --save ngx-electron

添加app目录中的 npm包 (这里当然要切换到app目录下)

  • app/package.json (先编写这个文件保存,不然添加npm包会报错)
{
  "name": "electron-ng-alain",
  "version": "1.0.0",
  "main": "main.js",
  "dependencies": {
  }
}
// 升级依赖 electron-updater
npm install --save electron-updater

编写electron 入口文件

  • main.js
const { app, BrowserWindow, ipcMain } = require('electron')
const path = require('path')
const url = require('url')

// 注意这个autoUpdater不是electron中的autoUpdater
const { autoUpdater } = require("electron-updater")

// 运行环境判断
var args = process.argv.slice(1);
dev = args.some(function (val) { return val === '--dev'; });

console.log(dev);
// 设置调试环境和运行环境 的渲染进程路径
const winURL = dev ? 'http://localhost:4200' :
`file://${__dirname}/dist/index.html`;

let win

function createWindow() {
  win = new BrowserWindow({ width: 800, height: 600 })

  // load the dist folder from Angular
  win.loadURL(winURL);

  // Open the DevTools optionally:
  // win.webContents.openDevTools()

  win.on('closed', () => {
    win = null
  })
}

app.on('ready', createWindow)


app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  console.log(__static)
  if (win === null) {
    createWindow()
  }
})

// 主进程监听渲染进程传来的信息
ipcMain.on('update', (e, arg) => {
  console.log("update");
  updateHandle();
});

// 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写
function updateHandle() {
  let message = {
    error: '检查更新出错',
    checking: '正在检查更新……',
    updateAva: '检测到新版本,正在下载……',
    updateNotAva: '现在使用的就是最新版本,不用更新',
  };
  const os = require('os');
  // http://localhost:5500/up/ 更新文件所在服务器地址
  autoUpdater.setFeedURL('http://localhost:5500/up/');
  autoUpdater.on('error', function (error) {
    sendUpdateMessage(message.error)
  });
  autoUpdater.on('checking-for-update', function () {
    sendUpdateMessage(message.checking)
  });
  autoUpdater.on('update-available', function (info) {
    sendUpdateMessage(message.updateAva)
  });
  autoUpdater.on('update-not-available', function (info) {
    sendUpdateMessage(message.updateNotAva)
  });

  // 更新下载进度事件
  autoUpdater.on('download-progress', (progressObj) => {
    win.webContents.send('downloadProgress', progressObj)
  })
  // 下载完成事件
  autoUpdater.on('update-downloaded',  (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) => {
    ipcMain.on('isUpdateNow', (e, arg) => {
      // 关闭程序安装新的软件
      autoUpdater.quitAndInstall();
    })
    win.webContents.send('isUpdateNow')
  });

  //执行自动更新检查
  autoUpdater.checkForUpdates();
}

// 通过main进程发送事件给renderer进程,提示更新信息
// win = new BrowserWindow()
function sendUpdateMessage(text) {
  win.webContents.send('message', text)
}

渲染进程

  • angular 与 electron通信 用到前面我们安装的ngx-electron
  • app.module.ts
    • 添加 NgxElectronModule
import { NgxElectronModule } from 'ngx-electron';

@NgModule({
  ...
  imports: [
    ...
    NgxElectronModule
  ],
})
  • 在组件中使用
import { ElectronService } from 'ngx-electron';

export class DashboardComponent implements OnInit {
  constructor(
    private _e: ElectronService,
  ) { }

  ngOnInit() {
    // 监听主进程
    this._e.ipcRenderer.on('message', (event, message) => {
      alert(message);
    });
    this._e.ipcRenderer.on('isUpdateNow', (event, message) => {
      this.s1 = '下载完成';
      alert('下载完成');
      this._e.ipcRenderer.send('isUpdateNow');
    });
    this._e.ipcRenderer.on('downloadProgress', (event, message) => {
      this.s2 = message;
    });

  }
  upData() {
    // 向主进程发送请求
    this._e.ipcRenderer.send('update');
  }

}
  

配置 angular.json文件

  • 修改 编译输出目录
  • 这个要对应着 main.js中的运行环境目录
"outputPath": "app/dist",

配置根目录下的 package.json文件

  • 配置运行命令方便运行
    • concurrently 这个命令是同时运行两条 node 命令
      • npm i -g concurrently (我这里全局安装了)(详细用法百度一下)
  • build 打包配置项 参考 https://www.electron.build/configuration/configuration
  • keywords 打包需要的目录 (具体我也不是很懂怎么用)
  • 如果你复制使用请去掉注释
 "scripts": {
    ...
    // 调试
    "dev": "concurrently \"ng serve\" \"electron . --dev\"",
    // 打包
    "win-pack": "ng build --prod --build-optimizer && electron-builder -w"
  },
  // 打包配置项
 "build": {
    //  应用id
    "appId": "con.Tast.app",
    // 应用名称
    "productName": "Tast",
    // 打包输目录
    "directories": {
      "output": "win"
    },
    // 更新配置项 参考 https://www.electron.build/auto-update
    "publish": [
      {
        "provider": "generic",
        "url": "http://localhost:5500/up/"
      }
    ],
    "win": {
      "target": [
        "nsis"
      ]
    },
    "nsis": {
      "oneClick": false,
      "perMachine": true,
      "allowToChangeInstallationDirectory": true
    }
  },
  // 打包渲染进程的所在文件 
  "keywords": [
    "dist"
  ]

修改 html模板文件

  • src\index.html
<base href="./">

全部完成

// 运行调试
npm run dev
// 打包
npm run win-pack

打包&更新

  • 打包完成双击.exe 文件就可以安装了
  • 更新只要修改app/package.json 文件中的版本号,然后重新打包即可
  • 把打包好将 4个文件放到服务器中
  • 我这里需要用管理员运行才能更新(打包配置中应该可以修改)


    只需要这个4个

如果你也使用windows 那么你也可以使用 iis创建测试服务器

  • iis的安装 略过
  • 我遇到了问题说一下




祝你好运!!

源码: https://github.com/PeachT/Electron-ng-alain

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容