1 分•作者: petethomas•4 个月前
返回首页
最新
1 分•作者: shaimagz•4 个月前
2 分•作者: tie-in•4 个月前
各位 HN 的朋友们:
我想说,大多数开发者在编写代码时,都不会过多考虑将 I/O 操作与业务逻辑混在一起。我们经常会看到这样的代码:
```typescript
const user = findUser(email);
if (!user) await saveUser(user);
```
你可能会问:这有什么大不了的?当我们这样写代码时,会发生两件事:
1. **调试生产环境中的 Bug 变得更加困难。** 除非你拥有完全相同的数据库和远程 API 服务进行连接,否则你可能无法重现 Bug。
2. **你必须在测试中使用 Mock 和 Fake,或者使用 Testcontainers,这些方法只能在一定程度上提供帮助,而且速度很慢!**
为了解决这些问题,我构建了 Pure Effect,一个轻量级的 TypeScript/JavaScript 效果库。核心思想很简单:如果一个函数执行了 I/O 操作,那么它就不是纯粹的。但如果它返回一个描述它想要执行的 I/O 操作的指令,那么它就是纯粹的。所以,你不需要 `await findUser(email)`,而是返回一个 `Command` 对象,它会告诉你:“我想调用这个函数,当它完成时,接下来该做什么。” 这样,你的业务逻辑就变成了一个纯粹的函数。每次输入相同,输出也相同。在解释器(`runEffect`)运行之前,数据库根本不会被触及。
当我开始开发这个库时,我没有想到这个简单的想法能带来如此多的可能性。一旦你的流程变成纯数据,许多令人惊叹的功能就成为可能:
* **无需 Mocking 库。** 在测试中,你可以遍历这个数据结构并断言其结构:`assert.equal(flow.cmd.name, 'cmdFindUser')`。没有任何东西会被执行。
* **用 `Retry(effect, { attempts: 3, delay: 200, backoff: 2 })` 包裹任何效果。** 配置是纯粹的数据,因此你可以在测试中对其进行断言。
* **每个命令的输入和输出都通过解释器,因此你可以免费获得完整的执行跟踪。** 你可以编写一个简单的 `timeTravel()` 函数在本地重放它,而无需触碰任何 I/O。这对于调试复杂的生产 Bug 非常完美。
* **`onBeforeCommand` 钩子位于你的业务逻辑和解释器之间。** 由于它在每个预期的副作用触发之前都能看到它们,因此可以用来强制执行运行时护栏。例如,你可以阻止破坏性调用在发生之前被执行。
* **你可以审查 AI 生成的代码,然后再执行。** 由于 Pure Effect 的流程是纯数据,你可以在生成代码触碰任何内容之前检查它打算做什么。
它只有六个基本元素:`Success`、`Failure`、`Command`、`Ask`、`Retry` 和 `Parallel`,以及 `effectPipe` 和 `runEffect`。零依赖,压缩后小于 1KB。
**与 Effect-TS 的比较**
Effect-TS 是这个领域中功能齐全的选择,拥有庞大的生态系统。Pure Effect 提供了不同的权衡。它覆盖了 80% 的用例:可测试的流程、依赖注入、重试和 OpenTelemetry 钩子,所有这些都包含在 1KB 以内,零依赖,并且无需学习新的术语。Effect-TS 是一个你需要围绕它构建的框架。而 Pure Effect 则是一种你可以直接应用到现有代码中的模式。
我从去年十二月开始在生产环境中使用 Pure Effect。它目前是 v0.8.0 版本,尚未达到 1.0,但已经足够稳定,我想把它分享出来,听听大家的看法。
GitHub:[https://github.com/aycangulez/pure-effect](https://github.com/aycangulez/pure-effect)
我写了五篇博文,记录了 Pure Effect 的演变过程。如果你想了解更详细的故事,可以在 [https://lackofimagination.org/tags/effect/](https://lackofimagination.org/tags/effect/) 找到它们。
1 分•作者: kaushikmahorker•4 个月前
103 分•作者: consumer451•4 个月前
我简短的故事是:由于苏联控制下的波兰的各种因素,我的叔叔扮演了我父亲的角色。
他带我去采石场发射 Estes 式的火箭汽车,等等。他还设法从工作单位偷了一个 Milicja(宪兵)警报器,并把它装在了我的香蕉式自行车后面。作为一名电气工程师,他让它真的能响。
感谢所有让我们成为今天的我们的黑客们。
1 分•作者: Mohamed-Edeeb•4 个月前
2 分•作者: theanonymousone•4 个月前
2 分•作者: thunderbong•4 个月前
2 分•作者: andsoitis•4 个月前
2 分•作者: jruohonen•4 个月前
5 分•作者: jmount•4 个月前
2 分•作者: nookeshkarri7•4 个月前
2 分•作者: mooreds•4 个月前
2 分•作者: theahura•4 个月前
好吧,我猜称它为浏览器有点牵强。它实际上只是Chromium加上Playwright,再加上一个终端屏幕。
但该死,这东西确实管用。我尝试过所有其他类型的浏览器用户代理,它们都试图通过截屏和移动鼠标来让模型使用网站。这既慢又不高效,而且还很昂贵。相比之下,我用这个浏览器做了很多事情,比如抓取数千张图片,或者为100个组织自动配置fly.io的账单,同时还在后台玩《杀戮尖塔》。
它还有很多粗糙之处,但希望其他人也能觉得它有用!
2 分•作者: tas101•4 个月前
21 分•作者: brandur•4 个月前
59 分•作者: rafaepta•4 个月前
1 分•作者: michibertel•4 个月前
2 分•作者: ksec•4 个月前
3 分•作者: simonpure•4 个月前