测试已测试 | ✗ |
Language语言 | SwiftSwift |
许可证 | 自定义 |
发布最新发布 | 2017年2月 |
SwiftSwift 版本 | 2.3 |
SPM支持 SPM | ✗ |
由 NodeKit 维护。
{NK} NodeKit 是一个通用的、开源的嵌入式引擎,它为 macOS、iOS、Android、Fire OS 和 Windows 桌面和移动应用程序提供了一个完整的 Node.js 实例。
对于应用程序开发者,后端可以用纯 Node javascript 代码编写,前端可以用您选择的任何架构,包括但不限于 Atom Electron API、Facebook React、Express 等。
{NK} NodeKit 允许为 Node 开发的应用程序一次开发,然后在不进行任何修改的情况下在上述任何平台以及浏览器中运行。
此存储库 nodekit-io/nodekit-darwin 包含了特定于 Apple 平台的组件(包括 iOS、OSX 和 tvOS)。
有关 Windows 平台的相应存储库,请参阅 nodekit-io/nodekit-windows(包括 Windows 7+ 桌面、Windows 10 桌面、Windows 10+ 移动、Xbox、SurfaceHub 和物联网设备系列)
有关 Android 平台的相应存储库,请参阅 nodekit-io/nodekit-android。
注意:即将推出命令行工具
npm install nodekit -g
nodekit create myapp io.nodekit.myapp myapp
cd myapp
nodekit platform add ios
nodekit platform add macos
nodekit build
nodekit run macos
测试直接嵌入为一个 {NK} NodeKit 应用程序。{NK} NodeKit 作为一个纯 Swift 2.x 的项目很棒的一点是它没有外部依赖。
git clone https://github.com/nodekit-io/nodekit.git
在 Xcode 中打开 src/nodekit.xcodeproj
。您将看到 4 个构建目标,其中 2 个用于框架(分别用于 iOS 和 OSX)、2 个用于示例应用程序。
为 My Mac 构建 nodekit-Mac-sample 或为 iOS 模拟器(例如 iPhone 6)构建 nodekit-iOS-sample 并运行。
您应该会看到一个漂亮的聊天应用程序,它将自动调整大小以适应设备大小,并且在所有平台上都能正常运行而无需更改。
在 main.swift 中添加两行代码以启动内嵌的 WebKit 视图并启动 NodeKit 引擎(已经在示例中为您准备好了)。
import NodeKit
NKNodeKit.start();
确保任何标准Node应用程序位于app/目录中。此应用程序将在main
进程中运行(一个隐藏但高性能的JavaScript引擎,如Nitro WKWebView或JavaScriptCore)。应用程序通常首先做的事情是打开一个renderer
窗口,与Atom Electron非常相似
const app = require('electro').app;
const BrowserWindow = require('electro').BrowserWindow
app.on('ready', function() {
var window = new BrowserWindow();
});
示例应用程序包含一个内置的Web服务器,用于提供静态和动态内容;在iOS上,这可以通过localhost端口上的http服务器实现,但在OSX上,你可能想完全不使用端口,只使用内置协议服务器。
在Xcode中为iOS和Mac目标构建。
{NK} Scripting是混合应用程序的高级JavaScript - 原生(Swift、Objective-C、.NET C#)桥梁。它建立在JavaScriptCore或ChakraCore等核心平台桥梁之上,但抽象了实现细节并标准化了甚至在同一平台上的多个脚本引擎家族(例如iOS上的Nitro WKWebView和UIWebViews)。它是{NK} NodeKit的基础,可以用而不需要{NK} Electro或{NK} Core,或者可以使用替代品。
{NK} Electro是针对{NK} NodeKit应用程序的API,用于简化应用程序生命周期和用户界面任务。它受到了Atom Electron API的启发,通常是一个更轻量但代码兼容的子集。它需要{NK} Scripting,但如果您不需要所有Node特性,只需要一种轻量级的方法来构建通用桌面和移动应用程序(有点像Cordova),并且希望使用{NK} Scripting功能,则无需{NK} Core。
{NK} Core将上述功能更进一步,并为{NK} NodeKit应用程序提供了一种轻量级但功能齐全的Node版本。它利用Node所有JavaScript组件的原始Node源代码,但通常使用不同绑定以利用每个平台的内置JavaScript引擎(而不是V8引擎)。可能的话,将原生代码移至JavaScript。它需要{NK} Scripting,并且通常与{NK} Electro一起使用,但技术上可以用您自己的代码或插件替换{NK} Electro以打开和管理窗口生命周期。
{NK} NodeKit存储库包含一个XCode项目,其中包含所有上述组件(无依赖项),可以编译为一个iOS 8 +和macOS 10.9 +动态框架。Windows 10和Android的版本正在积极开发中。
单框架文件(包含二进制代码和嵌入的资源,如核心Node.js JavaScript代码)可以直接包含在任何iOS或macOS应用程序中。请参阅示例应用程序以获取示例。您因此可以编译并创建自己的项目;实际上,没有应用商店的消费者真正需要知道您是如何构建的,除非您想告诉他们或修改{NK} NodeKit源代码。
YES 对于所有JavaScript部分(Node的大部分当然是用JavaScript编写的)。NO 对于所有的V8绑定。
我们将Node.js的源文件直接包含在NodeKit中(您可以在名为lib的文件夹中找到框架包中的这些文件)。然后,我们添加自己的绑定来替代V8本地绑定,尽可能用JavaScript编写,对于像套接字、定时器和文件系统这样的真正平台特定内容,用少量本地调用来实现。这些绑定与Node版本具有完全相同的API签名,因此可以替换插件。
这意味着大多数Node包将无需修改即可正常工作。对于那些需要与V8进行node-gyp本地绑定的包,将需要替代方案。
实际上,我们借鉴了所有这些技术和类似的优秀项目Nodelike和Nodyn(它们都已不再维护)以及微软为ChakraCore提供的Node分支,通过重新编写到V8的绑定来实现。然而,我们尽可能多地使用了JavaScript代码。整个Node生态系统理论认为,JavaScript相当快,事实上,当我们像{NK} NodeKit使用的Nitro引擎那样编译时,它确实非常快。在本地和在JavaScript之间进行桥接通常会增加延迟,而我们希望避免这种情况,除非是必要的或者已经由新兴的HTML5/ES5/ES6特征完成。
然而,我们真正的动机并不是执行速度,我们不想在每个应用程序下载中包括一个大的48Mb可执行文件用于Chromium或其JavaScript引擎......因为大多数现代操作系统已经包含了一个ES5引擎。
因此,在iOS和macOS上,我们使用JavaScriptCore或Nitro...在Windows上,我们使用Chakra或ChakraCore...在Android和Linux上,我们使用Chromium/V8。Node JavaScript源代码可以在每个平台上运行(在某些情况下我们添加了一些polyfills),我们唯一需要编写(每个平台一次)的是绑定,而实际上只是核心四个(TCP套接字、UDP套接字、定时器和文件系统)。其他如缓冲区、加密等,则使用只有JavaScript的版本(好吧,对于一直跟到这里的人,实际上对于加密,我们只是不喜欢JavaScript引擎变体的随机生成器,所以我们深入到操作系统中为随机字节调用提供改进的安全性,没有OpenSSL依赖,只是本地平台)
只需使用Safari Web Inspector来设置断点、检查变量等,无论是在JavaScriptCore和Nitro脚本引擎中(对于主进程)还是渲染进程的UI和JavaScript环境中。
Apache 2.0
我们选择了平台特定代码以允许在GitHub上按语言搜索,并适当显示(例如,Swift的趋势仓库、C#),允许对次要的平台特定更改有不同的版本号,并且由于仓库本质上不是相互依赖的,而是作为带有相同功能和API的补充语言端口。
{NK} Sockets
的形式发布,虽然有大量的优秀的Objective-C库,但Swift版本的就更少(而且几乎没有没有附带微小C依赖的,而这种依赖我们已经消除了),我们不得不从几个互补来源拼凑出这个框架。