如何为Electron应用开发原生模块( 二 )

上述代码定义了一个 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" 。

  1. 创建 binding.gyp 文件:在项目目录中创建一个名为 binding.gyp 的文件 , 并添加以下内容:
{"targets": [{"target_name": "filesystem","sources": ["filesystem.cpp"]}}binding.gyp 是一个用于配置 Node.js 原生模块构建过程的项目文件 。它采用了 JSON 格式,并使用特定的语法来定义编译选项、依赖项和源文件等信息 。通过编辑 binding.gyp 文件,可以指定编译器和链接器的选项,添加所需的依赖库 , 并确定要编译的源文件 。
编译原生模块在构建编译原生模块时,需要使用 node-gyp ,它会读取 binding.gyp 文件并根据其内容进行编译操作 。node-gyp 提供了一个简化的构建流程,使得开发人员能够轻松地配置和构建原生模块 。
使用以下命令构建该模块 。
$ node-gyp configure $ node-gyp build运行上述命令将生成一个名为 build/Release/filesystem.node 的编译好的原生模块文件 。
接下来,就可以在任何 Node.js 文件中使用该模块:创建一个名为 app.js 的 JavaScript 文件 , 并添加以下代码
const addon = require('./build/Release/filesystem.node'); const filePath = '/path/to/file.txt'; const content = addon.readFile(filePath); console.log(content);上述代码使用 require 导入原生模块,然后调用 readFile 函数读取指定文件的内容 , 并输出到控制台 。
总结在 Electron 应用中,使用和开发原生模块可以为前端开发同学提供更广阔的可能性;能够利用操作系统级别的功能来提升应用的性能 。
那么有同学就会有疑问,除了自己开发原生模块还有什么方案可以给Electron应用提供更广泛的功能扩展,包括底层系统功能的访问、高性能计算呢?
当然有,在日常开发中,可以使用动态链接库(Dynamic Link Library,DLL)进行扩展功能的模块化 。使用动态链接库可以使用更多的语言和框架进行开发,适合不同开发者的需求 。比如 , 一个go开发者也可以给我们提供一个动态链接库供Electron调用 , 也可以将go代码打包成不同平台的文件供其他平台调用,更适合独立功能各个平台使用的场景 。原生模块则更专注于为 Node.js 和 Electron 应用程序提供特定功能的开发 。
在实际应用中,可根据具体需求和开发团队的技术栈来选择合适的方式 , 结合动态链接库和原生模块来扩展 Electron 应用程序的功能 。
参考链接
  • Electron桌面应用开发:https://juejin.cn/book/7152717638173966349?enter_from=course_center&utm_source=course_center
  • node-gyp 实现 nodejs 调用 C++:https://juejin.cn/post/6844903971220357134?searchId=20231214152519329167E9F0AB744365BF




推荐阅读