生态页面信号
@ecopages/signals 是一个可独立使用或位于Radiant下方的渲染-不可知信号包.
它的核心模式基于 TC39 信号提案,其表面积更小,并且有少数方便的帮助者今天用于应用代码.
公共入境点仍然存在 index.ts,而目前的执行工作则在以下重点单元中进行: src/ 因此核心运行时间,效果,监视器支持,和存储逻辑可以独立地演化.
当前范围
该套件目前提供:
State<T>可写入值Computed<T>懒惰派生值currentComputed()对于需要主动计算背景的高级派生助手effect(...)反应副作用,并计划重新执行watch(...)以上一个值访问来观察衍生值untrack(...)财务报告和审定财务报表peek(...)非跟踪读取subtle.Watcher加号watched财务报告和审定财务报表unwatched低级无效工作流程的钩子createStore(...)深反应对象和阵列状态mapItems(...)用于对每个项目进行一次映射并在清单中保留时重用其结果的衍生列表isStore(...)用于检测信号后置存储代理snapshot(...)用于实现纯嵌入式数据- 期间的自动依赖性发现
Computed评价 - 对渲染器或框架适配器的订阅支持
源版式
该套装围绕一个稳定的公共管和较小的执行文件进行:
index.ts再出口公众API并曝光subtlesrc/types.ts定义公共合同、选项和低等级符号src/state.ts执行可写State信号src/computed.ts执行懒惰衍生Computed信号和主动计算助手src/effect.ts财务报告和审定财务报表src/watch.ts执行效果安排和衍生价值观察src/watcher.ts执行建议书形状的低级监视器src/tracking.ts包含未跟踪的已读帮助src/store.ts包含深存储代理和快照实现
设计位置
这个包是不可知的.
- 它不知道JSX.
- 它不知道Radiant组件.
- 它既作为独立的包件工作,又作为这些包件的下部适配器工作.
flowchart LR
Set["state.set(value)"] --> Stale["dependent computeds<br/>marked stale"]
Stale --> Pull["computed.get()<br/>recomputes lazily and caches"]
Stale --> Notify["subscribers, effects<br/>and watchers notified"]
Notify --> Adapter["an adapter re-reads and patches,<br/>such as an @ecopages/jsx binding"]
计算出它在评估时读取的信号,因此依赖性不需要声明。 在读取之前,任何内容都不会重算,一个订阅的适配器都会被推出新的值来补丁自己的输出.
TC39 关系
本套件以目前的TC39信号器提案为基础,并围绕下列内容跟踪相同的宽度模型:
State财务报告和审定财务报表Computed信号类- 基于缓存值的懒于拉重算
- 在计算评价过程中自动发现依赖性
- 可写和计算信号的自定义平等函数
- 未跟踪读取为逃生舱
这不是本提案草案的即时执行.
最好将其理解为其核心语义中的提案相通,但尚未完全与草案表面相兼容.
- 它暴露了方便的帮助者,例如:
effect(...), (中文(简体) ),watch(...), (中文(简体) ),createStore(...),以及snapshot(...)直接说. - 它现在暴露在手动
subscribe(...)用于适配器和库集成的钩子. - 它暴露出一个提议形状
subtle.WatcherAPI,同时保留现有的便利助手. - 内容
subtle.Watcher遵循提议式的再武装行为,其中呼叫watch(...)重置下一个无效周期的待决集和通知批次 . - 它尚未暴露出完整的TC39微妙的内向表面.
API 注释
subscribe(...)用于适配器式的推力集成. 应用程序级别的衍生工作通常以下列方式表达:Computed, (中文(简体) ),effect(...),或watch(...)。 。 。 .watch(...)建立在计算信号和效果之上,因此它继承了计算平等行为和效果调度。 它在变化时通知,而不是每个冲出:在排程器运行之前,一个套装,然后是套装previousValue是最后交付的值.subtle.Watcher报告停滞而不是重新计算值。 通话watch(...)既是注册也是重置.createStore(...)覆盖嵌入的平原对象和阵列,同时snapshot(...)解析当前用于日志、序列化或比较的平面值图表.mapItems(source, project, options?)将每个项目的结果按项目身份来保留,因此只能预测新项目,其他项目保留相同的结果对象.project运行未跟踪,所以读取其项目信号的结果不会重映射列表. 诸如@ecopages/jsx跳过值不变的行; JSX 用户可以使用<MapItems each={list}>换句话说.
示例
import { Computed, State, createStore, effect, watch } from '@ecopages/signals';
const count = new State(0);
const parity = new Computed(() => ((count.get() & 1) === 0 ? 'even' : 'odd'));
const store = createStore({ profile: { name: 'Ada' } });
const dispose = effect(() => {
console.log(parity.get(), store.profile.name);
});
const stopWatching = watch(
() => store.profile.name,
(nextName, previousName) => {
console.log(previousName, '->', nextName);
},
);
count.set(1);
store.profile.name = 'Grace';
dispose();
stopWatching();
限制
这一执行情况仍然比目前的TC39提案草案要小.
- 没有完整的TC39
Watcher和微妙的语义浮出水面 - 还没有一个完整的提议式的 微妙的回顾帮助者
- 没有批量或交易模式
- 尚未将框架所属处置树或组成部分所有权整合
这些遗漏是蓄意的。 目标是保持一个小的、有用的独立一揽子方案,同时留有余地随着提案的发展进一步调整.