We're sunsetting PodQuest on 2025-07-28. Thank you for your support!
Export Podcast Subscriptions
People
G
Geoff
Topics
Geoff: 我过去尝试过使用 Swift WASM,但当时它还不成熟,并且需要通过 Electron 等方式才能在 Windows 上运行。最近我再次尝试,发现它有了很大的改进,已经集成到标准的 Swift 工具链中,并且可以通过简单的步骤进行安装和使用。我成功地将现有的 iOS 和 Linux 代码移植到 Swift WASM,只需移除与 SwiftUI 和 Hummingbird 相关的部分代码即可。我甚至能够直接将 SVG 代码嵌入 HTML 中,从而在 Web 浏览器中显示条形码。整个过程大约花费了 90 分钟。 然而,Swift WASM 仍然存在一些限制,例如不支持网络请求和多线程,这使得一些依赖于这些功能的代码无法正常工作。此外,生成的 WASM 文件非常大,大约 62MB,这可能会影响性能和用户体验。虽然可以通过使用 Swift for embedded frameworks 来减小文件大小,但这需要额外的设置。总的来说,Swift WASM 虽然很有前景,但目前还不适合用于生产环境,需要进一步改进。 Peter: 我对 Geoff 的 Swift WASM 开发经验非常感兴趣,特别是它现在已经集成到标准的 Swift 工具链中,这使得安装和使用变得更加容易。这对于希望在浏览器中运行 Swift 代码的开发者来说是一个好消息。我也很关注 Swift WASM 的一些限制,例如缺乏网络请求和多线程支持,以及大型 WASM 文件的问题。这些问题可能会影响应用程序的性能和用户体验。但是,Geoff 的经验表明,Swift WASM 已经取得了显著的进步,并且未来有很大的发展潜力。我相信随着技术的不断发展,这些问题将会得到解决,Swift WASM 将会成为一个更加成熟和强大的工具。

Deep Dive

Shownotes Transcript

Geoff花了一些时间尝试Swift WASM(WebAssembly),并想讨论他的发现和想法。我们很乐意重点介绍使用Swift语言的项目,并欢迎任何参与项目的人员通过compileswift.com/contact与我们联系。本集中提到的内容GitHub上的Swift WASM SwiftWASM.org Hummingbird剧集成为Patreon会员并帮助此播客生存https://www.patreon.com/compileswift关注Mastodonhttps://iosdev.space/@Compileswift感谢我们每月的支持者

Marko Wiese Adam Wulf bitSpectre Arclite

★ 在Patreon上支持此播客 ★ </context> <raw_text>0 等等,我仍然太兴奋了,无法说出话来。大家好,欢迎收听Compile Swift播客。是的,我们做到了,我们成功了,我们一直在练习。这花了一段时间。在本集中,我们将讨论Swift Wasm,或者取决于你如何发音。但首先,Jeff,你好吗,伙计?你的世界发生了什么?

嘿,Peter。我一切都很好。我一直在玩一些新东西,我认为这就是我们今晚要讨论的。是的。你一直在玩一些我根本没有接触过的东西。所以我会有问题。不出所料,你将成为这方面的主题专家。你现在已经是专家了。你玩了几个小时,对吧?是的,大约三个小时。

是的,就像所有优秀的框架一样,一旦你安装了它,安装了包,做了一个HelloWorld,你就是专家了。是的。完全正确,是的。这就是我听到的。问我任何问题。我懂了。就是这样。好的。那么,今天你一直在玩什么?是的,这实际上是我过去玩过的东西。几年前,我做了一个……

玩笑直播。我一年做两次玩笑直播。我会在我的年度愚人节直播和年度万圣节直播中做一些有点荒谬的事情。几年前,我想,哦,我要向大家展示如何在Swift中构建一个

Windows应用程序。这是几年前在万圣节直播中发生的事情之一。我这样做的方法是,哦,我要使用Swift Wasm,对于不熟悉这个的人来说。这是一种将Swift编译为在浏览器中运行的方法。

好的。在前端。不要混淆,但我本来想说不要混淆。我们不是说服务器端,对吧?让我们明确一点。不是服务器端。不,这是浏览器中的客户端Swift。无论如何,Swift for Windows应用程序的恶作剧是我正在构建一个Swift WebAssembly应用程序

