Wasp 0.18 App 声明完全指南:自定义标题、Head 与各组件配置
【免费下载链接】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 0.18 版本
app声明的完整配置展开。app是每个 Wasp 项目中唯一的顶层声明,它集中定义应用的标题、HTML<head>内容,以及认证、客户端、服务端、数据库、邮件发送与 WebSocket 等组件的配置入口。读完本文,你将掌握app声明的全部字段语义、常见自定义场景(如修改浏览器标签页标题、注入第三方样式表与脚本),并能对照源码理解每个字段在 Wasp 编译与代码生成链路中的真实作用。
为什么需要app声明
在 Wasp 的声明式模型中,一个项目有且仅有一个app类型声明。它是整个应用的"总配置入口"——无论是页面(page)、路由(route)、查询(query)、操作(action)还是实体(entity),最终都服务于这个app定义的上下文。
从编译器的角度看,app声明会被解析为一个结构化的 App 对象。在 waspc/src/Wasp/AppSpec/App.hs 中可以看到它的数据定义:
data App = App { wasp :: Wasp, title :: String, deployment :: Maybe Deployment, head :: Maybe [String], auth :: Maybe Auth, server :: Maybe Server, client :: Maybe Client, db :: Maybe Db, emailSender :: Maybe EmailSender, webSocket :: Maybe WebSocket }也就是说,app声明在内部被拆分为十个字段:wasp(编译器版本要求)、title(标题)、deployment(部署模式)、head(头部注入内容)、auth(认证)、server(服务端)、client(客户端)、db(数据库)、emailSender(邮件发送)与webSocket(WebSocket)。除wasp和title外,其余字段均为可选(Maybe类型),这正是"只配置你需要的那部分"这一设计哲学在类型层面的体现。
一个最小的app声明
app todoApp { wasp: { version: "^0.18.0" }, title: "ToDo App", head: [ "<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" />" ] }修改应用标题
浏览器标签页中 favicon 旁边显示的标题,正是由app声明的title字段控制的。修改它只需要改动一行:
app myApp { wasp: { version: "^0.18.0" }, title: "BookFace" }需要留意的是,title是必填字段(在 App.hs 中它的类型是String而非Maybe String),因此每个app声明都必须显式提供。标题最终会写入生成应用的 HTML 文档标题中,与 favicon 一同展示在浏览器标签页上。
向<head>添加额外内容
如果你需要引入额外的样式表、脚本或 meta 标签,可以将它们以字符串形式添加到head字段。head是一个字符串数组,每个元素对应一行将被注入 HTML 文档<head>的内容:
app myApp { wasp: { version: "^0.18.0" }, title: "My App", head: [ // optional "<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" />", "<script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js\"></script>", "<meta name=\"viewport\" content=\"minimum-scale=1, initial-scale=1, width=device-width\" />" ] }常见用途包括:
- 引入第三方字体(如 Google Fonts);
- 加载 CDN 上的 JS 库(如 Chart.js);
- 覆盖或补充 viewport、description 等 meta 信息;
- 设置自定义 favicon:
"<link rel='icon' href='/favicon.ico' />"。
从源码结构看,head :: Maybe [String](App.hs)决定了它是一个可选的字符串列表——不配置时生成器不会注入任何额外头部内容,配置后按数组顺序逐行写入。
一个来自仓库的实例
在当前仓库的示例 examples/ask-the-documents/main.wasp.ts 中,可以找到真实项目对title与head的组合使用:
export default app({ name: "askTheDocuments", wasp: { version: "0.26.0" }, title: "PG Vector Example", head: ["<link rel='icon' href='/favicon.ico' />"], // ... });注意:当前仓库示例已迁移到基于
@wasp.sh/spec的 TypeScript Spec 格式(main.wasp.ts),而 0.18 文档讲解的是经典.waspDSL。两者在声明能力上是一一对应的:name/title/head等字段的语义完全一致,只是书写语法不同。本指南以 0.18 的 DSL 语法为准。
app声明 API 参考
app声明支持的全部字段如下:
app todoApp { wasp: { version: "^0.18.0" }, title: "ToDo App", head: [ "<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" />" ], auth: { // ... }, client: { // ... }, server: { // ... }, db: { // ... }, emailSender: { // ... }, webSocket: { // ... } }字段逐项说明
wasp: dict(必填)
Wasp 编译器配置。它是一个字典,目前只包含一个字段:
version: string(必填):声明该应用兼容的 Wasp 版本范围。取值必须是合法的 SemVer 范围(如^0.18.0)。- 在 waspc/src/Wasp/AppSpec/App/Wasp.hs 中,
Wasp数据结构只有一个version :: String字段,与文档描述完全吻合。 - 需要注意:目前
version字段只支持 caret 范围(即^x.y.z形式),完整的 SemVer 规范支持将在未来版本中提供。如果填写的版本不兼容,Wasp 编译器会拒绝编译该应用。
- 在 waspc/src/Wasp/AppSpec/App/Wasp.hs 中,
title: string(必填)
应用标题,显示在浏览器标签页中 favicon 旁边。
head: [string](可选)
要注入 HTML 文档<head>的额外行(如<link>或<script>标签)列表。
其余字段(均为可选,各自有独立文档章节)
| 字段 | 类型 | 用途 | 深入阅读 |
|---|---|---|---|
auth | dict | 认证配置 | authentication 章节 |
client | dict | 客户端配置 | client configuration 章节 |
server | dict | 服务端配置 | server configuration 章节 |
db | dict | 数据库配置 | database configuration 章节 |
emailSender | dict | 邮件发送配置 | email sending 章节 |
webSocket | dict | WebSocket 配置 | WebSocket 章节 |
从源码理解各组件的可选性设计
App数据类型中,auth、server、client、db、emailSender、webSocket全部是Maybe包装的可选值(App.hs)。这意味着:
- 你可以只声明
title+head,构建一个不带认证、不带自定义服务端配置的最简应用; - 也可以逐步叠加
auth、client、server等配置块,让应用能力渐进增强。
client字段的底层能力
在 waspc/src/Wasp/AppSpec/App/Client.hs 中可以看到client字典实际支持的能力:
data Client = Client { setupFn :: Maybe ExtImport, -- 客户端初始化函数(如导入 CSS) rootComponent :: Maybe ExtImport, -- 根组件(如自定义 Layout) baseDir :: Maybe String, -- 客户端代码目录(如 /client) envValidationSchema :: Maybe ExtImport -- 客户端环境变量校验 schema }server字段的底层能力
同理,waspc/src/Wasp/AppSpec/App/Server.hs 揭示了服务端配置块的内部结构:
data Server = Server { setupFn :: Maybe ExtImport, -- 服务端启动前执行的 setup 函数 middlewareConfigFn :: Maybe ExtImport, -- 中间件配置函数 envValidationSchema :: Maybe ExtImport -- 服务端环境变量校验 schema }这些子字段的语义与对应文档章节(client-config、server-config)中的说明一致,读者在深入配置client/server时可以直接对照源码确认每个键的职责。
实战:配置一个带认证与自定义根组件的应用
将上面的知识点组合起来,一个较完整的app声明如下:
app myApp { wasp: { version: "^0.18.0" }, title: "BookFace", head: [ "<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" />", "<meta name=\"viewport\" content=\"minimum-scale=1, initial-scale=1, width=device-width\" />" ], auth: { userEntity: User, methods: { usernameAndPassword: {} }, onAuthFailedRedirectTo: "/login" }, client: { rootComponent: App }, server: { setupFn: myServerSetup }, db: { system: PostgreSQL } }配置要点:
auth.userEntity指向在entity中声明的用户实体,methods.usernameAndPassword启用用户名密码登录;client.rootComponent引用src/下的 React 根组件,用于包裹所有页面;server.setupFn指向服务端初始化逻辑,适合在启动时执行数据库种子或环境检查;db.system指定数据库系统,例如PostgreSQL或SQLite。
小结
app声明是 Wasp 项目唯一的顶层配置入口,每个项目只能有一个;title与wasp.version为必填,head与auth/client/server/db/emailSender/webSocket均为可选;- 修改标题、注入样式与脚本是最常见的两种自定义操作,只需改动
title和head两个字段; - 编译器内部通过 App.hs 中的
App数据类型承载这些配置,Maybe字段设计保证了"按需配置、最小可用"; - 想深入了解某个组件块的完整配置项,请按上文表格进入对应文档章节;想直接查看真实项目写法,可参考 examples/tutorials/TodoApp/main.wasp.ts 与 examples/ask-the-documents/main.wasp.ts(后者为新版 TypeScript Spec 语法)。
【免费下载链接】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),仅供参考