跳转到主要内容

让开源应用自动更新更简单

·3 分钟阅读

今天,我们发布了一个免费、开源、托管的更新网络服务以及配套的npm 包,以便为开源 Electron 应用实现便捷的自动更新。这是我们朝着赋能应用开发者,让他们减少部署方面的担忧,而更多地专注于为用户开发高质量体验迈出的一步。


The new updater module in action

让生活更轻松

Electron 提供了一个autoUpdater API,使应用程序能够从远程端点获取元数据,以检查更新、在后台下载更新并自动安装它们。

对许多 Electron 应用开发者来说,启用这些更新一直是部署过程中的一个繁琐步骤,因为这需要部署和维护一个仅用于提供应用版本历史元数据的 Web 服务器。

今天,我们宣布一项新的即插即用解决方案,用于自动应用更新。如果您的 Electron 应用托管在公开的 GitHub 仓库中,并且您使用 GitHub Releases 来发布构建版本,那么您就可以使用此服务为您的用户提供持续的应用更新。

使用新模块

为了最大限度地减少您的配置工作,我们创建了update-electron-app,这是一个与新的update.electronjs.org网络服务集成的 npm 模块。

安装模块

npm install update-electron-app

在您的应用的主进程的任何位置调用它

require('update-electron-app')();

就是这样!该模块将在应用启动时检查更新,之后每十分钟检查一次。找到更新后,它将在后台自动下载,并在更新准备就绪时显示一个对话框。

迁移现有应用

已经在使用 Electron 的 autoUpdater API 的应用程序也可以使用此服务。为此,您可以自定义 update-electron-app 模块或直接与 update.electronjs.org 集成

替代方案

如果您正在使用electron-builder来打包您的应用程序,您可以使用其内置的更新器。有关详细信息,请参阅electron.build/auto-update

如果您的应用程序是私有的,您可能需要运行自己的更新服务器。为此,有许多开源工具,包括 Zeit 的Hazel和 Atlassian 的Nucleus。有关更多信息,请参阅部署更新服务器教程。

致谢

感谢Julian Gruber帮助设计和构建这个简单且可扩展的网络服务。感谢Zeit的开源Hazel服务,我们从中汲取了设计灵感。感谢Samuel Attard的代码评审。感谢 Electron 社区帮助测试此服务。

🌲 祝愿 Electron 应用拥有一个常青的未来!

Electron 2 新功能:应用内购买

·阅读时间 2 分钟

新的 Electron 2.0 发行版包含了大量新功能和修复。此主要新版本的一个亮点是为 Apple 的Mac App Store提供了一个新的inAppPurchase API


应用内购买使内容或订阅可以直接在应用程序内购买。这为开发人员提供了一种便捷的方式来拥抱免费增值商业模式,在这种模式下,用户无需支付任何费用即可下载应用程序,并可以选择性地提供应用内购买以获得高级功能、附加内容或订阅。

这个新 API 是由社区贡献者Adrien Fery添加到 Electron 中的,以便在Amanote中实现应用内购买。Amanote 是一款用于讲座和会议的笔记 Electron 应用。Amanote 可免费下载,并允许用户在 PDF 中添加清晰结构化的笔记,其功能包括数学公式、绘图、音频录制等。

自从为 Amanote 的 Mac 版本添加了应用内购买支持后,Adrien 注意到 **销售额增加了 40%**!

入门

新的 inAppPurchase API 已经登陆最新的 Electron beta 版。

npm i -D electron@beta

API 的文档可以在GitHub上找到,Adrien 还很贴心地撰写了一篇关于如何使用该 API 的教程。要开始为您的应用程序添加应用内购买功能,请参阅教程

更多 针对该 API 的改进 正在进行中,并将很快在即将发布的 Electron beta 版本中推出。

Windows 可能是下一个

接下来,Adrien 希望通过在 Electron 中添加对 Microsoft Store 应用内购买的支持,为 Amanote 开辟新的收入渠道。敬请关注相关动态!

Webview 漏洞修复

·阅读时间 2 分钟

已发现一个漏洞,该漏洞允许在某些禁用 Node.js 集成的 Electron 应用程序中重新启用 Node.js 集成。此漏洞已被分配 CVE 标识符CVE-2018-1000136


受影响的应用程序

