返回 登录
10

以 Swift 作为服务器的软件框架功能对比(节选)

原文:Current Features & Benefits of the Top Server-Side Swift Frameworks
作者:Ryan Collins
译者:Rocky Wei
CSDN 有奖征稿啦】技术之路,共同进步,欢迎投稿、给文章纠错,请发送邮件至mobilehub@csdn.net,或加微信 tree-rain-chen。

当可用于生产服务器的 Swift 后台软件框架体系进入我的视野时,如何选择哪一种品牌来开始新项目是一个困难的问题。根据我个人的研究和经验,以下是时下最热门的软件体系的介绍和对比。

首先重要的事情说三遍:在决定最终选择之前,最好您亲自尝试所有的框架。我以前曾经做过上面的各个软件评测报告,但是真的不能仅仅依靠运行速度或者其他唯一指标来决定一切,最好都尝试一下。

目前最流行的服务器端 Swift 软件函数库/服务器包括了 Vapor、Perfect、Kitura 和 Zewo。它们各自互不相同,我尝试了一圈然后来写这篇文章与您分享。我按照其支持的功能多少决定了论述的顺序,从功能最少到功能最多列出。

本文撰写时间为 2017 年 3 月,因此您在阅读时请注意这个时效性(因为每个厂家都在努力进步)。

从 Zewo 开始

Zewo 受 Go 语言启发,采用了 Go 类型的并发(concurrency)因此避免了回调函数,采用麻省理工开源许可证,据我所知,该品牌为 GitHub 上一些独立程序员共同维护。

Zewo 目前的性能速度已经足够快,并包括了运行一个服务器所需要的所有基本功能特征,包括 HTTP 服务器请求/响应,URL 路由,TLS(SSL)传输认证加密,页面基本模板(Mustache),结构化数据(JSON/XML),还允许使用中间层(过滤器)。

Zewo 支持 Tunstile 认证函数库,因此能够实现用户登录和会话管理。另外还原生支持 JSON Web Tokens。Zewo 提供的数据库驱动包括 MySQL、PostgreSQL、Redis 和 RethinkDB,以及一个使用 Postgre 的数据库对象自动化管理(ORM)函数库。

在部署方面,Zewo 具有 Docker 镜像并支持所有 Swift 原生平台(macOS 或 Ubuntu 14/16)。

在使用说明方面,Zewo 有一个基本的项目范例,开发时必须执行的步骤,以及 PostgresSQL 的驱动使用指南。除此之外,范例中还包括了 websockets 和 graphQL。目前 Zewo 的文档仅限于项目快速上手。

  • Zewo 的优点: 如果您喜欢使用 Go 风格的 concurrency 并发,并且讨厌用回调函数进行线程操作的话,那么 Zewo 是您希望使用的。尽管速度够快,而且不能算是最快的,我相信还是有可能有程序员希望使用 Go 风格并发。目前 Zewo 是所有 Swift 后台框架中唯一具有有效的 graphQL 示例的服务器,但并不是唯一支持 graphQL 的 Swift 组件,因为 GraphQL 本身就有一个第三方的 Swift 软件包。Zewo 的自持技术包括 ZeroMQ 消息队列和 Lua 脚本库,因此如果您想在服务器里使用 Lua、连接到 RethinkDB 数据库或者与 ZeroMQ 打交道,那么 Zewo 就是唯一的选择。

  • Zewo 的缺点: 与本文提到的其他三巨头项目相比,Zewo 属于一个小众产品,这意味着产品支持度有限;同时开发文档也非常糟糕——迄今(2017 年 3 月)为止也就是一个快速上手的指南而已。如果您熟练掌握,则需要大量阅读其源代码并且经常访问他们的 Slack 频道,因为几乎没有什么现成的示范代码供参考。小众社区则意味着开发进度比较慢而且功能非常有限,无法与其他 Swift 后台软件相比,详见下文。

  • Zewo 总结: 如果您喜欢 Go 风格并发、讨厌回调函数,或者希望在 Swift 上使用 ZeroMQ、Lua 或者 RethinkDB,那么 Zewo 是首选。如果您需要完善的文档、教程、或者更多的功能支持,那么最好再看看其他的软件。不过话要说回来,如果您希望亲自贡献大量代码或者文档,这倒是个好机会,因为我相信 Zewo 绝对需要您的社区支持。

