跳转到主要内容

5 篇标有“功能”的帖子

展示 Electron 核心的新功能

查看所有标签

electron/rfcs 介绍

·阅读时长 4 分钟

Electron 的 API 工作组正在采用开放的意见征集 (RFC) 流程,以帮助引导 Electron 核心的重大更改。

为什么需要 RFC?

简而言之,我们希望能够顺利地将重大变更引入 Electron 核心。

目前,新的代码更改主要通过 GitHub 上的 issue 和 pull request 进行讨论。对于大多数 Electron 的更改,这是一个很好的系统。许多 bug 修复、文档更改甚至新功能都足够简单,可以通过标准的 GitHub 流程进行异步审查和合并。

对于更重大的变更——例如,大型 API 接口或会影响大多数 Electron 应用的破坏性变更——在编写大部分代码之前,于构思阶段进行审查是很有意义的。

此流程被设计为向公众开放,这也将使广大的开源社区更容易在潜在变更进入 Electron 之前对其提供反馈。

它是如何运作的?

整个 RFC 流程位于 GitHub 上的 electron/rfcs 仓库中。步骤在仓库的 README 中有详细描述。

简而言之,一旦向 electron/rfcs 仓库提交了 PR,一个 RFC 就进入了提案(Proposed)阶段。一个提案中的 RFC 会进入

  • 激活(Active)状态,当该 PR 被合并到仓库的 main 分支时,这意味着 Electron 维护者们同意在 electron/electron 中实现该提案,或者
  • 拒绝(Declined)状态,如果该 PR 最终被拒绝。
信息

要使 RFC 变为“已激活”,PR 必须至少获得 2 名 API 工作组成员的批准。合并之前,RFC 应进行同步演示,并获得至少三分之二的 WG 成员法定人数的一致同意。如果达成共识,将触发为期一个月的最终评论期,之后 PR 将被合并。

一个激活状态的 RFC 在其实现被合并到 electron/electron 后,将进入完成(Completed)状态。

谁可以参与?

Electron 社区中的任何人都可以提交 RFC 或在 electron/rfcs 仓库中留下反馈!

我们希望使此过程成为双向对话,并鼓励社区参与,以获得可能在未来使用这些 API 的 Electron 应用程序的各种意见。如果您有兴趣对当前提议的 RFC 发表评论,Electron 的维护者已经创建了一些。

致谢

Electron 的 RFC 流程是基于许多已建立的开源 RFC 流程建模的。许多想法的灵感和主要文案部分都来自于:

Apple Silicon 支持

·3 分钟阅读

随着 Apple Silicon 硬件将在今年晚些时候发布,您该如何让自己的 Electron 应用在新硬件上运行呢?


随着 Electron 11.0.0-beta.1 的发布,Electron 团队现在正在发布运行在苹果计划今年晚些时候发布的全新 Apple Silicon 硬件上的 Electron 构建。您可以通过 npm install electron@beta 获取最新的 beta 版本,或者直接从我们的 发布网站下载。

它是如何运作的?

从 Electron 11 开始,我们将为 Intel Mac 和 Apple Silicon Mac 发布单独版本的 Electron。在此更改之前,我们已经发布了两个工件:darwin-x64mas-x64,后者用于 Mac App Store 的兼容性。我们现在还将发布另外两个工件:darwin-arm64mas-arm64,它们是上述工件的 Apple Silicon 等效版本。

我需要做什么?

您需要发布两个版本的应用程序:一个用于 x64(Intel Mac),一个用于 arm64(Apple Silicon)。好消息是,electron-packagerelectron-rebuildelectron-forge 已经支持针对 arm64 架构。只要您使用的是这些包的最新版本,在将目标架构更新到 arm64 后,您的应用程序就能完美运行。

将来,我们将发布一个包,允许您将 arm64x64 应用程序“合并”到一个通用二进制文件中,但值得注意的是,该二进制文件会非常大,可能不适合分发给用户。

更新:该包现已在 @electron/universal 上提供。您可以用它来将两个已打包的 x64 和 arm64 应用合并成一个单一的二进制文件。

潜在问题

原生模块

