Wasp 文档写作规范详解:分区决策准则与 auto-js、with-hole、fix-api-links 定制 Docusaurus 插件
Wasp 文档写作规范详解分区决策准则与 auto-js、with-hole、fix-api-links 定制 Docusaurus 插件【免费下载链接】waspThe batteries-included full-stack framework for the AI era. Develop JS/TS web apps (React, Node.js, and Prisma) using declarative code that abstracts away complex full-stack features like auth, background jobs, RPC, email sending, end-to-end type safety, single-command deployment, and more.项目地址: https://gitcode.com/GitHub_Trending/wa/wasp本篇技术文章基于 Wasp 仓库中的 文档写作指南讲解该官方文档站Docusaurus 构建的内容组织原则与代码示例编写机制包括各文档分区Essentials、Data Model、Advanced Features 等的归类决策标准以及auto-jsTypeScript 自动生成 JavaScript 版本、with-hole代码省略号、fix-api-linksAPI 文档链接重写三个 remark 插件的用法与底层实现。读完本文你能在 Wasp 文档中正确放置新页面、编写自动双语言代码块并理解这些定制插件在 Docusaurus 配置 中的注册方式与 AST 转换原理。文档格式与目录组织Wasp 的文档可以使用Markdown 或 MDX编写统一位于仓库的 web/docs 目录下。站点由 Docusaurus 构建配置入口为 web/docusaurus.config.ts侧边栏结构定义在 web/sidebars.ts。当你要新增一个页面时写作指南要求先阅读分区准则来确定页面归属如果新页面需要一个全新的分区则要把该分区补充进指南文档本身并附上“如何判断一个页面是否属于该分区”的决策信息。下面完整继承并展开原文档定义的六个分区。Getting StartedWasp 是什么如何获得它回答“什么是 Wasp、如何获取”这一类问题。该分区对应侧边栏中的 Getting Started 类目web/sidebars.ts 中的introduction/introduction、introduction/quick-start、introduction/editor-setup等页面。Essentials拿到 Wasp 之后能做什么解释 Wasp 的工作流与最重要的部分覆盖四类核心问题如何创建一个新项目项目里包含什么目录结构如何给网站添加更多页面如何把数据存到数据库。归属判据一个特性属于 Essentials当且仅当它是核心特性——几乎每个 Wasp 项目都会以某种形式用到它。Data Model如何在 Wasp 中持久化数据归属判据看特性的宏观目的。只要答案里涉及“数据”或“数据库”大概率应放在这里。原文档还专门解释了它与 Essentials 的边界数据模型是 Wasp 的核心组成部分之所以独立成区是因为其中有些部分是“extras”——不同项目按需选用如迁移工具、种子数据等并非每个项目都会完整用到与 Essentials“每个项目都用”的标准不同。Advanced FeaturesWasp 还能提供什么归属判据两条同时满足它不是核心特性不满足 Essentials 标准它是单一概念“单元”——即该特性没有多个复杂子组件。原文档给出的反例正是认证auth 有多个 provider每个 provider 的用法与配置差异很大需要长篇解释因此不适合塞进 Advanced Features。Authentication认证的全部选项回答“我知道 Wasp 有 auth现在告诉我所有选项”。独立成区的原因与上面相对auth 各 provider 在使用方式与配置上差异显著auth UI 本身也是个大话题再加上认证使用的最佳实践体量足以单独分区。Project Setup如何在我的项目里添加/配置 X回答“如何在我的项目中添加或配置 X”这类操作型问题。原文档解释了为什么它们不算 Advanced Features这些条目“又无聊又小”本身不是 Wasp 的有趣特性只是“可以做到的事情”且都与项目配置/项目内可以存在什么相关。代码块示例两个自定义 Docusaurus 插件写作指南指出Wasp 团队创建了几个自定义 Docusaurus 插件来让代码块编写更简单、更一致。它们以 remark 插件的形式在 web/docusaurus.config.ts 中注册remarkPlugins: [ autoJSCode, autoImportTabs, fileExtSwitcher, searchAndReplace, codeWithHole, fixAPILinks, ],注意注册顺序autoJSCode排在最前codeWithHole在其后这与两个插件的可组合性直接相关见下文with-hole一节。auto-js只写 TypeScript自动生成 JavaScript 版本对于需要同时提供 JavaScript 与 TypeScript 两个版本的示例只需编写 TypeScript 版本并在代码块 meta 中加上auto-js标记ts titlesrc/apis.ts auto-js export const validatePassword (password: string) password.length 8; 构建时它会被自动转换成带标签页切换器的 MDX 结构——ts-blank-space剥离类型注解生成 JS 版本并自动为两个版本加上切换 TabTabs groupIdjs-ts TabItem valuejs labelJavaScript js titlesrc/apis.js export const validatePassword (password) password.length 8; /TabItem TabItem valuets labelTypeScript ts titlesrc/apis.ts export const validatePassword (password: string) password.length 8; /TabItem /Tabs该插件的完整实现在 web/src/remark/auto-js-code.ts。结合源码可以看到几条原文档未展开的实现细节语言映射插件只支持ts - js与tsx - jsx两种转换源码中LANGUAGE_TRANSFORMATIONS常量auto-js-code.ts#L59-L62title中的文件扩展名会同步替换.ts - .js、.tsx - .jsx。Wasp Spec 文件的限制如果代码块title匹配*.wasp.ts(x)插件会直接抛错并终止构建——源码注释表明 Wasp Spec 文件“应当始终是 TypeScript”不存在 JS 版本auto-js-code.ts#L165-L170。转换管线先用ts.createSourceFile在内存中创建 TS 源码文件根据语言选择ScriptKind.TS或TSX再调用blankSourceFile剥离类型最后用 Prettier 的babel/babel-tsparser 分别格式化生成的 JS 与原始 TS 代码块auto-js-code.ts#L203-L217。错误处理任何一步抛错都会被file.fail记录为带代码块位置信息的构建错误而不是静默跳过。auto-js 的已知注意事项Caveatsauto-js底层依赖 ts-blank-space——注意原文档引用的该库外部链接在本文按规范不再保留外部站址此处仅说明其作用它只移除类型注解不处理其他任何语法。因此存在一些边界情况写作指南推荐跑npm run start并在浏览器中检查生成的 JS 输出是否正常。已知注意事项包括Prettier 重排由于 TS→JS 转换的机制auto-js会对你的代码执行prettier格式化。建议把生成的代码复制回源文件保证“写法”与“展示”一致。类型专用 import 不会删除仅导入类型的import语句不会从生成的 JS 中移除除非你在 import 中使用type说明符如import type { X } from ...。高亮注释错位TS 专属行前的// highlight-next-line注释转换后该行被删掉但注释残留会高亮到错误的一行。应改用// highlight-start/// highlight-end成对注释。文件名不会被替换插件不会替换代码块内部的文件名引用例如 import 路径或说明性注释。这主要影响教程页面教程中文件扩展名是动态切换的目前尚无解决方案。如果以上任何一条妨碍你正确表达代码写作指南建议直接手写 JS 版本见下一节——auto-js只是避免写两遍代码的便利设施。手动创建语言切换器不想依赖auto-js时可以按 Docusaurus 官方的“多语言代码块”multi-language code blocks特性手工编写Tabs/TabItem结构。这也是所有auto-js生成结果的目标形态——理解手写方式有助于排查自动生成失败时的降级方案。with-hole在代码示例中省略部分代码当示例需要省略部分代码时with-holemeta 属性会把代码块中你写的$HOLE$标识符替换为省略号同时保持代码语法合法。它可与auto-js组合使用。示例输入ts titlesrc/apis.ts auto-js with-hole export const validatePassword (password: string) password.length 8 $HOLE$; 转换结果两个语言版本各自独立替换且 JS 版本由去类型后的 TS 代码生成Tabs groupIdjs-ts TabItem valuejs labelJavaScript js titlesrc/apis.js export const validatePassword (password) password.length 8 /* ... */; /TabItem TabItem valuets labelTypeScript ts titlesrc/apis.ts export const validatePassword (password: string) password.length 8 /* ... */; /TabItem /Tabs实现在 web/src/remark/code-with-hole.ts核心逻辑非常直接const META_FLAG with-hole; const HOLE_IDENTIFIER $HOLE$; const HOLE_REPLACEMENT /* ... */; const SUPPORTED_LANGS [js, jsx, ts, tsx] as const; // ... node.value node.value.replaceAll(HOLE_IDENTIFIER, HOLE_REPLACEMENT);从源码可以确认两点细节替换的目标是块注释/* ... */而非裸的...这样在表达式位置省略时依然语法合法auto-js的类型剥离也不会受影响支持语言限定为js、jsx、ts、tsx代码块语言不在其中会通过assertCodeBlockIsInLanguage报错该工具函数定义在 web/src/remark/util/code-blocks.ts。在配置中的注册顺序codeWithHole位于autoJSCode之后意味着with-hole的替换发生在auto-js的 TS→JS 转换之前所以$HOLE$会先变成/* ... */再被ts-blank-space一并转换两个 Tab 中都能看到省略号。链接fix-api-plugins 与 API 文档的双上下文链接fix-api-links把 wasp.sh 绝对 URL 重写为相对链接Wasp 站点的 API 参考docs/api/由wasp.sh/spec包源码中的TSDoc 注释自动生成见 spec 包 README。这些注释同时被站点外部作为原始 markdown 消费例如作为 IDE 注释因此注释中的链接必须同时在两种上下文里有效。为此作者需要在 TSDoc 注释中以完整的https://wasp.sh/docs/...绝对 URL 形式书写指向其他 Wasp 文档的链接fix-api-links插件则在构建时剥掉https://wasp.sh前缀只保留相对路径——相对链接在站点上可以正常解析而且可以接受断链检查。实现在 web/src/remark/fix-api-links.ts全部逻辑只有几行但从源码可以精确读出它的触发条件与作用范围const API_FOLDER docs/api/; const URL_PREFIX https://wasp.sh; const fixAPILinks: Plugin[], md.Root () (tree, file) { const relativePath path.relative(file.cwd, file.path); if (!relativePath.startsWith(API_FOLDER)) return; // 只处理 docs/api/ 下的文件 visit(tree, link, (node) { if (node.url.startsWith(URL_PREFIX)) { node.url node.url.slice(URL_PREFIX.length); // 剥掉前缀 } }); };两个关键约束仅对docs/api/目录内的 markdown 生效——其他文档即使写了 wasp.sh 绝对链接也不会被重写写作时在正文中仍应使用仓库内相对路径只有以https://wasp.sh开头的链接 URL 会被改写改写成相对路径后即可被断链工具检查。这一点与全局配置相呼应web/docusaurus.config.ts 中设置了onBrokenLinks: throw与onBrokenAnchors: throw即任何断链/断锚都会使构建直接失败。所以 API 文档“先写绝对链接、构建时重写为相对链接”的设计正是为了让生成文档既能通过构建期断链检查又能在 TSDoc 的原始消费场景下保持有效。写作检查清单综合指南与配置提交文档前应验证页面归属新页面是否按六分区的决策标准放对了位置若是新分区是否已把分区及判断标准补进 web/WRITING-DOCS.md 并更新 web/sidebars.ts。auto-js 输出对使用auto-js的代码块运行npm run start在浏览器中检查生成的 JS 是否符合预期类型 import、高亮注释、文件名引用是三大易错点。省略号用法需要省略代码时用$HOLE$with-hole而不是手工敲...裸...在表达式中可能破坏语法也会干扰auto-js的类型剥离。API 文档链接在wasp.sh/spec的 TSDoc 中写完整https://wasp.sh/docs/...链接交给fix-api-links重写正文文档则使用仓库内相对路径最终由onBrokenLinks: throw兜底把关。以上机制的完整代码分布在 web/src/remark 目录下auto-js-code.ts、code-with-hole.ts、fix-api-links.ts及其共享工具 web/src/remark/util/code-blocks.ts所有插件均通过 web/docusaurus.config.ts 的remarkPlugins列表统一注册可按同样方式为文档流水线扩展更多 markdown 转换能力。【免费下载链接】waspThe batteries-included full-stack framework for the AI era. Develop JS/TS web apps (React, Node.js, and Prisma) using declarative code that abstracts away complex full-stack features like auth, background jobs, RPC, email sending, end-to-end type safety, single-command deployment, and more.项目地址: https://gitcode.com/GitHub_Trending/wa/wasp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

