glob 与文件模式
glob、globby、fs-extra。
25 分钟
glob 与文件模式
批处理脚本要 按模式找文件:src/**/*.ts、排除 node_modules、复制目录树——glob / globby 匹配路径,fs-extra 简化复制与 mkdir。本课为 nva-templates 与 nva-practice 提供文件扫描基础。
学习目标
- 编写常见 glob 模式与 negation
- 用 globby 异步枚举文件
- 用 fs-extra 安全复制目录
glob 模式速查
| 模式 | 含义 |
|---|---|
* | 单段任意字符 |
** | 跨目录递归 |
? | 单字符 |
!**/node_modules/** | negation 排除 |
import { globby } from "globby";
const files = await globby([
"content/课程/**/drafts/*.md",
"!**/node_modules/**",
]);
console.log(files.length, "draft files");
与 node-fs 的 readdir 手写递归相比,globby 可读、可排除。
fs-extra 常用 API
import fs from "fs-extra";
await fs.ensureDir("out/import");
await fs.copy("templates", "out/import/templates", { overwrite: false });
await fs.writeJson("out/import/manifest.json", { count: 42 }, { spaces: 2 });
ensureDir 避免 ENOENT;copy 适合 scaffold CLI。
与 chokidar 配合
nva-watch 的 watch 字符串与 globby 模式 尽量一致,否则「监听到了但没扫描到」会不同步。
性能注意
- 仓库根目录跑
**/*可能很慢—— 收窄根路径 - 大量小文件:考虑 stream 处理(node-streams)而非一次读入内存
- import 脚本应对 单文件大小 设上限,防 OOM
练习
- glob 列出
nodejs-advanced-essentials/drafts/*.md - 复制某 draft 到 并加时间戳后缀