如果满足以下所有条件,则应用程序受影响:

  1. 运行 Electron 1.7、1.8 或 2.0.0-beta 版本
  2. 允许执行任意远程代码
  3. 禁用 Node.js 集成
  4. 未在其 webPreferences 中显式声明 webviewTag: false
  5. 未启用 nativeWindowOption 选项
  6. 未拦截 new-window 事件并手动覆盖 event.newGuest,而未使用提供的选项标签

尽管这似乎只影响少数 Electron 应用程序,但我们仍鼓励所有应用程序作为预防措施进行升级。

缓解措施

此漏洞已在今天的1.7.131.8.42.0.0-beta.5版本中得到修复。

无法升级应用程序 Electron 版本的开发者可以通过以下代码缓解此漏洞:

app.on('web-contents-created', (event, win) => {
win.on(
'new-window',
(event, newURL, frameName, disposition, options, additionalFeatures) => {
if (!options.webPreferences) options.webPreferences = {};
options.webPreferences.nodeIntegration = false;
options.webPreferences.nodeIntegrationInWorker = false;
options.webPreferences.webviewTag = false;
delete options.webPreferences.preload;
},
);
});

// and *IF* you don't use WebViews at all,
// you might also want
app.on('web-contents-created', (event, win) => {
win.on('will-attach-webview', (event, webPreferences, params) => {
event.preventDefault();
});
});

进一步信息

此漏洞由 Trustwave SpiderLabs 的 Brendan Scarvell 发现并负责任地报告给 Electron 项目。

要了解有关保护您的 Electron 应用安全的最佳实践,请参阅我们的安全教程

要报告 Electron 中的漏洞,请发送电子邮件至 security@electronjs.org

请加入我们的 邮件列表,以接收有关发布和安全更新的通知。

网站小问题

·阅读时间 2 分钟

上周,electronjs.org网站出现了几分钟的宕机。如果您受到了这些短暂中断的影响,我们对由此带来的不便深表歉意。经过今天的调查,我们已经诊断出了根本原因,并部署了一个修复程序


为了防止将来发生此类宕机,我们在应用程序中启用了Heroku 阈值警报。一旦我们的 Web 服务器累积的失败请求或响应缓慢超过某个阈值,我们的团队就会收到通知,以便我们能够快速解决问题。

每种语言的离线文档

下次您在飞机上或地下咖啡馆开发 Electron 应用时,您可能需要一份离线参考文档。幸运的是,Electron 的文档有超过 20 种语言的 Markdown 文件。

git clone https://github.com/electron/electron-i18n
ls electron-i18n/content

带 GUI 的离线文档

devdocs.io/electron 是一个方便的网站,它存储了不仅 Electron 还有许多其他项目(如 JavaScript、TypeScript、Node.js、React、Angular 等)的离线文档。当然,也有一个 Electron 应用可以做到这一点。请查看 Electron 网站上的devdocs-app

devdocs-app

如果您喜欢在不使用鼠标或触控板的情况下安装应用程序,请尝试Electron Forgeinstall 命令。

npx electron-forge install egoist/devdocs-app

协议处理器漏洞修复

·阅读时间 2 分钟

已发现一个远程代码执行漏洞,影响使用自定义协议处理程序的 Electron 应用程序。此漏洞已被分配 CVE 标识符CVE-2018-1000006


受影响的平台

