模块化项目
模块化的项目更易读和易维护,对于代码量大一些的项目,应该使用模块化开发
Halsp 在框架层面良好支持模块化的项目
各模块之间,利用 @halsp/inject
的依赖注入能力,实现低耦合的关系
模块化项目需要用到 @halsp/router
,以支持模块化的路由
目录结构
一般模块化的项目,目录结构如下图
+-- src
| +-- index.ts
| +-- common
| | dtos
| +-- modules
| +-- user
| | +-- module.ts // 模块化配置
| | +-- entities
| | | +-- user.entity.ts
| | +-- dtos
| | | +-- create-user.dto.ts
| | | +-- login.dto.ts
| | +-- services
| | | +-- user.service.ts
| | | +-- admin.service.ts
| | +-- actions
| | | +-- user.actions.ts // 装饰器风格
| | | +-- admin.actions.ts // 装饰器风格
| +-- todo
| +-- module.ts // 模块化配置
| +-- entities
| | +-- todo.entity.ts
| | +-- template.entity.ts
| +-- dtos
| | +-- create-todo.dto.ts
| | +-- query-todo.dto.ts
| +-- services
| | +-- todo.service.ts
| | +-- image.service.ts
| | +-- template.service.ts
| +-- _.get.ts // 路径即路由风格
| +-- ^id.patch.ts // 路径即路由风格
| +-- template.post.ts // 路径即路由风格
+-- package.json
+-- tsconfig.json
存放模块代码的目录为 modules
,参考 @halsp/router 路由文件夹
modules
文件夹下的每个文件夹,都代表一个模块
模块化配置
每个模块下都必须有一个 module.ts 或 module.js 文件,否则将视为普通文件夹
在模块配置文件中导出 json 对象,类型和内容如下
interface RouterModule {
prefix?: string;
decorators?: ClassDecorator[] | ((mapItem: MapItem) => ClassDecorator[]);
deepDir?: string;
}
- prefix
路由前缀,统一为该模块下所有路由加上前缀
- decorators
类装饰器数组,或回调函数返回装饰器数组。可以统一为路由 Action 类动态加上装饰器
如结合 @halsp/swagger
为该模块下所有 Action 统一加上 Tag 和描述
import { V } from "@halsp/validator";
export default {
prefix: "user",
decorators: [V.Tags("User").Description("desc")]
}
-- deepDir
仅 路径即路由风格
起作用,值为模块下的目录相对路径
表明只有在此子目录中的 Action 才会生效,并且请求路径以此为基础
通过此参数,允许将模块下所有 Action 统一放到一个目录中,如 actions,代码结构更清晰,目录结构可以如下
+-- src
| +-- modules
| +-- todo
| +-- module.ts // 模块化配置,deepDir 值为 actions
| +-- actions
| | +-- _.get.ts
| | +-- ^id.patch.ts
| | +-- template.post.ts
配置导出类型
简单的可以直接导出一个 json
export default {
prefix: "user"
}
另外 @halsp/router
提供一个函数 defineModule
,推荐用这种方式能够利用 TypeScript 类型推断
import { defineModule } from "@halsp/router";
export default defineModule({
prefix: "user"
})
或
import { defineModule } from "@halsp/router";
export default defineModule(()=> {
return {
prefix: "user"
};
})
除 export default
外,也可以用 module.exports
const { defineModule } = require("@halsp/router");
module.exports = defineModule({
prefix: "user",
});