跳到主要内容

Touch Bar 支持

·阅读时长 3 分钟

Electron 1.6.3 Beta 版本初步支持 macOS Touch Bar


新的 Touch Bar API 允许你添加按钮、标签、弹出窗口、颜色选择器、滑块和间隔符。这些元素可以动态更新,并在交互时发出事件。

这是此 API 的首个发布版本,因此将在接下来的几个 Electron 发布版本中不断演进。请查阅发布说明以获取更多更新,并提交 议题 以报告任何问题或缺失的功能。

你可以通过 npm install electron@beta 安装此版本,并在 Electron TouchBarBrowserWindow 文档中了解更多信息。

非常感谢 @MarshallOfSound 为 Electron 贡献此功能。🎉

Touch Bar 示例

Touch Bar Gif

下面是创建 Touch Bar 中简单老虎机游戏的示例。它演示了如何创建 Touch Bar、样式化项目、将其与窗口关联、处理按钮点击事件以及动态更新标签。

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

const { TouchBarButton, TouchBarLabel, TouchBarSpacer } = TouchBar;

let spinning = false;

// Reel labels
const reel1 = new TouchBarLabel();
const reel2 = new TouchBarLabel();
const reel3 = new TouchBarLabel();

// Spin result label
const result = new TouchBarLabel();

// Spin button
const spin = new TouchBarButton({
label: '🎰 Spin',
backgroundColor: '#7851A9',
click: () => {
// Ignore clicks if already spinning
if (spinning) {
return;
}

spinning = true;
result.label = '';

let timeout = 10;
const spinLength = 4 * 1000; // 4 seconds
const startTime = Date.now();

const spinReels = () => {
updateReels();

if (Date.now() - startTime >= spinLength) {
finishSpin();
} else {
// Slow down a bit on each spin
timeout *= 1.1;
setTimeout(spinReels, timeout);
}
};

spinReels();
},
});

const getRandomValue = () => {
const values = ['🍒', '💎', '7️⃣', '🍊', '🔔', '⭐', '🍇', '🍀'];
return values[Math.floor(Math.random() * values.length)];
};

const updateReels = () => {
reel1.label = getRandomValue();
reel2.label = getRandomValue();
reel3.label = getRandomValue();
};

const finishSpin = () => {
const uniqueValues = new Set([reel1.label, reel2.label, reel3.label]).size;
if (uniqueValues === 1) {
// All 3 values are the same
result.label = '💰 Jackpot!';
result.textColor = '#FDFF00';
} else if (uniqueValues === 2) {
// 2 values are the same
result.label = '😍 Winner!';
result.textColor = '#FDFF00';
} else {
// No values are the same
result.label = '🙁 Spin Again';
result.textColor = null;
}
spinning = false;
};

const touchBar = new TouchBar([
spin,
new TouchBarSpacer({ size: 'large' }),
reel1,
new TouchBarSpacer({ size: 'small' }),
reel2,
new TouchBarSpacer({ size: 'small' }),
reel3,
new TouchBarSpacer({ size: 'large' }),
result,
]);

let window;

app.once('ready', () => {
window = new BrowserWindow({
frame: false,
titleBarStyle: 'hidden-inset',
width: 200,
height: 200,
backgroundColor: '#000',
});
window.loadURL('about:blank');
window.setTouchBar(touchBar);
});

本周项目:Voltra

·阅读时长 6 分钟

本周我们采访了 Aprile ElcichPaolo Fragomeni,聊了聊 Voltra,这是一个由 Electron 驱动的音乐播放器。


什么是 Voltra?

Voltra 是一款为希望拥有自己音乐的人设计的音乐播放器。它也是一个商店,你可以根据你已有的音乐发现和购买新音乐。它无广告,支持桌面和移动平台。它也不会监视你。

voltra-artistview

Voltra 适合哪些人?

任何听音乐的人。

是什么促使你们创建 Voltra?

广播一直拥有庞大的听众群体。它正从空中广播转向互联网。现在你可以点播音乐——这是一种广播复兴!许多新产品和服务因此应运而生,但流媒体广播仍然让别人控制你的音乐以及你的体验方式。

我们想要一个完全专注于你拥有音乐的产品。一个可以让你轻松直接从艺术家或唱片公司发现和购买新音乐的产品。

有免费版本吗?

桌面播放器是完全免费的。出售你的音乐也是免费的!我们没有广告支持。

由于该应用是免费的,我们可能会在稍后将其开源。目前我们没有足够的精力来管理它。我们对于功能和发展方向也有非常具体的想法。我们有一个活跃的 Beta 社区,并且我们认真对待他们的反馈。

你们如何盈利?

我们有高级功能!

我们的 Voltra 音频存档是一项专为音乐设计的云备份服务。我们不压缩或分享数据块。您的音乐收藏将为您进行物理备份。

对于艺术家和唱片公司,我们的 专业会员资格提供了帮助他们触达更多相关受众的工具,例如分析和专业的艺术家网页。

Voltra 有何不同?

设计和可用性对我们来说至关重要。我们希望为听众提供无干扰的听音乐体验!市面上有一些有趣的音乐播放器和商店。但其中许多比它们的创作者意识到的更高级、更难用。我们希望 Voltra 能够触达尽可能多的人。

我们也不从艺术家或唱片公司抽取分成。这是我们关键的差异化优势。这非常重要,因为它降低了艺术家将音乐推向市场的门槛。

你们做出过哪些设计和技术决策?

在设计 Voltra 时,我们考虑了原生应用和网络的 UI 惯例,我们也深入思考了可以移除哪些东西。我们有一个活跃的私人 Beta 测试组,他们在过去几个月里给了我们关键的反馈。