在 Windows 上运行并注册为协议(例如 myapp://)的默认处理程序的 Electron 应用程序存在漏洞。

此类应用程序可能会受到影响,无论协议是如何注册的,例如使用本机代码、Windows 注册表或 Electron 的app.setAsDefaultProtocolClient API。

macOS 和 Linux **不受**此问题影响。

缓解措施

我们已经发布了新的 Electron 版本,其中包含此漏洞的修复程序:1.8.2-beta.51.7.121.6.17。我们敦促所有 Electron 开发人员立即将他们的应用程序更新到最新的稳定版本。

如果您因任何原因无法升级您的 Electron 版本,您可以在调用app.setAsDefaultProtocolClient时将 -- 作为最后一个参数附加,这可以防止 Chromium 解析其他选项。双破折号 -- 表示命令选项的结束,之后只接受位置参数。

app.setAsDefaultProtocolClient(protocol, process.execPath, [
'--your-switches-here',
'--',
]);

有关更多详细信息,请参阅 app.setAsDefaultProtocolClient API。

要了解有关保护您的 Electron 应用安全的最佳实践,请参阅我们的安全教程

如果您希望报告 Electron 的漏洞,请发送电子邮件至 security@electronjs.org

Electron 2.0 及未来 - 语义化版本

·一分钟阅读

Electron 的新主要版本正在开发中,随之而来的是我们版本控制策略的一些变化。从 2.0.0 版本开始,Electron 将严格遵守语义化版本控制。


这一变化意味着您会更频繁地看到主版本号的更新,并且这通常是对 Chromium 的重大更新。补丁版本也将更加稳定,因为它们现在只包含错误修复,而没有新功能。

主版本号递增

  • Chromium 版本更新
  • Node.js 主版本更新
  • Electron 破坏性 API 更改

次要版本号递增

  • Node.js 次要版本更新
  • Electron 非破坏性 API 更改

补丁版本号递增

  • Node.js 补丁版本更新
  • 与修复相关的 Chromium 补丁
  • Electron 错误修复

由于 Electron 的 semver 范围现在将更有意义,我们建议使用 npm 默认的 --save-dev 标志来安装 Electron,它会在版本号前加上 ^,让您安全地及时更新次要版本和补丁版本。

npm install --save-dev electron

对于仅对错误修复感兴趣的开发者,您应该使用波浪线 semver 前缀,例如 ~2.0.0,它永远不会引入新功能,只进行修复以提高稳定性。

更多详情,请参阅 electronjs.org/docs/tutorial/electron-versioning

Electron 的新国际化网站

·7分钟阅读

Electron 有了一个新网站:electronjs.org!我们用 Node.js Web 服务器替换了静态 Jekyll 网站,这使我们能够灵活地进行国际化,并为更多令人兴奋的新功能铺平了道路。


🌍 翻译

我们已经开始进行网站国际化工作,目标是让全球开发者都能方便地进行 Electron 应用开发。我们正在使用一个名为Crowdin的本地化平台,它与 GitHub 集成,能够自动打开和更新拉取请求,将内容翻译成不同的语言。

Electron Nav in Simplified Chinese

尽管我们到目前为止一直在悄悄地进行这项工作,但已有超过 75 名 Electron 社区成员通过各种途径发现了该项目,并加入了网站国际化和将 Electron 文档翻译成 20 多种语言的工作。我们看到世界各地的人们每天都有贡献,其中法语、越南语、印度尼西亚语和中文的翻译处于领先地位。

要选择您的语言并查看翻译进度,请访问 electronjs.org/languages

Translations in progress on Crowdin

如果您精通多种语言,并有兴趣帮助翻译 Electron 的文档和网站,请访问electron/electron-i18n仓库,或直接在Crowdin上进行翻译,您可以使用 GitHub 账户登录。

目前 Crowdin 上已为 Electron 项目启用了 21 种语言。添加更多语言的支持非常容易,如果您有兴趣帮助翻译但未看到您的语言列表,请告诉我们,我们将为您启用。

原始翻译文档

如果您希望阅读原始 Markdown 格式的文档,现在可以用任何语言进行阅读

git clone https://github.com/electron/electron-i18n
ls electron-i18n/content

应用页面

从今天起,任何 Electron 应用都可以轻松地在 Electron 网站上拥有自己的页面。例如,请查看Etcher1ClipboardGraphQL Playground,下图为网站日文版上的截图。

GraphQL Playground

市面上存在一些令人惊叹的 Electron 应用,但它们并不总是容易找到,而且并非所有开发者都有时间和资源来构建一个合适的网站来推广和分发他们的应用。

仅使用一个PNG 图标文件和少量的应用程序元数据,我们就能收集到有关给定应用程序的大量信息。利用从 GitHub 收集的数据,应用程序页面现在可以显示公共存储库中每个应用程序的截图、下载链接、版本、发行说明和 README。利用从每个应用程序图标中提取的调色板,我们可以生成大胆且易于访问的颜色,为每个应用程序页面提供视觉上的区分。

如今,应用程序索引页还提供了类别和关键词过滤器,用于查找有趣的应用程序,如GraphQL GUIp2p 工具

如果您有想要在网站上展示的 Electron 应用,请在 electron/electron-apps 仓库中提交一个拉取请求。

使用 Homebrew 一行安装

macOS 的Homebrew包管理器有一个名为cask的子命令,它可以通过在终端中使用单个命令轻松安装桌面应用程序,例如 brew cask install atom

我们已经开始收集流行的 Electron 应用的 Homebrew cask 名称,现在将在每个具有 cask 的应用页面上显示安装命令(针对 macOS 用户)。

Installation options tailored for your platform: macOS, Windows, Linux

要查看所有具有 homebrew cask 名称的应用程序,请访问electronjs.org/apps?q=homebrew。如果您知道还有其他带有 cask 的应用程序我们尚未索引,请添加它们!

🌐 新域名

我们已将网站从 electron.atom.io 迁移到一个新域名:electronjs.org

Electron 项目诞生于Atom内部,Atom 是 GitHub 构建在 Web 技术上的开源文本编辑器。Electron 最初名为 atom-shell。Atom 是第一个使用它的应用程序,但很快人们就意识到这个神奇的 Chromium + Node 运行时可以用于各种不同的应用程序。当 Microsoft 和 Slack 等公司开始使用 atom-shell 时,很明显该项目需要一个新的名称。

于是,“Electron”诞生了。2016 年初,GitHub 组建了一个新团队,专门负责 Electron 的开发和维护,独立于 Atom。自那时以来,Electron 已被数千名应用程序开发者采用,现在许多大型公司都依赖它,其中许多公司拥有自己的 Electron 团队。

支持 Atom 和GitHub Desktop等 GitHub 的 Electron 项目仍然是我们的团队的重点,但通过迁移到一个新域名,我们希望能够更清晰地区分 Atom 和 Electron 之间的技术区别。

🐢🚀 Node.js 无处不在

之前的 Electron 网站是使用流行的 Ruby 类静态站点生成器Jekyll构建的。Jekyll 是构建静态网站的绝佳工具,但网站已经开始超出其能力范围。我们需要更多动态功能,如正确的重定向和动态内容渲染,因此Node.js服务器是显而易见的选择。

Electron 生态系统包含用许多不同编程语言编写的组件的项目,从 Python 到 C++ 再到 Bash。但 JavaScript 是 Electron 的基础,也是我们社区中最常用的语言。

通过将网站从 Ruby 迁移到 Node.js,我们旨在降低希望为网站做出贡献的人的入门门槛。

⚡️ 更轻松的开源参与

如果您在系统中安装了Node.js(8 或更高版本)和git,则可以轻松地在本地运行该网站。

git clone https://github.com/electron/electronjs.org
cd electronjs.org
npm install
npm run dev

新网站托管在 Heroku 上。我们使用部署管道和Review Apps功能,该功能会自动为每个拉取请求创建一个正在运行的应用程序副本。这使得审查者可以轻松地在实时网站副本上查看拉取请求的实际效果。

🙏 感谢贡献者

我们要特别感谢世界各地所有贡献了自己的时间和精力来帮助改进 Electron 的人士。开源社区的热情对 Electron 的成功起到了不可估量的作用。谢谢!

Thumbs up!

Chromium RCE 漏洞修复

·一分钟阅读

已发现一个远程代码执行漏洞,该漏洞存在于 Google Chromium 中,影响了所有近期版本的 Electron。任何访问远程内容的 Electron 应用程序都可能受到此漏洞的攻击,无论sandbox 选项是否启用。

我们发布了两个新版本的 Electron:1.7.81.6.14,它们都包含对此漏洞的修复。我们敦促所有 Electron 开发人员立即将其应用程序更新到最新的稳定版本。

npm i electron@latest --save-dev

要了解有关保护您的 Electron 应用安全的最佳实践,请参阅我们的安全教程

如果您想报告 Electron 中的漏洞,请联系 security@electronjs.org

宣布在 Electron 中支持 TypeScript

·阅读时长 5 分钟

electron npm 包现在包含一个 TypeScript 定义文件,该文件提供了整个 Electron API 的详细注释。这些注释可以改善您的 Electron 开发体验,即使您编写的是纯 JavaScript。只需 npm install electron 即可在您的项目中获取最新的 Electron 类型。


TypeScript 是 Microsoft 创建的开源编程语言。它是 JavaScript 的超集,通过添加对静态类型的支持来扩展该语言。近年来,TypeScript 社区发展迅速,在最近的 Stack Overflow 开发者调查中,TypeScript 被评为最受欢迎的编程语言之一。TypeScript 被描述为“可扩展的 JavaScript”,GitHubSlackMicrosoft的团队都在使用它来编写可扩展的 Electron 应用程序,供数百万人使用。

TypeScript 支持 JavaScript 中的许多较新语言功能,如类、对象解构和 async/await,但其真正区别的特点是类型注解。声明程序预期的输入和输出数据类型可以在编译时帮助您发现错误,从而减少 bug,并且注解还可以作为程序工作方式的正式声明。

当库是用纯 JavaScript 编写时,类型通常只是在编写文档时作为事后考虑而模糊定义的。函数通常可以接受比文档说明更多的类型,或者函数可能具有未在文档中说明的隐藏约束,这可能导致运行时错误。

TypeScript 通过定义文件解决了这个问题。TypeScript 定义文件描述了库的所有函数及其预期的输入和输出类型。当库作者将 TypeScript 定义文件与他们发布的库捆绑在一起时,库的消费者就可以在编辑器中直接探索其 API并立即开始使用它,通常无需查阅库的文档。

许多流行的项目,如AngularVue.jsnode-github(现在还有 Electron!)会编译自己的定义文件并将其与发布的 npm 包捆绑在一起。对于不捆绑自己定义文件的项目,还有一个DefinitelyTyped,这是一个由社区维护的定义文件第三方生态系统。

安装

从 1.6.10 版本开始,每次 Electron 发布都包含其自己的 TypeScript 定义文件。当您从 npm 安装 electron 包时,electron.d.ts 文件会自动与安装的包一起打包。

安装 Electron 的最安全方法是使用精确的版本号

npm install electron --save-dev --save-exact

或者,如果您使用的是 yarn

yarn add electron --dev --exact

如果您已经在使用第三方定义,如 @types/electron@types/node,您应该将它们从您的 Electron 项目中删除,以防止任何冲突。

该定义文件源自我们结构化的 API 文档,因此它将始终与Electron 的 API 文档保持一致。只需安装 electron,您就能始终获得与您使用的 Electron 版本同步的 TypeScript 定义。

用法

有关如何安装和使用 Electron 新 TypeScript 注解的摘要,请观看此短演示视频

如果您使用Visual Studio Code,您已经内置了 TypeScript 支持。还有针对AtomSublimevim其他编辑器的社区维护插件。

一旦您的编辑器配置为支持 TypeScript,您将开始看到更多上下文感知的行为,如自动完成建议、内联方法引用、参数检查等。

Method autocompletion

Method reference

Argument checking

开始使用 TypeScript

如果您是 TypeScript 新手并想了解更多信息,Microsoft 的这个入门视频提供了关于该语言创建原因、工作原理、使用方法以及未来方向的良好概述。

在官方 TypeScript 网站上还有一个手册和一个示例

由于 TypeScript 是 JavaScript 的超集,您现有的 JavaScript 代码已经是有效的 TypeScript。这意味着您可以逐步将现有的 JavaScript 项目迁移到 TypeScript,根据需要添加新的语言功能。

致谢

这个项目得以实现,离不开 Electron 社区的开源维护者的帮助。感谢Samuel AttardFelix RiesebergBirunthan MohanathasMilan BurdaBrendan Forster以及许多其他人提供的 bug 修复、文档改进和技术指导。

支持

如果您在使用 Electron 的新 TypeScript 定义文件时遇到任何问题,请在electron-typescript-definitions仓库中提交 issue。

祝您 TypeScript 愉快!

本周项目:Jasper

·6 分钟阅读

本周我们采访了 Jasper 的创建者。Jasper 是一款基于 Electron 的工具,用于管理 GitHub 通知。


你好!你是谁?

我是Ryo Maruyama,一名在日本的软件开发者。我正在开发JasperESDoc

Jasper 是什么?

Jasper 是一款灵活且强大的 GitHub issue 阅读器。它支持 github.com 和 GitHub Enterprise 上的 issues 和 pull requests。

Jasper App Screenshot

你为什么要做这个?

当人们在工作或参与开源项目时使用 GitHub,他们往往每天都会收到大量通知。作为订阅通知的一种方式,GitHub 提供电子邮件和Web 通知。我使用了几年,但遇到了以下问题:

  • 很容易忽略被提及、我评论过或我关注的 issues。
  • 我把一些 issues 放在脑海的一角稍后查看,但有时会忘记它们。
  • 为了不忘记 issues,我会在浏览器中打开很多标签页。
  • 很难查看所有与我相关的 issues。
  • 很难掌握我团队的所有活动。

我花了大量时间和精力来防止这些问题,所以我决定创建一个 GitHub issue 阅读器来高效地解决这些问题,并开始开发 Jasper。

谁在使用 Jasper?

Jasper 被一些使用 GitHub 的公司的开发者、设计师和经理使用。当然,也有一些开源开发者在使用它。GitHub 的一些员工也在使用它!

Jasper 如何工作?

一旦 Jasper 配置完成,就会出现以下屏幕。从左到右,你可以看到“流列表”、“issues 列表”和“issue 正文”。

Jasper Start Screen

这个“流”是 Jasper 的核心功能。例如,如果你想查看“分配给 @zeke 在 electron/electron 仓库中的 issues”,你就创建以下流:

repo:electron/electron assignee:zeke is:issue

Jasper Start Screen 2

创建流并等待几秒钟后,你就可以看到符合条件的 issues。

Jasper Start Screen 3

我们可以用流做什么?

我将介绍流可以使用哪些类型的条件。

用户和团队

Issues
mentions:cat mentions:dog提及用户 catdog 的 Issues
author:cat author:dog由用户 catdog 创建的 Issues
assignee:cat assignee:dog分配给 catdog 的 Issues
commenter:cat commenter:dogcatdog 评论过的 Issues
involves:cat involves:dog“涉及” catbob 的 Issues
team:animal/white-cat team:animal/black-doganimal/white-catanimal/black-dog 中提及的 Issues

involves 意味着 mentionauthorassigneecommenter

仓库和组织

Issues
repo:cat/jump repo:dog/runcat/jumpdog/run 中的 Issues
org:electron user:cat user:dogelectroncatdog 中的 Issues

orguser 相同

属性

Issues
repo:cat/jump milestone:v1.0.0 milestone:v1.0.1附加到 cat/jump 中的 v1.0.0v1.0.1 的 Issues
repo:cat/jump label:bug label:blocker附加了 cat/jump 中的 bug **和** blocker 的 Issues
electron OR atomshell包含 electronatomshell 的 Issues

审查状态

Issues
is:pr review:requiredcat/jump 中需要审查的 Issues
is:pr review-requested:catcat 请求审查的 Issues。
但这些尚未被审查。
is:pr reviewed-by:cat已被 cat 审查过的 Issues

正如你可能注意到的,流可以使用 GitHub 的搜索查询。有关如何使用流和搜索查询的更多信息,请参阅以下 URL:

Jasper 还具有未读 issues 管理、未读评论管理、标记星标、通知更新、过滤 issues、键盘快捷键等功能。

Jasper 是付费产品吗?多少钱?

Jasper 售价 12 美元。但你可以使用 免费试用版 30 天。

为什么选择在 Electron 上构建 Jasper?

我喜欢 Electron 的以下方面:

  • 可以使用 JavaScript/CSS/HTML 开发应用程序。
  • 可以为 Windows、Mac 和 Linux 平台构建应用程序。
  • Electron 正在积极开发,并拥有一个庞大的社区。

这些功能使得桌面应用程序的开发快速而简单。这太棒了!如果你有任何产品想法,都应该考虑使用 Electron。

在开发 Jasper 的过程中,您遇到过哪些挑战?

我很难理解“流”的概念。起初,我考虑使用 GitHub 的Notifications API。然而,我注意到它不支持某些用例。之后,我考虑除了 Notification API 之外,还使用Issues APIPull Requests API。但它从未成为我想要的。然后,在思考各种方法时,我意识到轮询 GitHub 的Search API将提供最大的灵活性。经过大约一个月的实验才达到这一点,然后我花了两天时间实现了 Jasper 的原型,其中包含了流的概念。

注意:轮询最多每 10 秒一次。这对于 GitHub API 的限制来说是足够可以接受的。

下一步是什么?

我计划开发以下功能:

  • 过滤后的流:一个流有一些过滤后的流,用于过滤流中的 issues。它就像 SQL 中的视图。
  • 多账户:你可以同时使用 github.com 和 GHE。
  • 提高性能:目前在 WebView 中加载 issue 的速度比普通浏览器慢。

在 Twitter 上关注 @jasperappio 以获取更新。