然后在Electron中运行它,并在Windows上运行它。这就是在Swift中构建Windows应用程序的可怕的、疯狂的科学方法,以及当时类似于SwiftUI的东西。

我的意思是,如果这听起来不像性能,我不知道还有什么像性能。太棒了。无论如何,这就是我几年前玩过的东西。而且,你知道,Swift WebAssembly似乎是一个有趣的项目,但还没有准备好投入生产。而且背后并没有太多的努力。它似乎就像,好吧,这有点意思,但它还不算严肃。

明确一点,这是一个开源项目,对吧?是的,是的,是的。这是一个开源项目,一些人只是把它拼凑起来以使其工作。无论如何,快进到上周五,当我这样说时,这听起来很傻,哦,这就是最终让它听起来很严肃的原因。在精彩的iOS Dev Weekly新闻通讯中,有一个名为Flappy Swift的游戏链接。

它是用Swift编写的Flappy Bird,在浏览器中运行。哦,令人震惊。如果这不是营销,我不知道是什么。当然不是。是的。嗯,使用Swift wasm。所以我查看了它,它似乎改进了过去Swift wasm存在的大多数问题。我们将讨论这些问题以及如何解决它们。嗯,但是,

事实证明,在将其作为Swift团队的官方项目方面已经做了很多工作。因此,现在许多工作实际上已经上游到主要的Swift编译器中,并且能够从头开始做很多工作。

标准版本的Swift,而之前你必须安装你自己的自定义工具链,现在它在标准Swift工具链中,所以我认为,自上次我查看它以来,似乎发生了很多变化,让我们再看看它现在是什么样子,这就是我们要讨论的。

所以我们知道几年前苹果公司正在为那些基本上有兴趣与他们合作的人发布职位,为他们,在Windows上使用Swift。我认为这使得它成为平台的官方组成部分,在我看来,这没有什么不好的消息。我喜欢到处都有Swift。我相信我们大多数人都喜欢。但这不属于该项目的一部分。这是一个单独的项目。

但它碰巧现在是官方工具链的一部分。我理解正确吗?是的。这还没有像Windows那样得到完全支持,因为它是Swift的官方平台,它还不是官方支持的构建目标。但他们正在努力使其达到他们正在……支持WebAssembly的所有内容……

上游,它都是主要swift工具链的一部分,他们正在努力实现使它成为一个完全支持的平台所需的一切,只是还没有达到。明白了,尽管如此,这仍然是个好消息,是的,任何直接的、任何这些方向的进展,我认为都是一件好事,就我个人而言,嗯,人们,任何时候你,我觉得我们可以将swift语言作为swift语言,

我不想说脱离,但要明确一点,嘿,Swift,它不仅仅意味着Apple设备,对吧?因为这是一个问题。正确。是的。是的。而且我肯定认为这是另一种方法。我的意思是,我们过去讨论过服务器端的Swift。因此,有了这个,你可以将整个前端和后端,两方面的应用程序构建在一起。

完全用Swift编写,你可以完全在Linux上构建它,从不接触Mac。你总是可以在Linux上运行它,从不接触Mac。而且你知道,世界上每个人都可以使用这个应用程序,并且可以将其分发给他们,只要它在浏览器中运行即可。因此,如果你真的不想,就没有理由让它再接触Apple了。所以这里有一个小旁注,

所有那些说,你知道,每隔一天就是我们也一样的人。Xcode。是的,你不需要它。你不仅不需要它,你实际上还不能用它。哦,有趣。如果你进入Swift开发者,或者抱歉,

如果你进入Swift WASM文档,他们做的第一件事之一,这就是我感觉它还不完全是官方版本的地方。好的。你安装官方的Swift编译器工具链。

这与你在Linux上使用的Swift编译器工具链相同。这与你在任何其他地方使用的Swift编译器工具链相同。它来自Swift.org。它是标准的Swift工具链。但是,所有这些都不适用于与Xcode一起分发的工具链。值得庆幸的是,苹果公司最近让这变得相对容易。他们引入了一个名为Swiftly的新工具,它的工作方式类似于RVM或PyEnv或任何此类工具。

