videojs v10 系列解读:02 · 12 个包的职责与依赖关系

用户存续期价值评估CLV(二) BG/NBD Model python模拟 BG/NBD Model …继续 想象每一个客户有两个硬币,一个“Buy Coin"控制客户购买的概率;一个"Die Coin"控制客户流失、不再购买的概率。 前面假设了客户的交易次数服从泊松过程: 在一年中的每个月,客户都以抛硬币的方式来决定是否购买。我们所观察到的购买次数取决与泊松分布的参数 ????。 %matplotlib inline import numpy as np impor... 阅读详情

上一篇建立了全局观,这篇我们钻进每个包的 package.json,看清楚三件事:这个包导出什么、它依赖谁、为什么这么分层。我把 12 个包全翻了一遍,这篇文章就是一份依赖地图——读完它,后面读任何代码都不会迷路。

先看分层全貌

12 个包构成一个干净的分层 DAG(有向无环图)。我画了个框图,从下到上四层:

┌─────────────────────────────────────────────────────────────┐
│  顶层消费者(平台层)                                          │
│    html   react   (react-native 不存在)                     │
├─────────────────────────────────────────────────────────────┤
│  第三层(领域核心)                                            │
│    core   media                                              │
├─────────────────────────────────────────────────────────────┤
│  第二层(基础设施)                                            │
│    store   spf                                               │
├─────────────────────────────────────────────────────────────┤
│  叶节点(无工作区依赖)                                        │
│    utils   element                                           │
├─────────────────────────────────────────────────────────────┤
│  资源与工具(游离)                                            │
│    icons(私有)   skins(私有)   cli                           │
└─────────────────────────────────────────────────────────────┘

下面从最底层开始往上拆。这样读有个好处:看上面一层时,它依赖的东西你都已经认识了。


叶节点层:地基

@videojs/utils — 通用工具根

一句话:纯函数工具集,没有一丁点状态。

依赖:谁都不依赖(连第三方运行时依赖都没有)。

导出方式很有意思:它有 13 个子路径导出,但没有根入口:

./array  ./dom  ./events  ./function  ./jwt  ./object
./predicate  ./percent  ./string  ./style  ./time  ./number  ./types

意思是消费者必须写成 import { listen } from '@videojs/utils/dom',不能偷懒 from '@videojs/utils'。这是刻意的——为了 tree-shaking。每个主题是独立入口,你只用 DOM 工具,就不会把 JWT 解析那些打进去。./dom 是其中最大的模块(事件监听、聚焦、Shadow DOM、popover 定位、WebKit 兼容)。

为什么是地基:整个 monorepo 几乎所有包运行时都依赖它。它的构建配置用的是 neutralLibraryConfig(单一产物,不像别的包分 dev/default 两份)。后面 05、06 篇会专门拆它。

@videojs/element — 响应式自定义元素基类

一句话:一个故意做小的 Lit 子集。

依赖:不依赖任何工作区包;唯一第三方依赖是 @lit/context。

导出就两个:

.              → ReactiveElement, DestroyMixin, 及类型
./context      → @lit/context 的透传再导出

为什么不用完整 Lit:核心文件 reactive-element.ts(约 13KB)只保留了 Lit 的「响应式属性 + 更新调度」内核,把模板系统、Shadow DOM、装饰器全砍了。因为 v10 的 UI 元素自己控制渲染(不靠 Lit 模板),只需要那个调度模型。砍完之后体积小很多、心智负担也低。

有个细节值得记:store 把 element 声明成可选 peer——意思是核心状态层不强制依赖元素库。这是个很关键的解耦,后面会反复看到这种「可选依赖让框架中立包真正中立」的手法。08-10 篇会深入它。


第二层:基础设施

@videojs/store — 响应式状态

一句话:目标附加式(target-attached)的响应状态管理。

依赖关系:

类型工作区依赖
dependencies@videojs/utils
peerDependencies(可选)@videojs/element、react
devDependencies@videojs/element

导出三个子路径:

.        → 核心:createState, createStore, defineSlice, combine, createSelector, AbortControllerRegistry
./html   → 自定义元素绑定:StoreController, SnapshotController, StoreAccessor
./react  → React 绑定:useStore, useSelector, useSnapshot

