Alexey Grachev:走向前端

2018 年 XNUMX 月基辅 Go 聚会:

Alexey Grachev:走向前端

主持人: - 大家好! 非常感谢您的到来! 今天我们有两位官方发言人——Lyosha 和 Vanya。 如果时间充裕的话还会有两个。 第一个演讲者是Alexey Grachev,他将为我们介绍GopherJS。

阿列克谢·格拉乔夫(Alexey Grachev)(以下简称“AG”): – 我是一名 Go 开发人员,我用 Go 编写 Web 服务。 有时您必须处理前端,有时您必须手动进入。 我想谈谈我对Go前端的经验和研究。

传说是这样的:首先我们将讨论为什么要在前端运行 Go,然后我们将讨论如何做到这一点。 有两种方式 - Web Assembly 和 GopherJS。 让我们看看这些解决方案的现状如何以及可以做什么。

前端出了什么问题?

每个人都同意前端一切都好吗?

Alexey Grachev:走向前端

难道测试还不够吗? 构建缓慢? 生态系统? 美好的。

关于前端,我喜欢一位前端开发人员在他的书中所说的一句话:

Alexey Grachev:走向前端

JavaScript 没有类型系统。 下面我将我在工作中遇到的问题列举出来,并说明一下是如何解决的。

一般来说,类型系统很难被称为Javasript中的类型系统——有一些行表明对象的类型,但实际上这与类型无关。 这个问题在 TypeScript(Javasript 的附加组件)和 Flow(Javascript 中的静态类型检查器)中得到了解决。 实际上,前端已经达到了解决 Javascript 类型系统错误问题的程度。

Alexey Grachev:走向前端

浏览器中没有标准库 - 浏览器中有一些内置对象和“神奇”功能。 但在 Javascript 中并没有这样的标准库。 这个问题已经被 jQuery 解决了一次(每个人都使用 jQuery 以及工作所需的所有原型、帮助器和函数)。 现在大家都用Lodash:

Alexey Grachev:走向前端

回调地狱。 我想每个人大约 5 年前都看过 Javascript 代码,它看起来就像是令人难以置信的错综复杂的回调的“面条”。 现在这个问题已经解决了(随着 ES-15 或 ES-16 的发布),Javascript 中也添加了 Promise,大家可以松一口气了。

Alexey Grachev:走向前端

直到Promice地狱到来……我不知道前端行业是怎么管理的,但他们总是把自己逼进一些陌生的丛林。 我们还成功兑现了承诺。 然后我们通过添加一个新的原语 - async/await 解决了这个问题:

Alexey Grachev:走向前端

异步的问题就解决了。 Async/await 是各种语言中相当流行的原语。 Python 和其他语言都有这种方法——非常好。 问题解决了。

什么问题没有解决? 框架、生态系统和程序本身的复杂性呈指数级增长。

Alexey Grachev:走向前端

  • JavaScript 语法有点奇怪。 我们都知道添加数组和对象的问题以及其他笑话。
  • JavaScript 是多范式的。 当生态系统非常庞大时,这是一个特别紧迫的系统:
    • 每个人都以不同的风格编写 - 有些是结构性的,有些是功能性的,不同的开发人员以不同的方式编写;
    • 来自不同的包,使用不同的包时有不同的范式;
    • Javasript 中的函数式编程有很多“乐趣”——rambda 库出现了,现在没有人可以读取用这个库编写的程序。

  • 所有这些都对生态系统产生了巨大影响,并且它的增长令人难以置信。 这些包彼此不兼容:有些基于 Promise,有些基于 async/await,有些基于回调。 他们也以不同的范式写作!
  • 这使得项目难以维护。 如果你看不懂代码就很难找到bug。

什么是网络组装?

来自 Mozilla 基金会和许多其他公司的勇敢的人们想出了 Web Assembly 这样的东西。 这是什么?

Alexey Grachev:走向前端

  • 这是浏览器内置的支持二进制格式的虚拟机。
  • 二进制程序几乎是本地执行的,也就是说,浏览器不需要每次都解析 JavaScript 代码的所有“面条”。
  • 所有浏览器均已声明支持。
  • 由于这是字节码,因此您可以为任何语言编写编译器。
  • 四种主要浏览器已经提供了 Web Assembly 支持。
  • 我们期待 Go 很快得到原生支持。 这个新架构已经添加:GOARCH=wasm GOOS=js(很快)。 到目前为止,据我了解,它还没有功能,但有说法是它肯定会在 Go 中。

现在做什么? 地鼠JS

虽然我们不支持 Web Assembly,但有一个像 GopherJS 这样的转译器。

Alexey Grachev:走向前端

  • Go 代码被转换为“纯”Javascript。
  • 在所有浏览器中运行 - 没有只有现代浏览器才支持的新功能(这是 Vanilla JS,可以在任何浏览器上运行)。
  • Go 拥有的几乎所有内容都得到支持,包括 goroutine 和通道……我们非常喜欢和了解的一切。
  • 几乎支持整个标准库,除了那些在浏览器中支持没有意义的包:系统调用、网络交互(有一个 net/http 客户端,但没有服务器,并且客户端是通过 XMLHttpRequest 模拟的)。 一般来说,整个标准库都是可用的——这里是在浏览器中,这里是Go的stdlib,我们喜欢它。
  • Go中的整个包生态系统,所有第三方解决方案(模板等)都可以使用GopherJS编译并在浏览器中运行。

GopherJS 非常容易获得——它只是一个普通的 Go 包。 我们确实 go get,并且有一个 GopherJS 命令来构建应用程序:

Alexey Grachev:走向前端

这是一个很小的你好世界......

Alexey Grachev:走向前端

