<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[别问我为什么代码没注释，写的时候上帝和我知道，现在只有上帝知道了。]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/linux_cfan</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; linux_cfan]]></copyright><item><title><![CDATA[videojs v10 源代码系列解读：35 · HLS 解析器：multivariant 与 media playlist]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166946119</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166946119</guid><author>linux_cfan</author><pubDate>Thu, 01 Oct 2026 14:44:49 +0800</pubDate><description><![CDATA[SPF 的 HLS 解析器（parse-multivariant.ts、parse-media-playlist.ts、parse-attributes.ts）是零依赖的纯函数，将文本精准转为类型化结构。核心亮点包括：引号优先解析属性、两行式 STREAM-INF 处理、基于 URI 折叠与最小带宽代理的跨音频组去重算法，巧妙解决 HLS 笛卡尔积问题；从视频流 CODECS 偷取音频 codec 补规范空隙；并严格遵循“无知”设计——不判断 live/VOD、不填充未知字段，确保可测性与纯粹性。]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：34 · `createComposition`：类型安全的冲突检测]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166946106</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166946106</guid><author>linux_cfan</author><pubDate>Thu, 01 Oct 2026 14:43:35 +0800</pubDate><description><![CDATA[createComposition 通过编译期类型检查与运行时执行协同，实现行为组合。运行时分三步：构建去重信号映射、共享 deps 执行 setup 并收集 cleanup、异步清理后重置信号。编译期核心为四层类型链：从 setup 推导状态类型，递归交集合并行为类型，检测交叉塌缩（never/undefined）识别冲突，最终通过 ValidateComposition 在调用时拦截类型错误。冲突以字符串字面量报错，确保组合安全，是 TypeScript 类型系统精妙应用的典范。]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：33 · Behavior：通用组合单元]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166883256</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166883256</guid><author>linux_cfan</author><pubDate>Wed, 30 Sep 2026 08:33:47 +0800</pubDate><description><![CDATA[SPF 核心创新在于将信号、Actor、Reactor 等统一为可组合的 Behavior，实现“引擎即 Behavior 列表”的架构。Behavior 通过 stateKeys/contextKeys 声明依赖，setup 中构建响应关系或实例化内部原语，外部仅通过信号槽通信，零直接引用。defineBehavior 在编译期强制键名穷尽，防止运行时错误；makeShareSignals 提供消费者边界，支持捕获信号引用并物化输入槽。读写权限由每个 Behavior 自行声明，类型安全由 TS 保障。组]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：32 · Reactor 模型：信号驱动的状态机]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166883236</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166883236</guid><author>linux_cfan</author><pubDate>Wed, 30 Sep 2026 08:32:41 +0800</pubDate><description><![CDATA[Reactor 是信号驱动的“薄翻译器”，通过 monitor（状态自动转换）、entry（进入时执行一次）、effects（依赖变化重跑）实现响应式逻辑。其核心仅192行，将生命周期全绑定在 effect 的 cleanup 契约上，实现“状态切换即清理”。monitor 优先于状态效果执行，确保 transition 立即生效；所有行为编译为 descriptor 数组，统一由 effect() 驱动，类型强制每个状态显式声明，保障完整性。销毁分两步预留异步扩展，体现极致简洁与安全。]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：31 · Actor 模型：消息驱动的有限状态机]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166838866</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166838866</guid><author>linux_cfan</author><pubDate>Tue, 29 Sep 2026 11:24:18 +0800</pubDate><description><![CDATA[Actor 是基于消息驱动的响应式状态机，核心机制包括：快照即信号实现自动响应，getState 用 untrack 避免意外依赖，transition 与 setContext 分别更新状态与上下文。通过 on 消息分发表实现类型安全的事件处理，getContext() 提供 live 读取语义以支持异步任务链。onSettled 在任务批次完成后自动转换状态，配合三重防护防止陈旧状态更新。整体设计兼顾安全性、响应性与可组合性，为 SegmentLoaderActor 等组件提供坚实基础。]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：30 · `SerialRunner` 与 `ConcurrentRunner`]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166838817</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166838817</guid><author>linux_cfan</author><pubDate>Tue, 29 Sep 2026 11:23:28 +0800</pubDate><description><![CDATA[本文解析 SPF 框架中两个精巧的 Runner 实现：ConcurrentRunner 通过 promise 引用身份比对实现无 generation token 的过时回调丢弃，同 id 任务自动去重；SerialRunner 利用 promise 链天然队列特性，零显式队列实现串行调度，settled 作为内部 generation token 管理批次状态。两者均以优雅的异步设计解决并发与串行场景下的任务管理难题，展现函数式与引用语义在复杂控制流中的高阶应用。]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：29 · `Task`：可取消的异步单元]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166796216</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166796216</guid><author>linux_cfan</author><pubDate>Mon, 28 Sep 2026 23:27:38 +0800</pubDate><description><![CDATA[Task 是 SPF 并发处理的地基，封装可取消的异步操作：自带 AbortController，支持外部信号组合，通过 TaskLike 接口实现状态、身份与可取消性。核心设计强调状态排序保证（先写 value/error 再更新 status），确保观察者安全读取结果；abort() 仅触发信号，状态变更由 runFn 决定，保持职责清晰。不依赖响应式信号存状态，状态查询用 getter，完成感知用回调，克制而高效。去重与调度交由 Runner 负责，形成“执行单元 + 调度策略”分层架构。]]></description><category></category></item><item><title><![CDATA[网课回放总被吐槽“找不到重点“？一次 Web 播放器选型的完整记录]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166796203</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166796203</guid><author>linux_cfan</author><pubDate>Mon, 28 Sep 2026 23:25:56 +0800</pubDate><description><![CDATA[本文分享企业内训平台改版中针对“回放难找内容”的痛点，通过将用户反馈转化为可验证的需求清单，对比四款播放器后，最终选定闭源的ZWPlayer。其核心优势在于：悬停预览缩略图、上拉精确定位、字幕全文搜索（支持跨课程）、双语字幕同屏与章节导航，显著提升回放体验。配套可视化工具降低资产生产成本，接入简单，虽存在闭源、文档尚在完善等短板，但在“回放为核心”的教育场景下，成为最优解。]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：28 · 信号基底：TC39 Signals polyfill 封装]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166691891</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166691891</guid><author>linux_cfan</author><pubDate>Sat, 26 Sep 2026 19:42:51 +0800</pubDate><description><![CDATA[SPF 通过 primitives.ts 薄层封装 TC39 Signals，实现类型安全的读写分离与原子更新。核心技巧在于 update 函数结合 untrack 避免依赖污染，effect 则巧妙利用 Computed 的重跑机制实现副作用自动清理。watcher 借微任务批处理调度，确保响应式更新高效有序。整体设计简洁而精巧，体现运行时依赖追踪的工程智慧。]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：27 · SPF 总览：三层模型与设计目标]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166691884</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166691884</guid><author>linux_cfan</author><pubDate>Sat, 26 Sep 2026 19:41:18 +0800</pubDate><description><![CDATA[SPF 是 v10 的核心创新，基于 TC39 Signals 与 Actor/Reactor 模型重构 HLS over MSE 流处理框架。它打破传统单体设计，将解析、ABR、缓冲等职责拆分为单一职责的层（core/media/network/playback），实现高可维护性与可测试性。通过信号驱动状态、消息驱动 Actor、翻译驱动 Reactor 的三层模型，构建响应式、可组合的流处理系统。核心原语阶梯化设计，以 Behavior 统一引擎组件，最终在 createSimpleHlsEngine ]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：26 · presentation 子系统：全屏/PiP/远程播放/方向锁]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166645840</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166645840</guid><author>linux_cfan</author><pubDate>Fri, 25 Sep 2026 19:26:43 +0800</pubDate><description><![CDATA[v10 的 presentation 子系统通过纯函数库与 feature 装配分离，精准应对浏览器兼容难题：全屏采用四级降级请求与四层状态判定，覆盖 iOS、Safari PWA 及 Cast 场景；PiP 通过 UA + display-mode 避开 Safari PWA 崩溃陷阱；远程播放依赖鸭子类型并调用浏览器原生设备选择 UI；方向锁则以“事实”与“意图”双标志优雅处理异步竞态，实现跨平台一致体验。]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读: 25 · 输入动作注册表：手势/热键→媒体的桥]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166645835</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166645835</guid><author>linux_cfan</author><pubDate>Fri, 25 Sep 2026 19:25:51 +0800</pubDate><description><![CDATA[v10 播放器通过 media-actions.ts 共享内核，将手势与热键的相对操作（如快进、调速）统一到动作注册表中，仅通过 selector 读取状态并调用 store 方法，实现单一逻辑、自动同步 UI。toggle 类动作则由各输入系统直接调用 store.state.xxx() 处理。其中播放速率采用循环列表导航，确保始终在合法档位间切换，体验更流畅。该设计解耦清晰，支持多输入扩展，兼顾一致性与可维护性。]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：24 · 记忆化选择器与派生状态]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166601536</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166601536</guid><author>linux_cfan</author><pubDate>Thu, 24 Sep 2026 22:20:34 +0800</pubDate><description><![CDATA[本文详解核心状态层的16个选择器设计：以feature为单位构建一行式createSelector，实现精准切片。通过“未配置返回undefined”实现UI自动降级，结合SnapshotController与useStore的浅比较，达成按feature粒度的记忆化与独立重渲染。派生状态不放选择器层，而是由feature的state()或UI Core的getState()处理，保持选择器纯粹性。警惕状态键重叠隐患，强调结构清晰、边界分明的设计哲学。]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：23 · 数据属性序列化与 CSS 变量桥接]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166601531</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166601531</guid><author>linux_cfan</author><pubDate>Thu, 24 Sep 2026 22:19:42 +0800</pubDate><description><![CDATA[v10 通过“双桥”实现无头 Core 与皮肤的解耦：data-* 属性桥接离散状态（如暂停、禁用），CSS 自定义属性桥接连续数值（如滑块填充百分比）。核心逻辑仅输出状态数据，通过统一序列化规则（true→空属性，falsy→移除）适配 React 与 Web Components。皮肤纯 CSS 消费属性与变量，实现零 JS 交互反馈，达成逻辑与样式彻底分离。]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：22 · 无头 UI Core：纯逻辑组件范式]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166476199</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166476199</guid><author>linux_cfan</author><pubDate>Wed, 23 Sep 2026 12:57:31 +0800</pubDate><description><![CDATA[03 篇用介绍过「无头 Core」的概念，这篇深入它的全貌。我会用三个代表性 Core 做对比：PlayButtonCore（03 篇讲过，简单按钮）、SliderCore（滑块，纯计算型）、CaptionsRadioGroupCore（列表型，内部有响应式状态）。看完你会发现这个「纯逻辑组件」范式有清晰的分层规则。]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：21 · 逐个解析核心 Feature]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166476060</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166476060</guid><author>linux_cfan</author><pubDate>Wed, 23 Sep 2026 12:55:55 +0800</pubDate><description><![CDATA[本文拆解视频播放器核心 feature 机制：volume 通过动态创建 video 探测 iOS 音量控制能力，time 实现乐观更新与 seek 抢占，buffer 将 TimeRanges 转为可判变的 tuple 数组，source 换源时清空所有操作，error 与 emptied 事件联动，live 依赖多事件重算直播边缘，text-track 用内层 AbortController 处理异步加载，quality 通过对象身份重绑实现换源后自适应。各模块均遵循「守卫→sync→listen」模式]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：20 · Feature 预设：video/audio/live/background]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166354317</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166354317</guid><author>linux_cfan</author><pubDate>Tue, 22 Sep 2026 12:00:07 +0800</pubDate><description><![CDATA[v10 通过类型化元组实现预设，将 16 个 feature 组装成开箱即用的播放器形态。预设非魔法，而是基于领域逻辑的合理取舍：直播去倍速因无意义，音频无全屏因无画面，背景视频暂为空因待设计。空预设也导出以支持类型先行。预设可自由组合，顺序影响覆盖但当前仅具可读性。核心思想是“不装即隐藏”，通过 undefined selector 实现按钮自动消失，比隐藏更彻底。]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：19 · Feature 即 Slice：播放器的能力组装机制]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166354230</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166354230</guid><author>linux_cfan</author><pubDate>Tue, 22 Sep 2026 11:58:52 +0800</pubDate><description><![CDATA[v10 播放器核心以「Feature」为最小单元，将播放、音量等能力抽象为标准 store slice，实现组合式架构。每个 Feature 是 Slice<PlayerTarget, State>，通过 state() 提供状态与动作，attach() 绑定副作用，并内置能力守卫与信号管理。支持 plain 与 configurable 两种形态，兼顾内置功能与外部扩展。播放器即 feature 的组合，类型推导贯穿全链路，生命周期自动管理，状态响应式更新，彻底取代 v8 插件机制，实现“组合优于继承”的]]></description><category></category></item><item><title><![CDATA[videojs v10 源代码系列解读：18 · 媒体轨道与 rendition 列表实现]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166254206</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166254206</guid><author>linux_cfan</author><pubDate>Mon, 21 Sep 2026 20:19:58 +0800</pubDate><description><![CDATA[v10 通过 media-tracks/ 模块在浏览器不支持时，用 polyfill 实现统一的音视频轨道与清晰度列表管理。核心亮点：利用 WeakRef 反向引用避免循环引用；queueMicrotask 实现事件防抖，合并高频变更；generator 配合 Symbol.iterator 动态生成可迭代列表；selected 与 active 状态分离，精准反映用户选择与实际播放状态。整体设计兼顾性能、内存安全与语义一致性。]]></description><category></category></item><item><title><![CDATA[ZLMediaKit 前端播放器怎么选？xgplayer / DPlayer / ckplayer / ZWPlayer 横向对比]]></title><link>https://blog.youkuaiyun.com/linux_cfan/article/details/166254175</link><guid>https://blog.youkuaiyun.com/linux_cfan/article/details/166254175</guid><author>linux_cfan</author><pubDate>Mon, 21 Sep 2026 20:17:23 +0800</pubDate><description><![CDATA[自建流媒体链路中，ZLMediaKit服务端能力强大，但前端播放器选型常被忽视，导致WebRTC无法播放、延迟高、断连难重连等问题。本文对比xgplayer、DPlayer、ckplayer与ZWPlayer四款国产播放器，聚焦协议支持、直播健壮性、字幕功能等维度。结论：若需全协议覆盖（尤其WebRTC）、低延迟直播与高级交互功能，ZWPlayer为最优解；点播场景则可选xgplayer或DPlayer。选型应基于实际业务需求，避免“服务端强、前端弱”的链路短板。]]></description><category></category></item></channel></rss>