这个包最特别的地方是「目标附加式」:state 在 target(media/container)存在之前就可以创建,attach(target) 才触发 setup,detach 把状态重置回初始值。状态用 Slice 组合(combine(...slices) 扁平合并),不是 Redux 那种 reducer 树。清理机制是 AbortControllerRegistry(base/supersede/clear 三招),这是它的一等公民。

element/react 为什么是可选 peer:核心 core/ 目录零框架依赖;html 和 react 绑定只是薄适配器。理论上你可以把 store 用在非 Web、非 React 的环境。11、12 篇深入。

@videojs/spf — 流处理框架

一句话:自研的 HLS over MSE 流处理框架,全仓库最大的包。

依赖:@videojs/utils;第三方依赖 signal-polyfill(TC39 Signals 提案的 polyfill)。

导出:

.                  → 框架原语(信号、Task、Actor、Reactor、createComposition, defineBehavior)
./dom              → DOM 便利聚合
./hls              → createSimpleHlsEngine, SimpleHlsMediaElement
./media-tracks     → 媒体轨道绑定
./background-video → 背景视频引擎变体

代码量:37,746 行,全仓库最大。四层模型:信号 → Reactor → Actor → 平台。Behavior 是组合的通用单元,引擎就是一串 Behavior。

为什么自研:我去翻 internal/design/spf/ 的设计文档,里面的说法是——目标是把「天然不属于一起」的流媒体问题(清单解析、质量选择、分段缓冲、流结束协调)拆成单一职责的层,而不是一个单体播放器。注意 media 包仍然提供 hls.js 适配器作为可选——SPF 是新增的自研路径,不是强制替换。卷五 15 篇全是它。


第三层:领域核心

@videojs/media — 媒体契约

一句话:定义「媒体能干什么」的契约层。

依赖:@videojs/spf、@videojs/utils;第三方依赖 @vimeo/player、dashjs、hls.js、mux-embed(都是可选的引擎适配器)。

导出:

