# @effected/templates 中文文档

规范地址：https://npmcn.com/package/%40effected/templates/

版本：0\.20\.0
npm 元数据更新时间：2026-11-10T15:12:49.818Z
中文译文更新时间：2026-11-13T09:31:06.605Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40effected/templates
原文对照：https://npmcn.com/package/%40effected/templates/?lang=original
项目主页：https://github.com/spencerbeggs/effected/tree/main/packages/templates#readme
源码仓库：https://github.com/spencerbeggs/effected

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：83.8 kB，15 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=24\.11\.0
- 运行依赖：1 个
- peer 依赖：effect ~4\.1\.0
- 首次发布：2026-07-26T02:47:45.000Z
- 最新版本发布：2026-11-10T15:12:49.418Z
- 近 30 天下载量：5691（2026-10-13 至 2026-11-11，npm 官方下载统计）
- 已发布版本数：26（近 12 个月 26 个）

## 中文简介

用户编辑文件中的管理区块:解析,调和,同步并检查已划定的区域.

## 安装

```sh
npm install @effected/templates
```

也可以使用：`pnpm add @effected/templates`、`yarn add @effected/templates`、`bun add @effected/templates`

## README

# @ 受影响/平板

[![npm](https://img.shields.io/npm/v/@effected%2Ftemplates?label=npm&color=cb3837)](https://www.npmjs.com/package/@effected/templates) [![License: MIT](https://img.shields.io/badge/License-MIT-4caf50.svg)](https://opensource.org/licenses/MIT) [![Node.js %3E%3D24.11.0](https://img.shields.io/badge/Node.js-%3E%3D24.11.0-5fa04e.svg)](https://nodejs.org/) [![TypeScript 7.0](https://img.shields.io/badge/TypeScript-7.0-3178c6.svg)](https://www.typescriptlang.org/)

管理部分:已划定 `BEGIN`编号 :`END` 块,其周围内容属于用户的文件。 一个工具拥有块,用户拥有其他一切,既不破坏另一个——一个生成的钩子背后的机制,一个管理的配置片段,或者任何文件,你的工具和用户都需要编辑.

> **预`1.0.0`。 。 。 .** 此软件包是 `@effected/*` 在稳定基础上建造的工具包 效应v4(`effect` `~4.1.0`) 并仍在 `0.x` 发展。 稳定效果 制作一个工具箱 `1.0.0` 可能,不是自动的。 为了保持你的 `effect` 财务报告和审定财务报表 `@effect/*` 该工具包在线上构建和测试、安装 [`@effected/pnpm-plugin-effected`](https://www.npmjs.com/package/@effected/pnpm-plugin-effected)。 。 。 .
> 
> **稳定:不稳定.** 此软件包的 API 表面尚未考虑 完成并可能改变 `0.x` 释放 定一个确切的版本——甚至 标记软件包 _稳定_ 在此之前 `1.0.0` 可以引入突破性更改 和精确的针 变成一个类型检查错误 而不是一个 跑步时间惊喜。 完全政策: [释放策略](https://github.com/spencerbeggs/effected#release-strategy)。 。 。 .

## 为什么 @ effect/ templates

大多数"管理区段"执行将整个算法放入一个也做文件IO的服务中,因此最难的逻辑——决定改变什么,以及新块属于哪里——只能通过将文件写入磁盘来测试. 这个包裹将两者分开. `SectionDocument` 是一个纯字符串对字符串的核心,没有 `Effect`,没有IO和运行时间:分析文档,将已声明的一节与已声明的一节进行比较,核对整组内容,得出结果. `ManagedSection` 是一种读取文件、调用纯核心并只在文本实际更改时才写回的稀疏服务.

模糊性没有输入而不是通过猜测解决:未终止标记、孤儿 `END`,两个相重叠的部分,或两次声明的同一身份都是输入的 `SectionParseError` 命名行名, 绝不允许在下次运行时留下重复块的无声跳过。 线尾也是一种一等的不常态——文档中占主导地位的EOL在剖面上被检测出,并且每次比较都是EOL-正态的,因此一个CRLF文件不会永远报告漂移.

## 安装

```bash
npm install @effected/templates effect
```

```bash
pnpm add @effected/templates effect
```

需要节点.js~~24.11.0. `effect` v4是唯一的对等依赖. `@effected/files` 作为普通的依赖而出现, 它支持原子写作.

全体 `@effected/*` 软件包仅为无害环境管理:只公布出口地图 `import` 条件,所以 `require()` 包括解析 CJS 模式的工具 —— 与节点失败 `ERR_PACKAGE_PATH_NOT_EXPORTED` 而不是装入不存在的 CJS 建筑。 从ES模块导入.

`FileSystem` 来自 `effect` 核心,而不是从一个平台包,所以消费者提供一次在边缘(`NodeFileSystem.layer` 从 `@effect/platform-node` 在节点上. `Path` 也有必要`NodePath.layer` 在节点上 : 同步通过旁边的临时文件替换文件并重命名, 所以崩溃不能留下已切换的文件 .

## 快开始

宣布两节并同步成一个调用的文件 。 宣布的命令成为文件命令,所以 `base` 总是在前面 `tool`然而,用户可能已经手动重排文件:

```ts
import { CommentStyle, ManagedSection, SectionId } from "@effected/templates";
import * as NodeFileSystem from "@effect/platform-node/NodeFileSystem";
import * as NodePath from "@effect/platform-node/NodePath";
import { Effect, Layer } from "effect";

const Base = SectionId.make({ key: "base", commentStyle: CommentStyle.hash });
const Tool = SectionId.make({ key: "tool", commentStyle: CommentStyle.hash });

const program = Effect.gen(function* () {
  const sections = yield* ManagedSection;
  return yield* sections.syncAll(".husky/pre-commit", [Base.section("#!/usr/bin/env sh"), Tool.section("npx tool run")]);
});

Effect.runPromise(program.pipe(Effect.provide(ManagedSection.layer), Effect.provide(Layer.mergeAll(NodeFileSystem.layer, NodePath.layer)))).then((outcomes) =>
  console.log(outcomes.map((o) => o._tag)),
);
// example output on a fresh file: [ "Created", "Created" ]
// example output on a second, identical run: [ "Unchanged", "Unchanged" ]
```

## 标记属性

A 类 `BEGIN` 标记可以携带 `name="value"` 因此,一个工具读取一个块的出处——它运行它,并且当——离开标记线而不打开块:

```ts
import { CommentStyle, SectionDocument, SectionId } from "@effected/templates";
import { Result } from "effect";

const Tool = SectionId.make({ key: "tool", commentStyle: CommentStyle.hash });
const doc = SectionDocument.parseResult("#!/usr/bin/env sh\n");

if (Result.isSuccess(doc)) {
  const next = doc.success.reconcile([Tool.section("npx tool run", { origin: "ci", runId: "1873" })]);
  console.log(Result.isSuccess(next) ? next.success.text : next.failure.message);
  // #!/usr/bin/env sh
  //
  // # --- BEGIN tool MANAGED SECTION origin="ci" runId="1873" ---
  // npx tool run
  // # --- END tool MANAGED SECTION ---
}
```

属性是元数据, 永远不识别 : 一节是按键和注释样式单独找到的, 所以突起 `runId` 更新该块的位置, 而不是使它成为孤儿 并附加第二个。 它们确实算作是差别—— `check` 答题 `Drifted` 当一个已声明的属性对磁盘上的标记有异议时,这就是让一个工具重写一个唯一的更改是其元数据的块. 辩论和通过 `{}` 所以一个从未使用过属性的呼叫者 看不到赤裸的标记的漂移.

语法没有逃避,故意:名字匹配 `[A-Za-z][A-Za-z0-9_-]*`,数值为双引出,不带 `"` 或线条断开, 和任何外部的失败键入为 `SectionRenderError` 与 `reason: "invalidAttribute"` 命名属性——在字节被写入之前。 一个 `END` 标记从不携带属性,一个不清晰解析的属性运行(一对被mangled single,一个名称被声明了两次)使得整行的普通内容而不是标记.

属性标记是一个单向相容性中断:这个特性之前的扫描仪完全认不出一个,所以它打开的块停止成为该工具的一个被管理的部分. 将属性写入一个文件,另一个管理的工具是决定,而不是细节.

## 特征

-   `SectionDocument` 纯核: `parse` 编号 : `read` 编号 : `has` 编号 : `check` 编号 : `reconcile` 编号 : `remove` 在一个平整的字符串上,没有 `Effect`没有IO和运行时间 测试它.
-   `ManagedSection` 服务: `read`, (中文(简体) ), `readAll`, (中文(简体) ), `isManaged`, (中文(简体) ), `sync`, (中文(简体) ), `syncAll`, (中文(简体) ), `check`, (中文(简体) ), `checkAll` 财务报告和审定财务报表 `remove`,每个字只写回文本更改时.
-   `CommentStyle` - 一套开放式的 `{prefix, suffix?}` 预设( e)`hash`, (中文(简体) ), `slash`, (中文(简体) ), `semicolon`, (中文(简体) ), `dash`, (中文(简体) ), `html`, (中文(简体) ), `block`)涵盖行评论和包裹评论,如: `<!-- … -->`,所以一个被管理的段落可以活在Markdown或HTML中,而不仅仅是源文件.
-   标记属性 —— `name="value"` 在一对 `BEGIN` 标记,通过 `SectionId.section(content, attributes)` 财务报告和审定财务报表 `Section.attributes`: 工具的元数据, 绝不是一节身份的一部分.
-   `SyncOutcome` 编号 : `CheckOutcome` - 贴有标签的结果(`Created` 编号 : `Updated` 编号 : `Unchanged`, (中文(简体) ), `Absent` 编号 : `UpToDate` 编号 : `Drifted`),承接相关段落,而不是diff,所以一个呼叫者进行精确的对比.
-   管理区块外的字节保存:一个被宣布的区块外的每个字符都会通过一个同步,顺序包括一个领先的BOM.
-   由构建而来:同步一个已经更新的文档不会写出任何内容,也不会触动任何时间.

## 许可证

[麻省理工学院](https://npmcn.com/package/%40effected/templates/LICENSE)

## 常见问题

### @effected/templates 是什么？

用户编辑文件中的管理区块:解析,调和,同步并检查已划定的区域\.

### 如何安装 @effected/templates？

在项目目录运行 npm install @effected/templates，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：effect（~4\.1\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @effected/templates 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @effected/templates 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @effected/templates 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=24\.11\.0。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @effected/templates 可以商用吗？

@effected/templates 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @effected/templates 的下载量有多少？

根据 npm 官方下载统计，@effected/templates 在 2026/10/13 – 2026/11/11 这 30 天内被下载 5,691 次，日均约 190 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @effected/templates 还在维护吗？

最新版本 0\.20\.0 发布于 2026/11/10（2 天前）；至今共发布 26 个版本，其中过去 12 个月发布了 26 个；首次发布于 2026/07/26。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

