全书目录

第十三篇:Fastify 完全指南 —— 高速物流中枢宇宙

第十四章:模块化 —— 一座成熟中枢不会把所有传送带焊在一个文件里

1 分钟 274 字 第 269 / 962 个阅读单元

中小项目里,一个 server.js 还能忍。
一旦变成真实业务,中枢必须拆仓区。

一个很稳的目录可以长这样:

text
app/
├── app.js
├── plugins/
│   ├── db.js
│   ├── auth.js
│   └── docs.js
├── routes/
│   ├── shipments.js
│   ├── warehouses.js
│   └── health.js
├── schemas/
│   └── shipment.js
└── services/
    └── shipment-service.js

plugins/db.js

js
export default async function dbPlugin (fastify) {
  fastify.decorate('db', {
    async findShipmentById (id) {
      return { id, status: 'stored' }
    }
  })
}

routes/shipments.js

js
export default async function shipmentRoutes (fastify) {
  fastify.get('/shipments/:id', async function (request) {
    return this.db.findShipmentById(request.params.id)
  })
}

app.js

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