跳转到主要内容

5 篇标记为“特性”的文章

展示 Electron 核心中的新特性

查看所有标签

electron/rfcs 介绍

·阅读时长 4 分钟

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

为什么需要 RFC?

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

目前,新的代码变更主要通过 GitHub 上的问题和拉取请求进行讨论。对于 Electron 的大多数变更而言,这是一个不错的系统。许多错误修复、文档变更,甚至新功能都足够直接,可以通过标准 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 应该进行同步演示,并由至少三分之二的工作组成员组成的法定人数一致接受。如果达成共识,将触发一个月的最终评论期,之后 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 新的 Apple Silicon 硬件上运行的 Electron 版本,Apple 计划在今年晚些时候推出这些硬件。您可以通过 npm install electron@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 StoreinAppPurchase 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 版本中它将不断发展。请查看发行说明以获取进一步更新,并就任何问题或缺失的功能 提出 issues

您可以通过 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 blogNode.js changelogs。您可以在 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 blog,了解新版本发布的功能,并且您可以在 此处 查看 Electron 使用的 Chromium 版本。

您对什么感到兴奋?

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