npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

taer

v1.0.9

Published

![](https://img.shields.io/badge/build-passing-brightgreen) ![](https://img.shields.io/bundlephobia/min/taer) ![](https://img.shields.io/github/license/nachao/taer)

Downloads

36

Readme

Taer

前端元数据开发工具,用于管理元数据,然后在组件中使用。

logo.png

背景说明 此工具不局限于前端框架、UI库等,因为这只是一种研发实现方式,更像是一种设计模式。

Taer和基于组件开发有什么区别

传统:

第一步:产品提出业务需求;

第二步:研发分析需求,并给出需求可行性和研发周期、人员;UED给出效果图;

第二步:进行研发,基于对应的 前端框架(vue\react等) + ui框架(antd\element等)实现页面 布局 和 交互;

Taer:

第一步:产品和UED给出交互标准,将交互和展示转换为数据描述语言;

第二步:前端基于UI和交互的一套标准规则,开发出对应的解析规则和组件交互。确保每一个规则都可以通过枚举值对应上,至于规则需要复杂还是粗略,可以根据业务场景的复杂度而定。例如:输入方式有输入框、下拉框、多选框,每种交互都对应一个名称。也可以根据业务的复杂度渐进式的扩展规则,满足更多的业务场景。(和GQL中的schema是一个概念)

第三步:产品基于标准,提出业务需求的描述规则,这些规则可以立即转换成数据。当得到数据的一刻,需求就已经完成了。

它是一个完全基于 数据驱动 的解决方案,根据灵活、复用的特性。如果项目的定制化非常强,没有规则可寻,就不建议使用此方案。

(稍后会发布一套Taer结合react+antd、vue+element 的现成的解决方案,基于此标准可以直接进入第三步。会先提供需要开发预置数据的方式,然后提供纯表单可配置的方式转换为规则数据)

Taer和框架里面的 store 有什么区别

传统: 例如我们使用 vuex 时,会将一个模块,或者用户数据存在在 store 中,然后在使用的场景调用即可。

Taer: 将数据状态颗粒化到 每个字段中、每个按钮 中,彼此间提供通讯能力,但都是独立存在的。所以提供 TaerFields 用来扩展一个字段的数据状态。

代码演示

元数据用于描述任意一个实体数据(entity),例如一个最简单的 表单 实体数据:

const entity = {
    name: "user",
    get: "/user/create",
    fields: [
        { name: "name", label: "姓名" },
        { name: "age", label: "年龄" },
        { name: "sex", label: "性别" },
    ]
}

字段中需要定义哪些属性,完全取决于业务需求,只要确保有字段这样一个对象数据便可。

能力

  • TaerField 字段操作

  • TaerServer 异步操作

实体

元数据的单元为实体,一个实体数据的结构:

  • 实体描述

  • 异步操作定义

  • 字段描述定义

TaerField

将 entity.fields 转换为对象管理,以满足开发中的需求。例如:

  • 字段的值管理;
  • 字段的验证规则;
  • 字段之间的依赖关系;
  • ...

在组件直接引入和实例:

const filedController = new TaerFields(entity.fields); 

在DOM中遍历(以react为例)

<div>
    { 
        filedController.fields.map(field => (
            <label>
                <span>{ field.label }</span>
                <input value={ field.value } onclick={e => field.value = e.target.value } />
            </label>
        ))
    }
</div>

上面的使用中,就是一个简单的基于数组遍历出DOM,没有使用 TaerField 的任何能力。

分别提供了 .use().on() 两个方法,定义字段的扩展功能。 use是基于责任链模式的一种类似中间件的功能,on是基于观察者模式的一种消息订阅的功能。

useChange(option: IFieldMiddlewareOption): any

在字段的值发生修改时,立即触发的钩子,且可以对值进行处理。它是在 field.value = "xxx" 的赋值操作时被触发,对这个 "xxx" 进行格式的一个操作。

例如我们需要 age 字段为 Number 数值,则需要对其值进行格式化:

filedController.use({
    useChange: ({ value, field }) => {
        return field.key === 'age' ? Number(value) : value;
    }
})

这样此字段数据始终是 Number 类型。

useDisabled(option: IFieldMiddlewareOption): boolean

解析字段的禁用规则,以下情况下触发:

  • 此字段的 值 触发后;
  • 依赖字段的 值 修改时,使用 setDepends() 设置依赖字段;

useShow(option: IFieldMiddlewareOption): boolean

解析字段的展示规则,以下情况下触发:

  • 此字段的 值 触发后;

  • 依赖字段的 值 修改时,使用 setDepends() 设置依赖字段;

useParam(option: IFieldMiddlewareOption): IAnyObject

获取字段的参数化,例如前端数据格式和后端不同时,调用 fieldControler.toParam() 方法时执行。

例如日期参数,前端是 [Date, Date] 格式,后端期望是 "xxxxxxxxx,xxxxxxxxx" 格式:

filedController.use({
    useParam: ({ field }) => {
        if (field.type === 'date') {
			return { [field.key]: field.value.map(d.getTime()).join(',') };
        }
    }
})

setKeyName(key: string)

设置字段的主键,默认为字段中的 “key” 属性。

setType(type: FieldType)

设置字段的类型,字段默认 类型 为 FieldType.String

setDepends(fields: TaerField[])

设置字段的依赖字段,当 fields 中的字段 值 发生变化时,会触发 onDepends 观察。

onInited(option: IFieldEOption)

当字段对象化后,可以在此钩子使用上面的 set 方法,进行需求定义。

onChange(option: IFieldEOption)

当字段值修改时触发。

onDisabled(option: IFieldEOption)

当字段的 disabled 属性变更时触发,只有当定义过字段的 useDisabled 后才会发生变化。

onShow(option: IFieldEOption)

当字段 “展示状态” 变更时,只有当字段定义过 useShow 后才会发生变化。

onDepends(option: IDependFieldEOption)

当依赖字段的 值 发生修改时,使用 field.setDepends() 设置依赖字段。

TaerServer

数据服务操作功能,初始化时传入 url 参数,默认请求方式为 get。

const serverController = new TaerServer(entity.url)

属性:

  • data 响应的数据
  • msg 响应的提示文本
  • state 响应状态
  • res 响应对象
  • load 请求状态

send()

发起请求。

prevent()

执行 send() 方法后,可以在 onRequestBefore 钩子中,进行阻止请求操作。

useParams(option: IServerParamMiddlewareOption): IAnyObject

在请求发起先触发,默认会返回请求基本信息 url、method 的对象。可以结合 fieldController.toParam() 方法,得到字段参数化对象,整合到请求数据中。

useRequest(option: IServerRequestMiddlewareOption): Promise

定义请求方式,不设置的话则不会进行网络请求。

useResStatus(option: IServerResMiddlewareOption): boolean | string

定义解析数据响应后的状态,定义后使用 serverController.state 才有值。

useResMessage(option: IServerResMiddlewareOption): string

定义响应后的描述文本,定义后使用 serverController.msg 才有值。

useResData(option: IServerResMiddlewareOption): any

定义响应后的存储数据,定义后使用 serverController.data 才有值。

useResErrMessage(option: IServerResMiddlewareOption): string

定义请求报错时的反馈文本,定义后使用 serverController.msg 才有值。