Node.js 可以通过 Native module 方便的调用操作系统的 API 吗?

2022-05-05 18:59:56 +08:00
 milkleeeeee

我基本只懂前端开发相关的技术,最近在用 Electron 开发软件,然后需要一些操作系统层面的功能,比如:

Node.js 支持用 C/C++ 开发 native module,但是,我在 GitHub 上几乎搜不到能调用这些操作系统 API 的 native module (目前找到的只有 NodeRT,但似乎只支持 Windows 10 且很久没有维护了),所以我想问:

2106 次点击
所在节点    程序员
15 条回复
f64by
2022-05-05 19:16:25 +08:00
可以,使用 node-gyp ,在 C++里编写逻辑,然后暴露 API 给 Node 调用
statumer
2022-05-05 20:27:56 +08:00
从 electron 的角度讲,不一定需要让 js 直接调用 Objective-C ,而是可以通过进程间 IPC 的方式 (比如 socket, stdout ) 让 js 间接调用系统 API (参考 Clash, Chrome Native Messaging 的设计)。这种方法比起开发 node native addon 要简单很多。
learningman
2022-05-05 20:43:53 +08:00
这两功能与其依赖不确定的操作系统实现,不如调云端接口算了
ysc3839
2022-05-05 20:47:52 +08:00

难度很难量化,大概要懂 C++以及目标操作系统 API 的基本用法
ysc3839
2022-05-05 20:51:44 +08:00
不过你这需求比较尴尬的地方是,上述两个 Windows API 都没有 DualApiPartitionAttribute ,很可能不能被 Win32 应用调用。
OCR 我印象中是可以的,语音识别就未知了。
magicdawn
2022-05-05 20:57:30 +08:00
调用 macOS NSPasteboard API 的例子 https://github.com/magicdawn/simple-mac-clipboard
还是 NSPasteboard, 但是用的是 napi-rs https://github.com/magicdawn/clip-spy

napi-rs 体验不错, 可以试试
MEIyiyi
2022-05-05 21:03:57 +08:00
node 写 c++模块的场景多吗?( op 的问题我不懂,我就问问)
agdhole
2022-05-05 21:26:52 +08:00
react native windows?
MasterMonkey
2022-05-05 21:57:00 +08:00
ysc3839
2022-05-05 22:16:37 +08:00
@MEIyiyi 看需求的,一般是需要使用系统功能,且 Node.js 本身没提供的时候用到
liuzhedash
2022-05-05 23:05:57 +08:00
@MasterMonkey
node-ffi-napi 是可以的,前两年用这个调用过设备厂商提供的 win32 dll ,如果没 C/C++基础也没搞过 Windows 编程就比较棘手了。
macos 没搞过不情路,猜测 node-ffi-napi 也可以加载 dylib/so ,和 win32 的 dll 差不多。
milkleeeeee
2022-05-05 23:28:48 +08:00
@statumer #2 感谢,这也是个方法

@ysc3839 #5 Win32 是指 32 位的操作系统没法调用这俩接口?不过对于我的需求而言,不支持 Win32 也没有关系

@MasterMonkey #9 虽然文档上说不用写 C/C++ 就能调,但是看了下教程……完全整不明白,好像还是需要有 C/C++ 的技术背景才知道怎么用?
ysc3839
2022-05-06 01:19:19 +08:00
@milkleeeeee Win32 大概可以理解为一套 API ,或者说一个运行环境吧。Win32 最初是与 16 位的 Win16 相对的,与 Win16 有很大差别,所以专门称作 Win32 。后来 Windows 出了 64 位后,改动并不大,和 32 位的 Win32 基本是兼容的,所以后来 Win32 也可以包含 64 位。Win32 应用就是指使用 Win32 API ,或者说在 Win32 环境下运行的应用。
现在 Win32 一般是和 UWP 相对的,UWP 也可以理解为一个运行环境,在这个环境中运行的应用只能调用 UWP API ,UWP API 和 Win32 API 是部分重合的,也就是说有的 API 两边都能使用,有的只有其中一边能用。一个 WinRT class 有 DualApiPartitionAttribute 代表 UWP 和 Win32 都能使用,不过没有的话不一定不可以使用。
Electron 开发的应用是 Win32 应用,所以如果某个 API 只能在 UWP 环境下使用,就意味着 Electron 用不了。
DOLLOR
2022-05-06 14:18:25 +08:00
如果厂商提供 dll 文件的话,用 node-ffi-napi 是最方便的方法。
不过你可能还需要看得懂用 C++作为样例编写的文档。

比如微软官网
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxa
文档上的参数声明是这样写的
int MessageBoxA(
[in, optional] HWND hWnd,
[in, optional] LPCSTR lpText,
[in, optional] LPCSTR lpCaption,
[in] UINT uType
);

那么你就可以根据这个声明,构造出在 JS 接口
const user32 = ffi.Library('user32', {
MessageBoxA: ['int', ['int', 'string', 'string', 'int']],
});

然后就可以这样调用它
user32.MessageBoxA(
0,
'hello',
'title',
0x00000001 | 0x00000020
)
milkleeeeee
2022-05-06 17:30:50 +08:00
@DOLLOR #14 感谢,这下我更清楚了……不过我看了下 node-ffi-napi ,它也是好几年没人维护了,且从 issues 来看,不支持 macOS 的 arm64 版本,看起来没法满足我的需求

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/851011

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX