中小项目里,一个 server.js 还能忍。
一旦变成真实业务,中枢必须拆仓区。
一个很稳的目录可以长这样:
app/
├── app.js
├── plugins/
│ ├── db.js
│ ├── auth.js
│ └── docs.js
├── routes/
│ ├── shipments.js
│ ├── warehouses.js
│ └── health.js
├── schemas/
│ └── shipment.js
└── services/
└── shipment-service.jsplugins/db.js:
export default async function dbPlugin (fastify) {
fastify.decorate('db', {
async findShipmentById (id) {
return { id, status: 'stored' }
}
})
}routes/shipments.js:
export default async function shipmentRoutes (fastify) {
fastify.get('/shipments/:id', async function (request) {
return this.db.findShipmentById(request.params.id)
})
}app.js:
import Fastify from 'fastify'
import dbPlugin from './plugins/db.js'
import shipmentRoutes from './routes/shipments.js'
const app = Fastify({ logger: true })
await app.register(dbPlugin)
await app.register(shipmentRoutes, { prefix: '/api' })
await app.listen({ port: 3000, host: '0.0.0.0' })#再往上一级的自动装配
如果项目很大,可以用 @fastify/autoload 自动加载 plugins/ 和 routes/。
它适合把“仓区装配”标准化,但前提是你已经有清晰目录纪律。
#一个很实用的判断标准
- 共享基础设施:放
plugins - 纯 HTTP 接口:放
routes - 复用数据结构:放
schemas - 业务动作:放
services