首页/新闻资讯/正文详情

深入理解 RedwoodJS 项目文件结构:api / web / scripts 三端(Side)架构全解析

发布时间:2026/9/23 1:39:22 来源:云帆数科 栏目:资讯中心
深入理解 RedwoodJS 项目文件结构:api / web / scripts 三端(Side)架构全解析
深入理解 RedwoodJS 项目文件结构api / web / scripts 三端Side架构全解析【免费下载链接】redwoodRedwoodGraphQL项目地址: https://gitcode.com/gh_mirrors/re/redwood本篇技术指南以 RedwoodJS 官方教程第一章《Redwood File Structure》为骨架系统拆解一个全新 Redwood 应用生成出的目录结构后端api、前端web与独立脚本scripts三端如何分工、每个目录与文件承担什么职责以及它们如何通过 Yarn Workspaces 协作。读完本文你将掌握 RedwoodJS 应用的目录组织范式能够快速定位数据库 Schema、GraphQL 定义、Service 业务逻辑、路由与页面等关键代码并理解约定优于配置在 Redwood 中是如何落地的。顶层结构api / scripts / web 三端布局一个新创建的 RedwoodJS 应用在顶层会有三个目录api、scripts和web配置文件暂不展开。RedwoodJS 刻意将后端api与前端web的关注点分离到代码库中各自独立的路径下——这正是 Yarn 所称的workspaces工作区而在 Redwood 的语境里它们被称作sides端。这种一应用双端的布局是理解整个框架的前提前端只管 React 界面后端只管 GraphQL API 与数据访问二者通过约定好的目录与命名自动建立关联。├── api │ ├── db │ │ ├── schema.prisma │ ├── dist │ ├── src │ │ ├── directives │ │ │ ├── requireAuth │ │ │ └── skipAuth │ │ ├── functions │ │ │ └── graphql.js │ │ ├── graphql │ │ ├── lib │ │ │ ├── auth.js │ │ │ ├── db.js │ │ │ └── logger.js │ │ └── services │ └── types │ ├── scripts │ └── seed.js │ └── web ├── public │ ├── favicon.png │ ├── README.md │ └── robots.txt └── src ├── components ├── layouts ├── pages │ ├── FatalErrorPage │ │ └── FatalErrorPage.js │ └── NotFoundPage │ └── NotFoundPage.js ├── App.js ├── index.css ├── index.html └── Routes.jsTypeScript 项目中仅扩展名不同graphql.ts、auth.ts、FatalErrorPage.tsx、Routes.tsx等目录骨架完全一致。当前仓库的__fixtures__/empty-project就是一个完整的 TS 版空项目样例其实际目录树与本结构一一对应。由于前后端分属两个 Yarn workspace后续安装依赖时必须显式指明包要装进哪一端例如仅示意语法勿直接执行yarn workspace web add marked yarn workspace api add better-fsscripts目录则用于存放与api、web两端无直接关联、需要从命令行运行的 Node 脚本。其中的seed.{js,ts}用于向数据库填充应用运行所必需的基础数据比如管理员账号或站点配置。在空项目中该文件默认只是一段占位逻辑——见 seed.ts它导出一个async函数注释中演示了如何用db.user.createMany()批量写入种子用户并在末尾打印提示信息。api 目录后端全解析api目录下共有四个子目录db、dist、src与types。db数据库的管道schema.prisma存放数据库 schema表与列的完整定义。以空项目模板为例其内容如下见 schema.prismadatasource db { provider sqlite url env(DATABASE_URL) directUrl env(DIRECT_URL) } generator client { provider prisma-client-js binaryTargets native } model UserExample { id Int id default(autoincrement()) email String unique name String? }默认数据源是 SQLite通过DATABASE_URL环境变量读取连接串generator client声明使用 Prisma Client 生成器。第一次添加数据表并执行迁移后这里还会自动出现 SQLite 数据库文件dev.db以及一个migrations目录——migrations中的迁移文件记录了数据库 schema 随时间变化的每一次快照是团队协作与版本回滚的基础。dist编译产物dist存放 api 端的编译输出开发阶段无需关心构建时由 Redwood 自动生成。src全部后端源码api/src下包含五个目录directives存放 GraphQL schema directivesschema 指令用于控制查询访问权限或转换字段值。新项目预置两个指令requireAuth校验用户是否已认证并匹配可选的角色列表。空项目中的实现见 requireAuth.ts它通过createValidatorDirective定义requireAuth(roles: [String])在validate中调用src/lib/auth导出的requireAuth。skipAuth跳过鉴权、允许公开访问。实现见 skipAuth.tsvalidate为空函数即放行。functions除 Redwood 自动生成的graphql.{js,ts}外存放应用所需的任何 lambda functionsimport { createGraphQLHandler } from redwoodjs/graphql-server import directives from src/directives/**/*.{js,ts} import sdls from src/graphql/**/*.sdl.{js,ts} import services from src/services/**/*.{js,ts} import { db } from src/lib/db import { logger } from src/lib/logger export const handler createGraphQLHandler({ loggerConfig: { logger, options: {} }, directives, sdls, services, onException: () { // Disconnect from your database with an unhandled exception. db.$disconnect() }, })注意其中的 glob 通配符src/directives/**/*、src/graphql/**/*.sdl、src/services/**/*——这揭示了 Redwood 的核心约定directives、SDL 与 services 会自动按目录扫描并注册进 GraphQL Handler这正是约定优于配置的底层实现。graphql存放用 Schema Definition LanguageSDL书写的 GraphQL schema 文件文件名以.sdl.{js,ts}结尾。SDL 声明了查询、变更与对应的 GraphQL 类型是前后端契约的载体。lib预置三个文件同时可存放其他放哪都不太合适的 api 侧代码auth.{js,ts}初始是添加鉴权功能的占位文件。空项目版本见 auth.ts内置三个基础函数isAuthenticated()目前恒返回true模拟已登录用户hasRole({ roles })判断角色参数是否传入requireAuth({ roles })委托给isAuthenticated()。注释明确说明真正接入认证后这里会被实现为真实逻辑。db.{js,ts}实例化 Prisma 数据库客户端用于与数据库通信。实现见 db.tsnew PrismaClient({ log: emitLogLevels([info, warn, error]) })并通过handlePrismaLogging将 Prisma 日志接入 Redwood logger。logger.{js,ts}配置日志。实现见 logger.ts调用createLogger({})创建基于 pino 的 logger可通过RedwoodLoggerOptions自定义options日志格式、脱敏、destination输出到文件或传输流与showConfig等。services存放与数据相关的业务逻辑。GraphQL 的查询/变更最终落在这里——也就是通常所说的resolvers解析器但其组织形式更强调可复用性同一份业务代码可以在应用的其他位置如后台任务、脚本直接调用而非仅仅服务于 GraphQL 层。types自动生成的类型types存放自动编译生成的 GraphQL 类型TypeScript 类型定义开发阶段可以忽略由 Redwood 在开发/构建流程中自动维护。web 目录前端全解析web目录对应前端 React 应用同样分为静态资源区与源码区。public静态资源区public存放不经过 React 组件处理的资源——它们会被原样复制到最终应用的根目录favicon.png浏览器标签页图标新应用默认使用 RedwoodJS logo。README.md说明何时、如何使用public文件夹存放静态资源并给出在组件内通过打包器导入资源的最佳实践。仓库中的 README.md 强调public中的文件会绕过 JS 模块系统直接复制进构建产物因此应克制使用仅放置 favicon、robots.txt、manifest、与打包器不兼容的库等一般场景优先在组件内import资源让打包器完成校验、路径处理与打包例如import logo from ./my-logo.jpg。robots.txt控制搜索引擎爬虫等 Web 索引器的抓取行为。src前端源码区components存放传统 React 组件以及 Redwood 特有的Cells一种数据驱动的声明式组件范式负责加载/空态/失败态/成功态的自动管理教程后续章节会专门讲解。layouts存放包裹内容、跨多个页面共享的 HTML/组件结构布局。pages存放页面组件可选地被包裹在 Layout 中是某个 URL 对应的落地页例如/articles/hello-world映射到一页/contact-us映射到另一页。新应用内置两个页面NotFoundPage.{js,tsx}当没有其他路由匹配时渲染。空项目版本见 NotFoundPage.tsx渲染居中显示的 404 Page Not Found。FatalErrorPage.{js,tsx}当出现无法恢复的未捕获错误否则应用会崩溃渲染为白屏时渲染。空项目版本见 FatalErrorPage.tsx注意其实现细节仅在NODE_ENV development时加载redwoodjs/web的开发版错误页生产构建中不包含该错误页同时注释提醒应尽量保持该页面简单避免它自身再抛错。App.{js,tsx}引导代码负责把整个 Redwood 应用拉起来。空项目版本见 App.tsx外层是FatalErrorBoundary内部依次包裹RedwoodProvider支持titleTemplate标题模板与RedwoodApolloProviderGraphQL 客户端最后挂载Routes /。index.css自定义 CSS 的起点。文档提到还有很多方案可选例如 TailwindCSS——用好之后可能整个应用生命周期都无需手写自定义 CSS。index.html标准的 React 应用起始 HTML 文件是浏览器首先收到的页面骨架。Routes.{js,tsx}路由定义负责把 URL 映射到某个 Page。空项目版本见 Routes.tsx其文件头注释揭示了页面自动导入约定src/pages下所有 Page 组件自动导入子目录需大写并作为组件名前缀例如src/pages/HomePage/HomePage.js对应HomePagesrc/pages/Admin/BooksPage/BooksPage.js对应AdminBooksPage。默认内容即一个Router加一条notfound兜底路由const Routes () { return ( Router Route notfound page{NotFoundPage} / /Router ) }配套配置文件redwood.toml虽然目录结构讲解暂时排除了配置文件但redwood.toml是让一个 Redwood 应用成为 Redwood 应用的关键见 redwood.toml。它按端声明配置[web]下的title、端口8910、apiUrl默认/.redwood/functions与需要暴露给前端的includeEnvironmentVariables[api]下的端口8911[browser]下的open true表示启动时自动打开浏览器。删除该文件后运行yarn rw dev会直接报错。小结与后续学习路线至此RedwoodJS 应用的骨架已经清晰api端承载数据库db、GraphQL 层directives/graphql/functions、基础能力lib与业务逻辑servicesweb端承载静态资源public与 React 应用components/layouts/pages/Routesscripts端承载独立的 Node 脚本。后续教程将在这份骨架之上逐目录深入创建数据表db/schema.prisma、编写 SDL 与 Service、通过rw g命令生成页面与布局、接入 Cells 与认证逐步把这些空目录填满成完整的应用。【免费下载链接】redwoodRedwoodGraphQL项目地址: https://gitcode.com/gh_mirrors/re/redwood创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

CANN ops-nn 算子解析:aclnnNLLLossBackward 负对数似然损失反向传播两段式接口实战指南
CANN ops-nn 算子解析:aclnnNLLLossBackward 负对数似然损失反向传播两段式接口实战指南

CANN ops-nn 算子解析:aclnnNLLLossBackward 负对数似然损失反向传播两段式接口实战指南 【免费下载链接】ops-nn 本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-nn 本篇技术指南围… · 2026/9/23 1:39:22

LLM 项目 OpenAI 模型完全指南:配置、Responses API、Web Search 与 Code Interpreter 实战
LLM 项目 OpenAI 模型完全指南:配置、Responses API、Web Search 与 Code Interpreter 实战

人工智能大模型AI 应用CLI 【免费下载链接】llm Access large language models from the command-line 项目地址: https://gitcode.com/gh_mirrors/llm/llm 点击查看 免费下载 LLM 是一个从命令行访问大语言模型的工具,它内置了一个与 OpenAI API 对话的… · 2026/9/23 1:39:16

3份高通过率软件工程师简历完整示例解析
3份高通过率软件工程师简历完整示例解析

3份高通过率软件工程师简历完整示例解析 配置环境就卡半天?别慌,这只是表象。真正的痛点在于:你投了50份简历,只有3家回复,甚至面试时对方连你的名字都记不住。问题不在技术深度,而在简历的“信号噪声比”。招聘经理平均只花6-8秒扫描一份简历,… · 2026/9/23 1:39:15

