一、tree-fs 简介
tree-fs 是一个轻量级、零依赖的 Node.js 命令行工具,它的核心功能是将文本格式的目录树描述,直接转化为真实的文件夹和文件。
1.1 设计初衷
如果你曾让 ChatGPT、Claude 或 DeepSeek 等 AI 帮你规划项目结构,AI 通常会输出类似这样的文本:
my-app
├── src
│ ├── index.js
│ └── utils.js
└── README.md
然后你需要手动 逐个创建文件夹和文件------这项工作繁琐且容易出错。tree-fs 就是为了解决这个问题而生的,被誉为 AI 生成代码的 "Paste & Go" 接收器。
1.2 核心特性
| 特性 | 说明 |
|---|---|
| AI 兼容 | 自动剥离注释(如 # entry point),处理 Markdown 等非标准格式 |
| 确定性 | 同样的文本输入 → 完全相同的文件结构 |
| 安全 | 默认不会覆盖已存在的文件 |
| 智能识别 | 自动区分文件夹(如 v1.0/)和文件(如 v1.0.js) |
| 零依赖 | 安装仅需几秒钟 |
二、安装
2.1 使用 npx(无需安装,推荐)
bash
npx tree-fs
这是最快捷的方式,适合临时使用。
2.2 全局安装
bash
npm install -g tree-fs
安装后可直接使用 tree-fs 命令。
2.3 项目本地安装
bash
npm install tree-fs
适合在项目脚本中调用。
三、使用方式
3.1 交互模式(最常用)
"粘贴即生成" 工作流,非常适合从 AI 对话中复制目录结构:
bash
npx tree-fs
- 运行命令后,等待提示
- 粘贴你的目录树文本
- 按两次 Enter
- 完成!目录和文件已在当前目录生成
3.2 从文件读取
将目录树保存为 structure.txt,然后执行:
bash
tree-fs structure.txt
3.3 Unix 管道输入
适合自动化场景:
bash
# 从文件管道传入
cat structure.txt | tree-fs
# macOS 从剪贴板传入
pbpaste | tree-fs
# 直接 echo 传入
echo "src/\n index.js" | tree-fs
3.4 编程调用(API)
在 Node.js 脚本中集成:
javascript
const { parseTree, generateFS } = require("tree-fs");
const path = require("path");
const treeInput = `
backend-api
├── src
│ ├── controllers/
│ └── models/
└── .env
`;
// 1. 解析文本为 JSON AST
const tree = parseTree(treeInput);
// 2. 在目标目录生成文件
generateFS(tree, path.resolve(__dirname, "./output"));
console.log("目录结构创建完成!");
四、语法指南
tree-fs 设计得很"宽容",能处理各种"杂乱"的文本输入。
4.1 注释会被忽略
行末的 # 注释会被自动剥离:
src
├── auth.js # 处理 JWT 令牌
└── db.js # 数据库连接逻辑
✅ 结果:创建 auth.js 和 db.js,注释被忽略。
4.2 显式指定文件夹
如果名称看起来像文件但实际是文件夹(如版本号),在末尾加 /:
api
├── v1.5/ ← 创建为文件夹
└── v2.0/ ← 创建为文件夹
4.3 智能嵌套识别
如果一个条目下面有缩进的子项,即使名称带点(.),也会自动识别为文件夹:
app
└── v2.5 ← 因为有子项,自动作为文件夹
└── migrator.js
4.4 兼容多种树形符号
支持标准树字符、ASCII 艺术风格、项目符号等:
project
- src
+ components
> Header.jsx
* public
- logo.png
4.5 无扩展名文件识别
常见的无扩展名配置文件会被正确识别为文件:
Dockerfile
Makefile
LICENSE
Procfile
.gitignore
Jenkinsfile
4.6 标记与注释自动清理
文档中用于高亮特定文件的标记会被自动剥离:
project
├── src/ ← 工作目录
├── utils.js // 已弃用
└── .env # 请勿提交
✅ 结果:创建文件夹 src、文件 utils.js 和 .env,所有注释被忽略。
4.7 富文本与 Emoji 支持
工具会自动清理富文本格式和 Emoji。
五、实战示例
5.1 从 AI 对话生成项目结构
假设 ChatGPT 输出了以下目录结构:
my-blog/
├── public/
│ └── index.html
├── src/
│ ├── components/
│ │ ├── Header.js
│ │ └── Footer.js
│ ├── styles/
│ │ └── main.css
│ └── app.js
├── package.json
└── README.md
操作步骤:
bash
npx tree-fs
# 粘贴上面的目录树
# 按两次 Enter
✅ 所有文件夹和空文件瞬间生成完毕。
5.2 使用注释标记
你可以在目录树中加入注释说明,不影响生成结果:
project/
├── src/
│ ├── api/ # 接口层
│ │ └── user.js # 用户相关接口
│ └── utils/ # 工具函数
│ └── common.js # 通用工具
└── .env.example # 环境变量示例
5.3 在 Node.js 脚本中使用
javascript
const { parseTree, generateFS } = require("tree-fs");
const path = require("path");
const structure = `
admin-system/
├── public/
│ └── index.html
├── src/
│ ├── api/
│ │ └── request.js
│ ├── assets/
│ │ └── images/
│ ├── styles/
│ │ └── custom.css
│ └── views/
│ └── dashboard/
│ └── index.html
└── README.md
`;
const tree = parseTree(structure);
generateFS(tree, path.resolve(process.cwd(), "./my-admin"));
六、常见问题
Q1:生成时报错 ENOENT: no such file or directory
原因 :目录树文本中包含了通配符(如 *.png),工具无法展开。
解决方案:
- 移除通配符行,只保留目录
- 或展开为具体文件名列表(如
iframe_1.png、iframe_2.png)
Q2:如何防止覆盖已有文件?
tree-fs 默认不会覆盖已存在的文件,可以放心使用。
Q3:如何区分同名的文件夹和文件?
- 文件夹:以
/结尾(如src/),或下方有缩进的子项 - 文件:不以
/结尾,且无子项
Q4:tree-fs 和系统 tree 命令有什么区别?
tree-fs |
系统 tree |
|
|---|---|---|
| 功能 | 生成目录和文件 | 展示目录结构 |
| 输入 | 目录树文本 | 已有目录路径 |
| 输出 | 真实的文件夹/文件 | 树形文本 |
简单说:tree 是读 已有目录,tree-fs 是写新目录。
七、总结
tree-fs 是一个"小而美"的工具,特别适合以下场景:
- AI 辅助开发:将 AI 生成的项目结构一键落地
- 项目模板快速初始化:提前写好目录树文本,随时生成
- 自动化脚本:通过 API 在 CI/CD 或其他工具中集成
它的核心价值在于:让你从"手动建文件夹"的重复劳动中解放出来,把精力放在真正的编码上。