它允许你安装和管理不同的Swift安装。因此,你使用它来安装所需的工具链。我实际上喜欢这个想法,它与例如Xcode可能使用的任何东西都是分开的。我可以通过这种方式管理它,因为,你知道,像我们许多人一样,

有多个版本的Xcode。这表明我可能有多个版本可以切换,这同样,你知道,我实际上非常有兴趣在Linux上尝试一下。诸如此类的事情。我喜欢这种独立的想法。使安装变得简单。也使清理变得简单,对吧?

绝对的。是的,为了进一步说明这一点,你知道,我没有在Linux上这样做,因为我没有一个可以进行开发的Linux安装。我认为我家中唯一的Linux安装是Steam Deck。但我确实在我的Mac上的Emacs中完成了所有这些工作。我根本没有使用Xcode。我没有使用任何Mac特定的软件。

工具链来进行任何此类开发。所有这些都是在Emacs中使用EGLOT和Swift LSP完成的,以提供自动完成等功能。

是的,它运行良好。大家好,如果你喜欢在这个播客中听到的内容,并且想要帮助这个播客继续前进,并拥有优秀的嘉宾和精彩的对话,我邀请你成为Patreon的支持者。你可以访问patreon.com/compileswift,在那里你可以获得无广告版本的播客以及其他内容。

带我们浏览一下,我相信这很快,这些工具的非常简单的安装过程,对吧?访问Swift.org,你从那里下载它,按照你相应平台的说明操作,我猜,然后根据你的选择进行代码编辑。我错过了什么吗?我的意思是,这听起来很简单,对吧?

不,基本上就是这样。是的,安装Swiftly,新的Swift版本管理器。朋友们,链接在节目说明中。这是一个相当简单的安装。安装它。使用它来安装最新版本的Swift。事实上,实际上,你第一次运行Swiftly时,它会继续运行,我将为你安装最新版本。你不需要选择特殊的Swift WASM版本。你只需安装最新版本即可。

从那里开始,它与构建任何其他非Xcode Swift包完全相同。你只需运行Swift package init,这将设置一个包。然后,为了使其为Wasm构建而有所不同,你只需传入一个特定的Swift SDK参数,并说,我想为此构建Wasm。它会继续运行该构建,你将拥有一个.wasm文件。好的。然后你需要……

一个不同的工具。好的。这就是它变得有点复杂的地方,你需要一个不同的工具来在本地运行WASM代码。我还没有达到能够在浏览器中运行它的程度,但是有一些命令行工具可以在命令行上运行WebAssembly代码。好的。所以当你这样做的时候,当你今天早些时候尝试这个的时候,当我们录制这个的时候,

你是如何运行它的?我们将讨论你构建的内容,但是你当时是在终端作为终端应用程序运行它吗?因为我看到了你分享的屏幕截图。所以你在某个时候……

所以我构建的第一个版本只是标准的hello world命令。它实际上是……非常巧妙的是Swift的文档。你根本没有更改任何Swift代码。你只需运行Swift package init。这会给你一个标准的hello world程序,嗯,程序,嗯,如果你今天在你的终端上运行它,它会给你相同的hello world。你只需Swift run。它会打印hello world。所有这些都在说,嘿,如果你只使用这个额外的标志编译它,你总是会得到那个标准包,你将得到一个可以在WebAssembly中运行的版本。好的。然后,是的,

你谈到了我在哪里实际运行它?他们确实链接到另一个名为Wasm time的工具。该工具用于在命令行上运行WebAssembly代码并使用命令行输出。这就是我运行原始hello world项目的方式。

还没有在浏览器中。浏览器需要更多工作,但只是确保你已经构建了实际的WebAssembly代码,并且能够运行这个实际的WebAssembly代码。他们让你在命令行上完成所有这些操作。好的。好的。也许。朋友们,这里没有承诺,但是……

也许在某个时候我们中的一个人会尝试制作一个视频来展示所有这些是如何工作的。事实上,实际上,这可能是一个很好的借口,因为我已经很久没有在YouTube上制作视频了。我实际上正在考虑在我的笔记本电脑上的Linux安装上尝试这个,以验证为什么我在笔记本电脑上安装了它。所以我可能会尝试这样做。没有关于时间线的承诺,但我可能会尝试这样做。

接下来,你已经安装了所有工具,并且已经准备好运行所有其他内容。你运行了HelloWorld,一切都很顺利。那么,让我们来了解你实际上用它构建了什么作为探索。我想你正在这样做,如果你已经提到了,请原谅我,但这是一种概念证明,这是一种可以使用的技术。

用于做这个,对吧?是的,所以你做了什么?你基本上只是想玩这个技术,对吧?就像我们开发人员需要借口一样,对吧?你知道,就像哦,看闪亮的光,让我们安装它,是的。

是的,我基本上只是想弄清楚,好吧,让我们看看我可以为浏览器构建什么,看看我可以运行什么。所以所有事情的下一步是,好吧,让我们获取这个WebAssembly代码,让我们以某种方式与浏览器通信。因此,WebAssembly当前的一个限制是,无论你使用Swift编写,这都是正确的,如果你使用编译为WebAssembly的Python编写,任何存在的语言都是

你需要与JavaScript进行互操作才能真正控制浏览器中的任何内容,因为WebAssembly无法访问DOM。因此,你无法在没有与JavaScript集成的情况下向浏览器输出任何内容。那么我们是在谈论JavaScript作为两者之间的桥梁来……

基本上,添加WASM和浏览器之间的交互?是……

正确,是的。需要JavaScript充当两者之间的桥梁。但是,值得庆幸的是,Swift WASM项目已经产生了一个Swift框架,该框架为你处理了很多工作,并使用Swift动态成员查找功能将JavaScript桥集成到Swift本身中。因此,你可以拥有……

直接与JavaScript交互的Swift代码。你可以……

你使用这个JavaScript工具包,导入它,然后你就可以在Swift代码中与DOM对象交互。因此,你实际上不需要编写任何JavaScript代码来建立该桥梁。它都是通过JavaScript进行的。在那一点上,它并没有编译成原生WebAssembly,但是你不需要编写任何JavaScript代码。完美。这将是我的下一个问题,因为我

我敢肯定,像每个人一样,我想,哦,上帝,我现在必须编写JavaScript。但答案并非如此。不。答案是,你确实需要编写两行JavaScript。即使是我也可以做到这一点而不会搞砸。是的。你需要从网站上获得的一件事是实际的代码。

你加载它的区域。所以你需要编写一个HTML页面,基本的HTML,你需要在那里写什么。然后它有一个script标签,在Skype中,这个script标签是你的两行JavaScript。你需要导入你的WASM模块,并且你需要告诉该模块运行。所以基本上是导入,

这就是你需要编写的两行JavaScript。之后,所有其他内容都在你的Swift代码中。好的。所以,我的意思是,这实际上应该对几乎所有做过任何网络工作的人都很熟悉,对吧?在某些时候,将会有基本上,你知道,无论你在哪个世界中生活,你想要称之为什么的,在div标签和iframe或其他任何东西之间插入这个。这有点像同一件事,对吧?只需在此处注入此内容,对吧?是的。

那么我需要运行某种本地服务器吗?还是它会启动它?

嗯,你的经验是什么?你需要一个基本的 文件服务器。它不需要任何复杂的东西。你不需要一个完整的服务器。嗯,他们实际上只是说,嗯,NPX serve一个东西。嗯,我不认为Python仍然预装在机器上了,但这在过去也是一件可以做的事情,就像Python -M simple HTTP server。它会在某个文件夹中托管所有内容。嗯,你,你需要一些可以托管文件夹中文件的东西。你不需要使用Express或其他任何东西来构建任何东西。你不需要一个完整的后端服务器。你只需要,我可以运行……

我可以托管基本的HTML文件吗?这就是你需要的全部。好吧,这很好。我使用了一个名为Caddy的工具。这是我最喜欢的。它使用起来非常简单,而且性能非常高。你只需安装它。你说Caddy文件服务器。砰,完成了。它已托管。好的。所以我不希望提前跳过,但这听起来实际上也会使这个东西的分发更容易。

是的,因为你只需要能够托管一个.js文件和一个.html文件。这就是你的分发。好的,这很简单。是的,好的。对不起。是的,我让你分心了。所以是的,回到你正在构建的内容。继续吧。是的,再次强调,我主要是在玩Swift能够做什么。但是,在让命令行的hello world工作,然后让……

然后让浏览器的hello world工作之后,我想看看,好吧,我有一些代码,理论上它可以工作,并且不需要任何重写。所以我去了我的应用程序bark,我已经在那里运行了一些代码,这些代码同时在iOS上运行,也在我的Linux服务器上运行。而且,

那是条形码渲染代码,这样我就可以在本地应用程序中渲染它,正如你在SwiftUI中所期望的那样。但是我还拥有一个不同的版本,它可以渲染到PNG,这样我就可以生成Apple Wallet通行证。所以它就像,好吧,我已经在iOS和Linux服务器上运行了这个。

它应该很容易让这段代码也在浏览器中运行。这样,你知道,嗯,我可以有一个bark的网络应用程序版本,并显示你的条形码。但是,我没有真正计划做这样的事情,但这更像是,什么代码可以做一些明显很酷的事情,并且可能不会花费太多精力将其移植到Swiftplasm。好吧,那里还有另一件事是,嗯,

嗯,当我玩新技术时,我喜欢使用我已经构建过的东西,就像好吧,我知道这个东西应该做什么,我知道我是如何构建它来做到的,并且基本上只是我可以将它移植到任何新的技术上,而无需

我碰巧将此变成一个项目计划或其他任何东西,因为它构建了我以前做过的事情。现在,只是,也许我有点早了,在这种情况下,我们将回到它。但是你可以使用你的应用程序中的代码吗?还是基本上不行,你必须重写,因为我的意思是,它最终是Swift,对吧?

好吧,这就是我每天都无法缺少的东西,那就是我的咖啡。任何认识我的人,或者任何听过我的播客或其他任何东西的人都知道,我绝对不能没有我的咖啡,而且我喜欢好咖啡。所以事情是这样的,我将通过访问peterwidom.com/coffee赠送你一包免费咖啡,并且

那里有一家很棒的公司遵循公平贸易实践,帮助许多各种规模的独立烘焙商,并且操作很简单。你要做的是访问peterwhitam.com/coffee。你在那里注册。你会收到一包免费咖啡。是的,作为回报,他们通过给我一些咖啡来感谢我,但这并不是我这么做的原因。我这么做的原因是因为我发现了一些

如此多的好咖啡,如果没有这项服务,我永远不会遇到、听说过或体验过。Trade Coffee真是太棒了。你知道,那里有很多地方。我们都知道它们提供咖啡,好咖啡。

你可以去商店买咖啡,但是没有什么比发现新的独立烘焙商并支持他们,发现新的咖啡口味,新的研磨方式更好的了,你可以设置它。它非常聪明。你告诉它你喜欢哪种咖啡。随着时间的推移,它会随着你的选择和你的选择而变得越来越好,并为你提供你正在寻找的咖啡,并推荐一些非常相似的咖啡。

每次我收到一包新的咖啡时,我都会在之后尝试咖啡。我浏览服务并说,看,我喜欢这种咖啡。我认为这种咖啡还可以。或者我说,看,这真的不适合我。每次我这样做时,它都会使服务的准确性在下一个选择中有所提高。

所以再次强调,只需访问peterwhitam.com/coffee。今天就领取你的免费咖啡。如果你是一个咖啡爱好者,你将真正欣赏这项服务。我已经使用它多年了,并且强烈推荐它。是的,它最终是Swift。因此,当我将其移植过来时,我需要做的唯一更改是删除特定于其他框架的部分。好的。所以……

我要说的是,这段代码的某些部分确实专门渲染到SwiftUI。这主要是不相关的,因为显然很多东西都在Linux上运行,而Linux上没有。但是我移植过来的部分Linux代码直接依赖于Hummingbird代码。Hummingbird是我们过去讨论过的服务器端Swift框架。所以我需要删除对Hummingbird的任何引用。

所以一旦我完成了这些工作,我真的不需要做任何其他事情。我只需要删除,嘿,这个引用是SwiftUI。嘿,这个引用是Hummingbird。一旦我删除了这些引用,它或多或少就可以工作了。好的。所以如果人们过去遵循你的建议,而不是我的建议,没有人遵循我的建议。