下一个:Kitura

Kitura 是由蓝色巨人 IBM 在 2014 年与苹果公司宣布企业合作时启动的项目之一,采用 Apache 2.0 许可证。

与 Zewo 的 Swift 后台基本功能一致,Kitura 同样包含了这些标准功能,不过还包括了一些高级的特征。不过有一个显著的差别,就是 Kitura 只支持 JSON 作为唯一的原生结构化数据支持。如果您需要在 Kitura 为基础的项目上使用 XML,那么很抱歉您不得不另找门路。Kitura 还支持 Aphid MqTT(物联网 IoT 消息队列服务)。

在用户认证方面,Kitura 依赖于 Kitura-Credentials 加密工具。另外,Kitura 还预装 CORS/CSRF(网站交叉访问)中间层(用于过滤欺诈访问),还包括了比较热门的第三方登录工具,比如谷歌、脸谱和 GitHub 登录。但 Kitura 尚未实现对 JSON Web Tokens 的原生支持。

数据库方面 Kitura 是比较特殊的。对于传统关系型数据库,Kitura 采用了一个 SQL 数据库抽象层 Kuery(发音同 Query 查询)用于消除各种 SQL 数据实现的语法差异。通过 Kuery,可以直接调用 MySQL、SQLite 和 PostgreSQL。Kuery 不是一个完整的 ORM 数据库对象自动化管理实现,但是使用抽象层确实比直接调用 SQL 语句会更 Swifty(双关语:方便并且更贴近 Swift 品牌理念——译者注)一些。Kitura 还包括对诸如 Redis、CouchDB、Apache Cassandra 和 ScyllaDB 的支持,但是这些原生支持非关系型数据库并没有融合到 Kuery 抽象层去。

在页面模板方面,Kitura 不但支持 Mustache,还支持 Markdown 和 Stencil。此外 Kitura 还支持 FastCGI,允许从 Apache 进行流挂接。更深入一些可以发现,Kitura 还原生支持 Watson API(包括气象分析数据),而且还有一个比较好用的 HTML5 对象实体函数库。

Kitura 的部署当然是支持 macOS 和 Ubuntu 14/16,但是与其他 Swift 后台软件相比,IBM 提供在 Bluemix 云上对 Swift 的 macOS 应用原生集成。如果您已经使用 Bluemix 云建网,那么 Kitura 有很明显的优势。

在文档支持方面,Kitura 的在线资源还是很丰富的。其官方网站有一个做的很好的启动指南,并且所有的函数都有非常好的编程手册、结构清晰的教学文档以及在编译程序、测试和部署的辅助参考。

  • Kitura 的优点: 最显著的优点就是 Bluemix 云集成,使得 mac 应用能够直接上云,这一点非常不同。其次若干功能比如 IBM Watson API 函数库、Apache Cassandra 和 SyllaDB 数据库、以及 Stencil 模板,这些都是使得 Kitura 在某些特定项目上会成为唯一的选择。

  • Kitura 的缺点: 在社区文化方面,Kitura 在四种 Swift 框架体系的 Slack 用户数量比较中排第三。虽然其 Slack 群的人数比 Zewo 多一些,但是相比其他社区而言,Kitura 社区的确不能算是够活跃,尽管我本人曾经获得 IBM 以及该社区的成员的在线支持。如果您想在 Kitura 中使用 SQL,那么很抱歉您不得不使用其 Kuery 语法。尽管 Kuery 与 SQL 语言相比差别不算太大,但是总是要花一些时间才能上手。如果您希望使用 Turnstile 用于用户认证,那么对不起找别人吧。虽然 Kitura 有自己原生的用户认证函数库,但是 Kitura 真的是四个 Swift 后台软件中唯一不支持 Turnstile 的服务器框架。

  • Kitura 总结: Kitura 成名在于背后的蓝色巨人 IBM。相信 IBM 短期内不太可能消失,因此 Kitura 的开发肯定会比较持久。尽管 Kitura 没有最大的社区,也不具备最丰富的功能体系,但是已经能够基本满足很多程序员的需要。Kitura 有一些独特的功能,但是如果要投入使用也不得不多学习一些新内容(Kuery 关系数据库抽象层)。如果 IBM 的云平台比如 Watson 或 Bluemix 对您很有吸引力,那么 Kitura 是首选因为已经与上述 IBM 云做了后台集成。

