用途:新建 FmodeStudio 平台项目时复制本骨架(pnpm workspace monorepo + 根脚本一键启动 + dev/prod 双环境 + 模式 A/B 目录统一)。目录职责与完整规则见 rules/03-项目架构与目录.md;两模式部署见 rules/10-安全与环境部署.md;平台铁律见 CLAUDE.md 黄金规则 5/6。 填写说明:
<...>为必填项,按项目实际情况替换后删除本行。
<project-root>/
├── pnpm-workspace.yaml
├── package.json # 根脚本(一键启动,见第三节)
├── .npmrc
├── .gitignore # node_modules/ dist/ config.json .env 等
├── .claude/ # 项目规则与 hooks(复制 CLAUDE.md + rules/)
├── apps/
│ ├── web/ # Angular 前端(见 rules/03 标准目录)
│ │ ├── src/app/
│ │ │ ├── app.routes.ts app.config.ts app.ts
│ │ │ ├── core/ # 单例服务/守卫/前端私有类型(FmodeParse 初始化唯一入口)
│ │ │ ├── shared/ layouts/ pages/<feature>/
│ │ ├── src/assets/data/ # Mock 数据 JSON(按实体命名)
│ │ ├── angular.json
│ │ ├── proxy.conf.json # /parse /api → http://127.0.0.1:<server port>
│ │ └── package.json # dependencies: fmode-ng(锁版本)
│ └── server/ # 服务端(两模式目录统一:模式 A 上传此目录,模式 B 运行此目录)
│ ├── config.json # Parse Server 配置(含 masterKey,**不入 git**,规则 10 第 1 条)
│ ├── server.ts # 模式 B 入口(Express + Parse Server)
│ ├── api/
│ │ ├── routes.ts # 桶文件
│ │ └── module/<feature>/routes.ts # → /api/<feature>
│ ├── cloud/
│ │ ├── main.js # Parse.Cloud.define / beforeSave / afterSave
│ │ └── providers/ # (可选)拆分模块
│ └── package.json # dependencies: express parse parse-server pg-promise cors dotenv;dev: tsx
├── packages/
│ └── shared/ # 前后端共享:类型/常量/枚举(workspace 协议引用)
│ └── src/models/ src/constants/
├── modules/ # (可选)CDN 模块本地副本(如 fmode-functions-api)
└── docs/ # 文档体系 + schema/ PlantUML 范式(rules/11、05)
pnpm-workspace.yaml
packages:
- apps/*
- packages/*
根 package.json(一键启动核心)
{
"name": "<project-name>",
"private": true,
"packageManager": "pnpm@11",
"scripts": {
"dev": "concurrently -n web,server -c cyan,green \"pnpm -F web dev\" \"pnpm -F server dev\"",
"dev:web": "pnpm -F web dev",
"dev:server": "pnpm -F server dev",
"build": "pnpm -F web build",
"start:prod": "pm2 start apps/server/ecosystem.config.js",
"test": "pnpm -r test",
"lint": "pnpm -r lint"
},
"devDependencies": {
"concurrently": "^9"
}
}
子包脚本约定
dev: ng serve --proxy-config proxy.conf.json;build: ng build --configuration production;test: jest;dev: tsx watch server.ts;test: jest --runInBand。| 维度 | 开发模式(pnpm dev) |
生产环境 |
|---|---|---|
| 启动方式 | concurrently 并行:web dev server + server 热重载(tsx watch) | 模式 A:平台托管(fmode server start --config apps/server/config.json);模式 B:pnpm build + pnpm start:prod(PM2 + Nginx) |
| serverURL | 指向本地 server(经 proxy.conf.json 代理)或平台测试实例 | 指向平台返回/生产 Parse Server 地址(仅初始化处一处) |
| Mock 开关 | 可开(rules/06 Mock 规范:一行开关切换) | 必须关闭(发布前检查清单项) |
| 鉴权 | 允许 dev-login(双重校验保证仅非 production 生效) | 必须真实鉴权(rules/10 第 5 条双重校验) |
| 构建 | 免构建,dev server 即时编译 | ng build --configuration production(无 sourcemap、hash 文件名) |
| 上传内容(模式 A) | — | apps/server(config.json/api/cloud)+ apps/web/dist |
pnpm install(自动装 workspace 全部依赖,生成单一 pnpm-lock.yaml);apps/server/config.json(appId/masterKey/databaseURI/serverURL/port/cloud),确认 .gitignore 已排除;pnpm dev(一条命令起前后端);只起一端用 pnpm dev:web / pnpm dev:server;pnpm build → pnpm start:prod,Nginx 配置见规则 10 第 9 条;pnpm -F <pkg> add <dep>(根依赖加 -w),fmode-ng 安装后锁版本(规则 04 第 4 条)。pnpm install 一次成功,仅一个 pnpm-lock.yaml,无其他 lock 文件;pnpm dev 一条命令同时起前端与后端,页面能开、FmodeParse.initialize 生效;pnpm build 产物在 apps/web/dist 且无 .map 文件;pnpm test 递归跑通全部 workspace 测试;apps/server/ 一份且未入 git;