命令和订阅
本书前面部分,我们见到了 Elm 架构如何处理鼠标和键盘交互,但如何与服务器通信?如何生成随机数?
为了回答这些问题,了解 Elm 架构在幕后如何工作的将有所帮助。这将解释为什么与 JavaScript、Python 等语言相比,Elm 语言中的事物工作原理有点不同。
沙盒
我并未大书特书这一点,但迄今为止我们的所有程序都是使用 Browser.sandbox
创建的。我们给出了一个初始 Model
,并描述了如何对其进行 update
和 view
。
你可以将 Browser.sandbox
视为建立如此系统
我们继续停留在 Elm 世界中,编写函数并转换数据。这会连接到 Elm 的运行时系统。运行时系统会想办法高效地渲染 Html
。是否有什么改变?需要进行的最小 DOM 修改是什么?它还会确定何时有人点击按钮或输入文本字段。它会将其转换为 Msg
并将其送入你的 Elm 代码。
通过清晰地分离出所有 DOM 操作,就有可能使用极具侵略性的优化。因此,Elm 的运行时系统是 Elm 成为 可用的最快选项之一 的一个重要因素。
元素
在接下来的几个示例中,我们将使用 Browser.element
来创建程序。这将引入命令和订阅的概念,它允许我们与外部世界交互。
你可以将 Browser.element
视为建立如此系统
除产生 Html
值外,我们的程序还将向运行时系统发送 Cmd
和 Sub
值。这个世界里,我们的程序可以命令运行时系统发出 HTTP 请求或生成随机数。它们还可以订阅当前时间。
我认为当您开始看到示例时,命令和订阅会更有意义,所以,让我们开始吧!
注意 1:一些读者可能担心资产大小。“运行时系统?听起来很大!”其实不然!事实上,与流行的替代方案相比,Elm 资产非常小非常小。
注意 2:我们将在接下来的示例中使用
package.elm-lang.org
中的包。我们已经使用了一些包但是现在,我们将开始使用一些更好的包
但是,
package.elm-lang.org
中还有大量其他软件包!因此,当您在本地创建自己的 Elm 程序时,可能需要在终端中运行如下一些命令elm init elm install elm/http elm install elm/random
这样做将创建一个
elm.json
文件,其中elm/http
和elm/random
作为依赖关系。我将在以下示例中提到我们正在使用的软件包,因此我希望这对这一切有所了解!