返回首页

24小时热榜

2作者: tie-in大约 7 小时前原帖
嗨,HN, 我想可以安全地说,大多数开发者在编写与业务逻辑交织的输入/输出(I/O)代码时并不会多加思考。我们常常会看到这样的代码:`const user = findUser(email); if (!user) await saveUser(user);` 现在,你可能会问:这有什么大不了的?当我们这样写代码时,会发生两件事情: 1. 调试生产环境中的错误变得更加困难。除非你有完全相同的数据库和远程API服务可供连接,否则你可能无法重现这个错误。 2. 你必须在测试中使用模拟和伪造对象,或者使用测试容器,这些方法只能部分帮助,并且速度较慢! 为了应对这些问题,我构建了Pure Effect,一个小型的TypeScript/JavaScript效果库。核心思想很简单:如果一个函数执行I/O操作,它就不是纯函数。但如果它返回一个描述它想要执行的I/O的对象,那它就是纯的。因此,与其写`await findUser(email)`,不如返回一个Command对象,内容是:“我想调用这个函数,当它完成时,接下来该怎么做。”你的业务逻辑就变成了一个纯函数。每次相同的输入,得到相同的输出。直到解释器(runEffect)运行之前,数据库都不会被触碰。 当我最初开始这个库时,我没有预料到这个想法会有多大的延展性。一旦你的管道仅仅是数据,很多美好的事情就变得可能: - 不需要模拟库。你可以在测试中遍历树并断言其结构:`assert.equal(flow.cmd.name, 'cmdFindUser')`。没有任何代码被执行。 - 用`Retry(effect, { attempts: 3, delay: 200, backoff: 2 })`包装任何效果。配置是纯数据,因此你可以在测试中对其进行断言。 - 每个命令的输入和输出都通过解释器流动,因此你可以免费获得完整的执行跟踪。你可以编写一个简单的`timeTravel()`函数,在不接触任何I/O的情况下本地重放它。这对于调试复杂的生产错误非常完美。 - 一个`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则是一个你可以直接嵌入现有代码的模式。 自去年12月以来,我一直在生产环境中使用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/)找到相关标签。
2作者: theahura大约 8 小时前原帖
称其为浏览器有点牵强,我想。它其实只是将 Chromium 和 Playwright 结合在一起,再加上一个终端屏幕。 不过,这个东西确实好用。我尝试过其他各种浏览器代理,它们都试图通过截图和移动鼠标来让模型使用网站。这种方式既慢又低效,还很耗费资源。相比之下,我用这个浏览器做了很多事情,比如抓取数千张图片,或者为 100 个组织自动配置 fly.io 的账单,同时在前台玩《Slay the Spire》。 虽然它还有很多粗糙之处,但希望其他人也能觉得它有用!