用 Electron 打包语雀
本文主要记录用 打包的过程,并不会深入 Electron 这门技术。目前基本上用语雀作为个人笔记,但每次和其他标签页同在一个浏览器里,切换起来不是很方便,我希望可以作为一个桌面端应用,这样就可以:用 Alfred 快速打开、固定在 Dock 上、用 Command + Tab 快速切换。
在 Electron 之前,可以使用 Chrome 的 Create Shortcut 功能封装成一个 App,我之前也这么做过,但可定制化几乎没有,其中有一点我不喜欢:会打开新窗口。
我希望像桌面端应用那样所有的 Navigation 都在同一个窗口,而不会老是弹出新窗口。
是时候祭出 Electron 了!
一般生态良好的技术官网都会有快速入门的文档和示例。
之前没有用过,如何快速入门?最靠谱的就是去官网找 Quick Start 示例,Electron 也给我们提供了这样一个示例项目以便新手快速入门:
# 克隆示例项目的仓库
$ git clone https://github.com/electron/electron-quick-start
# 进入这个仓库
$ cd electron-quick-start
# 安装依赖并运行
$ npm install && npm start
加载 URL
这个示例加载的是本地 HTML 文件,我们是加载 URL,所以需要改一下 main.js 并重启:
mainWindow.loadFile('index.html')
// 改为
mainWindow.loadURL('https://www.yuque.com/dashboard/books')
初始窗口最大化
此时我们发现初始窗口有点小,我想要打开的时候就是充满整个屏幕。如果设置 mainWindow 的 width 和 height 有点 hard code 的感觉,屏幕一换就又不对了,google 一下找到设置方法:。
设置 Dock 图标
Electron 有专门针对 MacOSX 的设置,其中就有 dock 的相关设置:
if (process.platform === 'darwin') {
app.dock.setIcon(path.join(__dirname, 'images/appIcon.png'))
}
禁止打开新窗口
其实最让我在意的就是这一点了,也是搜了好一会 google 和 才找到:
当页面请求打开地址为 的新窗口时触发。可以通过 或外部链接 (如 ) 触发。
默认情况下, 将为 创建新的 。
调用 事件,可以阻止Electron自动创建新的 实例。 调用 事件后,你还可以手动创建新的 [](https://www.electronjs.org/docs/api/browser-window) 实例,不过接下来你必须用 方法来引用 [](https://www.electronjs.org/docs/api/browser-window) 实例,如果你不这样做,则可能会产生异常。 例如:
myBrowserWindow.webContents.on('new-window', (event, url, frameName, disposition, options) => {
event.preventDefault()
const win = new BrowserWindow({
webContents: options.webContents, // use existing webContents if provided
show: false
})
win.once('ready-to-show', () => win.show())
if (!options.webContents) {
win.loadURL(url) // existing webContents will be navigated automatically
}
event.newGuest = win
})
我们据此改造一下:
mainWindow.webContents.on('new-window', (event, url) => {
event.preventDefault()
mainWindow.loadURL(url)
})
这样就可以实现跳转只在当前窗口进行,而不会创建新的窗口。
打包
上面的示例并没有包含打包逻辑,我们需要通过 electron-packger 进行打包操作:
npm install electron-packager --save-dev
然后在 package.json 中的 scripts 属性增加如下命令:
"scripts": {
"start": "electron .",
"pack:osx": "electron-packager . --out=dist/osx --platform=darwin --arch=x64 --icon=images/icons.icns",
"pack:win64": "electron-packager . --out=dist/win --platform=win32 --arch=x64 --icon=images/icons.ico",
"build": "npm run pack:osx && npm run pack:win64"
}
为了在 Dock 上显示的 App 名称是语雀而不是 Electron,我们还得在 package.json 增加一个属性:。
结束语
整个过程花了一个半小时,不算坎坷也没想的那么容易,非常享受这之间的过程,果然解决痛点是最让人兴奋的事情。
这篇文章就是在自己打包的语雀桌面版上敲的,舒服。
项目我在 GitHub 上开源了,有兴趣可以 Clone 自己也打包一个,很方便。