Elm 编译器升级指南:从 0.16 迁移到 0.17 版本

Elm 编译器升级指南:从 0.16 迁移到 0.17 版本

compiler Compiler for Elm, a functional language for reliable webapps. compiler 项目地址: https://gitcode.com/gh_mirrors/co/compiler

前言

Elm 0.17 版本带来了许多重要的改进和变化,这些变化主要集中在简化架构、统一命名规范以及优化与 JavaScript 的交互方式上。本文将详细介绍如何将现有项目从 Elm 0.16 升级到 0.17 版本,帮助开发者顺利完成迁移。

第一步:更新 elm-package.json

在 0.17 版本中,核心包的命名和结构发生了重要变化:

  1. 包名变更:

    • evancz/elm-htmlelm-lang/html
    • evancz/elm-svgelm-lang/svg
    • evancz/virtual-domelm-lang/virtual-dom
  2. 功能迁移:

    • evancz/start-app 的功能现在位于 elm-lang/htmlHtml.App 模块中
    • evancz/elm-effects 的功能现在位于 elm-lang/corePlatform.* 模块中
    • Graphics.* 的功能现在位于 evancz/elm-graphics 包中

更新建议:

  1. 手动修改 elm-version 字段为 "0.17.0 <= v < 0.18.0"
  2. 清空 dependencies 字段
  3. 使用包管理工具重新安装所需依赖

语法变更

模块声明

0.17 版本简化了模块声明语法:

-- 0.16 语法
module Queue (..) where

-- 0.17 语法
module Queue exposing (..)

这个变化非常直观,只需要将 where 替换为 exposing 即可。

架构相关变更

Action 更名为 Msg

在 Elm 架构中,Action 类型被重命名为 Msg,这更符合其实际用途:

-- 0.16
type Action = Increment | Decrement

-- 0.17
type Msg = Increment | Decrement

这种命名更准确地反映了这些值是来自用户、服务器或浏览器的"消息"。

移除 Signal.Address

0.17 版本移除了 Signal.Address 概念,简化了视图代码:

-- 0.16
view : Signal.Address Action -> Model -> Html
view address model =
  button [ onClick address Decrement ] [ text "-" ]

-- 0.17
view : Model -> Html Msg
view model =
  button [ onClick Decrement ] [ text "-" ]

主要变化:

  1. 移除所有 address 参数
  2. Html 类型变为 Html Msg,表示可以产生特定类型消息的 HTML

Effects 更名为 Cmd

Effects 被整合到核心库并更名为 Cmd

-- 0.16
update : Action -> Model -> (Model, Effects Action)

-- 0.17
update : Msg -> Model -> (Model, Cmd Msg)

Cmd 模块位于 Platform.Cmd 中,默认已导入。

应用启动方式变更

StartApp 被整合到 Html.App 模块中:

-- 0.16
import StartApp
main = StartApp.start { ... }

-- 0.17
import Html.App as Html
main = Html.program { ... }

main 的类型从 Signal Html 变为 Program flags,Elm 现在会自动处理所有设置。

端口(Ports)更新

输出端口

-- 0.16
port focus : Signal String

-- 0.17
port focus : String -> Cmd msg

现在输出端口是一个函数,可以创建命令。

输入端口

-- 0.16
port users : Signal User

-- 0.17
port users : (User -> msg) -> Sub msg

输入端口现在创建订阅,而不是信号。

JavaScript 交互变更

初始化 Elm 程序的方式有所简化:

| 初始化方式 | 0.16 语法 | 0.17 语法 | |------------|-----------|-----------| | 嵌入 | Elm.embed(Elm.Main, node) | Elm.Main.embed(node) | | 全屏 | Elm.fullscreen(Elm.Main) | Elm.Main.fullscreen() | | Worker | Elm.worker(Elm.Main) | Elm.Main.worker() |

升级建议

  1. 按照上述步骤逐步修改代码
  2. 重点关注架构相关变更(Msg、Cmd、Sub)
  3. 测试所有与 JavaScript 的交互部分
  4. 查阅最新的 Elm 架构指南,了解 0.17 的最佳实践

这些变更虽然看起来很多,但大多是机械性的替换,遵循本指南可以顺利完成升级。0.17 版本通过简化核心概念,使 Elm 更加易用和高效。

compiler Compiler for Elm, a functional language for reliable webapps. compiler 项目地址: https://gitcode.com/gh_mirrors/co/compiler

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黎玫洵Errol

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值