Core 内部开发工具
从 @hfyidu/api@1.0.1 开始,可以通过独立 subpath @hfyidu/api/core 使用公司内部项目长期沉淀的通用开发工具。
ts
import {
BaseUseCase,
Future,
Option,
PaginatorUseCase,
createSingleton,
urlWithQuery,
} from '@hfyidu/api/core'来源与打包方式
core 的公开成员来自两个公司内部工具包:
| 来源 | 定位 | 在 @hfyidu/api/core 中的处理 |
|---|---|---|
@shivip/mp-core | 面向 Vue 3、uni-app 和微信小程序的用例状态、分页、单例、异步适配工具 | 全量转发 |
@shivip/common-util | 与具体 UI 和运行平台无关的 DDD 基类、类型、URL、校验和对象工具 | 由 @shivip/mp-core 全量转发 |
这两个包是公司内部项目开发工具,不要求业务项目直接安装。发布 @hfyidu/api 时,它们的代码和类型已经内联到 core 产物中:
- 业务项目只需安装
@hfyidu/api - 不要再从
@shivip/mp-core或@shivip/common-util导入 - 统一从
@hfyidu/api/core导入,避免不同项目引用到不一致的内部版本 vue没有被内联,它仍由业务项目提供,版本要求为^3.2.0
按需引入
core 是独立构建入口。只需要工具能力时,应从 @hfyidu/api/core 导入,不要为了工具函数从根入口 @hfyidu/api 引入全部业务领域。
能力分组
@shivip/mp-core 提供
| 分类 | 成员 |
|---|---|
| 响应式用例 | ModuleUseCase、ModuleUseCaseStatus、useModuleData |
| 分页用例 | PaginatorUseCase、usePaginatorData、PagedResultDto、PagedQueryParams、PaginationUseCaseConfigOption |
| 业务枚举 | BaseEnumeration |
| 单例与全局容器 | Container、createSingleton、createSingletonWithContainer |
| 异步工具 | Future |
| 通用类型 | HigherOrderComponent、CallbackHandler |
@shivip/common-util 提供
| 分类 | 成员 |
|---|---|
| DDD/请求基类 | BaseUseCase、BaseDto、BaseDomain、BaseEvent、BaseHttpApi、BaseRepository、BaseRouteModule |
| DTO 元数据装饰器 | Required、Default、OriginalKey、Freeze、List、WhenList、WhenMap |
| URL 与路径 | ApiPathBuilder、joinPath、toQueryString、urlWithQuery |
| 校验工具 | validString、validNumber、validBoolean、validArray、validFunction、validAsyncFunction、validMobile、validObject、nonNullable |
| 对象与可选值 | Option、simpleDeepClone |
| 属性描述符 | readonlyDescriptor、notWriteDescriptor、writableDescriptor、getSetDescriptor、notEnumerateDescriptor |
| 错误处理 | ErrorManager、assert |
| 请求/事件/路由类型 | HttpRequestMethod、HttpRequestOption、HttpResponse、UseCaseParams、UseCaseResponse、EventArgs、EventHandler、RouteConfig |
| 通用类型 | Nullable、Optional、CanWrite |
综合示例
下面的示例同时使用分页基类、路径构建、请求方法枚举和 Vue 响应式状态:
ts
import {
ApiPathBuilder,
HttpRequestMethod,
PaginatorUseCase,
type PagedResultDto,
} from '@hfyidu/api/core'
interface Article {
id: number
title: string
}
interface ArticleQuery {
page?: number
limit?: number
keyword?: string
}
class ArticleListUseCase extends PaginatorUseCase<
ArticleQuery,
Article,
PagedResultDto<Article>
> {
protected async onRun(params: ArticleQuery): Promise<PagedResultDto<Article>> {
return new Promise((resolve, reject) => {
uni.request({
url: ApiPathBuilder.create('/article').resolve('list'),
method: HttpRequestMethod.GET,
data: params,
success: ({ data }) => resolve(data as PagedResultDto<Article>),
fail: reject,
})
})
}
}
const articles = new ArticleListUseCase()
await articles.refresh()
console.log(articles.list)
if (articles.hasMore.value) {
await articles.loadNextPage()
}对于 @hfyidu/api 已封装的业务领域,优先使用对应的 Domain.cases.xxx;只有开发新的业务能力或独立项目基础设施时,才需要直接继承这些 core 基类。