.        → 核心:Media 能力契约类型、谓词、MediaError、track 列表实现
./dom    → DOM 绑定:HTMLMediaElementHost, video-host, audio-host, custom-media-element
./dom/*  → 各引擎适配器(./dom/hls-js, ./dom/dash, ./dom/vimeo, ./dom/mux, ./dom/google-cast)

核心内容:

  • 能力型契约:Media 类型由许多小 *Capability + *Events 接口组合而成。非 HTML 目标(Cast、Vimeo)可以只实现部分接口。
  • 谓词守卫:isMediaPauseCapable(media) 等类型守卫。
  • Host-Component 模型:HTMLMediaElementHost 委托 getter/setter,通过组件注册表编排引擎。
  • 一堆引擎适配器:hls.js、dash.js、native-hls(Safari)、Vimeo、Mux(监控)、Google Cast。

依赖方向:是 core → media,不是反过来。media 不依赖 core。13-18 篇深入。

@videojs/core — 播放器核心

一句话:播放器逻辑的中枢,组合 media 契约 + store 状态 + utils 工具。

依赖:@videojs/media、@videojs/store、@videojs/utils。

导出(代码量第二大,36,576 行):

.               → 框架中立的 UI Core 类(PlayButtonCore 等约 30 个)
./dom           → DOM 播放器层:PlayerFeature, definePlayerFeature, features 预设, selectors, gesture, hotkey
./i18n          → 翻译 API
./i18n/locales/* → 每个语言环境的生成包
./i18n/text/*   → 每个文本域的生成包

几个重点:

  • Feature 即 Slice:definePlayerFeature 其实就是 defineSlice<PlayerTarget>()(恒等函数)。播放器是 combine(...features) 组成的 Store。
  • 无头 UI Core:src/core/ui/<component>/ 每个组件有纯逻辑 XCore 类,不碰 DOM。
  • i18n 系统:以英文短语为键,BCP47 回退链,代码生成类型化参数。
  • 输入子系统:gesture、hotkey、media-actions。

关键定位:它是中枢,但不含 DOM 渲染——纯逻辑在根 . 子路径,DOM 在 ./dom 子路径。19-26 篇深入。


顶层消费者:平台层

@videojs/html — Web Components 平台

依赖最完整:core + element + media + spf + store + utils;devDep icons、skins。

核心内容:

  • createPlayer({ features }) 工厂:返回 { context, create, PlayerController, ProviderMixin, ContainerMixin }。
  • Store Mixin 三件套:ProviderMixin(持有 store)、ContainerMixin(注册容器)、MediaAttachMixin(注册媒体),全靠 Lit 风格 Context 连接。
  • 约 40 个 UI 元素:每个包装 core 里的 XCore 类。
  • SkinElement:拉取共享 CSS + 每个预设的皮肤模块。

为什么 html 依赖 element:它是唯一运行时依赖 @videojs/element 的顶层包——Web Components 需要 ReactiveElement 基类。42-47 篇深入。

@videojs/react — React 平台

依赖:core + media + spf + store + utils;不依赖 element;peerDep react/react-dom(^18 || ^19)。

核心内容:

  • createPlayer({ features }):返回 { Provider, Container, usePlayer, useMedia }(和 html 的返回对偶)。
  • Store 集成:用 @videojs/store/react 的 useStore/useSelector(基于 useSyncExternalStore),不是 html 那套 StoreController。
  • createMediaButton 工厂:React 版的无头 Core 复用模式。

为什么对等:React 自己管组件生命周期,不需要 element 的 ReactiveElement。但它复用 core 的所有无头 Core 类——这就是「同一逻辑两种渲染」。48-51 篇深入。


资源与工具包:游离层

这三个包不参与主依赖链,单独说一下。

@videojs/icons(私有,不发布)

源是 src/assets/{default,minimal}/ 各 25 个 SVG。构建脚本 scripts/build.ts 用 svgo + @svgr/core 生成多格式模块(react/html/render/element 四套)。被 html 和 react 的 src/icons/ 再导出。58 篇会拆它的代码生成流程。

@videojs/skins(私有,不发布)

纯样式包,无运行时逻辑。src/{default,minimal,shared}/,每个含平行 css/ 和 tailwind/ 树。59、60 篇深入。

@videojs/cli — 文档 CLI

唯一和播放器库运行时完全解耦的包。两个命令:docs <slug>(读打包的 markdown 文档页)和 config(管理配置)。有意思的是它在构建时和文档站耦合——通过 ambient 模块声明把站点的安装代码生成器打包进 CLI。它是文档的「交付通道」,不是构建工具。64 篇深入。


这么分层,到底图什么

把 12 个包放一起看,能提炼出几条很清晰的设计原则。这些原则后面会反复验证:

  1. 框架中立优先。utils、element、store、spf、media、core 这六个包不含 React 依赖,前三个甚至不含 DOM 依赖。平台行为全推到 html 和 react。这让核心逻辑理论上可以跨平台(含未来的 RN)。

  2. 依赖单向向下。依赖图是 DAG,没有循环。core → media → spf → utils 是主干,html/react 在顶端消费。

  3. 可选依赖解耦框架。store 把 element 和 react 都声明成可选 peer——这是「让框架中立包真正中立」的关键。

  4. 私有资源包隔离。icons 和 skins 标记私有,只当 devDep,不进运行时依赖图。

  5. CLI 独立。和播放器库零运行时耦合,独立演进。

  6. 平行 API 设计。html 和 react 的 exports 结构(预设、media、icons、i18n)几乎 1:1 对应,刻意维持对等,降低跨平台心智负担。

理解了这张依赖地图,v10 的骨架就清楚了。下一篇我们看撑起这套架构的三条设计哲学,用真实代码说话。

996引擎 - 读写变量性能测试 单轮100万次读写,取3轮平均耗时(毫秒),有效读取率均为100%,数值越小性能越优。 阅读详情

相关推荐

Jaspersoft Studio 6.20.0 免注册安装指南(附下载链接)

本文提供了Jaspersoft Studio 6.20.0社区版的免注册安装详细指南。文章介绍了绕过官网注册获取安装包的多种可靠途径,并逐步详解了从启动安装器到首次运行的全过程,帮助用户快速完成安装与基础配置,高效开启报表设计工作。

mars5的博客 1696

videojs v10 源代码系列解读:12 · Slice 组合、选择器与取消注册表

/ L71 — 恒等函数 }// L71 — 恒等函数函数体就是——恒等函数,运行时零成本。那它图什么?纯类型推断辅助。先捕获Target,返回一个泛型<State>的工厂。// State 自动从 state 返回类型推导();// State 自动从 state 返回类型推导TypeScript 从state的返回类型推导出State,调用方不用手写状态接口,就拿到。这就是 03 篇说的「Feature 即 Slice」的代码基础——core包的本质就是。

别问我为什么代码没注释,写的时候上帝和我知道,现在只有上帝知道了。 149

AI协议助手:法律文本解析与智能问答技术解析

自然语言处理(NLP)技术在法律文本解析中展现出巨大潜力,通过BERT等预训练模型实现条款分类与语义理解。结合OCR与知识图谱技术,AI协议助手能快速提取合同核心条款,并以问答形式解释法律术语,显著提升商务场景的决策效率。测试数据显示,该系统对NDA协议的识别准确率达92%,响应时间仅1.2秒,特别适用于人力资源竞业协议、云服务SLA评估等场景。随着RAG架构与法律术语向量库的应用,AI+法律正推动合同审核成本下降67%,未来将在跨境合规、智能谈判等方向持续演进。

weixin_29053577的博客 131

VideoJs使用总结

VideoJs简介 VideoJs是用于视频播放的javascript的库。 官方文档 使用方法 <div class="video"> <video id="player" class="video-js vjs-styles-defaults"> <!--<source sr...

weixin_34409741的博客 3024

从Mule ESB到Apache Camel:手把手教你设计一个轻量级企业集成框架的‘心脏’

本文深入探讨了从Mule ESB到Apache Camel的轻量级企业集成框架设计实践,对比了两者在协议支持、消息处理能力和部署灵活性等方面的差异。通过实际代码示例和性能优化技巧,帮助开发者构建高效的核心模块,适用于现代微服务架构下的系统集成需求。

weixin_28738165的博客 375

电脑主板开机12步流程全解析:从按下电源键到BIOS启动的完整过程

本文深入解析了电脑主板从按下电源键到BIOS启动的完整12步流程,详细阐述了待机电路、主供电上电、CPU供电建立、时钟信号分发及复位链等关键硬件协同工作原理。通过剖析电脑主板的电路结构与芯片协作时序,帮助读者构建系统性的硬件故障诊断思维,精准定位开机故障。

weixin_29290963的博客 265

videojs 的常规使用

videojs 的常规使用 初步使用 videojs是一个开源的web视频组件(videojs官网),其使用基于html5的video标签。官方已经给出较为简单的使用例子: &lt;head&gt; &lt;link href="https://vjs.zencdn.net/7.1.0/video-js.css" rel="stylesheet"&gt; &lt;!-- I...

Sino_Crazy_Snail的小窝 8221

保姆级教程:用SSC Tool 5.13为先楫HPM6E00EVK生成8轴EtherCAT从站代码(含XML配置详解)

本文详细介绍了如何使用SSC Tool 5.13为先楫HPM6E00EVK开发板配置8轴EtherCAT从站,包括XML文件深度配置、代码生成与工程整合、烧录与调试技巧。教程涵盖从环境准备到性能优化的全流程,帮助开发者快速实现符合CIA402标准的8轴控制。

weixin_30352645的博客 257

videojs 播放视频

背景:动态更换播放的视频源时,需要先用dispose()销毁,再重新创建,dispose方法会连同dom一同删除,故需要创建dom (如果直接创建video元素,注意生成的object不能在video标签下面,否则页面不报错但不能播放,最好创建一个div ,将其innerHTML设为’

在职可交流前端开发,包括:web端、uniapp等,欢迎指教。 1万+

[网络安全自学篇] 七十三.WannaCry勒索病毒复现及分析(四)蠕虫传播机制全网源码详细解读

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了逆向分析OllyDbg动态调试工具的基本用法,包括界面介绍、常用快捷键和TraceMe案例分析。这篇文章将继续详细讲解WannaCry蠕虫的传播机制,带领大家详细阅读源代码,分享WannaCry勒索病毒是如何传播感染的。作者分析该病毒一个月,一方面觉得自己技术菜,另一方面深知系统安全需要坚持,继续加油。希望文章对您有所帮助~

杨秀璋的专栏 1万+

YOLO26 电子产品零部件质检:缺陷检测 + Streamlit

YOLO26s 电子质检链路:1100 张工业零部件图 (4 类缺陷) → 增强 (blur+shear+低光照) → 150 epoch → mAP@0.5=0.91 → Streamlit 质检界面 (上传/摄像头双模式) → 缺陷严重度分级 (pass/minor/major/critical)。核心贡献:blur+shear 模拟产线振动和视角偏移, 使模糊场景 recall 从 72% 提升至 78%;Streamlit 一键部署, 无需前端经验。建议先收集 200 张纯正常件做负样本防过检;

m0_71589036的博客 375

视频插件VideoJS5介绍

1:官网下载 http://videojs.com/ 扩充video功能---plugins.md插件 1:新建一个函数 function examplePlugin(options) { this.on('play', function(e) { console.log('playback has started!');

... 8156

PLC为西门子的S7-1200,舵机为 DS3218,PLC控制舵机旋转程序实现?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 999

H5播放HLS之videojs播放视频

一、简介 如果要让网页支持在所有浏览器上播放,就需要使用第三方的播放器。VideoJs是一个较好的播放器库,完全免费,不像JWPlayer一样需要付费才能使用一些高级功能。 videojs播放库是比较有名的一个播放库,它不仅支持hls也支持rtmp,不过如果是播放rtmp它最终也是通过flash插件完成的,我们暂时只看hls。 二、实现 如果使用videojs播放hls前端代码实现如下: <!DOCTYPE html> <html lang="en"> <head>

lixiang987654321的专栏 6227

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

videoJs使用说明

VideoJS入门说明 新手入门请看,里面包含了最基本的js文件和vue入门方法,官方还有demo展示 videojs官网:VideoJS官网 1.创建方法如下: 可以在父组件引用this.$refs.videoPlayer.initVideo(this.nowOptions); //父组件下的 <button@click = "test">第一集</button> test(){ this.nowOptions.url= 'https://vjs.zencdn.net/v/

weixin_42837167的博客 1326

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

videojs v10 源代码系列解读:13 · 能力型媒体契约:`Media` 的组合接口

v10 通过“能力型契约”解决媒体源差异问题:将 HTMLMediaElement 拆分为数十个最小化、可独立检测的 Capability 接口(如 MediaPlaybackCapability、MediaSeekCapability),每个仅定义单一功能。结合 EventLike 与 TypedEventTarget 实现类型安全事件系统,利用 TypeScript 的 extends 混入机制灵活组合能力,实现从原生 <video> 到 Google Cast 等异构媒体源的统一抽象与安全探测。

别问我为什么代码没注释,写的时候上帝和我知道,现在只有上帝知道了。 189

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

videoJs实现手机视频播放功能

一、videojs简介 我们项目中用的是angular开发的手机H5的app,今天有一个需求是js播放视频功能,就上网搜索了一下,找到了videoJs,Video.js是一款web视频播放器,支持html5和flash两种播放方式。 二、videojs初始化 video.js有两种初始化方式,一种是在video的html标签之中,一种是使用js来进行初始化。两种都需先引入video.js和video-js.css。建议直接下载到项目中进行引用。 <link href="//vjs.zencd

会飞的鱼儿的博客 7785

videojs v10 系列解读:04 · 从入口到渲染:一次播放的生命周期

本文详解 Video.js v10 播放器从 createPlayer() 到播放的完整调用链。核心路径:createPlayer → createStore(柯里化工厂)→ attach(target) 绑定媒体元素 → combine() 分发 attach 至各 Feature → 状态更新触发 UI 变化。HTML 与 React 入口在 @videojs/store 层汇合,通过 attach 建立状态与媒体的连接,实现“目标附加式”架构。关键机制包括信号控制自动清理、错误隔离与类型推导优化,揭示

别问我为什么代码没注释,写的时候上帝和我知道,现在只有上帝知道了。 132

在vue中使用海康插件实现视频监控,视频直播方法一(RTMP流加Flash加videoJS)

在vue中使用海康威视实现视频监控,视频直播方法一(RTMP流加Flash加videoJS) 第一步 用npm装这个几个包 "video.js": "^6.6.0", "videojs-flash": "^2.2.0", "videojs-swf": "^5.4.2", 第二步 在页面引入上述包 //视频插件包 import videojs from "video.js"; impo...

jinglianglove的博客 3809

videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力

谓词(predicate)用于在运行时安全探测媒体对象是否具备特定能力,弥补 TypeScript 类型在运行时消失的缺陷。核心模式为:先类型守卫,再检查字段与方法存在性。关键在于三个复合谓词——isMediaBufferCapable、isMediaTextTrackCapable、isMediaRemotePlaybackCapable——额外排除空哨兵(如 EMPTY_TIME_RANGES),以区分占位与真实能力。谓词仅覆盖需动态探测的能力,不为必然支持或简单布尔值定义。例外是 hasMetadat

别问我为什么代码没注释,写的时候上帝和我知道,现在只有上帝知道了。 129

videojs v10 系列解读: 03 · 三大设计哲学:无头 Core、能力契约、行为组合

v10 播放器以三条核心设计原则重构:无头 Core 与平台渲染器分离,逻辑不依赖 DOM,实现跨平台复用;能力型契约,通过细粒度接口与谓词守卫,支持部分能力的静默降级;行为组合,将复杂功能拆解为可插拔的 Behavior 单元,实现高内聚、低耦合。真实代码中,PlayButtonCore 纯逻辑、isMediaSeekCapable 运行时判断、Behavior 组合配置,均体现其工程哲学——让系统更可测、可维护、可扩展。

别问我为什么代码没注释,写的时候上帝和我知道,现在只有上帝知道了。 105

videojs v10 源代码系列解读:15 · `HTMLMediaElementHost`:主机-组件模型

HTMLMediaElementHost 是 media 模块的核心枢纽,通过泛型适配多种播放目标(如 <video>、iframe),实现 MediaFull 接口但几乎不持有状态。其核心机制是「组件覆盖」:通过 getMediaOwner 按注册顺序逐属性委托给组件的 targetOverride,支持组件按需接管能力。组件通过 MediaComponent 接口注册,可动态替换 paused、currentTime 等属性行为,如 Google Cast 投屏时无缝切换至远程媒体对象。事件转发、弱引用

别问我为什么代码没注释,写的时候上帝和我知道,现在只有上帝知道了。 199

videojs-player版本兼容性指南:浏览器支持情况

在前端开发中,视频播放器的兼容性直接影响用户体验和产品可用性。根据Can I Use 2024年数据,全球仍有12.3%的用户使用老旧浏览器(如IE11、Safari 14),而视频播放失败会导致高达47%的用户流失率。videojs-player作为基于Video.js的组件库,其跨浏览器支持能力取决于三个关键层面: ```mermaid flowchart TD A[videojs-...

gitblog_00358的博客 978

videojs v10 源代码系列解读:11 · `@videojs/store`:目标附加式响应状态

v10 播放器状态系统基于 createState 与 store 工厂,核心是「目标附加式」设计:状态可先于媒体元素存在,支持预初始化与动态切换。通过模块级微任务批处理,多个容器的更新合并为一次 flush,提升性能。StateContainer 实现不可变状态与惰性通知,仅在值变更时触发更新,并利用 AbortSignal 实现监听器自动清理。柯里化工厂模式实现类型推导与灵活扩展,构建响应式、高效且可维护的状态管理基石。

别问我为什么代码没注释,写的时候上帝和我知道,现在只有上帝知道了。 163

vue使用videojs的坑

目前项目中需要使用videojs来播放视频流。代码如下: <video-player ref="videoPlayers" class="vjs-custom-skin videoPlayer" :playsinline="true" :options="videoPlayer" customEventName="customstatechangedeventname"> </video-player> import { getVideoPatrolList } fro

songduo112的博客 1953

Web 版翻译者资料库

本项目是桌面版《翻译者资料库》的 Web 移植版,基于 Spring Boot 3.3、Thymeleaf、Bootstrap 5.3 与 MySQL 8.0 构建。它面向翻译写作提供资料、词汇、句库、文本工具、对照制作、查找、备份恢复及旧库迁移等功能,完整继承桌面版核心业务规则,支持一键启动与离线访问。

howard2005的专栏 144
上一篇: Video.js v10 全景:一次彻底重写
下一篇: videojs v10 系列解读: 03 · 三大设计哲学:无头 Core、能力契约、行为组合
逻辑玩家
博客等级 码龄19年 75粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值