由于您要面向一个新的架构,您需要更新一些依赖项,这可能会导致构建问题。下面列出了一些依赖项的最低版本要求,供您参考。

依赖项版本要求
Xcode>=12.2.0
node-gyp>=7.1.0
electron-rebuild>=1.12.0
electron-packager>=15.1.0

由于这些依赖项的版本要求,您可能需要修复或更新某些原生模块。值得注意的是,Xcode 升级会引入新版本的 macOS SDK,这可能会导致您的原生模块构建失败。

我该如何测试?

目前,Apple Silicon 应用程序只能在 Apple Silicon 硬件上运行,而这种硬件在撰写此博文时尚未商业上市。如果您有 开发者过渡套件,可以在上面测试您的应用程序。否则,您需要等待生产 Apple Silicon 硬件发布后才能测试您的应用程序是否正常工作。

Rosetta 2 怎么样?

Rosetta 2 是 Apple 的最新 Rosetta 技术迭代,它允许您在新的 arm64 Apple Silicon 硬件上运行 x64 Intel 应用程序。尽管我们认为 x64 Electron 应用程序可以在 Rosetta 2 下运行,但有一些重要的事情需要注意(以及为什么您应该发布原生的 arm64 二进制文件)。

  • 您的应用程序性能将显著下降。Electron/V8 使用 JIT 编译 JavaScript,并且由于 Rosetta 的工作方式,您将有效地进行两次 JIT 编译(一次在 V8 中,一次在 Rosetta 中)。
  • 您将失去 Apple Silicon 中新技术带来的好处,例如更大的内存页大小。
  • 我们有没有提到过性能会显著下降?

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 开辟新的收入渠道。敬请关注相关动态!

Touch Bar 支持

·3 分钟阅读

Electron 1.6.3 beta 版本包含对 macOS Touch Bar 的初步支持。


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

这是此 API 的第一个版本,因此它将在接下来的几个 Electron 版本中不断发展。请查看发行说明以获取进一步更新,并就任何问题或缺失的功能打开 issue

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

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

Touch Bar 示例

Touch Bar Gif

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

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);
});

在 Electron 中使用 V8 和 Chromium 的功能

·阅读时间 2 分钟

构建 Electron 应用程序意味着您只需要创建一个代码库,并为单个浏览器进行设计,这非常方便。但是,由于 Electron 会随着 Node.jsChromium 的发布而保持更新,因此您还可以利用它们提供的出色功能。在某些情况下,这可以消除您以前可能需要包含在 Web 应用程序中的依赖项。


有很多功能,我们将在下面举例说明,但如果您有兴趣了解所有功能,可以关注 Google Chromium 博客Node.js 发行说明。您可以在 electronjs.org/#electron-versions 查看 Electron 使用的 Node.js、Chromium 和 V8 的版本。

通过 V8 支持 ES6

Electron 结合了 Chromium 的渲染库和 Node.js。两者共享同一个 JavaScript 引擎 V8。许多 ECMAScript 2015 (ES6) 功能已内置于 V8 中,这意味着您可以在 Electron 应用程序中使用它们,而无需任何编译器。

下面是一些示例,但您还可以获得类(严格模式)、块作用域、Promise、类型化数组等。有关 V8 中 ES6 功能的更多信息,请查看 此列表

箭头函数

findTime () => {
console.log(new Date())
}

字符串插值

var octocat = 'Mona Lisa';
console.log(`The octocat's name is ${octocat}`);

New Target

Octocat() => {
if (!new.target) throw "Not new";
console.log("New Octocat");
}

// Throws
Octocat();
// Logs
new Octocat();

数组包含

// Returns true
[1, 2].includes(2);

Rest 参数

// Represent indefinite number of arguments as an array
(o, c, ...args) => {
console.log(args.length);
};

Chromium 功能

感谢 Google 和贡献者在 Chromium 上付出的辛勤努力,在构建 Electron 应用时,您还可以使用一些很棒的功能,包括(但不限于):

关注 Google Chromium 博客,了解新版本发布的功能,同样,您可以在 此处查看 Electron 使用的 Chromium 版本。

您对什么感到兴奋?

在 Twitter 上 @ElectronJS 与我们分享您最喜欢的 V8 或 Chromium 内置功能。