压轴 Vapor

一旦接触 Vapor 您很快就会了解的两件事情:他们有最大最活跃的开发社区,而且 Vapor 的使用语法非常简单。Vapor 是所有 Swift 后台软件中完全使用 Swift 开发出来的软件。Vapor 的所有权是一个初创公司 Qutheory 有限公司,该软件使用麻省理工开源许可证。

由于完全使用 Swift,Vapor 因此从一开始就有些不同。首先,Vapor 为了实现“纯 Swift”开发而牺牲了一些速度(注意速度不是唯一的也不是最重要的指标,这也是为什么我要写这篇文章的部分原因)。其次,Vapor 也因为纯粹的 Swift 语法而使其源代码获得很好的易读性,并且不依赖于许多第三方软件,比如其他软件可能使用的是 Node.js 的 HTTP 语法分析器,但是 Vapor 开发了其原生的 Swift 版本的 HTTP 解析器。这也是的其函数库能够以 Swift 语言的方式保持命名规范和易读性。就像 Zewo 热衷与 Go 风格的并发函数库一样,Vapor 对于完全用 Swift 编写所有代码这件事情上也非常自豪。

Vapor 有一组非常好的核心功能,包括他们自己开发的功能;但在基本功能中比较显著的是与 Kitura 和 Zewo 相比,Vapor 缺乏对 XML、CSRF 反欺诈网站交叉访问中间层和 FastCGI 的支持。当然,Vapor 也开发了很多 Kitura 和 Zewo 没有的功能,比如支持苹果的消息推送服务 APNS,以及用 SMTP 发送邮件等,这两个函数库都很好用。

Vapor 的数据库功能是比较完整的,不但包括对 MySQL、Sqlite 和 PostgreSQL 的支持,还支持 Redis 和 MongoDB。此外,Vapor 支持 SQLite / MySQL、PostgreSQL、MongoDB 的数据库对象关系自动化管理(ORM),名称为 Fluent。因为完全采用 Swift 接口,Fluent 的驱动是协议导向的,因此很容易在此基础之上追加任何数据库驱动。

服务器 Swift 应用中比较流行的 Turnstile 用户身份验证框架已经集成到了 Vapor 之中,可以直接使用,不需要增加额外的依存关系。Vapor 还包括了一个完整的加密函数库并提供原生支持。其他的原生函数库包括用户认证、会话管理、预装的数据库关系对象自动化管理 ORM 系统(Fluent)以及 CORS(请求来源变化控制)中间层。

由于有庞大而活跃的社区支持,其开发进展非常可观。自 2016 年 9 月官方发布 Vapor 1.0 以来,该团队一直在努力;近期在公测 Vapor 2.0 的 alpha 版本,常常能看到每天有数次更新。

Vapor 有一些独特的功能。首先除了 Mustache 和 Markdown 脚本之外,Vapor 还有自己独立的模板引擎,名为 Leaf(叶子)。由于采用 Swift 开发并直接集成到 Vapor 引擎,该脚本系统能够在 Vapor 服务器上很好地处理请求和响应。另外 Vapor 的路由验证系统也很独特,能够控制路由在传递参数时控制参数类型,比如整型 Int。另外一个特点是使用 SwiftyBeaver 日志系统,并提供一系列用于创建和操控项目的命令行,这些命令能够直接在终端命令行中使用,或者通过其自带的 homebrew 进行操作。Vapor 还提供了一系列 Swift 开发的命令行工具,包括进度指示器等等。Vapor 本身的命令行工具也非常有特点,您可以通过扩展其终端协议来处理您程序中自己的命令行参数。

在部署方面,当然和其他所有 Swift 后台软件一样,可以原生支持 macOS 和 Ubuntu 14/16,还包括了 Docker 的镜像,以及其 Toolbox 命令行辅助工具,用于在 Heroku 或 Docker 上运行。