如果他们过去遵循你的关于关注点分离以及所有内容的建议,你可能会从任何其他平台、任何其他应用程序中获取所有重要的业务逻辑,但你基本上可以处理它。是的。所以我过去就是这样做的。我已经做了一些类似于从实际显示过程中删除的基本操作。

条形码。所以我将条形码编码为基本的矢量绘图调用,然后将这些矢量绘图调用转换为实际显示,

这部分是分开的。所以所有将代码编码为矢量绘图调用的东西,我能够直接将其拉到应用程序本身中,这些矢量绘图调用然后转换为SwiftUI使用SwiftUI的路径和矩形等等,以便在SwiftUI中将其渲染到屏幕上。

我的Linux代码在我的服务器端代码中。对不起。我将其渲染到SVG,然后我只需在我的Linux框上使用一个转换程序将该SVG转换为PNG,并使用该PNG作为Apple Wallet通行证。好的。

在这种情况下,我可以做的是获取该中间SVG,因为你可以直接在HTML中放置SVG,所以我只是获取了输出的SVG代码,将其直接发送到HTML。我说,在这里放一个div,用这个SVG填充该div。它就在那里。它显示在屏幕上。这就可以了。我只是获取了我已经……

无论如何,为我的Apple Wallet代码吐出的SVG代码,并将其直接放在HTML屏幕上,它可以工作,并且它在网络上显示条形码。这看起来很棒。是的,实际上。所以你基本上删除了一个步骤,对吧?嗯,是的。是的,我确实删除了。嗯,因为我,我当时已经将其渲染到SVG以便然后将该SVG转换为PNG。而且,嗯,

嗯,可能无法在本地浏览器中执行此操作,因为你知道你在哪里编写那个临时文件……但是是的,我可以直接显示svg,因为那只是html代码,是的,它完全按照我的预期工作,太棒了,所以,嗯,我确实捕捉到了一点流,我当时在后台潜伏,同时我在吃东西,总而言之,我们在这里谈论的是什么?像

从开始到提供服务需要两三个小时。从什么都不运行到在屏幕上显示条形码需要两个小时。老实说,时间不到两个小时,因为两个小时包括……

流请求以支持它在服务器端不支持的特定类型的条形码。所以我想总共可能需要90分钟,从没有接触过它到安装它,完成命令行hello world,完成浏览器hello world,到在屏幕上显示条形码。所以我不会说出名字。我可以猜到是谁。数字4 17,嗯,

完全正确,嗯,我的意思是,老实说,这确实涉及到嗯,我确实工作过……渲染条形码的pdf 417代码,对不起,pdf 417是一种条形码类型,如果你有驾驶执照,你可以在你的驾驶执照背面看到它,你知道它是什么样子,我们不会讨论渲染该条形码的复杂方法,嗯……

无论如何,这段代码依赖于我编写的另一个库,我可以在 iOS 和 Linux 上使用它。而这个库本身又依赖于其他人的第三方库来处理——这是一个大整数库,这样我就可以处理巨型数字了——

所有这些代码,我所做的只是说,这是我应用程序、我的 Swift Rasm 应用程序的一个依赖项。而且,呃,

它能够引入这些依赖项并为 Swift WASM 编译它们。而我不需要对这些其他依赖项做任何事情。它只是起作用了。我只需要引入标准的 Swift 依赖项,并为 WebAssembly 编译它们,然后在浏览器中运行它们。有趣的是,我想在这里问一个问题,因为你提到了这一点。而且你确实说过,当……

你基本上为此初始化一个项目时。这是一种创建 Swift 包的方式。那么,我可以使用 Swift 包,你知道的,来自 Swift 包管理器等等吗?我可以像使用任何其他依赖项一样引入它们,

假设它只是假设它们不依赖于只在 ios 或其他地方运行的任何苹果框架,是的,只要它们是纯 shift 框架,你可以用 so 包管理器引入并在任意操作系统上运行它们,是的,它们只是很好,所以后续问题是,因为我们没有使用呃,我们有好处,没有使用 Xcode,缺点是

我们没有调试器。你使用这个的调试体验如何?你知道的,正如你所说,你使用了 Emacs,但我选择的代码编辑器,调试体验如何?是的,我知道他们确实有一个非常酷的 Chrome 扩展程序用于调试,

