跳到主要内容

5 篇带有 “特性” 标签的文章

展示 Electron 核心的新功能

查看所有标签

介绍 electron/rfcs

·3 分钟阅读

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

为什么需要 RFC?

简而言之,我们希望简化 Electron 核心的重大变更的流程。

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

对于更重要的变更——例如,大型 API 界面或会影响大多数 Electron 应用的破坏性变更——最好在编写大部分代码之前在构思阶段进行审查。

此过程旨在向公众开放,这也将使更广泛的开源社区更容易在潜在变更进入 Electron 之前提供反馈。

它是如何工作的?

整个 RFC 流程都在 GitHub 上的 electron/rfcs 存储库中进行。步骤在存储库 README 中有详细描述。

简而言之,一旦向 electron/rfcs 存储库创建 PR,RFC 将被提议。当 PR 合并到存储库的 main 分支中时,提议的 RFC 将变为

  • 活动,这意味着 Electron 维护者同意在 electron/electron 中实现该 RFC,或者
  • 如果 PR 最终被拒绝,则变为拒绝
信息

为了使 RFC 变为活动,PR 必须获得至少 2 名 API 工作组成员的批准。在合并之前,应同步展示 RFC,并由至少三分之二的 WG 成员的法定人数一致接受。如果达成共识,将触发为期一个月的最终评论期,之后 PR 将被合并。

如果实现已合并到 electron/electron 中,则活动 RFC 将被完成

谁可以参与?

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 构建版本。您可以使用 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 对 JavaScript 使用 JIT 编译,并且由于 Rosetta 的工作方式,您实际上会运行两次 JIT(一次在 V8 中,一次在 Rosetta 中)。
  • 您会失去 Apple Silicon 中新技术的好处,例如增加的内存页大小。
  • 我们是否提过性能将大大降低?

Electron 2 中的新功能:应用内购买

·2分钟阅读

新的 Electron 2.0 发布系列 包含 新功能和修复。此新主要版本的亮点之一是适用于 Apple Mac App Store 的新 inAppPurchase API


应用内购买允许直接在应用程序内购买内容或订阅。这为开发人员提供了一种轻松采用 免费增值商业模式 的方法,在这种模式中,用户无需付费即可下载应用程序,并提供用于高级功能、附加内容或订阅的可选应用内购买。

社区贡献者 Adrien Fery 将新 API 添加到 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 开辟新的收入渠道。请继续关注这方面的进展!

触控栏支持

·3 分钟阅读

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


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

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

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

非常感谢 @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);
});

在 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();

Array Includes

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

剩余参数

// 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 内置功能。