文档方面 Vapor 的资源非常丰富,组织的很好,使用很方便,但是还不太完善(比如如果您需要查看 MySQL 的详细函数,则需要查看源代码)。Vapor 还有一个非常独特的优点是他们有自己的在线教学视频网站——Vapor 大学:http://vapor.university。该网站上包括了很多的 Vapor 教学及演示集锦,以及从热门 IT 教学网站 Ray Wenderlich 上发布的 Vapor 课程。Vapor 的 GitHub 上包括了很多示范项目,比如 Leaf 模板、SQLite、认证、开发步骤、Vapor 在线大学的网站源码、在线聊天源码、Fluent 数据库关系自动化管理系统 ORM、网站仪表盘 Dashboard、Pokedex(如果你喜欢抓皮卡丘小怪物)和一个 Slack 聊天机器人(就在本文发表的当天,Perfect 也推出了自己的 SlackBot 聊天机器人,位于 GitHub/PerfectServers 目录下——译者注)。Vapor 甚至提供了一个最基本的中文文档。

  • Vapor 的优点: Vapor 有最干净简洁的语法和最庞大而活跃的开发社区。这些都使得 Vapor 对于初学者来说非常容易上手。Swift 初学者们可以很快找到所有必要的教学资源、简洁的语法和非常活跃的社区支持。如果您在寻找完全由 Swift 语言开发的服务器后台,那么 Vapor 将是唯一的选择,因为其他的 Swift 服务器框架体系都至少包括一个以 C 语言为幕后基础的函数库。SwiftBeaver 也是原生的,还有一个优点是在路由中检测变量类型、消息推送和 SMTP 简单邮件协议支持,数据库的支持也很好。

  • Vapor 的缺点: 由于纯粹使用 Swift 开发,Vapor 牺牲了一些服务器的性能和速度。所以如果您需要吞吐量超大的服务器,那么要么掏银子增加预算,要么还是找其他选择吧。这不能算是慢,但是肯定不是最快的。虽然文档资源很丰富,但是其文档还是有提高的空间,特别是某些原生数据库支持方面(欢迎给他们提供改进方法)。

  • Vapor 总结: Vapor 非常适合初学者以及 Swift 纯粹主义者——语法简洁功能丰富。Vapor 的开发社区庞大而活跃、演进和补丁的速度也够快,社区的支持反馈也很迅速。如果您的功能需求在 Vapor 提供范围内,而且您希望项目的语法精准易读、实现迅速,那么请选择 Vapor。

最后的大轴 Perfect

Perfect 是功能绝对强大、速度绝对够快的 Swift 服务器软件体系。Perfect 有加拿大软件公司 PerfectlySoft 运营,获得了种子基金支持并在其母公司内孵化。而且值得一提的是 Perfect 的历史——其团队核心成员与苹果公司有很深的渊源——之前是 Lasso 计算机语言的核心成员——苹果公司早期的软件产品线 Lasso。该团队开发服务器软件有很多年历史,随后才战略转移到了 Swift 语言。Perfect 采用 Apache 2.0 许可证。

首先 Perfect 的显著特点之一就是包含了大量的源代码库。因为数量太多,所以 Perfect 将 GitHub 上将源代码划分为以下几个分支团队:

这可能是因为如果采用别的方式代码会比较难于管理,也的确是因为 Perfect 的功能过于丰富、参考示范代码也太多,所以不得不分开管理。

Perfect 包括了您所期待的所有基本功能,包括路由、websockets 基于 HTTP 的网络套接字、TLS(SSL)通信加密、Mustache 模板和 Markdown 模板、JSON 结构化数据等等,以及全部其他所有 Swift 后台框架加在一起才有的 XML 结构化数据、苹果推送消息 APNS、MqTT 消息队列和 SMTP 邮件发送。实际上很难发现 Perfect 缺乏什么功能,可能唯一缺乏的就是路由参数类型验证机制。除非刻意去找茬,否则很难需要 Perfect 去配合 IBM 的服务或者采用 Vapor 自创的 Leaf 模板。Perfect 没有任何附加的命令行工具,不过 Perfect 有自己独特的原生 Mac 图形界面应用程序。

Perfect 的社区同 Vapor 一样庞大而活跃,在所有 Swift 后台框架中 Slack 用户人数排第二名,仅次于 Vapor(人数比 Vapor 稍微少一点)但是发展膨胀速度一样很快。

Perfect 的数据库支持非常广泛,其原生 SQL 驱动包括 MySQL、SQLite、PostgreSQL 和 MariaDB,还支持 MongoDB、Redis、CouchDB 甚至还包括 FileMaker(苹果自己的数据库 Swift 都不支持,Perfect 反过来支持——译者注)。Perfect 据说还部分支持微软的 ODBC,即多种数据库的底层兼容界面——有点像 ORM,但是以 C 函数库为基础。提到 ORM 数据库对象关系自动化管理,Perfect 有 StORM 并完整实现了 PostgreSQL、MySQL、CouchDB 和 SQLite。