STM32 ADC-DMA协同实现高精度电压采样

STM32 ADC-DMA协同实现高精度电压采样

1. 项目概述:为什么ADC-DMA协同是电压采样不可绕过的硬核组合在STM32F411CEU6这类中高端MCU的实际工程现场,我见过太多人把“电压采样”当成一个开关量操作——配置好ADC时钟、选个通道、调个HAL_ADC_Start()就完事。结果一上电,示波器一测&a…

2026/9/13 18:01:24 阅读更多 →
ToolJet 使用自定义端点(Custom Endpoint)连接 S3 兼容对象存储(以 MinIO 为例)

ToolJet 使用自定义端点(Custom Endpoint)连接 S3 兼容对象存储(以 MinIO 为例)

ToolJet 使用自定义端点(Custom Endpoint)连接 S3 兼容对象存储(以 MinIO 为例) 【免费下载链接】ToolJet Open-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, bus…

2026/9/13 18:01:24 阅读更多 →
东方博宜OJ 2362:前缀和后缀 ← KMP算法

东方博宜OJ 2362:前缀和后缀 ← KMP算法

【题目来源】 https://oj.czos.cn/p/2362 【题目描述】 给定若干由小写字母组成的字符串(这些字符串总长≤410^5),在每个字符串中求出所有既是前缀又是后缀的子串长度。例如:ababcababababcabab,既是前缀又是后缀的&a…

