跳至主要内容

Electron 内部:将 Node 用作库

·阅读时长 4 分钟

这是解释 Electron 内部机制的系列文章中的第二篇。如果你还没有阅读过,请查看有关事件循环集成的第一篇文章

大多数人使用Node 用于服务器端应用程序,但由于 Node 的丰富 API 集和蓬勃发展的社区,它也非常适合嵌入式库。这篇文章解释了 Electron 如何将 Node 用作库。


构建系统

Node 和 Electron 都使用GYP 作为它们的构建系统。如果你想在你的应用程序中嵌入 Node,你必须也使用它作为你的构建系统。

不熟悉 GYP?在继续阅读本文之前,请阅读本指南

Node 的标志

Node 源代码目录中的node.gyp 文件描述了 Node 的构建方式,以及许多控制哪些 Node 部分启用以及是否打开某些配置的GYP 变量。

若要更改构建标志,你需要在项目的 .gypi 文件中设置这些变量。Node 中的 configure 脚本可以为你生成一些常用配置,例如运行 ./configure --shared 将生成一个 config.gypi,其中包含指示 Node 构建为共享库的变量。

Electron 不使用 configure 脚本,因为它有自己的构建脚本。Node 的配置在 Electron 根源代码目录的common.gypi 文件中定义。

在 Electron 中,Node 通过将 GYP 变量 node_shared 设置为 true 来作为共享库进行链接,因此 Node 的构建类型将从 executable 更改为 shared_library,并且包含 Node 的 main 入口点的源代码将不会编译。

由于 Electron 使用与 Chromium 一起提供的 V8 库,因此不会使用 Node 源代码中包含的 V8 库。这可以通过将 node_use_v8_platformnode_use_bundled_v8 都设置为 false 来实现。

共享库或静态库

在与 Node 链接时,有两种选择:你可以将 Node 构建为静态库并将其包含在最终的可执行文件中,或者你可以将其构建为共享库并在最终可执行文件旁边进行分发。

在 Electron 中,Node 长期以来一直作为静态库构建。这使得构建变得简单,能够实现最佳编译优化,并允许 Electron 在没有额外 node.dll 文件的情况下进行分发。

但是,在 Chrome 切换到使用BoringSSL 之后,这种情况发生了改变。BoringSSL 是OpenSSL 的一个分支,它删除了几个未使用的 API 并更改了许多现有的接口。由于 Node 仍然使用 OpenSSL,因此如果将它们一起链接,编译器会由于冲突的符号而生成许多链接错误。

Electron 无法在 Node 中使用 BoringSSL,也无法在 Chromium 中使用 OpenSSL,因此唯一的选项是切换到将 Node 构建为共享库,并将隐藏 BoringSSL 和 OpenSSL 符号 在每个组件中。

此更改给 Electron 带来了了一些积极的副作用。在此更改之前,如果你使用的是原生模块,则无法在 Windows 上重命名 Electron 的可执行文件,因为可执行文件的名称是在导入库中硬编码的。在 Node 构建为共享库之后,此限制消失了,因为所有原生模块都链接到 node.dll,其名称不需要更改。

支持原生模块

Node 中的原生模块 通过为 Node 定义一个加载入口函数来工作,然后从 Node 中搜索 V8 和 libuv 的符号。这对嵌入者来说有点麻烦,因为默认情况下,在将 Node 构建为库时,V8 和 libuv 的符号会被隐藏,并且原生模块将无法加载,因为它们无法找到这些符号。

因此,为了使原生模块正常工作,V8 和 libuv 符号在 Electron 中被公开。对于 V8,这是通过强制 Chromium 配置文件中的所有符号都被公开 来实现的。对于 libuv,这是通过设置 BUILDING_UV_SHARED=1 定义 来实现的。

在你的应用程序中启动 Node

完成构建和与 Node 链接的所有工作后,最后一步是在你的应用程序中运行 Node。

Node 没有提供许多用于将自身嵌入其他应用程序的公共 API。通常,你只需调用node::Startnode::Init 即可启动 Node 的新实例。但是,如果你正在构建一个基于 Node 的复杂应用程序,你必须使用 node::CreateEnvironment 等 API 来精确控制每个步骤。

在 Electron 中,Node 以两种模式启动:在主进程中运行的独立模式,这与官方 Node 二进制文件类似;以及将 Node API 插入网页的嵌入模式。这方面的详细信息将在以后的文章中介绍。

2016 年 7 月:新应用和聚会