我们发现专辑封面和摄影作品对人们来说非常重要。许多播放器只是文件列表。拥有实体专辑的一件很酷的事情就是专辑封面,我们希望在 Voltra 桌面应用中强调这一点。

voltra-albumview

我们还确保不随意改动用户的文件。我们使用文件监视功能,这样你就可以将文件放在任何你想要的地方,我们不会替你重命名或移动它们。我们有一个嵌入式数据库来跟踪被监视目录的状态,以便即使进程没有运行,我们也能跟踪新增的文件。

在构建 Voltra 过程中遇到过哪些挑战?

我们投入大量时间关注性能。我们最初使用了框架,但后来转向了原生 Javascript。根据我们的经验,框架提供的通用抽象所带来的性能损失和繁琐不如直接使用原生 Javascript。

目前我们可以很好地处理超大型集合。大型集合可能意味着数万张图片!从渲染进程直接使用 Node.js 的文件系统模块,可以非常轻松地根据 DOM 事件超快速地懒加载和卸载大量图片。

总的来说,setImmediaterequestIdleCallback 是在执行大量处理的同时保持 UI 响应性的极其重要的工具。更具体地说,将 CPU 密集型任务分配到单独的进程中确实有助于保持用户界面的响应性。例如,我们将实际的音频上下文移到了一个单独的进程中,通过 IPC 与其通信,以避免繁忙的 UI 可能造成的干扰。

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

浏览器的沙箱对我们的应用来说限制太多。但我们也在开发一个网页播放器。因此,我们可以在两种实现之间共享几乎 100% 的代码,这是一个巨大的优势。

我们实际上最初是使用 Swift 构建了一个原生应用。我们发现的主要问题是我们重复发明了许多东西。网络拥有世界上最大的开源生态系统。所以我们很快就转向了 Electron。

此外,也是最重要的一点,使用 Electron,你只需开发一次,它就应该在所有主要平台上™正常工作。虽然不能完全保证,但为每个平台原生编码的成本肯定会超过 Electron 带来的任何其他成本。

你们最喜欢 Electron 的哪些方面?

事半功倍!:将 Node.js 的网络堆栈和 Chromium 的呈现层打包在一起,是事半功倍的秘诀。

能力:它只是 Web 技术栈,所以实际上我们整个团队都可以参与到产品的实际构建中。

社区:有一个组织良好且非常善于沟通的社区!在这样的支持下进行开发,我们感觉非常好。

Electron 在哪些方面可以改进?

我们希望看到 Electron 认可并推荐一个单一的打包工具。打包工具对于 Electron 的重要性,就像包管理器对于 Node 的重要性一样。用户领域存在多种打包工具,每种都有有趣的功能,但每种也都有 Bug。社区达成共识将有助于引导贡献者投入的精力。

接下来有什么计划?

我们‘re 目前正在开发一个移动应用,并与艺术家和唱片公司合作,将他们的音乐添加到 Voltra 商店。嘿!如果你是艺术家或唱片公司,立即注册!我们计划在达到 1000 万首曲目目标时开放商店。

Electron 内部:将 Chromium 构建为库

·阅读时长 7 分钟

Electron 基于 Google 的开源项目 Chromium,该项目的设计初衷并不一定是为了被其他项目使用。本文介绍了如何将 Chromium 构建为供 Electron 使用的库,以及构建系统多年来的演变过程。


使用 CEF

Chromium 嵌入框架 (CEF) 是一个将 Chromium 转换为库的项目,并提供基于 Chromium 代码库的稳定 API。非常早期的 Atom 编辑器和 NW.js 版本都使用过 CEF。

为了维护稳定的 API,CEF 隐藏了 Chromium 的所有细节,并用自己的接口封装了 Chromium 的 API。因此,当我们需要访问底层的 Chromium API 时,例如将 Node.js 集成到网页中,CEF 的优点反而成了障碍。

因此,最终 Electron 和 NW.js 都转向直接使用 Chromium 的 API。

作为 Chromium 的一部分进行构建

尽管 Chromium 官方不支持外部项目,但其代码库是模块化的,并且很容易构建一个基于 Chromium 的最小浏览器。提供浏览器界面的核心模块称为 Content Module。

要使用 Content Module 开发项目,最简单的方法是将项目作为 Chromium 的一部分进行构建。这可以通过首先检出 Chromium 的源代码,然后将项目添加到 Chromium 的 DEPS 文件来完成。

NW.js 和非常早期的 Electron 版本都采用这种方式进行构建。

缺点是,Chromium 的代码库非常庞大,需要非常强大的机器才能构建。对于普通笔记本电脑来说,可能需要 5 个小时以上。因此,这极大地影响了能够为项目做出贡献的开发者数量,同时也减慢了开发速度。

将 Chromium 构建为单个共享库

作为 Content Module 的使用者,Electron 在大多数情况下无需修改 Chromium 的代码,因此改进 Electron 构建的一个显而易见的方法是将 Chromium 构建为共享库,然后在 Electron 中链接它。这样一来,开发者在贡献 Electron 时就不再需要构建完整的 Chromium 了。

libchromiumcontent 项目由 @aroben 为此目的创建。它将 Chromium 的 Content Module 构建为共享库,然后提供 Chromium 的头文件和预构建二进制文件供下载。libchromiumcontent 初始版本的代码可以在此链接中找到。

brightray 项目也作为 libchromiumcontent 的一部分诞生,它提供了 Content Module 的一个薄层封装。

通过结合使用 libchromiumcontent 和 brightray,开发者可以快速构建一个浏览器,而无需深入了解构建 Chromium 的细节。它还消除了构建项目对快速网络和强大机器的要求。

除了 Electron,还有其他采用这种方式构建的基于 Chromium 的项目,例如 Breach 浏览器

过滤导出符号