2026/9/13 18:01:24 阅读更多 →

最新新闻

如何用 client_connected Reducer 拒绝 SpacetimeDB 的指定客户端连接

如何用 client_connected Reducer 拒绝 SpacetimeDB 的指定客户端连接

如何用 client_connected Reducer 拒绝 SpacetimeDB 的指定客户端连接 【免费下载链接】SpacetimeDB Development at the speed of light 项目地址: https://gitcode.com/GitHub_Trending/sp/SpacetimeDB SpacetimeDB 的模块对外网暴露,任何客户端都能尝试连…

2026/9/13 18:54:48 阅读更多 →
Compose for Web 事件处理详解:从 attrs 事件监听器到 addEventListener 的完整机制

Compose for Web 事件处理详解:从 attrs 事件监听器到 addEventListener 的完整机制

Compose for Web 事件处理详解:从 attrs 事件监听器到 addEventListener 的完整机制 【免费下载链接】compose-multiplatform Compose Multiplatform, a modern UI framework for Kotlin that makes building performant and beautiful user interfaces easy and en…

2026/9/13 18:54:48 阅读更多 →
Beekeeper Studio 连接 Redis 完全指南:ACL 认证、TLS/SSH 与 ReJSON 支持

Beekeeper Studio 连接 Redis 完全指南:ACL 认证、TLS/SSH 与 ReJSON 支持