首先在安全和用户认证上 Perfect 采用 Turnstile。这是一个流行广泛的第三方开源框架,源自 Stormpath,可以在 GitHub 上找到。Perfect 实现了 Turnstile 版本扩展、预装了不同的数据库集成来实现用户身份的验证机制。与 Vapor 一样,Perfect 拥有自己的加密函数库,还包括了 SPNEGO/Kerberos、LDAP 轻量活动目录和微软 Active Directory 活动目录支持。Perfect 具备原生的 OAuth2 函数库,预装了很多流行的第三方登录机制,比如脸谱、谷歌、GitHub、领英和 Slack 等等。比较出名的是 Perfect 能够支持基本 HTTP 认证方法。Perfect 还能够提供会话管理,最后,Perfect 还提供如 CORS 和 CSRF 这样的反网站欺诈中间层。

Perfect 具备一些非常独特的功能,而这些功能在其他地方是找不到的。Perfect 团队为此付出了巨大的努力而且结果值得称道。其中之一就是采用原生的 cURL 类函数库封装,使得 Perfect 用户能够直接使用 libcurl。在文件管理方面 Perfect 有非常稳健的文件管理类包(创建、读取、写入和删除)、目录管理(创建、列表和删除)以及 zip(压缩和解压缩)。Perfect 也是唯一提供 MariaDB、ODBC 甚至 FileMaker 的 Swift 后台软件框架体系。

此外,Perfect 还非常独特的封装了 OAuth2 过程,而且在所有 Swift 服务器软件中,Perfect 是唯一将所有文档完整翻译成中文的软件框架、并且所有主要的源代码库的 README 引导页也都翻译成了中文。除此之外,Perfect 还是唯一预装了快速部署的服务器,以及二进制结构化数据 BSON 实现、以及唯一支持 SPNEGO/Kerberos、LDAP 轻量活动目录和微软 Active Directory 活动目录组件,甚至支持大数据(GridFS/Hadoop)的真正的服务器框架体系。

Perfect 还开发了一个原生的 Mac 图形界面应用程序,称为 Perfect Assistant 软件助手,不单单能够使用 Perfect,而且能够加入所有基于 Swift Package Manager 软件包管理器的项目。该助手是直接集成 Docker 并且能够进行 Linux 测试、亚马逊弹性计算云/谷歌云自动化部署。用户可以直接使用该助手启动空白项目,或者从项目模板中新建服务器应用。该助手还提供在本地计算机上一键编译双平台(mac 和 Linux)、清理项目、编译转化为 Xcode 项目(使得项目可以在 Xcode 内调用 linux 脚本交叉编译,太方便了)、运行测试以及更多操作。软件助手还能够进行项目依存关系管理、所有的 SPM 软件包管理操作都可以用鼠标拖拽完成。所有预装的组件都是 Perfect 或者高度集成 Perfect 的,但是您也可以自定义加入新的组件。

Perfect 除了其为 Mac 用户量身定做的助手应用程序之外,还与一个名为 SCADE 的专用 IDE 集成开发环境实现了内部集成。使用 SCADE,不但可以直接编写 Swift 的 mac 和 linux 应用,更犀利的事,该 IDE 还能够同时为 iOS 和安卓开发手机原生应用。SCADE 通过其自行开发的 SDK 实现了从前端到后段的跨多种平台全栈开发。对于好奇心比较强的用户而言,目前 SCADE 处于私有 beta 版本测试状态,而且可以试用的唯一方法就是加入 Perfect 的 Slack 频道 #swift-android-ios。

Perfect 还支持多种部署方式,当然与其他软件框架一样支持 Swift 在 macOS 和 Ubuntu 14/16 上的开发。同时 Perfect 还有 Docker 镜像,也支持 FastCGI 的 Apache 集成,或者 Heroku 编译包。通过使用 Perfect 软件助手,还能够实现亚马逊弹性计算云或者谷歌云的一键部署,如前文所属。与其他复杂的部署选项相比,Perfect 还具有一个非常独特的预装源程序,比如 SwiftSlack,一个用 Swift 语言编写的 Slack 接入网站,允许邀请新用户加入您自己的 Slack 群。