在 Windows 上,一个共享库可以导出的符号数量是有限制的。随着 Chromium 代码库的增长,libchromiumcontent 中导出的符号数量很快超过了这个限制。

解决方案是在生成 DLL 文件时过滤掉不需要的符号。其工作原理是向链接器提供一个 .def 文件,然后使用脚本判断某个命名空间下的符号是否应该被导出

通过这种方法,尽管 Chromium 不断添加新的导出符号,libchromiumcontent 仍然可以通过剔除更多符号来生成共享库文件。

组件构建

在讨论 libchromiumcontent 采取的后续步骤之前,首先介绍 Chromium 中的组件构建概念非常重要。

作为一个庞大的项目,Chromium 在构建时的链接步骤非常耗时。通常开发者做少量改动后,可能需要 10 分钟才能看到最终输出。为了解决这个问题,Chromium 引入了组件构建,它将 Chromium 中的每个模块构建为单独的共享库,从而使得最终链接步骤花费的时间几乎可以忽略不计。

分发原始二进制文件

随着 Chromium 的不断增长,其中导出的符号数量之多,甚至 Content Module 和 Webkit 的符号数量都超过了限制。仅仅通过剔除符号已经不可能生成一个可用的共享库了。

最终,我们不得不直接分发 Chromium 的原始二进制文件,而不是生成一个单一的共享库。

正如前面介绍的,Chromium 有两种构建模式。由于分发原始二进制文件,我们不得不在 libchromiumcontent 中分发两种不同的二进制版本。一种称为 static_library 构建,包含 Chromium 正常构建生成的每个模块的所有静态库。另一种是 shared_library,包含组件构建生成的每个模块的所有共享库。

在 Electron 中,Debug 版本链接到 libchromiumcontent 的 shared_library 版本,因为它下载量小,且在链接最终可执行文件时耗时较少。而 Release 版本链接到 libchromiumcontent 的 static_library 版本,这样编译器可以生成完整的符号(这对于调试很重要),并且链接器可以做更好的优化,因为它知道哪些目标文件是必需的,哪些不是。

因此,对于日常开发,开发者只需构建 Debug 版本,这不需要良好的网络或强大的机器。尽管 Release 版本需要更好的硬件来构建,但它可以生成更优化的二进制文件。

gn 更新

作为世界上最大的项目之一,大多数普通系统不适合构建 Chromium,Chromium 团队开发了他们自己的构建工具。

早期版本的 Chromium 使用 gyp 作为构建系统,但它速度慢,并且其配置文件对于复杂项目来说难以理解。经过多年的开发,Chromium 切换到了 gn 作为构建系统,它更快,并且架构更清晰。

gn 的改进之一是引入了 source_set,它表示一组目标文件。在 gyp 中,每个模块由 static_libraryshared_library 表示,对于 Chromium 的正常构建,每个模块都会生成一个静态库,并在最终的可执行文件中链接在一起。通过使用 gn,每个模块现在只生成一堆目标文件,最终的可执行文件只需将所有目标文件链接在一起,因此不再生成中间的静态库文件。

然而,这项改进给 libchromiumcontent 带来了很大的麻烦,因为 libchromiumcontent 实际上需要中间的静态库文件。

解决这个问题的首次尝试是修补 gn 以生成静态库文件,这解决了问题,但远非一个理想的解决方案。

第二次尝试由 @alespergl 进行,他从目标文件列表中生成自定义静态库。他使用了一个技巧,首先运行一个虚拟构建来收集生成的目标文件列表,然后将该列表提供给 gn,实际构建静态库。这只对 Chromium 的源代码进行了最小的修改,并保持了 Electron 的构建架构不变。

总结

正如你所见,与将 Electron 作为 Chromium 的一部分进行构建相比,将 Chromium 构建为库需要付出更大的努力并持续维护。然而,后者消除了构建 Electron 对强大硬件的要求,从而使得更广泛的开发者能够构建并贡献 Electron。这些努力是完全值得的。

本周项目:WordPress Desktop

·阅读时长 4 分钟

本周我们采访了 Automattic 的一些人,聊了聊 WordPress Desktop,这是一个用于管理 WordPress 内容的开源桌面客户端。


WordPress Apps

人人都知道 WordPress,但 WordPress Desktop 是什么?

WordPress.com 桌面应用提供了一个无缝的跨平台体验,让你能够专注于内容和设计,而不会被浏览器标签分心——或者让你的网站保持在侧边但可访问。结合我们的浏览器支持和移动应用,你可以在任何地方以任何有助于你完成工作的方式构建你的网站。

为什么构建一个用于管理 WordPress 网站的桌面应用?难道不能完全基于 Web 吗?

它实际上使用的技术与你在浏览器中访问 WordPress.com 时完全相同。然而,它是本地托管的,因此加载时间极短。借助原生功能(例如停靠栏、通知等)的优势,你真的可以专注于你的 WordPress 网站和博客。

为什么选择在 Electron 上构建 WordPress Desktop?

2015 年底,我们以 Calypso 的形式重建了 WordPress.com 的大部分功能,Calypso 是一个使用 React 的开源现代 JavaScript 应用。我们开始研究 Electron,并对 Calypso 进行了一些更改,使其能够在本地运行。这是一次引人入胜的体验,我们认为进一步开发它非常有价值。

我们有几个团队在开发 Calypso。如果使用传统的桌面技术来构建一个与之相匹配的完整多平台 GUI 客户端,将会花费更多精力。通过使用 Electron,我们一个由 2-4 人组成的小团队得以利用其他团队的努力,并在几个月内构建了桌面应用。

在构建 WordPress Desktop 过程中遇到过哪些挑战?

