# Next.js 16 + Turbopack 用 isomorphic-dompurify 会构建失败

## 现象

PR #217 给 RichTextEditor 加 HTML sanitize，第一反应装 `isomorphic-dompurify`（"同构"听起来对 SSR 友好）。`npm run build` 直接挂：

```
FATAL: An unexpected Turbopack error occurred.
TurbopackInternalError: NftJsonAsset: cannot handle filepath node:worker_threads
- Execution of get_all_written_entrypoints_with_issues_operation failed
- Execution of EntrypointsOperation::new failed
- Execution of all_entrypoints_write_to_disk_operation failed
```

## 根因

`isomorphic-dompurify` 的 SSR 支持是通过引入 `jsdom` 来模拟 DOM 环境实现的。`jsdom` 依赖 Node 内置模块 `node:worker_threads`。**Turbopack 当前（next 16.0.x）不会处理 `node:` 协议的导入**，构建直接 panic。

## 修复

`'use client'` 组件不需要"同构"——SSR 阶段不会执行编辑器初始化。改用纯浏览器版 `dompurify`：

```bash
npm uninstall isomorphic-dompurify
npm install dompurify @types/dompurify
```

```ts
// 之前
import DOMPurify from 'isomorphic-dompurify';
// 之后（同样的 API）
import DOMPurify from 'dompurify';
```

`dompurify` 在 SSR 时降级为 no-op（`window` 不存在时 `sanitize()` 返回原样），对 client-only 组件无影响。

## 何时该选哪个

| 场景 | 选择 |
|---|---|
| `'use client'` React 组件（编辑器、用户输入处理） | `dompurify` |
| 真正需要服务端 sanitize（如 webhook 入口、Server Action 处理用户 HTML） | `isomorphic-dompurify` 或者迁回 webpack（Next.js 还没把 Turbopack 推到稳定） |
| Pages Router / 老 Next.js 项目 | 都行，但 isomorphic 更方便 |

## 防御建议

Next 16 + Turbopack 项目，如果发现 `cannot handle filepath node:xxx` 这类构建错，先看依赖里有没有 jsdom / 任何引入 `node:*` builtin 的库。常见嫌疑：
- `isomorphic-dompurify`、`isomorphic-fetch`（旧版）
- 任何把 SSR polyfill 塞 Node-only 模块的"同构" wrapper

## 触发场景

- Next.js 16 + Turbopack（默认）
- 新加 HTML/Markdown sanitize / parse 依赖
- Build 突然挂在 Turbopack panic（不是常规 TS error）
