mcpField
E
effect-ts-resources

effect-ts-resources

github.com/mrevanzak开发895 次安装40 周前更新
代码仓库

关于 effect-ts-resources

面向 Effect-TS 开发者的资源生命周期管理技能,使用 Scope 和 acquireRelease 确保资源在失败或中断时也能清理。

主要功能

  1. 01使用 acquireRelease 确保释放
  2. 02管理作用域内的资源生命周期
  3. 03按 LIFO 顺序清理资源
  4. 04向 Scope 添加终结器

适用场景

  1. 01管理数据库连接
  2. 02打开并关闭文件
  3. 03启动服务器或获取锁

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mrevanzak/effect-ts-skills --skill effect-ts-resources

安装后在 Claude Code 中输入/effect-ts-resources确认已加载。

详细介绍

Effect-TS 资源管理

概述

使用 Scope 和 acquireRelease 管理资源生命周期,确保资源得到清理。无论程序失败、抛出异常还是被中断,都会执行清理。

适用场景

  • 症状:资源泄漏(连接挂起)、手动编写 try/finally 代码块、清理逻辑复杂。
  • 触发条件:打开文件、连接数据库、启动服务、获取锁。
  • 不适用场景:简单的数据转换,或无需显式关闭或释放的值。

核心模式

在 Effect 中,手动使用 try/finally 容易出错,因为它会绕过中断处理。

反模式(手动)Effect 模式(安全)
try { conn.open() } finally { conn.close() }Effect.acquireRelease(open, close)

快速参考

函数用途
Effect.acquireRelease定义获取资源以及确保资源释放的逻辑。
Effect.scoped创建一个边界,释放作用域内的所有资源。
Effect.addFinalizer向当前作用域添加清理操作。

实现

1. acquireRelease 模式

确保即使发生失败或中断,也会执行清理。

import { Effect } from 'effect';

const withDatabaseConnection = Effect.acquireRelease(
  Effect.tryPromise(() => pool.connect()), // Acquire
  (connection) => Effect.sync(() => connection.release()) // Release
);

const program = Effect.gen(function* () {
  const conn = yield* withDatabaseConnection;
  return yield* conn.query('SELECT * FROM users');
});
2. 作用域内的资源

多个资源共用同一个生命周期边界。资源按 LIFO(后进先出)顺序释放。

import { Effect, Scope } from 'effect';

const program = Effect.scoped(
  Effect.gen(function* () {
    const db = yield* managedConnection;
    const cache = yield* managedCache;
    // Both cleaned up when scope closes (cache first, then db)
    return yield* doWork(db, cache);
  })
);
3. 文件处理
const withFile = (path: string) => Effect.acquireRelease(
  Effect.tryPromise(() => fs.open(path, 'r')),
  (handle) => Effect.promise(() => handle.close())
);

常见错误

  • 使用 try/finally:绕过 Effect 的中断模型。请使用 acquireRelease。
  • 忘记使用 Effect.scoped:直到父作用域关闭(通常是应用结束)后,资源才会释放。
  • 顺序错误:资源按获取顺序的相反顺序释放。请确保先获取依赖项。

**必备背景知识:**使用 effect-ts-fundamentals 了解核心生成器模式。

评论

支持 Markdown