我们很快就让应用的初始版本运行起来了,但将其调整为桌面应用的最佳运行状态花费了更多时间。该应用的一大挑战是您实际上在自己的机器上运行一个 Calypso 的副本——它完全是一个 API 驱动的 UI。这涉及到大量的桥接工作,并且更改会反馈回 Calypso 本身。

此外,我们还花费了大量精力为不同平台打包应用——我们提供 Windows、macOS 和 Linux 版本——并且这些平台之间存在足够的差异,使得这项工作颇具挑战性。

当时 Electron 相对较新,我们不断遇到很快就被修复的问题(有时甚至当天就修复了!)

Electron 在哪些方面应该改进?

Electron 已经提供了我们构建桌面应用所需的大部分功能,并且自从我们开始使用它以来,它发展得非常快。尽管如此,桌面应用中一些习以为常的功能,例如拼写检查和查找/替换,使用 Electron 原生实现起来比较困难。

我们也很乐意看到一些较新的 Chrome 技术也逐渐融入 Electron。我们特别热衷于尝试 WebVR。

你们最喜欢 Electron 的哪些方面?

我们选择 Electron 的主要原因,也是它最大的优势,是其非常活跃和开放的社区。Automattic 一直坚信开源。这是我们的核心信条之一,而 Electron 项目和社区也遵循了许多非常开放和积极的核心理念。

WordPress Desktop 接下来有什么计划?

我们模式的一大优点是桌面应用可以受益于任何新的 Calypso 功能——持续不断地改进。我们希望能够为应用添加更多功能,例如离线支持,这将真正让应用更接近原生体验,并提供更好的系统通知。

Automattic 是否有其他团队正在开发 Electron 应用程序?

是的,在我们为桌面应用程序努力之后,Simplenote 团队决定使用 Electron 为 Windows 和 Linux 构建桌面应用程序(原生 Mac 客户端已存在)。Simplenote Electron 应用程序也是开源的,并在 Github 上可用。

我们还有一个即将推出的使用 Electron 的 Raspberry Pi 集成。

如果其中任何内容引起了您的兴趣,我们非常乐意听到您的声音

有哪些 Electron 技巧对其他开发者可能有帮助?

发布已签名的桌面软件的过程对我们来说是相对新的,特别是对于 Windows。我们撰写了一篇关于Windows 应用程序代码签名的文章,其中包含了整个过程以及我们为了正确实现它所经历的一些障碍。

本周项目:Dat

·阅读时长 7 分钟

本周推荐的项目是 Dat,一个获得资助的开源去中心化数据分发工具。Dat 由一个地理分布式团队构建和维护,其中许多人协助撰写了这篇博文。


A screenshot of the main view of dat-desktop, showing a few rows of shared
dats

首先,Dat 是什么?

我们希望将点对点和分布式系统的优点引入数据共享。我们从科学数据共享开始,然后扩展到研究机构、政府、公共服务以及开源团队。

另一种理解方式是将其视为类似 Dropbox 或 BitTorrent Sync 的同步和上传应用程序,但 Dat 是开源的。我们的目标是成为一个强大、开源、非营利的数据共享软件,适用于大型、小型、中型、小批量和大批量数据。

要使用 dat 命令行工具,您只需要输入

dat share path/to/my/folder

Dat 将创建一个链接,您可以使用该链接将该文件夹发送给其他人——没有中心服务器或第三方能够访问您的数据。与 BitTorrent 不同的是,也无法嗅探谁在共享什么(更多详情请参阅 Dat Paper 草稿)。

现在我们知道了 Dat 是什么。那么 Dat Desktop 有何作用?

Dat Desktop 是一种让不熟悉或不想使用命令行的人更容易访问 Dat 的方式。您可以在您的机器上托管多个 dat,并通过网络提供数据。

能分享一些很棒的使用案例吗?

DataRefuge + Svalbard 项目

我们正在开发一个代号为Svalbard 项目的东西,它与DataRefuge相关,后者是一个致力于备份面临消失风险的政府气候数据的组织。Svalbard 的名字来源于北极地区的 Svalbard 全球种子库,它拥有一个巨大的地下植物 DNA 备份库。我们的版本是一个大型的、版本控制的公共科学数据集集合。一旦我们了解并信任元数据,我们就可以构建其他很棒的项目,例如分布式志愿者数据存储网络

加州公民数据联盟

CACivicData 是一个开源档案馆,提供加州跟踪政治资金的数据库 CAL-ACCESS 的每日下载。他们进行每日发布,这意味着他们的 zip 文件中托管了大量重复数据。我们正在努力将其数据托管为 Dat 仓库,这将减少引用特定版本或更新到新版本所需的麻烦和带宽。

Electron 更新

这个还没有具体实现,但我们认为一个有趣的使用案例是将编译好的 Electron 应用程序放入 Dat 仓库,然后使用 Electron 中的 Dat 客户端拉取构建好的应用程序二进制文件的最新增量,以节省下载时间,同时减少服务器的带宽成本。

谁应该使用 Dat Desktop?

任何希望通过点对点网络共享和更新数据的人。数据科学家、开放数据黑客、研究人员、开发者。如果有人有我们还没想到的很棒的使用案例,我们非常乐于接受反馈。您可以访问我们的 Gitter 聊天室,问我们任何问题!

Dat 和 Dat Desktop 接下来的发展是什么?

用户账户和元数据发布。我们正在开发一个 Dat 注册表 Web 应用程序,将部署在 datproject.org,它基本上是一个“数据集的 NPM”,但需要注意的是,我们将只充当一个元数据目录,数据可以存储在任何在线位置(与 NPM 或 GitHub 不同,它们的数据都是集中托管的,因为源代码足够小,可以全部放在一个系统中)。由于许多数据集非常庞大,我们需要一个联邦式注册表(类似于 BitTorrent tracker 的工作方式)。我们希望让人们能够轻松地从 Dat Desktop 使用注册表查找或发布数据集,从而使数据共享过程更加顺畅。