·阅读时长 2 分钟

我们每月都会发布一篇综述,重点介绍 Electron 社区的活动。每篇综述都会涵盖新应用、即将举办的聚会、工具、视频等内容。


本网站通过社区的 拉取请求 更新新的 应用程序聚会。您可以 关注仓库 以获取新添加内容的通知,或者如果您不希望收到网站所有更改的通知,请订阅 博客 RSS 源

如果您开发了 Electron 应用程序或组织了聚会,请提交 拉取请求 将其添加到网站,它将在下一期综述中出现。

新应用程序

Demio为入站销售和营销打造的网络研讨会平台
ElectorrentuTorrent 服务器的远程客户端应用程序
PhoneGap使用 Web 技术构建出色的移动应用程序的开源框架
WordMark面向 Markdown 编写者的轻量级博客发布编辑器
UbAuth帮助开发人员使用 OAuth 2.0 为 Uber 应用程序创建访问令牌的应用程序
HyperTermHTML/JS/CSS 终端
MarpMarkdown 演示文稿编写器
Glyphr Studio免费的基于 Web 的字体设计器,专注于面向爱好者的字体设计
BitCrypt适用于 Windows 的简单文件加密应用程序,加密您的比特
Trym适用于 macOS 的精美小型应用程序,可帮助您查看、优化和转换 SVG 图标
Booker拥有 Markdown 强大功能的文本编辑器
PhonePresenter最智能的演示点击器
Yout在桌面上的新方式观看来自 YouTube 的播放列表

新聚会

Electron 开源桌面框架伦敦,英国

Electron 内部:消息循环集成

·阅读时长:3 分钟

这是解释 Electron 内部机制的系列文章的第一篇。本文介绍了如何在 Electron 中将 Node 的事件循环与 Chromium 集成在一起。


此前曾多次尝试将 Node 用于 GUI 编程,例如 node-gui 用于 GTK+ 绑定,以及 node-qt 用于 QT 绑定。但这些方法都无法在生产环境中正常工作,因为 GUI 工具包有自己的消息循环,而 Node 使用 libuv 用于其自己的事件循环,并且主线程一次只能运行一个循环。因此,在 Node 中运行 GUI 消息循环的常见技巧是在以非常小的间隔运行计时器,这会导致 GUI 界面响应速度变慢,并占用大量 CPU 资源。

在开发 Electron 期间,我们遇到了同样的问题,但方式相反:我们必须将 Node 的事件循环集成到 Chromium 的消息循环中。

主进程和渲染进程

在我们深入探讨消息循环集成的细节之前,我将首先解释 Chromium 的多进程架构。

在 Electron 中,有两种类型的进程:主进程和渲染进程(实际上这是极度简化的,要全面了解,请参阅 多进程架构)。主进程负责 GUI 工作,例如创建窗口,而渲染进程只负责运行和渲染网页。

Electron 允许使用 JavaScript 控制主进程和渲染进程,这意味着我们必须将 Node 集成到这两个进程中。

用 libuv 替换 Chromium 的消息循环

我的第一次尝试是用 libuv 重新实现 Chromium 的消息循环。

对于渲染进程来说,这很容易,因为它的消息循环只监听文件描述符和计时器,我只需要用 libuv 实现接口。

但是,对于主进程来说,这要困难得多。每个平台都有自己的 GUI 消息循环类型。macOS Chromium 使用 NSRunLoop,而 Linux 使用 glib。我尝试了很多技巧,试图从本机 GUI 消息循环中提取底层文件描述符,然后将它们提供给 libuv 以进行迭代,但仍然遇到了一些无法正常工作的边缘情况。

因此,最后我在一个小间隔内添加了一个计时器来轮询 GUI 消息循环。结果,进程占用恒定的 CPU 使用率,并且某些操作存在较长的延迟。

在单独的线程中轮询 Node 的事件循环

随着 libuv 的成熟,现在可以采用另一种方法。

后端 fd 的概念被引入到 libuv 中,它是一个文件描述符(或句柄),libuv 会为其事件循环轮询该描述符。因此,通过轮询后端 fd,就可以在 libuv 中出现新事件时获得通知。

因此,在 Electron 中,我创建了一个单独的线程来轮询后端 fd,由于我使用的是系统调用来进行轮询,而不是 libuv API,所以它是线程安全的。每当 libuv 的事件循环中出现新事件时,都会将消息发布到 Chromium 的消息循环,然后将在主线程中处理 libuv 的事件。

