NodeJs 使用 ES6 语法
- package.json 添加
1 | "babel": { |
npm install
有 2 种方法可配置
- 第一种: 启动命令改为:
./node_modules/.bin/babel-node app.js
- 第二种: 在 app.js 头部里添加
require("babel-register");
1 | "babel": { |
npm install
有 2 种方法可配置
./node_modules/.bin/babel-node app.js
require("babel-register");
在gradle4.7以后对于加入依赖lombok方式发生变化,gradle4.7版本以前,可以直接如下引用:
1 | compile("org.projectlombok:lombok:1.18.2")或者compileOnly("org.projectlombok:lombok:1.18.2") |
在gradle5.0这种方式会产生警告,在gradle5.0里面会直接报编译错误
有 2 中解决方式:
开发依赖:
1 | annotationProcessor 'org.projectlombok:lombok:1.18.2' |
测试依赖:
1 | testAnnotationProcessor 'org.projectlombok:lombok:1.18.2' |
1 | repositories { |
错误信息:
1 | Errors occurred while build effective model from /Users/joylau/.gradle/caches/modules-2/files-2.1/log4j/log4j/1.2.16/88efb1b8d3d993fe339e9e2b201c75eed57d4c65/log4j-1.2.16.pom: |
这是因为 Log4J 1.2.16 的 pom 中存在一个Bug。1.2.16 已经在 2010 年停止更新了
可以通过声明对 log4j:log4j:1.2.17 的显式依赖
或通过依赖关系管理确保使用 1.2.17 来解决
1 | implementation("log4j:log4j:1.2.17") |
为什么说经过了一系列的折腾呢, 因为前 2 中方式都没有解决我的问题,最后我是自己实现了自动更新的逻辑
没有解决我的问题是因为我需要兼顾到 mac 平台和 Windows 平台,然而 mac 平台比较麻烦,代码需要签名
我自己亲测方式一和方式二在 mac 平台上都需要代码签名, 而签名代码需要注册苹果开发者账号,需要付年费
于是这 2 条路就走不通了
最后我决定自己实现更新的逻辑
可以采取一个 json 文件来记录个版本的更新记录, 这里给个参考:
1 | [ |
1 | import $ from 'jquery'; |
1 | "files": [ |
同时该配置也可防止源码被打包进去,
"asar": false,
1 | "extraResources": [ |
1 | "directories": { |
1 | "win": { |
1 | "mac": { |
1 | "nsis": { |
1 | !macro customHeader |
当引入的 license 文件里有中文时, 在 Windows (中文操作系统) 平台下打包需要 GBK 编码, 在 macOS 下,GBK 编码会直接报错,需要修改为 UTF-8 编码
可能见过一种套娃的玩具,就是一个大的套着一个小的,每一个玩具的形状颜色都一样,只是大小比例不一样,套娃图标也是这个意思
需要这么一个工具, IconFX : 下载
制做一组至少有 256256 (此外还有 128128 , 9696, 6464, 4848,3232,16*16)的一套图标, Windows 下格式为 icon, Mac 下格式为 icns
使用 PS 制作一张图片或者下载一张图片,按照下面的步骤完成所有大小的图标创建,之后保存.
图像 — 从图像创建 Windows 图标
MacOS 也是同样的道理
个人理解为注册一种协议来实现应用间的跳转
Windows 上是通过注册表实现的
通过在 HKCR (HKEY_CALSSES_ROOT) 添加一条注册表记录
其中 command 的命令即为要执行的命令,注意后面要加一个参数 "%1"
在应用里显示包内容,使用 xcode 查看 Info.plist 找到 URL types – URL Schemes 里添加一项
1 | app.setAsDefaultProtocolClient(PROTOCOL, process.execPath, [`${__dirname}`]); |
这一句话即可完成 Windows 下和 macOS 下的协议注册,只不过需要应用启动后才可注册成功,就是说如果安装过后不打开的话,无法通过协议来唤醒应用,解决方式我们后面再讲
第一个参数为协议的名称, 第二个参数为执行的命令,第三个参数为所传字符串参数数组
在 Windows 环境下最后一项需要带上当前的项目路径,否则的话在开发模式下会打不开 electron 应用,打包完成后不会存在这个问题, mac 上也不会存在这个问题
参数的处理分 2 中情况
对于新打开的窗口:
使用 let argv = process.argv;
来获取进程参数,得到的是一个数组,如果做够一项包含我们的协议,则需要根据自己的字符串规则来进行处理
1 | let argv = process.argv; |
对于打开的第二个实例:
windows 上监听的事件是 second-instance
, mac 上监听的事件是 open-url
, 2 个事件传入参数还不一样, Windows 下传入的参数是字符串数组,mac 传入的参数是字符串,都包含了协议名称
1 | app.on('second-instance', (event, commandLine, workingDirectory) => { |
使用 setTimeout, 如果超时未打开的话则说明协议不存在
1 | let downloadURL = "http://xxxx"; |
使用 app.requestSingleInstanceLock()
1 | const gotTheLock = app.requestSingleInstanceLock(); |
经过实测Menu.setApplicationMenu(null);
在 Windows 环境下没有菜单栏, 在 MAC 系统上开发模式下有菜单栏
正确的解决方式是Menu.setApplicationMenu(Menu.buildFromTemplate([]));
electron 自带的注册快捷键的功能函数是 globalShortcut, 这个是全局的快捷键,就是说焦点不在当前程序上也能触发快捷键
我这里使用的是一个第三方的组件 electron-localshortcut
1 | electronLocalshortcut.register(win, 'F12', function () { |
这里使用的是 ipcMain 和 ipcRenderer
渲染进程使用ipcRenderer.send发送异步消息,然后使用on事件监控主进程的返回值。主进程使用on事件监听消息,使用event.sender.send返回数据
App.js:
1 | const {ipcRenderer} = require('electron') |
main.js
1 | const {ipcMain} = require('electron') |
渲染进程使用ipcRenderer.sendSync发送同步消息。主进程使用on事件监控消息,使用event.returnValue返回数据给渲染进程。返回值在渲染进程中,就直接体现为ipcRenderer.sendSync的函数返回值
上面的示例没有说主线程如何对小渲染线程发送消息,应该这样做:
1 | win.webContents.send('ch-1', 'send'); |
渲染窗口添加配置:
1 | webPreferences: { |
添加 renderer.js
1 | global.electron = require('electron') |
渲染进程的页面使用:
1 | const electron = window.electron; |
不需要引入任何包,直接在主线程使用 global
1 | // 共享对象 |
渲染进程获取信息: let osInfo = electron.remote.getGlobal(‘shareObject’).osInfo;
主线程修改对象: global.shareObject.osInfo = message;
渲染线程修改对象: electron.remote.getGlobal(‘shareObject’).osInfo = null;
建议使用 app.isPackaged
Windows 环境下:
1 | app.on('second-instance', (event, commandLine, workingDirectory) => { |
Mac 环境下:
1 | // macOS |
1 | if (app.isPackaged) { |