”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 光泽和微光让我的心率下降 - 案例研究

光泽和微光让我的心率下降 - 案例研究

发布于2024-11-08
浏览:973

Lustre and Gleam Make my Heart Rate Go Down - a Case Study

最近,一位客户联系我,询问其 WordPress 网站上的“财务评估”javascript 应用程序不再工作。它有很多问题,最后,最简单的方法就是重建它。

在此应用程序中,用户可以输入基本的财务和个人信息,应用程序会告诉他们在财务规划方面是否走在正确的道路上。这不是超级复杂的逻辑,但有相当多的逻辑。

我主要不是前端开发人员。我在后端最舒服。但我已经在 Vue、Angular、React 中实现了项目...它们工作,但我并不完全信任它们。随着时间的流逝,我总是对依赖项(包括开发工具链本身)已经过时产生了一种隐隐的焦虑。

输入微光

Gleam 是一种用于构建可扩展的类型安全系统的友好语言!
~ Gleam 的网站

自从 Gleam 首次宣布 v1 已准备好投入生产以来,我一直对他们感到兴奋。它的函数式风格、不变性、详尽的模式匹配、类型推断以及 Go 的简单稳定性意味着 Gleam 满足了我所有的喜好。

类型系统几乎可以保证,如果您的代码可以编译,它可以工作。我还没有在我的 Gleam 代码中遇到过一个不是“我的错,我忘了完成实现”的错误。

输入光泽

Gleam 是为了在 BEAM(Erlang 传奇的久经考验的 VM)上运行而构建的,但它也有一个 Javascript 编译目标。这意味着它可以轻松传送到 Node 和浏览器。

Lustre 是 Gleam 卓越的前端框架。它是 Elm 到 Gleam 生态系统的忠实移植,并具有 Elm 的“模型 -> 视图 -> 更新”状态管理架构。

这是一个比其他前端框架更加简单的概念模型。 Lustre 的状态管理模型并不是将状态管理作为一个可选库提供(我正在看你的 redux),而是它的核心。

您只需描述可以用来修改应用程序内的状态的每个动词,并将该动词映射到返回模型更新版本的类型安全纯操作。视图函数(也是纯函数)直接从该单一模型的状态流动。

Lustre 还提供了一个托管效果系统,这样即使各种 I/O 操作可能会失败,您的应用程序代码也可以使用完全纯函数来实现。

纯函数最酷的地方是什么?在给定相同的输入的情况下,它们保证始终提供相同的输出。这使得它们可预测、易于测试并且极其稳定。纯函数不会破坏。他们在数学上有点不能

甜甜的样板

Lustre 应用程序可能涉及更多样板设置应用程序并创建所有类型等。但 ...

从来没有一个更合适的框架来应用术语“样板”。它给我带来的自信就像将铆钉钉入钢板中一样。一旦就位,那东西就不会任何地方

我很难表达与我之前使用 javascript 的经历相比,这种感觉有多么不同。如果我在另一个框架中完成,我的应用程序的 LOC 可能会更少。但我相信它不会破裂吗?是不是就这么简单易懂了呢?

最终产品

我按时并在预算范围内交付了我的应用程序。客户对此非常满意。我睡得很安稳,因为我知道这个项目确实完成了

不仅如此,它还可以在所有地方的Wordpress中舒适地生活。我制作了一个短代码来加载已编译的资源,将其弹出到页面上,就是这样。

JS 包经过压缩和 gzip 压缩后大小为 18.1 kb。这几乎和 htmx 一样小。大声哭出来!

对于使用仍然相对晦涩的语言和框架来交付项目,我确实有一些保留。但知道应用程序不会崩溃,而且 Gleam 本身可以在一个下午学会,这些保留意见就得到了缓解。

最重要的是——老实说,如果我使用其他任何东西来构建它,我真的不认为我会对最终产品、工具链的稳定性或未来升级它的能力充满信心.

我的心率

我现在开始写这篇文章的全部动机:在生产环境中使用 Lustre 应用程序的感觉

这个应用程序发布已经有几周了,我仍然喜欢时不时地重新访问它。不是因为客户要求改变。只是看代码。

这么说我几乎感到尴尬,但我的大多数其他代码在某种程度上感觉像是一种责任。 特别是 javascript。即使它是 Typescript,即使它有测试。这让我感到焦虑,就像布满了隐藏的地雷和诱杀装置。

也许是技能问题。也许我只是被烧伤太多次了。

看着我的 Gleam/Lustre 代码让我感到平静

就是这样。这就是那条推文。

最后,我真诚地希望其他开发者能够尝试一下 Gleam 和 Lustre,这样他们在思考他们的前端代码时也能享受到同样的禅宗般的幸福。