通过这种方式,我避免了修补 Chromium 和 Node,并且相同的代码在主进程和渲染进程中都使用。

代码

您可以在 electron/atom/common/ 下的 node_bindings 文件中找到消息循环集成的实现。它可以轻松地用于想要集成 Node 的项目。

更新:实现已迁移到 electron/shell/common/node_bindings.cc

Electron 播客

·阅读时长:1 分钟

正在寻找 Electron 的介绍?刚刚发布了两档新的播客,它们很好地概述了 Electron 是什么、为什么构建它以及如何使用它。


现已发布

Hanselminutes:使用 Jessica Lord 创建跨平台 Electron 应用程序

Electron 是“只是带框架的 Chrome”还是比这更重要?Jessica 让 Scott 走上了正轨,并准确地解释了 Electron 平台在您的开发世界中的位置。


JavaScript Air:Electron 应用程序

Electron 正在成为使用 Web 技术构建多平台桌面应用程序的一种越来越相关且流行的方式。让我们深入了解这项很棒的技术,看看如何使用它来增强我们自己的体验以及用户在桌面上的体验。


如果您正在寻找 Electron 的介绍,请收听第一档节目。第二档节目更详细地介绍了使用 Electron 构建应用程序,并提供来自 Nylas 的 Evan Morikawa 的宝贵技巧。

我们目前正在制作另外两档播客,它们应该在下个月发布,请关注 @ElectronJS Twitter 帐户以获取最新信息。

Electron 1.0

·阅读时长 4 分钟

在过去两年中,Electron 帮助开发人员使用 HTML、CSS 和 JavaScript 构建跨平台桌面应用程序。现在,我们很高兴分享我们框架和创建它的社区的一个重要里程碑。Electron 1.0 版本现已从 electronjs.org 发布。


Electron 1.0

Electron 1.0 代表了 API 稳定性和成熟度的一个重要里程碑。此版本允许您构建在 Windows、Mac 和 Linux 上真正具有原生外观和感觉的应用程序。使用新的文档、新工具和一个新的应用程序来引导您完成 Electron API,构建 Electron 应用程序比以往更容易。

如果您已准备好构建您的第一个 Electron 应用程序,以下是一个 快速入门指南,可帮助您入门。

我们很高兴看到您接下来用 Electron 构建什么。

Electron 的发展历程

我们在推出 Atom 之后发布了 Electron,这距今已有两年多时间。Electron(当时被称为 Atom Shell)是我们构建 Atom 的框架。在那段时间,Atom 是推动 Electron 功能和功能发展的动力,我们努力推出 Atom 的首个版本。

现在,推动 Electron 发展的,是越来越多的开发人员和公司,他们构建的应用程序五花八门,从 电子邮件聊天Git 应用程序SQL 分析工具种子客户端机器人 都有。

在过去的两年中,我们看到公司和开源项目都选择 Electron 作为其应用程序的基础。仅在过去的一年里,Electron 的下载量就超过了 120 万次。浏览 一些很棒的 Electron 应用程序,如果您还没有,请添加自己的应用程序。

Electron downloads

Electron API 演示

随着 1.0 版本的发布,我们发布了一个新应用程序,可帮助您探索 Electron API 并了解如何让您的 Electron 应用程序具有原生外观和感觉。 Electron API 演示 应用程序包含代码片段,可帮助您开始构建应用程序,以及有关有效使用 Electron API 的提示。

Electron API Demos

Devtron

我们还添加了一个新的扩展程序,可帮助您调试 Electron 应用程序。 DevtronChrome 开发者工具 的一个开源扩展程序,旨在帮助您检查、调试和排查 Electron 应用程序的故障。

Devtron

功能

  • 依赖关系图,可以帮助您可视化应用程序在主进程和渲染器进程中的内部和外部库依赖关系
  • IPC 监视器,跟踪并显示应用程序进程之间发送和接收的消息
  • 事件检查器,显示应用程序在核心 Electron API(如窗口、应用程序和进程)上注册的事件和监听器
  • 应用程序 Linter,检查您的应用程序是否存在常见错误和缺失的功能

Spectron

最后,我们发布了新版本的 Spectron,这是 Electron 应用程序的集成测试框架。

Spectron

Spectron 3.0 对整个 Electron API 提供全面支持,使您能够更快速地编写测试,以验证应用程序在各种场景和环境中的行为。Spectron 基于 ChromeDriverWebDriverIO,因此它还具有用于页面导航、用户输入和 JavaScript 执行的完整 API。