另一个功能是多作者/协作文件夹。我们有宏伟的计划来实现协作工作流,可能带有分支,类似于 git,只是围绕数据集协作进行设计。但是我们现在仍在致力于整体稳定性和协议标准化!

为什么选择在 Electron 上构建 Dat Desktop?

Dat 是使用 Node.js 构建的,因此与我们的集成非常契合。除此之外,我们的用户使用各种各样的机器,因为科学家、研究人员和政府官员可能被迫使用其所在机构的特定设置——这意味着我们需要能够同时支持 Windows、Linux 和 Mac。Dat Desktop 让我们轻松做到了这一点。

在构建 Dat 和 Dat Desktop 时遇到过哪些挑战?

弄清楚人们想要什么。我们从表格数据集开始,但我们意识到这是一个有点复杂的问题,而且大多数人不使用数据库。所以在项目进行到一半时,我们从头开始重新设计了一切,转而使用文件系统,并且再也没有回头看。

我们还遇到了一些常见的 Electron 基础设施问题,包括:

  • 遥测 - 如何捕获匿名使用统计数据
  • 更新 - 设置自动更新有点零碎和神奇
  • 发布 - XCode 签名、在 Travis 上构建发布版本、进行 Beta 构建,这些都是挑战。

我们还在 Dat Desktop 的“前端”代码中使用 Browserify 和一些很棒的 Browserify Transforms(这有点奇怪,因为即使我们有原生的 require,我们仍然进行打包——但这都是因为我们想要 Transforms)。为了更好地管理我们的 CSS,我们从 Sass 切换到了 sheetify。它极大地帮助我们模块化 CSS,并使我们的 UI 更容易转向带有共享依赖的组件化架构。例如,dat-colors 包含了我们所有的颜色,并在我们所有项目之间共享。

我们一直以来都是标准和极简抽象的忠实粉丝。我们整个界面都是使用常规 DOM 节点和一些辅助库构建的。我们已经开始将其中一些组件移入 base-elements,这是一个低级可重用组件库。与我们的大多数技术一样,我们会不断迭代直到做好为止,但作为一个团队,我们觉得我们正朝着正确的方向前进。

Electron 在哪些方面应该改进?

我们认为最大的痛点是原生模块。必须使用 npm 为 Electron 重新构建模块,这增加了工作流的复杂性。我们的团队开发了一个名为 prebuild 的模块,用于处理预构建的二进制文件,这对于 Node 来说效果很好,但 Electron 工作流在安装后仍然需要一个自定义步骤,通常是 npm run rebuild。这很令人烦恼。为了解决这个问题,我们最近转向了一种策略,即将所有平台的编译好的二进制版本都打包到 npm tarball 中。这意味着 tarball 会变大(尽管可以使用 .so 文件——共享库进行优化),这种方法避免了运行安装后脚本,也完全避免了 npm run rebuild 模式。这意味着 npm install 第一次就能为 Electron 做正确的事情。

你们最喜欢 Electron 的哪些方面?

API 设计得相当周全,相对稳定,并且在与上游 Node 版本保持同步方面做得很好,我们别无所求!

有哪些 Electron 技巧对其他开发者可能有帮助?

如果您使用原生模块,不妨试试 prebuild

跟踪 Dat 发展的最佳方式是什么?

在 Twitter 上关注 @dat_project,或订阅我们的电子邮件新闻通讯

本周项目:Ghost

·5 分钟阅读

本周我们与 Felix Rieseberg 进行了交流,他是 Slack 的桌面工程师,也是 Ghost Desktop 的维护者,Ghost Desktop 是一个用于 Ghost 发布平台的 Electron 客户端。


Ghost Desktop Screenshot

Ghost 是什么?

Ghost 是一个完全开源、可定制的平台,用于构建和运行现代在线出版物。我们为从 Zappos 到 Sky News 的博客、杂志和记者提供支持。

它与其他发布平台有何不同?

Ghost 成立于 2013 年 4 月,是在一次非常成功的 Kickstarter 众筹活动之后创建的,旨在打造一个完全专注于专业出版的新平台。我们的使命是为世界各地的独立记者和作家创建最好的开源工具,并对在线媒体的未来产生真正的影响。它提供更简单、更集中的体验:我们的编辑器完全围绕提供最佳写作体验而设计。

与经典的 WordPress 相比,它提供更简单、更流畅的体验——更容易设置和维护,自带所有重要功能,并且速度大大加快。与其他在线平台相比,Ghost 赋予作者对其内容的完全所有权和控制权,允许完全定制,并使作者能够围绕其出版物建立业务。

Ghost 是一家营利性公司吗?

这一点对我们很重要:Ghost 是一个独立的非营利组织。我们为现代新闻业&博客构建出版工具,因为我们相信言论自由很重要。我们的软件根据免费开源许可发布,我们的商业模式完全透明,并且我们的法律结构意味着我们赚取的 100% 资金都将重新投入到改进 Ghost 中。

Ghost Desktop 是什么?

Ghost Desktop 允许作者同时管理多个博客——并专注于写作。一些简单的事情,比如常用的写作快捷方式,在浏览器中无法实现,但在我们的桌面应用程序中是可用的。它允许其他应用程序通过 deeplinks 直接与博客通信

什么是 Ghost for Journalism?

今年我们非常激动地将我们全部 10 人的全职 Ghost 团队投入到帮助发展三个独立出版物中,并为此投入 45,000 美元的资源。我们称之为Ghost for Journalism