Perfect 同样不缺乏培训资源。如前文介绍,Perfect 旗下包括了 GitHub 上的一个团队仓库,集中了两个网页的各种样本项目范例,主题非常丰富。Perfect 有一整套入门文档和 API 函数接口参考手册。如果您说中文,那么恭喜您,所有的指南都已经翻译成中文,而且大多数 Perfect 源代码仓库封面都有中文翻译。如果您需要视频教程,那么公开的内容也非常多,包括 Perfect 团队自己发布的剪辑、Ray Wenderlich 在线教程,以及我自己也有一些视频教程。同样相关的文章也不少。与其他的 Swift 后台软件一样,Perfect 有一个非常完整的入门指南。

  • Perfect 的优点: Perfect 具有一个非常文件的功能集合,其中有许多功能是独一无二的。对应这些功能来说,Perfect 还提供了很多样例程序供参考。这两点使得 Perfect 作为复杂工程的首选。如果您需要一个 Swift 服务器软件框架体系提供诸如 cURL、Filemaker、Kerberos、Active Directory、BSON、Hadoop、GridFS、OAuth2 或者 ODBC 之中任何一个模块支持来说,除了 Perfect 别的地方是找不到这样的东西的。而且,Perfect 还是唯一的一个支持 MariaDB 的 Swift 软件框架,以及原生的文件/目录类封装、zip 压缩解压缩函数库,如果你希望您的项目中涉及到任何一个上面提到的需求,则 Perfect 绝对是当之无愧独一无二的选项。Perfect 的源代码也组织得井井有条,实现在 GitHub 上按照代码用途进行分类。尽管 Zewo 采用了 Go 语言风格非常邪乎的快速并发模型 concurrent,但是相比之下 Perfect 还是所有服务器端 Swift 软件体系中速度最快的。

  • Perfect 的缺点: Perfect 并不是语法最为简洁(简单)的函数库。由于 Perfect 是以功能技术为开发导向的专业产品,因此可能对缺乏编程经验的工程师来说不太容易上手。因为技术上过度注重性能,因此不少 Perfect 专有的功能特性都以语法糖作为代价(函数接口形式稍微复杂——译者注),这一点 Perfect 团队是承认的,但是尚未在开发社区内将其完善改进。另外 Perfect 的视频和教程不是集中管理的,而且很多是社区用户贡献的,因此相对比较分散,不像 Vapor 大学那样在线集中。

  • Perfect 总结: Perfect 丰富的功能体系使得 Perfect 为复杂项目开发提供了可能,这一点是无以伦比的。同样 Perfect 庞大的示范代码、文档、教程和活跃的社区也能够支持大型项目的开发。因其优良的速度性能和强大的功能,基于 Perfect 的应用可以处理大量的文件目录或者大量的数据,还能够与如 Filemaker 或者微软 Active Directory 这些独特的系统进行集成。Perfect 独特的伸缩性能够保证您放心使用,因为具有最快的请求/响应能力。同样 Perfect 还有非常丰富的底层函数库,因此实际上 Vapor 和 Kitura 是能够直接在 Perfect 基础上进行集成开发的。

总结

尽管所有的上述四个 Swift 服务器软件框架体系都希望做同一件事情,但是它们之间在能力和提供的资源上差别还是很大的,互相之间都很独一无二。请根据您自身对待开发项目的要求进行选择,比如您有什么偏好,对性能是否有要求等等。我建议您在作出最终选择之前对每种软件都评测尝试一下。

对于哪些还没有开发出来的功能来说,一旦开发出来肯定会特别有用,比如双效验证、带权限的安全认证体系或者服务器运行指标库、自建 CSV 表格文件支持等等。如果您希望贡献代码,那么欢迎您加入各个开发社区。(原文此处提供了一些作者及其朋友圈提供的 Swift 函数库,不过因为多数都有不兼容 Swift 3.1 的问题,因此在本译文中不单独介绍,详情请参考原文)

我相信 Swift 的服务器开发前途一片光明。我自己已经使用了上面的一些软件用于我个人和我自己的客户项目开发。实话实说,我从来没有对服务器端的计算机语言有这么高兴的时候。同样我再也不想看到没有前途的项目,比如以前我一直在项目上使用 JavaScript,直到 WebAssembly 让我彻底放弃了 JS 脚本。随着时代进步,我相信会有更多更好的功能出现。

评论