Beekeeper Studio 连接 Redis 完全指南:ACL 认证、TLS/SSH 与 ReJSON 支持 【免费下载链接】beekeeper-studio Modern and easy to use SQL client for MySQL, Postgres, SQLite, SQL Server, and more. Linux, MacOS, and Windows. 项目地址: https://gitcode.co…

2026/9/13 18:54:48 阅读更多 →
PMSM电机FOC控制全解析:从坐标变换到无感调试

PMSM电机FOC控制全解析:从坐标变换到无感调试

FOC在圈里被吹得神乎其神,但也确实劝退了很多人。早几年我刚开始碰PMSM无感控制的时候,光看那堆坐标变换的公式推导就想摔键盘。后来真正把代码跑起来、把波形调出来,回头看才发现,FOC没有那么玄乎,但也绝不是一个晚上…

2026/9/13 18:54:48 阅读更多 →
小体积高扭矩电机驱动:通用MCU与硅MOS方案的优化和取舍

小体积高扭矩电机驱动:通用MCU与硅MOS方案的优化和取舍

做电机驱动的朋友应该都碰到过类似的问题:明明方案也是FOC、也是MCU加MOS管,凭什么别人家的板子又小扭矩又大,自己的板子要么很大,要么一猛起就发烫?早几年我折腾无人机电调、电动工具和机器人关节的时候,被…

2026/9/13 18:54:48 阅读更多 →
基于YOLOv8的网球场识别系统:数据集、训练与部署实战

基于YOLOv8的网球场识别系统:数据集、训练与部署实战

简介:面向计算机视觉方向毕业设计或课程设计,提供一套基于YOLOv8的网球场识别系统,功能完整、简单部署即可运行,尤其适合深度学习、目标检测相关专业学生作为毕设或课设基础。资源共97个文件,以70个Python脚本和12个py…

2026/9/13 18:53:48 阅读更多 →

日新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/13 16:51:11 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/12 18:29:34 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/12 19:02:44 阅读更多 →