社区

Electron 1.0 是数百位开发人员共同努力的成果。除了核心框架之外,还有数百个库和工具被发布,以简化构建、打包和部署 Electron 应用程序的过程。

现在有一个新的 社区 页面,列出了许多正在开发的优秀 Electron 工具、应用程序、库和框架。您还可以查看 ElectronElectron Userland 组织,以了解其中一些很棒的项目。

Electron 新手?观看 Electron 1.0 简介视频

Electron 0.37 中的新增功能

·阅读时长 4 分钟

Electron 0.37 最近已 发布,其中包括从 Chrome 47 到 Chrome 49 的重大升级,以及几个新的核心 API。此最新版本引入了 Chrome 48Chrome 49 中发布的所有新功能。这包括 CSS 自定义属性、增强的 ES6 支持、KeyboardEvent 改进、Promise 改进以及许多其他新功能,现在可以在您的 Electron 应用程序中使用。


新增功能

CSS 自定义属性

如果您使用过 Sass 和 Less 等预处理器语言,那么您可能熟悉变量,它允许您为颜色方案和布局等内容定义可重用的值。变量有助于使您的样式表保持 DRY 并更易于维护。

CSS 自定义属性类似于预处理器变量,因为它们是可重用的,但它们还具有使其更加强大灵活的独特特性:**它们可以使用 JavaScript 进行操作**。这个细微但强大的功能允许对可视界面进行动态更改,同时仍然受益于 CSS 的硬件加速 和减少前端代码和样式表之间的代码重复。

有关 CSS 自定义属性的更多信息,请参阅 MDN 文章Google Chrome 演示

CSS 变量实战

让我们逐步了解一个简单的变量示例,可以在您的应用程序中实时调整。

:root {
--awesome-color: #a5ecfa;
}

body {
background-color: var(--awesome-color);
}

变量值可以直接在 JavaScript 中检索和更改

// Get the variable value ' #A5ECFA'
let color = window
.getComputedStyle(document.body)
.getPropertyValue('--awesome-color');

// Set the variable value to 'orange'
document.body.style.setProperty('--awesome-color', 'orange');

也可以从开发工具的**样式**部分编辑变量值,以便快速反馈和调整

CSS properties in Styles tab

KeyboardEvent.code 属性

Chrome 48 添加了新的 code 属性,可用于 KeyboardEvent 事件,该属性将是按下的物理键,与操作系统键盘布局无关。

这应该使在您的 Electron 应用程序中实现自定义键盘快捷键更加准确,并确保在不同机器和配置之间的一致性。

window.addEventListener('keydown', function (event) {
console.log(`${event.code} was pressed.`);
});

查看 此示例,以了解其实际操作。

Promise 拒绝事件

Chrome 49 添加了两个新的 window 事件,允许您在未处理的被拒绝的 Promise 时收到通知。

window.addEventListener('unhandledrejection', function (event) {
console.log('A rejected promise was unhandled', event.promise, event.reason);
});

window.addEventListener('rejectionhandled', function (event) {
console.log('A rejected promise was handled', event.promise, event.reason);
});

查看 此示例,以了解其实际操作。

V8 中的 ES2015 更新

Electron 中的 V8 版本现已包含 91% 的 ES2015。以下是一些您可以直接使用的有趣新增功能 - 无需标志或预编译器

默认参数

function multiply(x, y = 1) {
return x * y;
}

multiply(5); // 5

解构赋值

Chrome 49 添加了 解构赋值,使分配变量和函数参数变得更加容易。

这使得 Electron 现在需要更干净、更紧凑的分配

浏览器进程要求
const { app, BrowserWindow, Menu } = require('electron');
渲染器进程要求
const { dialog, Tray } = require('electron').remote;
其他示例
// Destructuring an array and skipping the second element
const [first, , last] = findAll();

// Destructuring function parameters
function whois({ displayName: displayName, fullName: { firstName: name } }) {
console.log(`${displayName} is ${name}`);
}

let user = {
displayName: 'jdoe',
fullName: {
firstName: 'John',
lastName: 'Doe',
},
};
whois(user); // "jdoe is John"

// Destructuring an object
let { name, avatar } = getUser();

新的 Electron API

以下是一些新的 Electron API,您可以在 Electron 版本说明 中查看每个新 API。

BrowserWindow 上的 showhide 事件

当窗口显示或隐藏时,会发出这些事件。

const { BrowserWindow } = require('electron');

