有哪些像 Nativescript 这样的技术项目,在某种意义上是原生平台到 Javascript+原生反射代理绑定?

Posted

技术标签:

【中文标题】有哪些像 Nativescript 这样的技术项目,在某种意义上是原生平台到 Javascript+原生反射代理绑定?【英文标题】:Which technology projects like Nativescript are there, in the sense a native platform to Javascript+native reflection proxy binding? 【发布时间】:2018-03-06 13:23:32 【问题描述】:

Nativescript 最基本的特性是它将不同平台的语言和 API:s 转换为 javascript(或另一种给定的单一语言,例如 C#),例如对于 iPhone,它是 Objective C 语言和 ios API:s,对于 android 手机,它是 Java 语言和 Android API:s。

Nativescript 的“对 Javascript 代理的构建时反射”是这里的核心。

通过在线阅读各种“Nativescript 与其他”页面,我很清楚,这些页面的作者并没有真正讨论那个确切的方面,所以这些文章根本不能用来概括那种情况。

所以我想在这里问你:

有哪些项目可以提供该基本功能 - 从不同的智能手机(可能还有桌面)平台到 Javascript(或另一种单一语言,如 C#)的语言 + API 绑定?

所有 WebView/html 呈现的基于 UI 的解决方案在此处被取消资格。只有本机 UI 组件解决方案才有资格。也请随意列出不合格的解决方案,供大家参考,并仔细标出不合格的解决方案。

因此,我了解 Apache Cordova (https://cordova.apache.org/docs/en/latest/guide/overview/) 被取消资格。

我更喜欢 Javascript,但是让我们枚举所有项目,与在统一层使用哪种语言无关,因此 Xamarin 在此线程中是合格的。

对于那些各自合格的解决方案,它们是否真的像 Nativescript 一样全面/完整,是否受到支持,或者它们如何比较?

对于各自的解决方案,它们是否还提供一个运行时,将底层不同的 UI API:s 集成到一个跨多个平台的统一 UI API 中? (对于 Xamarin,我理解这个问题的答案是否 - 不同平台需要不同的代码。)

他们在方法上的主要区别是什么?

我挑选的一些可能符合条件的名称是“React Native”、“Appcelerator Titanium”和“Electron”(https://electron.atom.io/)。

这个问题对于任何像我这样的应用程序创建者或初创公司都很重要,他们会非常依赖解决方案,并希望做出很多贡献,所以这是一个长期的选择。

因此,对于我想要的每个相关解决方案: * NAME, URL: 它的名字,带有 URL * 不合格?:不合格与否 * AUTO-REFLECTION:是否具有自动构建时反射,任何细节 * LANGUAGE:统一语言(例如 Javascript) * 统一的 UI 代码:平台之间的 UI 代码相同 * 平台:支持的平台 * 代码转换:有关如何管理应用程序源代码的任何注释,例如它是否在设备上作为 Javascript 运行,是否对 Javascript 代码进行了任何代码转换(例如,解析出实际上本身不是有效 Javascript 的自定义标签),是否在 Javascript 上应用了任何类型的编译等。

请告诉我。

这对于概述非常有价值。

再次感谢 Telerik 和 Nativescript 团队创造了这项出色的技术!

【问题讨论】:

这里的主题相同(也许论坛作为记录答案的位置有一些好处):discourse.nativescript.org/t/… 【参考方案1】:

手机:

Cordova/PhoneGap/Ionic - https://cordova.apache.org/ - 不合格 - 统一 UI - JS/HTML/CSS - 基本上是一个包装好的 web 视图,能够进行本地绑定,您可以从中调用它。从某种意义上说,您可以通过您创建的插件访问本机平台。事实上,Microsoft 有一个名为 Project Ace https://microsoft.github.io/ace/ 的项目,它允许您访问 Cordova/Phonegap 应用程序中的 Native API。应用程序代码在 webview 中运行;并且所有内容都被发送到您构建到应用程序中的操作系统和插件中。尽管有“营销”的说法(离子在这里试图混淆市场真的很糟糕); Cordova/PhoneGap/Ionic 并不是真正的原生应用程序。它可能使用一些本机控件,但引擎在 web 视图中运行。

Flutter - https://flutter.io/ - 取消资格 - 统一 UI - Dart - 这是市场上另一个有趣的入口;它是在所有平台上完全编译的代码,因此它比基于 JS 的引擎性能更高。此外,它被编写成一个非常高性能的 UI(UI 的单独线程)。要访问平台上的原生 api,您需要使用编译后的 dart 所期望的接口以及 iOS 或 Android API 创建插件。

Fuse - https://www.fusetools.com/ - 不合格 - 统一 UI - JS - 这是一个有趣的项目;它实际上将标记编译为已编译的代码。我相信 JS 引擎在它自己的线程上运行,而 Fuse 运行时处理 GUI 线程。据我所知,所有的 thunking/reflection 都必须通过插件来完成。

NativeScript - https://www.nativescript.org - 合格 - 统一 UI - JS/XML/CSS - 在两种设备上使用相同的标记语言进行屏幕布局,有自己的内置系统来编组调用进入两个平台上的操作系统。访问任何 API 资源不需要额外的插件,iOS 和 Android 上的所有内容都可以通过纯 JavaScript 访问。在应用程序的主线程上运行 Javascript 引擎,如果您让主线程忙,这可能会导致性能问题。由于它的设计,它可以重用几乎所有未修改的 Android AAR/JAR 插件和 iOS cocoapod 插件,带来大量原生控件,通常只有在使用 ObjC/Swift/Java 时才能使用。它也是唯一一个零日访问新 API 的,因为反射是在运行时解决的。

React Native - http://www.reactnative.com/ - 不合格 - 统一 UI - JS - 它也是一个基于 JavaScript 引擎的系统,但它没有内置反射。几乎所有对设备 API 的访问都需要通过已编译的插件来运行,这些插件可以访问本机 API。需要注意的一点是,这个 JS 引擎在自己的线程上运行,而主线程是为 GUI 保留的。这可以提高应用的开箱即用性能,因为任何阻塞都会在单独的线程上发生,但会使与 GUI 相关的插件更难执行。

Xamarin - https://www.xamarin.com/ - 合格 - ??? - C# - 它有一种内置的反射。当他们发布新版本时,他们基本上创建了一个具有当前反射的 thunking 库。因此,当新版本的操作系统出现时,它们必须重新生成 C# thunkings,然后才能使用它。应用程序是在 iOS 上编译的,在 Android 上我相信它使用 Mono 来运行应用程序。所以你不能在运行时在 iOS 上做某些事情,比如 eval('console.log("hi"); /* even more JS code */') 就像在基于 JS 的引擎上一样。

桌面:

Electron - https://electron.atom.io/ - 不合格 - 统一 UI - HTML/CSS/JS - 这是一个基于桌面的环境,它合并了节点和 chrome。因此,您可以访问任何 Node api(非常大)和任何 chrome api 并创建应用程序。但是,您需要创建插件的任何较低级别。

NW - https://nwjs.io/ - 不合格 - 统一 UI - HTML/CSS/JS - 与 Electron 的注释基本相同。

几个注意事项:

    所有基于 JavaScript 的引擎都不编译代码;它们都在运行时运行 JavaScript 代码。

    您可以使用 Cordova/PhoneGap/ionic 在桌面(使用 electron/nw)、Web 和移动设备之间轻松共享应用程序。但它仍然是所有平台上的网络应用程序。

    您还可以将 NativeScript 与 Angular 结合使用来创建应用程序,该应用程序在移动、Web 和桌面(电子/nw)应用程序之间共享大约 98% 的代码库。基本上,某些应用程序中唯一的区别只是屏幕布局,因为您需要 Web 的 div/input 标签和移动端的 StackLayout/TextInput。但是其余的代码和逻辑可以是通用的,并且可以正常访问元素。

【讨论】:

不确定 Flutter 是否应该被取消资格。它不使用 Webview;它使用天空渲染引擎。 除非我误解了这个问题,否则取消资格是任何没有内置绑定/反射的东西。据我所知,目前只有两个平台内置了反射(除了使用纯原生 java/objc/swift);那就是 NativeScript 和 Xamarin。当您想调用任何本机 api 函数时,您通常必须在 Java/ObjC 中创建到相应语言的桥梁。不过,话虽如此,我相信如果 Google 继续努力,Flutter 会有未来。

以上是关于有哪些像 Nativescript 这样的技术项目,在某种意义上是原生平台到 Javascript+原生反射代理绑定?的主要内容,如果未能解决你的问题,请参考以下文章

带有 nativeScript 的 Mapbox

在 nativescript-pager 中动态添加项目会破坏视图顺序

透明 ActionBar:将 NativeScript 与 Angular 结合使用

来自另一个路径的模型类在 NativeScript 中引发错误调用模块

NativeScript:多个库,包名称为“com.google.android.gms.license”

Nativescript-Vue Javascript 导入自定义元素,如 Button、FieldView、Label ecc