高斯过程回归全解:小样本预测与不确定度建模实战
高斯过程回归全解:小样本预测与不确定度建模实战

1. 这个方法到底是什么,为什么我劝你先别急着上深度学习你可能也遇到过这种局面:手里就几十条实验数据,散点图看起来有趋势但又不完全光滑,想拟合一条曲线做预测,用多项式怕阶数选错,用神经网络怕直接过拟合… · 2026/9/23 4:59:32

边缘AI落地指南:工控机如何借力AMD 7730U稳定实现本地推理
边缘AI落地指南:工控机如何借力AMD 7730U稳定实现本地推理

不用再问“工控机能不能跑AI”——这问题放到2025年已经过时了。真正的问法是:哪一类边缘算力方案能把AI模型稳定、便宜、皮实地落到生产线、配电房、仓储拉线和户外卡口上。我今年经手了几个改造项目,感触挺深:传统工控机只要换对平台、配好… · 2026/9/23 4:59:25

AI写代码的类型安全陷阱与合约优先工作流实践
AI写代码的类型安全陷阱与合约优先工作流实践

过去三个月,我把大量日常编码任务交给了编码智能体。效率确实提升明显,但代价是半夜被线上告警叫醒的次数比去年一年还多。复盘了四次事故之后,我得出的结论有点反直觉:AI写代码的最大风险不是“它写错了”,而是“它写… · 2026/9/23 4:59:25

零基础AI编程实战:一个月四项目与项目纪律系统构建
零基础AI编程实战:一个月四项目与项目纪律系统构建

1. 一个月从零到四项目:我的AI编程真实路径复盘先说结论:一个月,四个项目,从完全零基础到能跑通完整开发流程,靠的不是天赋,而是一套被逼出来的“纪律系统”。这套系统后来被我做成了一个agent项目纪律工具… · 2026/9/23 4:59:25

学生党U盘选购指南:安全、速度与容量全解析
学生党U盘选购指南:安全、速度与容量全解析

1. 学生党U盘选购痛点解析作为一名在校园里摸爬滚打多年的老学长,我深知U盘对学生的重要性。从大一入学时懵懂地买了个杂牌U盘导致期末论文丢失,到现在帮学弟学妹们挑选过上百个U盘,我总结出学生党选购U盘的三大核心痛点:数据安全… · 2026/9/23 4:59:19

AI项目依赖更新实战:从锁版本到自动化验证的完整指南
AI项目依赖更新实战:从锁版本到自动化验证的完整指南

1. 为什么“依赖更新”这件事值得单独拎出来聊做 AI 应用开发的人,大概率都经历过这样一个场景:项目跑得好好的,某天早上打开终端,pip install -r requirements.txt或者npm install一执行,满屏红色报错。你什么都没改&… · 2026/9/23 4:59:19

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码