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

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

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

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]删除
最新教程 更多>
  • 如何在Chrome中居中选择框文本?
    如何在Chrome中居中选择框文本?
    选择框的文本对齐:局部chrome-inly-ly-ly-lyly solument 您可能希望将文本中心集中在选择框中,以获取优化的原因或提高可访问性。但是,在CSS中的选择元素中手动添加一个文本 - 对属性可能无法正常工作。初始尝试 state)</option> < op...
    编程 发布于2025-05-05
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    在Microsoft Visual C 中,Microsoft consions用户strate strate strate strate strate strate strate strate strate strate strate strate strate strate strate st...
    编程 发布于2025-05-05
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-05-05
  • 图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    在chrome 在使用Chrome and IE9中的图像时遇到的一个频繁的问题是围绕图像的持续薄薄边框,尽管指定了图像,尽管指定了;和“边境:无;”在CSS中。要解决此问题,请考虑以下方法: Chrome具有忽略“ border:none; none;”的已知错误,风格。要解决此问题,请使用以下...
    编程 发布于2025-05-05
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-05-05
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c 的函数时,接受成员函数指针的函数时,必须同时提供对象的指针,并提供指针和指针到函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此)和成员函数指针。这可以通过修改Menubutton :: SetButton()(如下所示:[&& && && &&华)...
    编程 发布于2025-05-05
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-05-05
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-05-05
  • 在Java中如何为PNG文件添加坐标轴和标签?
    在Java中如何为PNG文件添加坐标轴和标签?
    如何用java 在现有png映像中添加轴和标签的axes和labels如何注释png文件可能具有挑战性。与其尝试可能导致错误和不一致的修改,不如建议在图表创建过程中集成注释。使用JFReechArt import java.awt.color; 导入java.awt.eventqueue; 导入...
    编程 发布于2025-05-05
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-05-05
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示 仅通过Python的MlStripper 来简化剥离过程,Python Standard库提供了一个专门的功能,MLSTREPERE,MLSTREPERIPLE,MLSTREPERE,MLSTREPERIPE,MLSTREPERCE,MLST...
    编程 发布于2025-05-05
  • `console.log`显示修改后对象值异常的原因
    `console.log`显示修改后对象值异常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    编程 发布于2025-05-05
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-05-05
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-05-05
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的Python功能Eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。本文深入研究了eval()和ast.literal_eval()之间的差异,突出显示其安全性含义...
    编程 发布于2025-05-05

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

Copyright© 2022 湘ICP备2022001581号-3