Skip to content

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 提供

分类成员
响应式用例ModuleUseCaseModuleUseCaseStatususeModuleData
分页用例PaginatorUseCaseusePaginatorDataPagedResultDtoPagedQueryParamsPaginationUseCaseConfigOption
业务枚举BaseEnumeration
单例与全局容器ContainercreateSingletoncreateSingletonWithContainer
异步工具Future
通用类型HigherOrderComponentCallbackHandler

详见 @shivip/mp-core 工具参考

@shivip/common-util 提供

分类成员
DDD/请求基类BaseUseCaseBaseDtoBaseDomainBaseEventBaseHttpApiBaseRepositoryBaseRouteModule
DTO 元数据装饰器RequiredDefaultOriginalKeyFreezeListWhenListWhenMap
URL 与路径ApiPathBuilderjoinPathtoQueryStringurlWithQuery
校验工具validStringvalidNumbervalidBooleanvalidArrayvalidFunctionvalidAsyncFunctionvalidMobilevalidObjectnonNullable
对象与可选值OptionsimpleDeepClone
属性描述符readonlyDescriptornotWriteDescriptorwritableDescriptorgetSetDescriptornotEnumerateDescriptor
错误处理ErrorManagerassert
请求/事件/路由类型HttpRequestMethodHttpRequestOptionHttpResponseUseCaseParamsUseCaseResponseEventArgsEventHandlerRouteConfig
通用类型NullableOptionalCanWrite

详见 @shivip/common-util 工具参考

综合示例

下面的示例同时使用分页基类、路径构建、请求方法枚举和 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 基类。

内部工具包 · 未开源授权,仅限公司内部授权团队使用