一步步指南-为-Electron-运行开发原生模块 (一步步指导)
大家都知道Script无论是在阅读器中运转、还是在Node.js中运转都是复线程运转的,所以并不适宜在处置一些CPU密集型义务。但是Node.js准许开发者经常使用C、C++等言语开发像普通的Node.js模块一样经过require()函数加载的原生模块。由于Electron内置Node.js,这样就使得Electron雷同具有了相反的才干。
在实践业务场景中,也有一些现成的C/C++名目,在Node.js名目中间接复用可以浪费很多开发老本。
本文将讨论如何在Electron运行中开发原生模块,以裁减运行的性能和性能。
搭建原生模块开发环境
![一步步指导](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
在目前的原生模块开发中,普通都是基于Node-Api启动开发。
Node-Api是什么呢?
Node-API(NodelicationProgrammingInterface)是一个用于编写跨平台原生插件的封装层。它提供了一组稳固的C/C++函数,使开发者可以编写与Node.js运转时环境兼容的原生插件。经过经常使用Node-API,开发者可以消弭由于Node.js版本变动而惹起的插件不兼容的疑问,并且能够更繁难地编写和保养跨平台的原生模块。
了解一下就是咱们无需为不同版本的Node.js编译不同版本的原生模块。不同版本的Node.js经常使用雷同的接口为原生模块提供服务,这些接口是ABI化的,只需ABI的版本号分歧,编译好的原生模块就可以间接经常使用,而不须要从新编译。
ABI化是指将软件接口转化为运行程序二进制接口(ApplicationBinaryInterface)的环节。在编程中,ABI化的指标是确保在不同编译器、操作系统以及配件平台之间的二进制兼容性。经过将接口规范化为二进制规范,不同模块或程序可以相互调用和交互,而无需关心详细成功细节和底层平台差异。Node-API的设计就是为了成功跨版本和跨平台的ABI兼容性,以便C/C++模块能够在不同的Node.js环境中无需从新编译即可运转。
Node-API有哪些开发方式?
基于Node-API的原生模块开发可以经常使用C言语或许基于node-addon-api名目经常使用C++言语的两种方式。
接上去咱们就基于这个名目来开发一个Electron的原生模块。
npminstall-gnode-gyp
npminstallnode-addon-api--save-dev
以上就曾经搭建好了基本的原生模块开发环境,接上去经过一个繁难的例子,来成功一个访问系统文件的原生模块带大家了解一下开发流程。
开发原生模块访问系统文件并读取文件内容
开发原生模块须要相熟C++编程和Node.js的C/C++裁减开发,触及一些底层的编程和跨平台的常识。这里的例子较为繁难,繁难大家了解。
#include<napi.h>#include<tream>#include<fstream>Napi::StringReadFile(constNapi::CallbackInfo&info){Napi::Envenv=info.Env();//读取文件门路参数std::stringfilePath=info[0].As<Napi::String>().Utf8Value();//关上文件并读取内容std::ifstreamfile(filePath);std::stringcontent((std::istreambuf_iterator<char>(file)),std::istreambuf_iterator<char>());file.close();//将内容转换为Napi::String前往returnNapi::String::New(env,content);}Napi::ObjectInit(Napi::Envenv,Napi::Objectexports){exports.Set("readFile",Napi::Function::New(env,ReadFile));returnexports;}NODE_API_MODULE(addon,Init)
上述代码定义了一个ReadFile函数,它接受一个文件门路参数,并前往文件的内容。
NODE_API_MODULE是Node-API提供的一个关键的宏,用于在C++中定义Node.js原生模块的入口点,创立一个模块初始化函数,并将此函数泄露给Node.js运转时。
经常使用NODE_API_MODULE定义原生模块的入口点,可以让开发者以C++的方式编写模块的初始化、导出函数、属性等,并与Node.js运转时启动交互。并可以在Node.js中加载和经常使用。
Init函数是模块的初始化函数,用于在模块加载时注册和导出相应的函数、属性等。而后,经过NODE_API_MODULE将Init函数泄露给Node.js运转时,并指定模块的名字为"addon"。
{"targets":[{"target_name":"filesystem","sources":["filesystem.cpp"]}}
binding.gyp是一个用于性能Node.js原生模块构建环节的名目文件。它驳回了JSON格局,并经常使用特定的语法来定义编译选项、依赖项和源文件等消息。经过编辑binding.gyp文件,可以指定编译器和链接器的选项,增加所需的依赖库,并确定要编译的源文件。
编译原生模块
在构建编译原生模块时,须要经常使用node-gyp,它会读取binding.gyp文件并依据其内容启动编译操作。node-gyp提供了一个简化的构建流程,使得开发人员能够轻松地性能和构建原生模块。
经常使用以下命令构建该模块。
$node-gypconfigure$node-gypbuild
运转上述命令将生成一个名为build/Release/filesystem.node的编译好的原生模块文件。
接上去,就可以在任何Node.js文件中经常使用该模块:创立一个名为app.js的JavaScript文件,并增加以下代码
constaddon=require('./build/Release/filesystem.node');constfilePath='/path/to/file.txt';constcontent=addon.readFile(filePath);console.log(content);
上述代码经常使用require导入原生模块,而后调用readFile函数读取指定文件的内容,并输入到管理台。
总结
在Electron运行中,经常使用和开发原生模块可认为前端开发同窗提供更宽广的或许性;能够应用操作系统级别的性能来优化运行的性能。
那么有同窗就会有不懂,除了自己开发原生模块还有什么打算可以给Electron运行提供更宽泛的性能裁减,包含底层系统性能的访问、高性能计算呢?
当然有,在日常开发中,可以经常使用灵活链接库(DynamicLinkLibrary,DLL)启动裁减性能的模块化。经常使用灵活链接库可以经常使用更多的言语和框架启动开发,适宜不同开发者的需求。比如,一个go开发者也可以给咱们提供一个灵活链接库供Electron调用,也可以将go代码打包成不同平台的文件供其余平台调用,更适宜独罪恶能各个平台经常使用的场景。原生模块则更专一于为Node.js和Electron运行程序提供特定性能的开发。
在实践运行中,可依据详细需求和开发团队的技术栈来决定适宜的方式,联合灵活链接库和原生模块来裁减Electron运行程序的性能。
参考链接
electron在win上可运行后,如何打包到linux上运行?
1. 在 Windows 上准备开发环境和构建工具: - 安装 - 安装 Git - 安装 Yarn 或 npm(其中之一即可) - 安装 Electron Forge(用于打包和构建 Electron 应用程序)2. 下载或 clone 原代码到本地。 3. 在代码目录中,使用 Yarn 或 npm 安装依赖项: # 使用 Yarn yarn install # 或使用 npm npm install4. 在代码目录中,运行以下命令启动 Electron 应用程序以确保在 Windows 上运行正常: # 使用 Yarn yarn start # 或使用 npm npm run start 如果应用程序能够正常运行并在窗口中显示,那么说明 Electron 在 Windows 上已经成功运行。 5. 确保你在开发环境中有一个可用的 Linux 系统(可以是虚拟机、双系统或云服务器等)。 6. 在 Linux 系统中,安装 和 Git,然后下载或 clone 原代码到本地。 7. 在代码目录中,使用 Yarn 或 npm 安装依赖项(与步骤 3 相同)。 8. 在代码目录中,运行以下命令以构建 Linux 版本的应用程序: # 使用 Yarn yarn make # 或使用 npm npm run make 这将使用 Electron Forge 根据配置文件构建 Linux 版本的应用程序。 构建过程可能需要一些时间。 9. 构建完成后,在代码目录的 `out/make/` 目录中会生成一个 Linux 安装包或二进制文件。 你可以将该文件复制到 Linux 系统中,并在 Linux 上运行它。 请注意,Linux 版本的 Electron 应用程序可能需要使用 Linux 系统特定的库或依赖项。 确保在构建和运行应用程序之前满足这些依赖关系。
Webpack如何构建Electron应用
这次给大家带来Webpack如何构建Electron应用,Webpack构建Electron应用的注意事项有哪些,下面就是实战案例,一起来看一下。 Electron 可以让你使用开发 Web 的技术去开发跨平台的桌面端应用,由 Github 主导和开源,大家熟悉的 Atom 和 VSCode 编辑器就是使用 Electron 开发的。 Electron 是 和 Chromium 浏览器的结合体,用 Chromium 浏览器显示出的 Web 页面作为应用的 GUI,通过 去和操作系统交互。 当你在 Electron 应用中的一个窗口操作时,实际上是在操作一个网页。 当你的操作需要通过操作系统去完成时,网页会通过 去和操作系统交互。 采用这种方式开发桌面端应用的优点有:降低开发门槛,只需掌握网页开发技术和 即可,大量的 Web 开发技术和现成库可以复用于 Electron;由于 Chromium 浏览器和 都是跨平台的,Electron 能做到写一份代码在不同的操作系统运行。 在运行 Electron 应用时,会从启动一个主进程开始。 主进程的启动是通过 去执行一个入口 JavaScript 文件实现的,这个入口文件 内容如下:const { app, BrowserWindow } = require(electron)// 保持一个对于 window 对象的全局引用,如果你不这样做,// 当 JavaScript 对象被废品回收, window 会被自动地关闭let win// 打开主窗口function createWindow() { // 创建浏览器窗口 win = new BrowserWindow({ width: 800, height: 600 }) // 加载应用的 const indexPageURL = `file://${dirname}/dist/`; (indexPageURL); // 当 window 被关闭,这个事件会被触发 (closed, () => { // 取消引用 window 对象 win = null })}// Electron 会在创建浏览器窗口时调用这个函数。 (ready, createWindow)// 当全部窗口关闭时退出(window-all-closed, () => { // 在 macOS 上,除非用户用 Cmd + Q 确定地退出 // 否则绝大部分应用会保持激活 if ( !== darwin) { () }})主进程启动后会一直驻留在后台运行,你眼睛所看得的和操作的窗口并不是主进程,而是由主进程新启动的窗口子进程。 应用从启动到退出有一系列生命周期事件,通过 () 函数去监听生命周期事件,在特定的时刻做出反应。 例如在 (ready) 事件中通过 BrowserWindow 去展示应用的主窗口。 启动的窗口其实是一个网页,启动时会去加载在 loadURL 中传入的网页地址。 每个窗口都是一个单独的网页进程,窗口之间的通信需要借助主进程传递消息。 总体来说开发 Electron 应用和开发 Web 应用很相似,区别在于 Electron 的运行环境同时内置了浏览器和 的 API,在开发网页时除了可以使用浏览器提供的 API 外,还可以使用 提供的 API。 接入 Webpack接下来做一个简单的 Electron 应用,要求为应用启动后显示一个主窗口,在主窗口里有一个按钮,点击这个按钮后新显示一个窗口,且使用 React 开发网页。 由于 Electron 应用中的每一个窗口对应一个网页,所以需要开发2个网页,分别是主窗口的 和新打开的窗口 。 也就是说项目由2个单页应用组成,这和3-10管理多个单页应用 中的项目非常相似,让我们来把它改造成一个 Electron 应用。 需要改动的地方如下:在项目根目录下新建主进程的入口文件 ,内容和上面提到的一致;主窗口网页的代码如下:import React, { Component } from react;import { render } from react-dom;import { remote } from electron;import path from path;import ./;class App extends Component { // 在按钮被点击时 handleBtnClick() { // 新窗口对应的页面的 URI 地址 const modalPath = (file://, (), dist/); // 新窗口的大小 let win = new ({ width: 400, height: 320 }) (close, function () { // 窗口被关闭时清空资源 win = null }) // 加载网页 (modalPath) // 显示窗口 () } render() { return ( <p> <h1>Page Index</h1> <button onClick={}>Open Page Login</button> </p> ) }}render(<App/>, (app));其中最关键的部分在于在按钮点击事件里通过 electron 库里提供的 API 去新打开一个窗口,并加载网页文件所在的地址。 页面部分的代码已经修改完成,接下来修改构建方面的代码。 这里构建需要做到以下几点:构建出2个可在浏览器里运行的网页,分别对应2个窗口的界面;由于在网页的 JavaScript 代码里可能会有调用 原生模块或者 electron 模块,也就是输出的代码依赖这些模块。 但由于这些模块都是内置支持的,构建出的代码不能把这些模块打包进去。 要完成以上要求非常简单,因为 Webpack 内置了对 Electron 的支持。 只需要给 Webpack 配置文件加上一行代码即可,如下:target: electron-renderer,这句配置曾在2-7其它配置项-Target中提到,意思是指让 Webpack 构建出用于 Electron 渲染进程用的 JavaScript 代码,也就是这2个窗口需要的网页代码。 以上修改都完成后重新执行 Webpack 构建,对应的网页需要的代码都输出到了项目根目录下的 dist 目录里。 为了以 Electron 应用的形式运行,还需要安装新依赖:# 安装 Electron 执行环境到项目中npm i -D electron相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!推荐阅读:Angular实现可添加删除与计算总金额效果插件Bootstrap模态框多次弹出提交BUG
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。