let window = new BrowserWindow({ width: 500, height: 500 });
window.on('show', function () {
console.log('Window was shown');
});
window.on('hide', function () {
console.log('Window was hidden');
});

OS Xapp 上的 platform-theme-changed

当系统的 暗黑模式 主题切换时,会发出此事件。

const { app } = require('electron');

app.on('platform-theme-changed', function () {
console.log(`Platform theme changed. In dark mode? ${app.isDarkMode()}`);
});

OS Xapp.isDarkMode()

如果系统处于暗黑模式,此方法将返回 true,否则返回 false

OS XBrowserWindowscroll-touch-beginscroll-touch-end 事件

当滚动轮事件阶段开始或结束时,会发出这些事件。

const { BrowserWindow } = require('electron');

let window = new BrowserWindow({ width: 500, height: 500 });
window.on('scroll-touch-begin', function () {
console.log('Scroll touch started');
});
window.on('scroll-touch-end', function () {
console.log('Scroll touch ended');
});

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

新目标

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

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

数组包含

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

Electron 1.0 中即将发生的 API 更改

·阅读时长 4 分钟

从 Electron 的开始,一直到它被称为 Atom-Shell 的时候,我们一直在尝试为 Chromium 的内容模块和原生 GUI 组件提供一个不错的跨平台 JavaScript API。API 的开始非常自然,随着时间的推移,我们对初始设计做出了很多更改,以改进它们。


随着 Electron 1.0 版本的发布即将到来,我们希望借此机会进行一些更改,以解决最后一些 API 细节问题。以下描述的更改已包含在 **0.35.x** 版本中,旧的 API 会发出弃用警告,以便您能够为未来的 1.0 版本做好准备。Electron 1.0 版本将在几个月后发布,所以您还有时间进行调整,这些更改不会立即成为破坏性更改。

弃用警告

默认情况下,如果您使用的是弃用的 API,就会显示警告。要关闭警告,您可以将 process.noDeprecation 设置为 true。要跟踪弃用 API 使用的来源,您可以将 process.throwDeprecation 设置为 true 以抛出异常而不是打印警告,或者将 process.traceDeprecation 设置为 true 以打印弃用的跟踪信息。

使用内置模块的新方法

内置模块现在被分组到一个模块中,而不是被分成独立的模块,这样您就可以避免与其他模块发生冲突

var app = require('electron').app;
var BrowserWindow = require('electron').BrowserWindow;

为了向后兼容,旧的 require('app') 方法仍然支持,但您也可以将其关闭。

require('electron').hideInternalModules();
require('app'); // throws error.

使用 remote 模块的更简便方法

由于使用内置模块的方式发生了变化,我们简化了在渲染进程中使用主进程端模块的方法。您现在只需访问 remote 的属性即可使用它们。

// New way.
var app = require('electron').remote.app;
var BrowserWindow = require('electron').remote.BrowserWindow;

不再需要使用长的 require 链

// Old way.
var app = require('electron').remote.require('app');
var BrowserWindow = require('electron').remote.require('BrowserWindow');

拆分 ipc 模块

ipc 模块同时存在于主进程和渲染进程中,但两侧的 API 不同,这对新手来说非常 confusing。我们已将主进程中的模块重命名为 ipcMain,渲染进程中的模块重命名为 ipcRenderer,以避免混淆。

// In main process.
var ipcMain = require('electron').ipcMain;
// In renderer process.
var ipcRenderer = require('electron').ipcRenderer;

此外,在接收消息时,ipcRenderer 模块中添加了一个额外的 event 对象,以匹配 ipcMain 模块中处理消息的方式。

ipcRenderer.on('message', function (event) {
console.log(event);
});

标准化 BrowserWindow 选项

BrowserWindow 选项根据其他 API 的选项采用了不同的样式,由于名称中存在 -,所以在 JavaScript 中使用起来有些困难。现在,它们已标准化为传统的 JavaScript 名称。

new BrowserWindow({ minWidth: 800, minHeight: 600 });

遵循 DOM 的 API 名称约定

Electron 中的 API 名称以前偏好将所有 API 名称设置为 camelCase,例如 Url 转换为 URL,但 DOM 也有自己的约定,它偏好 URL 而不是 Url,同时使用 Id 而不是 ID。我们对以下 API 进行了重命名,以匹配 DOM 的样式。

  • Url 重命名为 URL
  • Csp 重命名为 CSP

由于这些更改,您在使用 Electron v0.35.0 为您的应用程序时会遇到很多弃用警告。一个简单的解决方法是将所有 Url 实例替换为 URL

Tray 事件名称的更改

Tray 事件名称的样式与其他模块略有不同,因此进行了重命名以使其与其他模块匹配。

  • clicked 重命名为 click
  • double-clicked 重命名为 double-click
  • right-clicked 重命名为 right-click

Mac App Store 和 Electron 上的 Windows 自动更新

·阅读时长 2 分钟

最近,Electron 添加了两个令人兴奋的功能:支持 Mac App Store 的构建和内置的 Windows 自动更新程序。


Mac App Store 支持

v0.34.0 版本开始,每个 Electron 版本都包含一个与 Mac App Store 兼容的构建版本。以前,使用 Electron 构建的应用程序不符合 Apple 对 Mac App Store 的要求。大多数这些要求都与使用私有 API 相关。为了以沙盒方式运行 Electron,使其符合这些要求,需要删除两个模块。

  • crash-reporter
  • auto-updater

此外,在检测 DNS 更改、视频捕获和辅助功能方面,一些行为也发生了变化。您可以在文档中阅读有关这些更改以及将您的应用程序提交到 Mac App Store的更多信息。这些发行版可以在Electron 发行版页面上找到,以 mas- 为前缀。

相关拉取请求:electron/electron#3108electron/electron#2920

Windows 自动更新程序

在 Electron v0.34.1 版本中,auto-updater 模块得到了改进,以便与Squirrel.Windows一起使用。这意味着 Electron 附带了在 OS X 和 Windows 上轻松自动更新应用程序的方法。您可以在文档中阅读有关在 Windows 上设置应用程序以进行自动更新的更多信息。

相关拉取请求:electron/electron#1984

Electron 中的新增功能

·阅读时长 2 分钟

最近,Electron 有了一些有趣的更新,并进行了演讲,以下是总结。


来源

截至 v0.32.0 版本,Electron 现在已更新至 Chrome 45。其他更新包括...

更好的文档

new docs

我们重新构建并标准化了文档,使其外观和阅读效果更佳。此外,还有社区贡献的文档翻译,例如日语和韩语。

相关拉取请求:electron/electron#2028electron/electron#2533electron/electron#2557electron/electron#2709electron/electron#2725electron/electron#2698electron/electron#2649.

Node.js 4.1.0

v0.33.0 版本开始,Electron 附带 Node.js 4.1.0。

相关拉取请求:electron/electron#2817.

node-pre-gyp

依赖 node-pre-gyp 的模块现在可以在从源代码构建时针对 Electron 进行编译。

相关拉取请求:mapbox/node-pre-gyp#175.

ARM 支持

Electron 现在提供针对 ARMv7 的 Linux 构建版本。它可以在 Chromebook 和 Raspberry Pi 2 等流行平台上运行。

相关问题:atom/libchromiumcontent#138electron/electron#2094electron/electron#366.

Yosemite 样式的无边框窗口

frameless window

@jaanus 提交的一个补丁已合并,与其他内置的 OS X 应用程序一样,允许在 OS X Yosemite 及更高版本上创建无边框窗口,并将系统交通灯集成在其中。

相关拉取请求:electron/electron#2776.

Google Summer of Code 打印支持

在 Google Summer of Code 之后,我们合并了@hokein 提交的补丁,以改进打印支持,并添加将页面打印为 PDF 文件的功能。

相关问题:electron/electron#2677electron/electron#1935electron/electron#1532electron/electron#805electron/electron#1669electron/electron#1835.

Atom

Atom 现在已升级到运行 Chrome 44 的 Electron v0.30.6 版本。正在进行升级到 v0.33.0 版本的工作,请参见atom/atom#8779

演讲

GitHub 用户Amy PalamountainNordic.js 的演讲中对 Electron 做了精彩的介绍。她还创建了electron-accelerator 库。

使用 Electron 构建原生应用程序,作者:Amy Palamountain

Ben Ogle 也是 Atom 团队的一员,他在YAPC Asia 上进行了有关 Electron 的演讲。

使用 Web 技术构建桌面应用程序,作者:Ben Ogle

Atom 团队成员 Kevin Sawicki 和其他人最近在 旧金山湾区 Electron 用户组 聚会上发表了关于 Electron 的演讲。视频 已经发布,这里有一些示例:

Kevin Sawicki 的 Electron 历史

Ben Gotow 的 如何让 Web 应用更像原生应用