感谢您的阅读。

版本声明 本文转载于:https://dev.to/enoonan/lustre-and-gleam-make-my-heart-rate-go-down-a-case-study-5765?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    在node-mysql node-mysql文档最初出于安全原因最初禁用多个语句支持,因为它可能导致SQL注入攻击。要启用此功能,您需要在创建连接时将倍增设置设置为true: var connection = mysql.createconnection({{multipleStatement:...
    编程 发布于2025-04-12
  • 如何在Java中执行命令提示命令,包括目录更改,包括目录更改?
    如何在Java中执行命令提示命令,包括目录更改,包括目录更改?
    在java 通过Java通过Java运行命令命令可能很具有挑战性。尽管您可能会找到打开命令提示符的代码段,但他们通常缺乏更改目录并执行其他命令的能力。 solution:使用Java使用Java,使用processBuilder。这种方法允许您:启动一个过程,然后将其标准错误重定向到其标准输出。...
    编程 发布于2025-04-12
  • 捕获闭包在C# 5.0中为何在for循环中 problematic,而在foreach循环中则无此问题?
    捕获闭包在C# 5.0中为何在for循环中 problematic,而在foreach循环中则无此问题?
    C# 5.0 循环中的捕获闭包:For循环与Foreach循环的差异 问题: 在 C# 5.0 中,foreach 循环中的捕获闭包能够正确捕获,但为什么 for 循环中的捕获闭包仍然存在问题? 解答: 从逻辑上看,for 循环中闭包的行为是合理的。将 for 循环分解为其组成部分(初始化器、条件...
    编程 发布于2025-04-12
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-04-12
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-04-12
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-04-12
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 ; $ date->修改('1个月'); //前进1个月 echo $ date->...
    编程 发布于2025-04-12
  • 如何在浏览器保持打开时销毁PHP会话?
    如何在浏览器保持打开时销毁PHP会话?
    有效的会话会话破坏,用于保持打开的浏览器 session_start(); if(isset($ _会话)){ unset($ _会话); session_unset(); session_destroy(); } 销毁会话的推荐方法包括: //初始化会话 sessio...
    编程 发布于2025-04-12
  • NULL值对MySQL性能和存储的影响:不同引擎的解析
    NULL值对MySQL性能和存储的影响:不同引擎的解析
    [2 [2 根据所选的存储引擎,零值对MySQL的性能和存储的效果都有很大变化。 [2 存储效率:[2 重要的是要记住,对零值的优化通常被视为微优化。 性能增长通常微不足道。 优先考虑精心设计的索引和足够的数据库缓存通常会提供更大的性能改进。
    编程 发布于2025-04-12
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 中,如果您使用一个大文件,并且需要从最后一行读取其内容,则在第一行到第一行,Python的内置功能可能不合适。这是解决此任务的有效解决方案:反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] ...
    编程 发布于2025-04-12
  • jQuery光标操作6大函数
    jQuery光标操作6大函数
    以下是一些强大的jQuery代码片段,用于操作鼠标光标!它们可以用于设置和获取输入和文本区域字段中的文本光标位置以及选择范围。尽情享受吧! // jQuery 获取光标位置函数调用示例 $("input[name='username']").getCursorPosition(); jQuery....
    编程 发布于2025-04-12
  • C++中Unnamed Namespaces与Static关键字:谁更优越封装?
    C++中Unnamed Namespaces与Static关键字:谁更优越封装?
    Unveiling the Superiority of Unnamed Namespaces over the Static KeywordIntroduction:The use of the static keyword has been consistently questioned in ...
    编程 发布于2025-04-12
  • Go类型别名导致类型断言失败的原因
    Go类型别名导致类型断言失败的原因
    [2 导入“ FMT” 键入Funcy Func(int)bool Func Funcy(I Int)Bool { 返回i%2 == 0 } func main(){ var a界面{} = funcy _ = a。(func(int)布尔)// fmt.printl...
    编程 发布于2025-04-12
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-04-12
  • NOT EXISTS vs. NOT IN vs. LEFT JOIN NULL: 选哪个SQL子句?
    NOT EXISTS vs. NOT IN vs. LEFT JOIN NULL: 选哪个SQL子句?
    [2 理解sql的,不存在,:比较分析 SQL提供了各种方法,用于比较跨表的数据并根据零值过滤结果。 掌握[之间的差异,, [2 这两个子句在相关表中检查没有匹配行的情况。 它们的关键区别在于无效处理: 不存在在中不在:returns true 仅在不存在非null匹配时。 任何nulls...
    编程 发布于2025-04-12

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3