连接 Node.js 和 Swift 代码。
NodeSwift 允许你编写 Swift 代码来与 Node.js 库进行交互,反之亦然。这实现了以下可能性,例如:
MyModule.swift
import NodeAPI
#NodeModule(exports: [
"nums": [Double.pi.rounded(.down), Double.pi.rounded(.up)],
"str": String(repeating: "NodeSwift! ", count: 3),
"add": try NodeFunction { (a: Double, b: Double) in
"\(a) + \(b) = \(a + b)"
},
])
index.js
const { nums, str, add } = require("./build/MyModule.node");
console.log(nums); // [ 3, 4 ]
console.log(str); // NodeSwift! NodeSwift! NodeSwift!
console.log(add(5, 10)); // 5.0 + 10.0 = 15.0
NodeClass
的 class
。我们还使用了一些 Swift 特性,例如动态成员查找,这些特性正是为了使这种互操作变得容易而设计的。一个 NodeSwift 模块由同一个文件夹中的 SwiftPM 包和 NPM 包组成,两者都将 NodeSwift 声明为依赖项。
Swift 包作为原生 Node.js 模块暴露给 JavaScript,JS 代码可以使用 require
引入它。两端通过 Node-API 进行通信,而 NodeAPI
模块在 Swift 端对 Node-API 进行了封装。
有关详细信息,请参阅 /example 中的示例。
WebAssembly
虽然 WebAssembly 在性能方面很出色,但它仍然在虚拟机中运行,这意味着它无法访问原生的 Darwin/Win32/GNU+Linux API。NodeSwift 在裸机上运行你的 Swift 代码,这应该比 WASM 更快,此外还能解锁对操作系统原生 API 的访问。
另一方面,如果你想在浏览器中运行 Swift 代码,WebAssembly 可能是正确的选择,因为 NodeSwift 需要 Node.js 运行时。
其他 NAPI 封装器
NAPI、NAN、Neon 等都是构建原生 Node.js 模块的其他选项,每种都有其自身的优势。例如,NAPI 是用 C 编写的,因此以内存不安全为代价提供了出色的可移植性。如果你想在 Apple 平台上增强你的 JS 工具,如果你想将 Node.js 代码引入你现有的 Swift 程序中,或者如果你只是更喜欢 Swift 而不是 C/C++/Rust 等,那么 NodeSwift 是一个不错的选择。