呃,用于调试 WebAssembly 代码,特别是 Swift WebAssembly 代码。看起来你可以设置断点。看起来你可以查看,呃,堆栈跟踪等等。嗯,我没有在这个,呃,

流中使用它,因为我拥有的大部分代码都是已经存在的代码。所以它已经被调试过了。呃,我在几个月前阅读它时,已经解决了所有错误。嗯,所以我,我没有,我没有做任何足够复杂或足够新的事情,嗯,现在不需要调试器。看起来他们确实有一个,呃,相当酷的,呃,

调试系统,但是呃,我没有时间去深入研究它,所以听起来,这只是一个外部观察,听起来如果你是一个熟悉调试 web 代码的人,我的意思是 Chrome 工具,对吧,可能对那些人来说是熟悉的领域,但我们不确定,但听起来如果你在 Chrome 开发者工具中这样做,你可能就在自己的地盘上了,是的

是的,我的意思是,就像我说的,看起来你可以做所有你在普通 web 代码中可以做的事情。你只是在 .swift 文件中做而已。

设置断点,打印内容,做任何你想做的事情。好的。所以你有一个很好的成功体验。你的应用程序运行良好,其他一切也很好。有什么陷阱或缺点吗?我知道了。你显然没有研究过这方面的一切,但是从你开始使用并尝试它的早期状态来看,你认为有什么缺点特别突出吗?

是的,你可以在 WebAssembly 中编写和部署的 Swift 代码仍然存在一些限制。如果你查看他们的文档,你会发现他们基本上说有很多事情你不能碰。我认为人们最想念的一点是所有网络方面的东西。所以你没有 URL 会话。你没有任何那种朋友,你必须通过。

JavaScript 桥来进行网络请求等等。嗯,另一个真正缺少的是任何类型的多线程支持。所以你有 Swift async await 并发的东西,但它仍然像在一个线程上跳来跳去。好的。嗯,所以 Swift WASM 中没有真正的多线程。因此,你编写的使用 async await 的代码,它在技术上可以工作。它会比较慢。它不会真正地,嗯,

不会执行?我想说的是,它不会真正并发。你编写的任何依赖于 dispatch 的代码,例如,它根本无法编译。是的,你根本没有 dispatch。你没有任何类似的东西。

那么关于这个问题。对于像这样的事情,我的意思是,它会告诉你并试图帮助你,说,嘿,这不会发生吗?不,它只会失败。好的。这就是我想问的。就像,你不想部署它。就像,我只是假设它正在工作吗?是的,不,不,它会失败。好的。好的,酷。

休息时间。

我使用这项服务,因为它有很多我经常使用的真正优秀的一流应用程序。对我来说,作为一名开发人员,能够访问 API、项目规划、撰写电子邮件、撰写文档等工具是无价的,你可以在 Setapps 服务上获得所有这些东西,包括数据库应用程序,所有这些东西,每月只需 10 美元。你可以根据需要使用任意数量的应用程序。

如果你有兴趣查看这个,请访问 peterwhitam.com,P-E-T-E-R-W-I-T-H-A-M.com/setapps,S-E-T-A-P-P。你可以在那里看到详细信息。它有一个链接,你可以点击它开始使用这项服务,看看它对你来说效果如何。我强烈推荐给每个 Mac 用户。休息时间结束。

所以这就是缺少的东西。就是这样。另一个我并不完全理解为什么缺少的东西是 Timer。

它在 WebAssembly 上不存在。是的,这看起来很奇怪。我不知道为什么会这样。也许这与多线程问题有关。没有什么东西像在后台计数滴答一样。但是是的,它在那里不可用。所以它在那里也不可用。所以如果你是依赖它来做事情的话,这有点令人沮丧。这实际上是一个很大的问题。是的。是的。

是的。我认为另一个主要的缺点大部分已经解决了,这也是我再次尝试这个的原因,但我还没有做到这一点。这算作也许绝对是一个缺点,也许绝对部分地只是一个复杂的问题,在标准构建中,你从,

