天天看點

NodeSwift 能火麼?Node.js 和 Swift 的強強聯合!

作者:進階前端進階

大家好,很高興又見面了,我是"進階前端‬進階‬",由我帶着大家一起關注前端前沿、深入前端底層技術,大家一起進步,也歡迎大家關注、點贊、收藏、轉發,您的支援是我不斷創作的動力。

NodeSwift 能火麼?Node.js 和 Swift 的強強聯合!

什麼是 NodeSwift

NodeSwift 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!
NodeSwift 能火麼?Node.js 和 Swift 的強強聯合!
NodeSwift 能火麼?Node.js 和 Swift 的強強聯合!

開發者雖然可以通過 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