大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。
什么是 NodeSwiftNodeSwift allows you to write Swift code that talks to Node.js libraries, and vice versa. This enables possibilities such as using native macOS APIs and SwiftPM in an Electron app.
NodeSwift 用于桥接 Node.js 和 Swift 代码。NodeSwift 允许开发者编写与 Node.js 库对话的 Swift 代码,反之亦然。该库实现了以下可能性:
在 Electron 应用中使用本机 macOS API 和 SwiftPM。从 Swift 程序,如: macOS 应用、iOS 应用或 Vapor 服务器与大量 NPM API 交互。通过在 Swift 中编写性能关键位来加速 JS 代码。NodeSwift 有以下突出特点:
安全:NodeSwift 利用了 Swift 的内存安全性和自动引用计数。这意味着,与基于 C 的 Node-API 不同,开发者在编写 NodeSwift 模块时永远不必考虑内存管理。惯用:NodeSwift 的 API 在惯用的 Swift 代码中感觉很自在多功能:开发者可以访问 Swift 中的全套 Node.js API,从 JavaScript 对象操作到事件循环调度。跨平台:NodeSwift 不仅适用于 macOS,还适用于 Linux、Windows 甚至 iOS!开发者虽然可以通过 WebAssembly 实现类似的能力而且性能出色,但其仍然在虚拟机中运行,这意味着其无法访问原生 Darwin/Win32/GNU+Linux API。NodeSwift 在裸机上运行 Swift 代码,除了解锁对操作系统原生 API 的访问之外而且比 WASM 更快。
另一方面,如果想在浏览器中运行 Swift 代码,WebAssembly 可能是正确的选择,而 NodeSwift 需要 Node.js 运行时。
如何使用 NodeSwift假如有下面的 MyModule.swift 代码:
// 这里是swift模块代码import NodeAPI#NodeModule(exports: [ // swift 导出的几个方法给js调用 "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 中引用上面 swift 代码的示例:
// 如何在js中引入swift模块代码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除了 NodeSwift 外,NAPI、NAN、Neon 等都是构建原生 Node.js 模块的方案,每个都有自己的优势。例如,NAPI 是用 C 编写的,因此以内存不安全为代价提供了很好的可移植性。如果想在 Apple 平台上增强 JS 工具或者想将 Node.js 代码引入现有的 Swift 程序,或者只是更喜欢 Swift 而不是 C/C++/Rust / 等,那么 NodeSwift 是一个不错的选择。
更多关于 NodeSwift 的用法和示例可以参考文末资料,本文不再过多展开。
参考资料https://medium.com/@nodeswift/step-by-step-run-your-aethir-checker-nodes-testnet-f8717d717a3b
https://medium.com/@nodeswift/step-by-step-run-your-aethir-checker-nodes-testnet-f8717d717a3b
https://www.brainmobi.com/blog/server-side-swift-frameworks-vs-node-js/
https://github.com/kabiroberai/node-swift