我们作为独立出版商的下一个伟大网络平台构建 Ghost 已经大约三年半了,现在我们达到了一个非常有趣的转折点。我们开始这段旅程是为了创建一个任何人都可以使用的简单、设计精良的博客平台。这始终是第一步。

从长远来看,我们希望 Ghost 成为世界上最优秀新闻业的绝佳平台,这意味着我们需要构建功能来吸引正是这些人。今年我们做出了一个非常慎重的决定,将重点放在这一点上。

为什么选择在 Electron 上构建 Ghost Desktop?

Ghost 在后端和前端都使用 JavaScript 和 Node.js,因此能够利用相同的技术和技能集使我们的团队能够更快地行动,构建更多功能,并最终提供更好的体验。此外,在 macOS、Windows 和 Linux 版本应用程序之间共享 95% 以上的代码,使我们能够专注于构建出色的核心用户体验,而无需为每个平台维护一个代码库。

在构建 Ghost Desktop 时遇到过哪些挑战?

拼写检查很可能仍然是最难提供的服务之一——我们可以轻松利用许多在线服务中的一个,但在保护用户隐私和自主权的同时正确检查多种语言的文本并不是一项简单的任务。

Electron 在哪些方面应该改进?

我们很希望看到 Electron 将操作系统的原生拼写检查功能引入其应用程序。我们梦想着一个世界,其中一个 <input> 字段能够获得与 NSTextView 相同的服务,但我们也深知这有多困难。

你们最喜欢 Electron 的哪些方面?

JavaScript 因其庞大的生态系统而闻名,包含无数工具和框架——但它带给我们的便利性再怎么强调也不为过。用 Electron 构建应用程序只比构建 Web 应用程序稍微难一点,这是一个惊人的成就。

Ghost 完成了吗?如果还没有,下一步计划是什么?

Ghost Desktop 也是一个正在进行的项目——距离完成还有很长的路。我们已经讨论了一段时间要为用户带来完整的离线模式,并且我们已经相当接近了。其他重要的工作领域是扩展和集成其他文本编辑应用程序(如 Word 或 Atom),最终让人们能够使用他们最喜欢的工具来撰写文章。总的来说,一旦我们发布了离线模式功能,我们将寻求与操作系统的更深入集成。如果您对此感兴趣,请加入我们

您最喜欢的一些 Electron 应用程序有哪些?

我是 KapFelonyVisual Studio Code 的忠实粉丝。

👻

本周项目:Beaker Browser

·阅读时长 4 分钟

本周我们采访了 Paul Frazee,他是 Beaker 浏览器的创建者。Beaker 是一款实验性的点对点网页浏览器,它使用 Dat 协议托管用户设备上的网站。


Beaker 是什么,为什么要创建它?

Beaker 是一款参与式浏览器。它是为独立黑客设计的浏览器。

Web 是闭源的。如果您想影响社交媒体的运作方式,您必须在 Facebook 或 Twitter 工作。对于搜索,您必须在 Google 工作。控制权掌握在公司手中,而不是用户自己。

使用 Beaker,我们有了一种新的 Web 协议:去中心化归档传输。“Dat”。它按需免费创建网站,然后从设备共享。无需服务器。这就是我们的创新。

Beakers Protocols

当您在 Beaker 中访问一个 Dat 网站时,您会下载文件。该网站永远属于您。您可以免费保存、分叉、修改并分享您的新版本。这一切都是开源的。

这就是它的意义所在:我们正在为开源网站制作一个浏览器。我们希望它成为社会黑客的工具包。

谁应该使用 Beaker?

黑客。模组制作者。创意人士。喜欢修修补改的人。

如何创建一个使用 Dat 的新项目?

我们有一个名为 bkr 的命令行工具,有点像 git + npm。这是创建一个网站的方法

$ cd ~/my-site
$ bkr init
$ echo "Hello, world!" > index.html
$ bkr publish

这是分叉一个网站的方法

$ bkr fork dat://0ff7d4c7644d0aa19914247dc5dbf502d6a02ea89a5145e7b178d57db00504cd/ ~/my-fork
$ cd ~/my-fork
$ echo "My fork has no regard for the previous index.html!" > index.html
$ bkr publish

这些网站随后会从您的浏览器中托管。这有点像 BitTorrent;您在 P2P 网状网络中共享网站。

如果您想要一个 GUI,我们浏览器内置了一些基本工具,但我们正在将这些工具推向 userland。这将全部成为可修改的用户应用程序。

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

对于这个项目来说很明显。如果我自己分叉 Chrome,我现在就会写 C++ 了!没人想那么做。我了解 Web 技术栈,并且可以快速使用它。这是无需多言的。

说实话,我不确定没有 Electron 我是否能做到这些。它是一个很棒的软件。

在构建 Beaker 时遇到过哪些挑战?

其中一半是摸索工具,弄清楚我可以做到什么程度。

构建浏览器本身相当容易。Electron 实际上是制作浏览器的工具包。... 除了浏览器标签页;那花了我很长时间才弄对。我最终放弃并学习了如何制作 SVG。它看起来好多了,但直到我弄对了,我经历了 3 或 4 次迭代。

Electron 在哪些方面应该改进?

如果我能把开发者工具停靠在 webview 里面,那将是太好了。

Beaker 接下来的发展是什么?

为 Dat 网站提供安全的 DNS 名称。一个社会可配置的 URL 方案,称为“app scheme”。更多 Dat API。

对于可能对项目感兴趣并愿意贡献力量的人,Beaker 在哪些方面需要帮助?

我们有很多未解决的问题。不要害怕联系我。freenode 上的 #beakerbrowser。我们维护一个贡献者页面,我们会把你加进去。如果您来奥斯汀,我请您喝啤酒。

有哪些 Electron 技巧对其他开发者可能有帮助?

  1. 使用现有的构建工具。相信我,你不会想自己折腾解决方案的。使用 electron-builder。使用样板仓库。
  2. 如果您需要在 Electron 仓库中提出问题,多做一些努力使其易于重现。这样您会更快获得回复,团队也会很感激。更好的是,尝试自己修复它。看看内部实现实际上挺有趣的。
  3. 至少通读所有指南和高级文档一次。
  4. 不要构建浏览器,这是一个饱和的市场。

本周项目:Kap

·阅读时长 7 分钟

Electron 社区正在快速壮大,人们正以惊人的速度创建功能强大的新应用和工具。为了庆祝这种创造性势头,并让社区了解一些新项目,我们决定开始每周一篇的博客系列,介绍值得关注的 Electron 相关项目。


这篇文章是该系列的第一篇,重点介绍了 Kap,这是一个开源的屏幕录制应用程序,由Wulkano构建,Wulkano 是一个由自由设计师和开发者组成的地理分布式团队。

Kap Screencast

Kap 是什么?

Kap 是一个开源的屏幕录制器,主要为设计师和开发者构建,以便轻松捕捉他们的工作。人们使用它来分享动画原型、记录 bug、制作有趣的 GIF 等等。

我们看到各年龄段和不同背景的人在教育场景、屏幕录制、教程等领域使用它……不胜枚举。甚至用来创建制作资产!我们的小型副项目受到如此好评,完全出乎我们的意料。

你们为什么构建它?

这是一个很好的问题,市面上并不缺屏幕录制器!我们觉得现有的替代品要么过于复杂、要么过于昂贵、要么功能太受限。没有一款能完全满足我们日常的需求。我们也认为,当我们使用的工具是开源时,这很好,这样每个人都可以帮助塑造它们。构建 Kap 最终很大程度上在于我们没有做什么。这一切都在细节中,一系列微小的改进累积起来,勾勒出了我们想要使用的工具的轮廓。

然而,也许最重要的是,Kap 已经成为一个让我们把烦恼抛在脑后,只是开心地为我们自己和像我们这样的人构建东西的地方。创造一个可以尽情宣泄、尝试新事物并享受手艺的环境非常重要。没有要求,没有压力,没有期望。设计师和开发者应该做副项目吗?当然。是的,他们应该。

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

原因有很多

  • Web 技术
  • 团队大部分成员是 Web 开发者
  • 我们投入了 JavaScript
  • 它为更多人贡献力量打开了大门
  • Electron 本身是开源的
  • node_modules 的强大和易于维护的模块化能力
  • 跨平台可能性

我们认为应用程序的未来在浏览器中,但我们还没有完全达到。Electron 是迈向这个未来的重要一步。它不仅使应用程序本身更容易访问,也使构建它们的代码更容易访问。一个有趣的想法是想象一个未来,操作系统是一个浏览器,而标签页本质上就是 Electron 应用程序。

此外,作为主要 Web 开发者,我们非常喜欢 JavaScript 的同构特性,您可以在客户端、服务器以及现在在桌面运行 JS。使用 Web 技术(HTML、CSS 和 JS),许多事情比原生开发简单得多:更快的原型开发、更少的代码、flexbox > auto-layout (macOS/iOS)。

在构建 Kap 时遇到过哪些挑战?

使用 Electron 提供的资源进行屏幕录制是最大的挑战。它们的性能不足以满足我们的要求,在我们看来会导致项目失败。虽然这不是 Electron 本身的问题,但原生开发和使用 Web 技术构建桌面应用程序之间仍然存在差距。

我们花了很多时间尝试解决 getUserMedia API 性能不佳的问题,这是一个源自 Chromium 的问题。当我们开始开发 Kap 时,主要目标之一是完全使用 Web 技术构建应用程序。在尝试了所有方法使其工作(最低要求是在 Retina 屏幕上达到 30 FPS)之后,我们最终不得不寻找另一种解决方案。

我在仓库里看到了一些 Swift 代码。那是什么?

在被迫寻找 getUserMedia 的替代方案后,我们开始尝试使用 ffmpeg。除了是音频和视频转换的最佳工具之一外,它还具备在几乎任何操作系统中录制屏幕的功能,我们得以录制清晰的视频,满足我们在 Retina 屏幕上 30 FPS 的最低要求。问题出在哪儿?性能是“😩”,CPU 使用率飙升。于是我们回到起点,讨论了我们的选择,并意识到我们必须做出妥协。由此产生了 Aperture,这是我们用 Swift 为 macOS 编写的屏幕录制库。

Electron 在哪些方面应该改进?

我们都知道 Electron 应用程序可能有点占用内存,但再次强调,这实际上是 Chromium 的问题。这是其工作原理的一部分,并且很大程度上取决于您运行的内容,例如 Kap 和 Hyper 通常使用不到 100MB 的内存。

我们看到的最大改进领域之一是负载,特别是 Electron 分发 Chromium 的方式。一个想法是拥有一个共享的 Electron 核心,并让应用程序安装程序检查系统上是否已存在它。

创建跨平台 Electron 应用程序的体验可以更好。现在平台之间存在太多不一致、特定平台的 API 以及缺失的功能,导致您的代码库充斥着 if-else 语句。例如,vibrancy(活力效果)只在 macOS 上受支持,自动更新器在 macOS 和 Windows 上工作方式不同,甚至在 Linux 上都不受支持。透明度在 Linux 上时灵时不灵,通常是不灵。

调用原生系统 API 也应该更容易。Electron 提供了一套非常好的 API,但有时您需要它不提供的功能。创建原生 Node.js 插件是一种选择,但使用起来很痛苦。理想情况下,Electron 应该自带一套良好的 FFI API,比如 fastcall。这将使我们能够用 JavaScript 编写 Swift 部分。

