{"id":25147073,"url":"https://github.com/veaba/copy-alien-signals","last_synced_at":"2025-04-03T06:46:49.929Z","repository":{"id":275018649,"uuid":"924815315","full_name":"veaba/copy-alien-signals","owner":"veaba","description":"copy-alien-signals， form: https://github.com/stackblitz/alien-signals","archived":false,"fork":false,"pushed_at":"2025-01-30T18:20:46.000Z","size":27,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-08T20:33:01.633Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/veaba.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-30T17:45:07.000Z","updated_at":"2025-01-30T18:20:49.000Z","dependencies_parsed_at":"2025-01-30T18:46:21.135Z","dependency_job_id":null,"html_url":"https://github.com/veaba/copy-alien-signals","commit_stats":null,"previous_names":["veaba/copy-alien-signals"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Fcopy-alien-signals","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Fcopy-alien-signals/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Fcopy-alien-signals/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Fcopy-alien-signals/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/veaba","download_url":"https://codeload.github.com/veaba/copy-alien-signals/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246952273,"owners_count":20859811,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-08T20:28:24.639Z","updated_at":"2025-04-03T06:46:49.914Z","avatar_url":"https://github.com/veaba.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# copy-alien-signals\n\n\u003e 抄录下代码实现\n\n- form [stackblitz/alien-signals](https://github.com/stackblitz/alien-signals)\n\n## UML 解释\n\n```mermaid\nclassDiagram\n    class Subscriber {\n        +currentValue: any\n        +subs: Link\n        +subsTail: Link\n        +deps: Link\n        +depsTail: Link\n        +flags: number\n    }\n    class ComputedSubscriber {\n        +getter: function\n    }\n    class EffectSubscriber {\n        +fn: function\n    }\n    class EffectScope {\n        +isScope: boolean\n    }\n    class Link {\n        +dep: Subscriber\n        +sub: Subscriber\n        +nextDep: Link\n        +prevSub: Link\n        +nextSub: Link\n    }\n    Subscriber \u003c|-- ComputedSubscriber\n    Subscriber \u003c|-- EffectSubscriber\n    Subscriber \u003c|-- EffectScope\n    Subscriber \"1\" *-- \"n\" Link : has links\n```\n\n- Subscriber（订阅者）：这是一个基类，代表所有可以订阅依赖的对象，包含当前值、依赖链表、订阅者链表和标志位等属性。\n- ComputedSubscriber（计算订阅者）：继承自 Subscriber，表示计算属性，有一个 getter 函数用于计算值。\n- EffectSubscriber（副作用订阅者）：继承自 Subscriber，表示副作用，有一个 fn 函数，当依赖变化时会执行这个函数。\n- EffectScope（副作用作用域）：继承自 Subscriber，用于管理一组副作用，有一个 isScope 标志来标识。\n- Link（链接）：用于表示依赖和订阅者之间的链接关系，包含依赖对象、订阅者对象以及前后链接指针。\n\n## 流程图\n\n```mermaid\ngraph LR\n    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;\n    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;\n    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;\n\n    A([开始]):::startend --\u003e B(创建响应式系统):::process\n    B --\u003e C{数据更新?}:::decision\n    C -- 是 --\u003e D(传播更新):::process\n    D --\u003e E(标记订阅者为脏):::process\n    E --\u003e F{订阅者是计算属性?}:::decision\n    F -- 是 --\u003e G(更新计算属性):::process\n    G --\u003e H(浅传播更新):::process\n    F -- 否 --\u003e I{订阅者是副作用?}:::decision\n    I -- 是 --\u003e J(运行副作用函数):::process\n    C -- 否 --\u003e K(访问计算属性):::process\n    K --\u003e L{计算属性脏或待更新?}:::decision\n    L -- 是 --\u003e G\n    L -- 否 --\u003e M(返回计算属性值):::process\n    J --\u003e N(处理待处理的内部副作用):::process\n    H --\u003e C\n    N --\u003e C\n    M --\u003e C\n```\n\n流程图解释\n\n1. 开始：创建响应式系统。\n2. 数据更新检测：判断是否有数据更新\n\n- 如果有数据更新：\n  - 传播更新，标记相关订阅者为脏。\n  - 判断订阅者类型：\n    - 如果是计算属性，更新计算属性的值，并进行浅传播更新。\n    - 如果是副作用，运行副作用函数，并处理待处理的内部副作用。\n- 如果没有数据更新：\n\n  - 当访问计算属性时，检查计算属性是否脏或待更新。\n\n    - 如果是，更新计算属性的值。\n    - 如果否，直接返回计算属性的值。\n\n    3.循环：整个过程会不断循环，以确保系统始终保持响应式。\n\n## 主要函数调用关系\n\n```mermaid\ngraph LR\n    classDef func fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;\n\n    A(func: createReactiveSystem):::func --\u003e B(func: link):::func\n    A --\u003e C(func: propagate):::func\n    A --\u003e D(func: startTracking):::func\n    A --\u003e E(func: endTracking):::func\n    A --\u003e F(func: updateDirtyFlag):::func\n    A --\u003e G(func: processComputedUpdate):::func\n    A --\u003e H(func: processPendingInnerEffects):::func\n    A --\u003e I(func: processEffectNotifications):::func\n    J(func: computed):::func --\u003e B\n    J --\u003e G\n    K(func: signal):::func --\u003e B\n    K --\u003e C\n    K --\u003e I\n    L(func: effect):::func --\u003e B\n    L --\u003e M(func: runEffect):::func\n    N(func: effectScope):::func --\u003e M\n    O(func: endBatch):::func --\u003e I\n    P(func: startBatch):::func --\u003e A\n    Q(func: pauseTracking):::func --\u003e A\n    R(func: resumeTracking):::func --\u003e A\n    M --\u003e D\n    M --\u003e E\n```\n\n函数调用关系解释：\n\n- createReactiveSystem 函数是核心，它返回多个处理依赖关系和更新的方法。\n- computed、signal、effect、effectScope 等函数是对外接口，它们会调用 createReactiveSystem 返回的方法来实现具体功能。\n- endBatch、startBatch、pauseTracking、resumeTracking 等函数用于控制批量更新和跟踪状态。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveaba%2Fcopy-alien-signals","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fveaba%2Fcopy-alien-signals","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveaba%2Fcopy-alien-signals/lists"}