Swift WASM 获得的 WASM 文件,人们必须下载到你的终端是巨大的。哦。我做的那个显示小条形码的文件,猜猜文件大小是多少。哦,天哪。好的。所以我认为这是一个非常大的数字,说 400K。好的。

这是一个疯狂的数字。你差了几个数量级。是的。哦,我的上帝。真的吗?那是 62 兆字节。哦,好的。那是……所以,好的。挤压一下手机,网络。他们有……

从理论上讲,他们已经使用相对较新的支持的嵌入式 Swift 框架解决了这个问题。所以使用 Swift,例如,Arduino,任何那种东西。

也就是说,这是一种单独的构建方式。因此,它需要更多的设置才能使该构建发生。而我今天没有时间去研究它。看起来它是相对可能的。我在流的开头提到的 flappy Swift 项目,只有 100K。好的。是的。

这仍然很大,但并非过大。特别是对于一个完整的游戏。对,对,对。但是是的,要达到这一点,确实需要更多的设置。而,是的,标准构建,我几乎不用任何时间就能设置好的东西,62 兆字节。有点荒谬。你知道吗?我要在这里给他们一个解释,好吧,这不是早期阶段,但是……

可以公平地说,优化并不是优先事项,但我惊讶的是,你知道,很多这些东西,这些工具,现在当他们做一个导出发行版构建时,你知道,他们,他们做了很多压缩来减小文件大小,但也许他们只是选择专注于其他领域了。让我们拭目以待。如果你使用嵌入式 Swift 工具链,它应该会小得多。只是,那是,

不像标准 Swift 构建那样容易连接。绝对下载并缓存该文件,对吧?是的。天哪。好的。好吧,这绝对算是一个缺点,但也许只是在不久的将来,未来几年。好的。还有什么我们没有涉及的吗?你会推荐吗?好的。所以我确实推荐你去看看。我本来想说,推荐你去看看。

很明显,听起来你可能不想在生产中大量使用它,或者在这个阶段根本不想使用它,如果嵌入式的东西按照它应该的方式工作,并且你可以得到像一次性的呃,像你一样,你可以把它变成一个构建脚本,你可以在你的 ci 上运行它,让它做你需要做的一切,这样你就再也不用碰它了,嗯

它可能值得研究。就像我说的,我看到的那一个再次启动了这个,一个你可以在浏览器中玩的游戏 100K。还不错。我认为这是完全正确的。我的意思是,如果你已经用 Swift 编写了所有这些代码,并且那是你可以拥有的代码,你的标准代码,你可以重用代码,你可以做任何类似的事情。

我认为值得研究。就像我说的,或者像你说的,这还处于早期阶段。我相信它将来会发展。现在有很多事情是手动的,比如 JavaScript 桥,人们可能会开始为此构建框架。但我至少对此感到兴奋。酷。我的意思是,我不了解 JavaScript。你知道的,我注意到……

人们不愿意发明 JavaScript 框架。所以我不知道这是否会发生,但也许吧。当然。哦,我的天哪。下周就会有一百个。是的。好的。酷。

这太吸引人了,杰夫。我希望我们已经给了大家一些思考的东西。对于那些喜欢探索和玩弄事物的人,就像每个工程师一样,我认为,试试看。试试看。各位,我们很乐意听到你们对此的看法。如果你使用过这个工具,或者你正在从事这个项目,我们……

我们想向你们发出邀请。我们很乐意邀请你们来参加播客并谈论它。那将是很棒的。除此之外,杰夫,大家在哪里可以找到你?你总是可以在 Cocotype.com 找到我。就是这样。你可以找到我……链接到所有地方。是的。你可以在 PeterWim.com 找到我。你可以找到这个播客,Compile Swift 播客……

在 compileswift.com,这就是我们为你们准备的,看看节目说明,那里会有很多链接,也看看 discord,如果你想加倍努力并在 patreon 上支持我们,就像你们许多人一样,向你们这些支持者致敬,非常感谢你们,我们非常感谢你们,这确实起了很大的作用,你可以访问 patreon.com/compileswift,然后

你会得到一个无广告版本的播客剧集。有时我们也喜欢在那里为你们提供一些额外的东西。当然,我们还有很棒的会员在那里。就是这样,各位。我们将在下一集中与你们交谈。再见。