...常规的 Go 程序、常规的标准库 fmt 包和用于访问浏览器 API 的 Binding Js。 Println最终会转换为控制台日志,浏览器会写“Hello gophers”! 就这么简单:我们构建 GopherJS – 我们在浏览器中启动它 – 一切正常!

你现在有什么? 绑定

Alexey Grachev:走向前端

所有流行的 js 框架都有绑定:

  • 查询;
  • Angular.js;
  • D3.js 用于绘制和处理大数据;
  • 反应.js;
  • VueJS;
  • 甚至还支持 Electron(也就是说,我们已经可以在 Electron 上编写桌面应用程序了);
  • 最有趣的是WebGL(我们可以制作全图形应用程序,包括具有3D图形、音乐和所有好东西的游戏);
  • 以及许多其他与所有流行的 javascript 框架和库的绑定。

骨架

  1. 有一个专门为 GopherJS 开发的 Web 框架 - Vecty。 这是 React.js 的成熟类似物,但仅使用 Go 开发,具有 GopherJS 的细节。
  2. 有游戏袋(惊喜!)。 我发现两个最受欢迎:
    • 恩戈;
    • 埃比滕。

我将向您展示几个示例,展示它的外观以及您可以在 Go 中编写的内容:

Alexey Grachev:走向前端

或者这个选项(我找不到 3D 射击游戏,但也许它存在):

Alexey Grachev:走向前端

我提供什么?

现在前端行业就是这样一个状态,以前所有从Javascript哭的语言都会往那里涌。 现在一切都将被编译成“Web Assemblies”。 作为地鼠,我们需要什么来占据我们应有的位置?

Alexey Grachev:走向前端

Go 传统上假设它是一种系统编程语言,并且实际上没有用于使用 UI 的库。 有一些东西,但它一半被废弃,一半不起作用。

现在是用 Go 创建可在 GopherJS 上运行的 UI 库的好机会! 你终于可以编写自己的框架了! 这是你可以编写一个框架的时候,它将成为第一个框架并得到早期采用,你将成为一个明星(如果它是一个好的框架)。

您可以根据浏览器的具体情况调整 Go 生态系统中已有的许多不同包(例如模板引擎)。 它们已经可以工作了,您可以进行方便的绑定,以便可以轻松地直接在浏览器中呈现内容。 另外,例如,您可以创建一个服务,可以使用相同的代码在服务器和前端上呈现相同的内容 - 前端开发人员喜欢的一切(仅现在在 Go 中)。

你可以写一个游戏! 只是为了好玩…

我有一切。

Alexey Grachev:走向前端

问题

问题(以下简称Q): – 我用 Go 还是 Js 编写?

股份公司: – 你编写例程、通道、结构、嵌入 – Go 中的一切...你订阅一个事件,向那里传递一个函数。

在: – 所以我用“裸”Js 写?

股份公司: – 不,你就像在Go中一样编写并连接到浏览器API(API没有改变)。 您可以编写自己的绑定,以便将消息发送到通道 - 这并不困难。

在: – 移动设备呢?

股份公司: – 我确实看到:Js 运行的 Cordova 补丁有绑定。 在 React Native 中——我不知道; 也许有,也许没有(我不是特别感兴趣)。 N-go 游戏引擎支持移动应用程序 - iOS 和 Android。

在: – 关于 Web Assembly 的问题。 越来越多的空间被占用,尽管有压缩和“压缩”……这样我们岂不是更加扼杀前端世界了?

股份公司: – Web Assembly 是一种二进制格式,并且默认情况下,二进制文件在最终版本中的数量不能超过文本...您会被运行时所吸引,但这与在标准 Javascript 库不存在时将其拖出一样,因此我们使用一些 Lodash 。 我不知道洛达什需要多少。

在: – 显然小于运行时间......

股份公司: – 在“纯”Javascript 中?

在: - 是的。 我们在发送之前对其进行压缩...

股份公司: – 但这是文本......一般来说,一兆字节看起来很多,但仅此而已(您拥有整个运行时间)。 接下来,您编写自己的业务逻辑,这将使您的二进制文件增加 1%。 到目前为止,我还没有看到这会杀死前端。 此外,Web Assembly 的运行速度比 Javascript 更快,原因很明显——它不需要解析。

在: – 这仍然是一个有争议的点......目前还没有任何“Vasma”(Web Assembly)的参考实现,以便人们可以明确地判断。 从概念上讲,是的:我们都知道二进制应该更快,但同一 V8 的当前实现非常高效。

股份公司: - 是的。

在: – 那里的编译工作确实非常酷,而且事实上并没有很大的优势。

股份公司: – WebAssembly也是大佬们做的。

在: – 在我看来,判断WebAssembly还是很困难的。 对话已经很多年了,但真正能感受到的成果却很少。

股份公司: - 或许。 我们拭目以待。

在: – 我们在后端没有问题......也许我们应该把这些问题留在前端? 为什么去那里?

股份公司: – 我们必须保留一线员工。

一些广告🙂

感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的内容? 通过下订单或推荐给朋友来支持我们, 面向开发人员的云 VPS,4.99 美元起, 我们为您发明的入门级服务器的独特模拟: VPS (KVM) E5-2697 v3(6 核)10​​4GB DDR480 1GB SSD 19Gbps XNUMX 美元或如何共享服务器的全部真相? (适用于 RAID1 和 RAID10,最多 24 个内核和最多 40GB DDR4)。

Dell R730xd 在阿姆斯特丹的 Equinix Tier IV 数据中心便宜 2 倍? 只有这里 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 电视低至 199 美元 在荷兰! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - 99 美元起! 阅读 如何建设基础设施公司同级使用价值730欧元的Dell R5xd E2650-4 v9000服务器一分钱?

来源: habr.com

添加评论