你们最喜欢 Electron 的哪些方面?

我们最喜欢的是,任何具有 Web 开发知识的人都可以构建多平台原生体验并为其做出贡献。更不用说在其上开发的便捷和乐趣、优秀的文档以及繁荣的生态系统。

从前端角度来看,构建 Kap 感觉与使用浏览器 API 构建一个简单网站没有区别。Electron 在使应用程序开发类似于(基本上等同于)Web 开发方面做得非常出色。实际上非常简单,我们甚至不需要框架或类似的工具来帮助我们,只需要干净模块化的 JS 和 CSS。

我们也非常喜欢构建它的团队、他们的奉献和支持,以及他们维护的活跃友好的社区。抱抱你们所有人!

Kap 接下来的发展是什么?

我们的下一步是审查应用程序,为 2.0.0 里程碑做准备,其中包括用 React 重写以及支持插件,让开发者能够扩展 Kap 的功能!我们邀请所有人关注项目并在我们的 GitHub 仓库上贡献力量。我们正在倾听,并希望听到尽可能多的人的意见,请告诉我们如何才能使 Kap 成为最适合您的工具

什么是 Wulkano?

Wulkano 是一家设计工作室和数字集体,一支由远程技术专家组成的团队,热爱共同参与客户项目和我们自己的项目。我们是一个分布式的、紧密协作的团队,成员来自不同的地方和背景,在我们的虚拟办公室(恰好是基于 Electron 的 Slack!)中分享知识、想法、经验,但最重要的是分享有趣的 GIF 和表情包。

有哪些 Electron 技巧对其他开发者可能有帮助?

利用并参与这个很棒的社区,查看Awesome Electron,看看示例,并利用出色的文档

Electron 简单示例

·2 分钟阅读

我们最近在 GitHub 总部为 Hackbright Academy 的成员举办了一场 Electron 黑客马拉松,Hackbright Academy 是一所位于旧金山的女性编程学校。为了帮助参与者快速启动他们的项目,我们自己的 Kevin Sawicki 创建了一些 Electron 示例应用。


如果您是 Electron 开发的新手或尚未尝试过它,这些示例应用是极好的入门点。它们小巧、易于阅读,并且代码注释丰富,解释了所有功能的运作方式。

要开始使用,请克隆此仓库

git clone https://github.com/electron/simple-samples

要运行下面的任何应用,请进入应用的目录,安装依赖项,然后启动

cd activity-monitor
npm install
npm start

活动监视器

显示 CPU 系统、用户和空闲活动时间的甜甜圈图表。

Screenshot

哈希

使用不同的算法显示输入文本的哈希值。

screenshot

镜像

以最大化尺寸播放电脑摄像头视频,如同照镜子一样。包括一个可选的彩虹滤镜效果,使用了 CSS 动画。

价格

使用 Yahoo Finance API 显示石油、黄金和白银的当前价格。

screenshot

URL

在窗口中加载命令行上传递的 URL。

其他资源

我们希望这些应用能帮助您开始使用 Electron。以下是其他一些学习资源

Electron 用户领域

·阅读时长 3 分钟

我们在 Electron 网站上新增了一个 userland(用户空间)部分,以帮助用户发现构成我们蓬勃发展的开源生态系统的人、包和应用。


github-contributors

用户空间的起源

用户空间是软件社区的人们聚集在一起分享工具和想法的地方。这个术语起源于 Unix 社区,在那里它指的是任何在内核之外运行的程序,但今天它的含义更广。当今 JavaScript 社区的人们提到用户空间时,通常指的是 npm 包注册表。这是大多数实验和创新发生的地方,而 Node 和 JavaScript 语言(就像 Unix 内核一样)则保留了一组相对小且稳定的核心功能。

Node 和 Electron

与 Node 一样,Electron 拥有一小组核心 API。这些 API 提供了开发多平台桌面应用所需的基本功能。这种设计理念使 Electron 能够保持灵活的工具特性,而不过分规定其使用方式。

用户空间是“核心”的对应物,它使开发者能够创建和分享扩展 Electron 功能的工具。

收集数据

为了更好地了解我们生态系统的趋势,我们分析了依赖于 electronelectron-prebuilt 的 15,000 个公共 GitHub 仓库的元数据

我们使用 GitHub APIlibraries.io API 和 npm 注册表收集了关于依赖项、开发依赖项、被依赖方、包作者、仓库贡献者、下载次数、分支次数、星标次数等信息。

然后我们使用这些数据生成了以下报告

  • 应用开发依赖项:在 Electron 应用中最常被列为 devDependencies 的包。
  • GitHub 贡献者:为众多 Electron 相关 GitHub 仓库做出贡献的 GitHub 用户。
  • 包依赖项:经常被其他 npm 包依赖的 Electron 相关 npm 包。
  • 星标应用:拥有众多星标的 Electron 应用(非 npm 包)。
  • 下载量最多的包:下载量很大的 Electron 相关 npm 包。
  • 应用依赖项:在 Electron 应用中最常被列为 dependencies 的包。
  • 包作者:Electron 相关 npm 包最多产的作者。

过滤结果

应用依赖项星标应用这样列出包、应用和仓库的报告都有一个文本输入框,可用于过滤结果。

当您在此输入框中输入时,页面的 URL 会动态更新。这使您可以复制代表特定用户空间数据切片的 URL,然后与他人共享。

babel

未来更多内容

第一批报告仅仅是个开始。我们将继续收集有关社区如何构建 Electron 的数据,并将向网站添加新的报告。

用于收集和显示这些数据的所有工具都是开源的

如果您对如何改进这些报告有任何想法,请通过在网站仓库或上述任何仓库中创建 issue 告知我们。

感谢 Electron 社区,是你们成就了今天的用户空间!